emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 67dcbc4 5/5: In ada-mode, wisi; release ada-mode 6.1.1, wi


From: Stephen Leake
Subject: [elpa] master 67dcbc4 5/5: In ada-mode, wisi; release ada-mode 6.1.1, wisi 2.1.1
Date: Thu, 11 Jul 2019 21:11:12 -0400 (EDT)

branch: master
commit 67dcbc4e4c821f8b86b063693de2022594a1f122
Author: Stephen Leake <address@hidden>
Commit: Stephen Leake <address@hidden>

    In ada-mode, wisi; release ada-mode 6.1.1, wisi 2.1.1
---
 packages/ada-mode/NEWS                             |   26 +-
 packages/ada-mode/README                           |    2 +-
 packages/ada-mode/ada-lalr-elisp.el                | 1506 ++---
 packages/ada-mode/ada-mode.el                      |   98 +-
 packages/ada-mode/ada-mode.info                    |  241 +-
 packages/ada-mode/ada-mode.texi                    |  154 +-
 packages/ada-mode/ada-process.el                   |  125 +
 packages/ada-mode/ada-wisi-elisp-parse.el          |   10 +-
 packages/ada-mode/ada-wisi.el                      |  270 +-
 packages/ada-mode/ada.wy                           | 2740 +++++++++
 packages/ada-mode/ada_lr1_parse_table.txt.gz       |  Bin 2831194 -> 2955113 
bytes
 packages/ada-mode/ada_mode_wisi_lalr_parse.ads     |   17 +-
 packages/ada-mode/ada_mode_wisi_lr1_parse.ads      |   19 +-
 packages/ada-mode/ada_process_actions.adb          | 1230 ++--
 packages/ada-mode/ada_process_actions.ads          |   31 +-
 packages/ada-mode/ada_process_lalr_main.adb        | 5849 ++++++++++----------
 packages/ada-mode/ada_process_lalr_main.ads        |    9 +-
 packages/ada-mode/ada_process_lr1_main.adb         | 1268 ++---
 packages/ada-mode/ada_process_lr1_main.ads         |    9 +-
 packages/ada-mode/ada_re2c.c                       | 3157 +++++------
 packages/ada-mode/build.sh                         |    2 +-
 packages/ada-mode/emacs_wisi_common_parse.adb      |   29 +-
 packages/ada-mode/emacs_wisi_common_parse.ads      |   31 +-
 packages/ada-mode/gen_emacs_wisi_lr_parse.adb      |    4 +-
 packages/ada-mode/gen_emacs_wisi_lr_parse.ads      |   26 +-
 .../ada-mode/gen_emacs_wisi_lr_text_rep_parse.adb  |    4 +-
 .../ada-mode/gen_emacs_wisi_lr_text_rep_parse.ads  |   30 +-
 packages/ada-mode/gen_run_wisi_lr_parse.adb        |    2 +-
 packages/ada-mode/gen_run_wisi_lr_parse.ads        |   23 +-
 .../ada-mode/gen_run_wisi_lr_text_rep_parse.adb    |    2 +-
 .../ada-mode/gen_run_wisi_lr_text_rep_parse.ads    |   27 +-
 packages/ada-mode/gnat-core.el                     |    1 +
 packages/ada-mode/gpr-lalr-elisp.el                |   64 +-
 packages/ada-mode/gpr-mode.el                      |    3 +-
 packages/ada-mode/gpr-process.el                   |   54 +
 packages/ada-mode/gpr-query.el                     |    4 +-
 packages/ada-mode/gpr-wisi.el                      |    5 +
 packages/ada-mode/gpr.wy                           |  369 ++
 packages/ada-mode/gpr_mode_wisi_parse.ads          |   17 +-
 packages/ada-mode/gpr_process_actions.adb          |   39 +-
 packages/ada-mode/gpr_process_actions.ads          |   37 +-
 packages/ada-mode/gpr_process_lr1_main.adb         | 3567 ++++++------
 packages/ada-mode/gpr_process_lr1_main.ads         |    9 +-
 packages/ada-mode/gpr_re2c.c                       | 1878 ++++---
 packages/ada-mode/run_ada_lalr_parse.ads           |    4 +-
 packages/ada-mode/run_ada_lr1_parse.ads            |    4 +-
 packages/ada-mode/run_wisi_common_parse.adb        |    7 -
 packages/ada-mode/wisi-ada.adb                     | 1017 ++--
 packages/ada-mode/wisi-ada.ads                     |    9 +
 packages/ada-mode/wisi-gpr.adb                     |    7 +
 packages/ada-mode/wisi-gpr.ads                     |    6 +
 .../wisitoken-parse-lr-mckenzie_recover-ada.adb    | 2276 ++++----
 .../wisitoken-parse-lr-mckenzie_recover-ada.ads    |   13 +-
 packages/ada-mode/xref-ada.el                      |  120 +-
 packages/path-iterator/path-iterator.el            |   16 +-
 packages/wisi/NEWS                                 |   37 +-
 packages/wisi/README                               |    2 +-
 ...da_containers-gen_doubly_linked_lists_image.adb |   50 +
 ...a_containers-gen_doubly_linked_lists_image.ads} |   17 +-
 ...rs-gen_image_aux.ads => sal-ada_containers.ads} |   44 +-
 packages/wisi/sal-gen_bounded_definite_queues.adb  |  154 +
 packages/wisi/sal-gen_bounded_definite_queues.ads  |   99 +
 ...sal-gen_bounded_definite_vectors-gen_sorted.adb |   15 +-
 ...sal-gen_bounded_definite_vectors-gen_sorted.ads |   10 +-
 packages/wisi/sal-gen_graphs.adb                   |  718 +++
 packages/wisi/sal-gen_graphs.ads                   |  190 +
 .../wisi/sal-gen_unbounded_definite_stacks.adb     |   34 +-
 .../wisi/sal-gen_unbounded_definite_stacks.ads     |   37 +-
 ...en_unbounded_definite_vectors-gen_image_aux.adb |   11 +-
 ...en_unbounded_definite_vectors-gen_image_aux.ads |    9 +-
 .../wisi/sal-gen_unbounded_definite_vectors.adb    |   22 +
 .../wisi/sal-gen_unbounded_definite_vectors.ads    |    3 +
 packages/wisi/sal-generic_decimal_image.adb        |   48 +
 packages/wisi/sal-generic_decimal_image.ads        |   37 +
 packages/wisi/sal.adb                              |    2 +-
 packages/wisi/wisi-elisp-parse.el                  | 3407 ++++++------
 packages/wisi/wisi-parse-common.el                 |   53 +-
 packages/wisi/wisi-process-parse.el                |  107 +-
 packages/wisi/wisi-run-indent-test.el              |  300 +
 packages/wisi/wisi-tests.el                        |  146 +
 packages/wisi/wisi.adb                             |  383 +-
 packages/wisi/wisi.ads                             |   99 +-
 packages/wisi/wisi.el                              | 3157 ++++++-----
 packages/wisi/wisitoken-bnf-generate.adb           |  239 +-
 packages/wisi/wisitoken-bnf-generate_grammar.adb   |  172 +-
 packages/wisi/wisitoken-bnf-generate_utils.adb     |  105 +-
 packages/wisi/wisitoken-bnf-generate_utils.ads     |   32 +-
 packages/wisi/wisitoken-bnf-output_ada.adb         |  117 +-
 packages/wisi/wisitoken-bnf-output_ada_common.adb  |  187 +-
 packages/wisi/wisitoken-bnf-output_ada_emacs.adb   |  739 ++-
 packages/wisi/wisitoken-bnf-output_elisp.adb       |    4 +-
 .../wisi/wisitoken-bnf-output_elisp_common.adb     |   19 +-
 packages/wisi/wisitoken-bnf.adb                    |   19 +-
 packages/wisi/wisitoken-bnf.ads                    |  112 +-
 packages/wisi/wisitoken-gen_token_enum.ads         |   64 +-
 .../wisi/wisitoken-generate-lr-lalr_generate.adb   | 1207 ++--
 .../wisi/wisitoken-generate-lr-lalr_generate.ads   |   14 +-
 .../wisi/wisitoken-generate-lr-lr1_generate.adb    |  652 +--
 .../wisi/wisitoken-generate-lr-lr1_generate.ads    |   14 +-
 packages/wisi/wisitoken-generate-lr.adb            |  966 +++-
 packages/wisi/wisitoken-generate-lr.ads            |   59 +-
 packages/wisi/wisitoken-generate-lr1_items.adb     |    3 +-
 packages/wisi/wisitoken-generate-lr1_items.ads     |    2 +-
 packages/wisi/wisitoken-generate-packrat.adb       |  494 +-
 packages/wisi/wisitoken-generate-packrat.ads       |  150 +-
 packages/wisi/wisitoken-generate.adb               |  977 ++--
 packages/wisi/wisitoken-generate.ads               |  310 +-
 packages/wisi/wisitoken-lexer-re2c.adb             |    2 +-
 packages/wisi/wisitoken-lexer-re2c.ads             |    2 +-
 packages/wisi/wisitoken-lexer-regexp.adb           |    6 +-
 packages/wisi/wisitoken-lexer-regexp.ads           |    2 +-
 packages/wisi/wisitoken-lexer.ads                  |    4 +-
 .../wisitoken-parse-lr-mckenzie_recover-base.adb   |  875 +--
 .../wisitoken-parse-lr-mckenzie_recover-base.ads   |  365 +-
 ...wisitoken-parse-lr-mckenzie_recover-explore.adb | 3074 +++++-----
 ...wisitoken-parse-lr-mckenzie_recover-explore.ads |   56 +-
 .../wisitoken-parse-lr-mckenzie_recover-parse.adb  |  629 ++-
 .../wisitoken-parse-lr-mckenzie_recover-parse.ads  |  157 +-
 .../wisi/wisitoken-parse-lr-mckenzie_recover.adb   | 2389 ++++----
 .../wisi/wisitoken-parse-lr-mckenzie_recover.ads   |  500 +-
 packages/wisi/wisitoken-parse-lr-parser.adb        | 2282 ++++----
 packages/wisi/wisitoken-parse-lr-parser.ads        |   50 +-
 packages/wisi/wisitoken-parse-lr-parser_lists.adb  |   18 +-
 packages/wisi/wisitoken-parse-lr-parser_lists.ads  |    1 +
 .../wisi/wisitoken-parse-lr-parser_no_recover.adb  | 1060 ++--
 packages/wisi/wisitoken-parse-lr.adb               | 1764 +++---
 packages/wisi/wisitoken-parse-lr.ads               | 1310 ++---
 .../wisi/wisitoken-parse-packrat-procedural.adb    |  512 +-
 .../wisi/wisitoken-parse-packrat-procedural.ads    |  166 +-
 packages/wisi/wisitoken-parse_table-mode.el        |    3 +-
 packages/wisi/wisitoken-semantic_checks.adb        |  304 +-
 packages/wisi/wisitoken-semantic_checks.ads        |  204 +-
 packages/wisi/wisitoken-syntax_trees.adb           | 2838 ++++++----
 packages/wisi/wisitoken-syntax_trees.ads           |  998 ++--
 packages/wisi/wisitoken.adb                        |   30 +
 packages/wisi/wisitoken.ads                        |  922 +--
 packages/wisi/wisitoken_grammar_actions.adb        |   79 +-
 packages/wisi/wisitoken_grammar_actions.ads        |  117 +-
 packages/wisi/wisitoken_grammar_main.adb           |  656 ++-
 packages/wisi/wisitoken_grammar_main.ads           |    2 +-
 packages/wisi/wisitoken_grammar_re2c.c             | 2521 ++++++---
 packages/wisi/wisitoken_grammar_re2c_c.ads         |    2 +-
 packages/wisi/wisitoken_grammar_runtime.adb        | 2434 +++++++-
 packages/wisi/wisitoken_grammar_runtime.ads        |   67 +-
 144 files changed, 40503 insertions(+), 28213 deletions(-)

diff --git a/packages/ada-mode/NEWS b/packages/ada-mode/NEWS
index 641fae7..6a7e722 100644
--- a/packages/ada-mode/NEWS
+++ b/packages/ada-mode/NEWS
@@ -3,10 +3,29 @@ GNU Emacs Ada mode NEWS -- history of user-visible changes.
 Copyright (C) 2018 Free Software Foundation, Inc.
 See the end of the file for license conditions.
 
-Please send wisi bug reports to address@hidden, with
+Please send ada-mode bug reports to address@hidden, with
 'ada-mode' in the subject. If possible, use M-x report-emacs-bug.
 
 
+* Ada Mode
+11 Jul 2019
+
+** parser Ada language protocol version 1
+** parser gpr language protocol version 1
+
+** ada-auto-case can now take the value `not-upper-case'; typed words
+   that are all upper case are not adjusted.
+
+** which-function-mode in large Ada buffers now uses partial parse;
+   the new user variable `ada-which-func-parse-size' sets the minimum
+   region to parse, centered on point. It should be set to the largest
+   subprogram size that parses in an acceptable time.
+
+** gpr-mode supports new gpr syntax "at n" in an attribute specification.
+
+** The ada-mode xref backend now includes object names in the local
+   file name completion table.
+
 * Ada mode 6.1.0
 21 Mar 2019
 
@@ -90,7 +109,8 @@ Please send wisi bug reports to address@hidden, with
 ** new user command: ada-refresh-prj-file. Useful when the project
    file has been edited.
 
-** Implement an xref backend for Ada, using gpr-query. See (info "(emacs) 
Xref").
+** Implement an xref backend for Ada, using gpr-query. See (info
+   "(emacs) Xref").
 
 ** The various "find other file" commands assume the use of the Gnu
    ELPA package other-frame-window; they no longer provide "other
@@ -146,7 +166,7 @@ Please send wisi bug reports to address@hidden, with
    lines relative to start of expression. Otherwise, indent relative
    to previous line. Default nil.
 
-** xref-ada allows entering an identifier to search for without
+** xref-ada allows entering an identifier to search for with
    completion. The search is only in the current file.
 
 ** ada-show-references, ada-show-local-references now take an 'append'
diff --git a/packages/ada-mode/README b/packages/ada-mode/README
index 69e4e21..b252be0 100644
--- a/packages/ada-mode/README
+++ b/packages/ada-mode/README
@@ -1,4 +1,4 @@
-Emacs Ada mode version 6.1.0
+Emacs Ada mode version 6.1.1
 
 Ada mode provides auto-casing, fontification, navigation, and
 indentation for Ada source code files.
diff --git a/packages/ada-mode/ada-lalr-elisp.el 
b/packages/ada-mode/ada-lalr-elisp.el
index 811b0d4..95dce2d 100644
--- a/packages/ada-mode/ada-lalr-elisp.el
+++ b/packages/ada-mode/ada-lalr-elisp.el
@@ -168,50 +168,50 @@
        (()))
       (abstract_subprogram_declaration
        ((overriding_indicator_opt subprogram_specification IS ABSTRACT 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken nil 
nil]))))
       (accept_statement
        ((ACCEPT IDENTIFIER actual_parameter_part_opt parameter_profile_opt DO 
handled_sequence_of_statements END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
-      (wisi-containing-action 1 4) ;; for goto-declaration-start
-      (wisi-containing-action 1 6) ;; ""
-      (wisi-motion-action [1 5 [6 EXCEPTION WHEN] 9])
-      (wisi-face-apply-action [2 nil font-lock-function-name-face 8 nil 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken [0 ada-indent] [ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-containing-action 1 6) ;; ""
+      (wisi-motion-action [1 5 [6 EXCEPTION WHEN] 9])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 8 nil 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken [nil ada-indent] [ada-indent ada-indent] nil nil nil])))
        ((ACCEPT IDENTIFIER actual_parameter_part_opt parameter_profile_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-containing-action 1 4) ;; for goto-declaration-start
-      (wisi-face-apply-action [2 nil font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (access_definition
        ((null_exclusion_opt ACCESS protected_opt PROCEDURE 
parameter_profile_opt )
-        (wisi-indent-action [0 0 0 0 (wisi-anchored% 4 ada-indent-broken)]))
+        (wisi-indent-action [nil nil nil nil (wisi-anchored% 4 
ada-indent-broken)]))
        ((null_exclusion_opt ACCESS protected_opt FUNCTION 
parameter_and_result_profile )
-        (wisi-indent-action [0 0 0 0 (wisi-anchored%- 4 ada-indent-broken)]))
+        (wisi-indent-action [nil nil nil nil (wisi-anchored%- 4 
ada-indent-broken)]))
        ((null_exclusion_opt ACCESS general_access_modifier_opt name )
         (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-type-face])))
       (actual_parameter_part
        ((LEFT_PAREN association_list RIGHT_PAREN )
-        (wisi-indent-action [0 [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))
+        (wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))
        ((LEFT_PAREN conditional_quantified_expression RIGHT_PAREN )
-        (wisi-indent-action [0 [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)])))
+        (wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)])))
       (actual_parameter_part_opt
        ((actual_parameter_part ))
        (()))
       (aggregate
        ((LEFT_PAREN expression_opt WITH NULL RECORD RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 1) 0 0 
(wisi-anchored 1 0)]))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) nil 
nil (wisi-anchored 1 0)]))
        ((LEFT_PAREN expression_opt WITH association_list RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 1) 
[(wisi-anchored 1 1) (wisi-anchored 1 1)]
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) 
[(wisi-anchored 1 1) (wisi-anchored 1 1)]
                          (wisi-anchored 1 0)]))
        ((LEFT_PAREN NULL RECORD RIGHT_PAREN ))
        ((LEFT_PAREN conditional_quantified_expression RIGHT_PAREN )
-        (wisi-indent-action [0 [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))
+        (wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))
        ((LEFT_PAREN association_list RIGHT_PAREN )
-        (wisi-indent-action [0 [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)])))
+        (wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)])))
       (aliased_opt
        ((ALIASED ))
        (()))
@@ -220,9 +220,9 @@
        (()))
       (array_type_definition
        ((ARRAY LEFT_PAREN index_subtype_definition_list RIGHT_PAREN OF 
component_definition )
-        (wisi-indent-action [0 0 (wisi-anchored 2 1) (wisi-anchored 2 0) 0 0]))
+        (wisi-indent-action [nil nil (wisi-anchored 2 1) (wisi-anchored 2 0) 
nil nil]))
        ((ARRAY LEFT_PAREN discrete_subtype_definition_list RIGHT_PAREN OF 
component_definition )
-        (wisi-indent-action [0 0 (wisi-anchored 2 1) (wisi-anchored 2 0) 0 
0])))
+        (wisi-indent-action [nil nil (wisi-anchored 2 1) (wisi-anchored 2 0) 
nil nil])))
       (aspect_clause
        ((FOR attribute_reference USE expression_opt SEMICOLON )
         (wisi-statement-action [1 statement-start 5 statement-end]))
@@ -231,47 +231,47 @@
        ((at_clause )))
       (aspect_specification_opt
        ((WITH association_list )
-        (wisi-indent-action [0 ada-indent-broken]))
+        (wisi-indent-action [nil ada-indent-broken]))
        (()))
       (assignment_statement
        ((name COLON_EQUAL expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-containing-action 1 3)
-      (wisi-indent-action [0
-                           ada-indent-broken
-                           (wisi-hanging
-                            (wisi-anchored% 2 ada-indent-broken)
-                            (wisi-anchored% 3 ada-indent-broken))
-                           0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-containing-action 1 3)
+      (wisi-indent-action [nil
+                           ada-indent-broken
+                           (wisi-hanging
+                            (wisi-anchored% 2 ada-indent-broken)
+                            (wisi-anchored% 3 ada-indent-broken))
+                           nil]))))
       (association_opt
        ((CHARACTER_LITERAL EQUAL_GREATER expression_opt )
-        (wisi-indent-action [0 ada-indent-broken
+        (wisi-indent-action [nil ada-indent-broken
                          [(wisi-anchored% 2 ada-indent-broken) (wisi-anchored% 
2 ada-indent-broken)]]))
        ((CHARACTER_LITERAL EQUAL_GREATER BOX ))
        ((discrete_choice_list EQUAL_GREATER expression_opt )
-        (wisi-indent-action [(wisi-hanging 0 ada-indent-broken)
-                         ada-indent-broken
-                         [(wisi-hanging%- (wisi-anchored% 2 ada-indent-broken)
-                            (wisi-anchored% 2 (* 2 ada-indent-broken)))
-                          (wisi-hanging%- (wisi-anchored% 2 ada-indent-broken)
-                            (wisi-anchored% 2 (* 2 ada-indent-broken)))]]))
+        (wisi-indent-action [(wisi-hanging nil ada-indent-broken)
+                           ada-indent-broken
+                           [(wisi-hanging%- (wisi-anchored% 2 
ada-indent-broken)
+                                            (wisi-anchored% 2 (* 2 
ada-indent-broken)))
+                            (wisi-hanging%- (wisi-anchored% 2 
ada-indent-broken)
+                                            (wisi-anchored% 2 (* 2 
ada-indent-broken)))]]))
        ((discrete_choice_list EQUAL_GREATER BOX )
-        (wisi-indent-action [(wisi-hanging 0 ada-indent-broken) 
ada-indent-broken 0]))
+        (wisi-indent-action [(wisi-hanging nil ada-indent-broken) 
ada-indent-broken nil]))
        ((expression )
-        (wisi-indent-action [[(wisi-hanging 0 ada-indent-broken) (wisi-hanging 
0 ada-indent-broken)]]))
+        (wisi-indent-action [[(wisi-hanging nil ada-indent-broken) 
(wisi-hanging nil ada-indent-broken)]]))
        (()))
       (association_list
        ((association_list COMMA association_opt ))
        ((association_opt )))
       (asynchronous_select
        ((SELECT triggering_alternative THEN ABORT sequence_of_statements_opt 
END SELECT SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 5)
-      (wisi-indent-action [[0 ada-indent] [ada-indent ada-indent] [0 
ada-indent-broken] ada-indent-broken
-                           [ada-indent ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 5)
+      (wisi-indent-action [nil [ada-indent ada-indent] [nil ada-indent-broken] 
ada-indent-broken
+                           [ada-indent ada-indent] nil nil nil]))))
       (at_clause
        ((FOR direct_name USE AT expression_opt SEMICOLON )
         (wisi-statement-action [1 statement-start 6 statement-end])))
@@ -289,24 +289,24 @@
        ((AMPERSAND )))
       (block_label
        ((IDENTIFIER COLON )
-        (wisi-indent-action [ada-indent-label 0])))
+        (wisi-indent-action [ada-indent-label nil])))
       (block_label_opt
        ((block_label ))
        (()))
       (block_statement
        ((block_label_opt DECLARE declarative_part_opt BEGIN 
handled_sequence_of_statements END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 misc 4 motion 8 
statement-end])
-      (wisi-containing-action 2 3)
-      (wisi-containing-action 2 5)
-      (wisi-motion-action [2 4 [5 EXCEPTION WHEN] 8])
-      (wisi-indent-action [0 [0 ada-indent] [ada-indent ada-indent] [0 
ada-indent] [ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 2 misc 4 motion 8 
statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-containing-action 2 5)
+      (wisi-motion-action [2 4 [5 EXCEPTION WHEN] 8])
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))
        ((block_label_opt BEGIN handled_sequence_of_statements END 
identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 misc 6 statement-end])
-      (wisi-containing-action 2 3)
-      (wisi-motion-action [2 [3 EXCEPTION WHEN] 6])
-      (wisi-indent-action [0 [0 ada-indent] [ada-indent ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 misc 6 statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-motion-action [2 [3 EXCEPTION WHEN] 6])
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil nil nil]))))
       (body_g
        ((proper_body ))
        ((body_stub )))
@@ -317,29 +317,29 @@
        ((protected_body_stub )))
       (case_expression
        ((CASE expression_opt IS case_expression_alternative_list )
-        (wisi-indent-action [0 ada-indent-broken 0 ada-indent-when])))
+        (wisi-indent-action [nil ada-indent-broken nil ada-indent-when])))
       (case_expression_alternative
        ((WHEN discrete_choice_list EQUAL_GREATER expression_opt )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken
-                           (wisi-hanging (wisi-anchored% 1 ada-indent)
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken
+                           (wisi-hanging (wisi-anchored% 1 ada-indent)
                                          (wisi-anchored% 1 (+ ada-indent 
ada-indent-broken)))])))
       (case_expression_alternative_list
        ((case_expression_alternative_list COMMA case_expression_alternative )
-        (wisi-indent-action [0 [0 ada-indent-when] 0]))
+        (wisi-indent-action [nil [nil ada-indent-when] nil]))
        ((case_expression_alternative )))
       (case_statement
        ((CASE expression_opt IS case_statement_alternative_list END CASE 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
-      (wisi-containing-action 1 4)
-      (wisi-motion-action [1 [4 WHEN] 7])
-      (wisi-indent-action [0 ada-indent-broken [0 ada-indent-when] 
[ada-indent-when ada-indent-when] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 [4 WHEN] 7])
+      (wisi-indent-action [nil ada-indent-broken nil [ada-indent-when 
ada-indent-when] nil nil nil]))))
       (case_statement_alternative
        ((WHEN discrete_choice_list EQUAL_GREATER sequence_of_statements_opt )
-        (progn
-      (wisi-statement-action [1 motion])
-      ;; ada-indent-when added in case_statement
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]]))))
+        (progn
+      (wisi-statement-action [1 motion])
+      ;; ada-indent-when added in case_statement
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]]))))
       (case_statement_alternative_list
        ((case_statement_alternative_list case_statement_alternative ))
        ((case_statement_alternative )))
@@ -357,24 +357,25 @@
         (wisi-indent-action [[0 0]])))
       (component_clause
        ((IDENTIFIER AT simple_expression RANGE simple_expression DOT_DOT 
simple_expression SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 8 statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil]))))
       (component_clause_list
        ((component_clause_list component_clause ))
        ((component_clause )))
       (component_declaration
        ((identifier_list COLON component_definition COLON_EQUAL expression_opt 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored% 4 ada-indent-broken)
-                             ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 3) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                               (wisi-anchored% 4 ada-indent-broken)
+                               ada-indent-broken nil])))
        ((identifier_list COLON component_definition aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-containing-action 1 3) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (component_definition
        ((ALIASED subtype_indication ))
        ((subtype_indication ))
@@ -403,11 +404,11 @@
        ((select_statement )))
       (conditional_entry_call
        ((SELECT entry_call_alternative ELSE sequence_of_statements_opt END 
SELECT SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-indent-action [[0 ada-indent] [ada-indent ada-indent] [0 
ada-indent] [ada-indent ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-indent-action [nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil]))))
       (conditional_quantified_expression
        ((if_expression ))
        ((case_expression ))
@@ -432,11 +433,11 @@
        ((generic_instantiation ))
        ((null_procedure_declaration ))
        ((identifier_list COLON CONSTANT COLON_EQUAL expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-containing-action 1 5)
-      (wisi-indent-action [(wisi-hanging 0 ada-indent-broken) 
ada-indent-broken ada-indent-broken ada-indent-broken
-                           (wisi-anchored% 4 ada-indent-broken) 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-containing-action 1 5)
+      (wisi-indent-action [(wisi-hanging nil ada-indent-broken) 
ada-indent-broken ada-indent-broken ada-indent-broken
+                           (wisi-anchored% 4 ada-indent-broken) nil])))
        ((object_declaration ))
        ((package_declaration ))
        ((renaming_declaration ))
@@ -456,13 +457,13 @@
        ((delay_statement sequence_of_statements_opt )))
       (delay_statement
        ((DELAY UNTIL expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil])))
        ((DELAY expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-indent-action [0 ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-indent-action [nil ada-indent-broken nil]))))
       (derived_type_definition
        ((abstract_limited_opt NEW name and_interface_list_opt WITH 
record_definition )
         (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))
@@ -492,7 +493,7 @@
       (discriminant_part_opt
        ((LEFT_PAREN BOX RIGHT_PAREN ))
        ((LEFT_PAREN discriminant_specification_list RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)]))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))
        (()))
       (discriminant_specification_opt
        ((identifier_list COLON null_exclusion_opt_name_type COLON_EQUAL 
expression_opt ))
@@ -505,44 +506,46 @@
        ((discriminant_specification_opt )))
       (elsif_expression_item
        ((ELSIF expression_opt THEN expression_opt )
-        (progn
-      (wisi-statement-action [1 motion 3 motion])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
ada-indent]))))
+        (progn
+      (wisi-statement-action [1 motion 3 motion])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent]))))
       (elsif_expression_list
        ((elsif_expression_list elsif_expression_item ))
        ((elsif_expression_item )))
       (elsif_statement_item
        ((ELSIF expression_opt THEN sequence_of_statements_opt )
-        (progn
-      (wisi-statement-action [1 motion 3 motion])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
[ada-indent ada-indent]]))))
+        (progn
+      (wisi-statement-action [1 motion 3 motion])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
[ada-indent ada-indent]]))))
       (elsif_statement_list
        ((elsif_statement_list elsif_statement_item ))
        ((elsif_statement_item )))
       (entry_body
        ((ENTRY IDENTIFIER entry_body_formal_part WHEN expression_opt IS 
declarative_part_opt BEGIN handled_sequence_of_statements END identifier_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 4 motion 6 motion 8 
motion 12 statement-end])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-containing-action 1 7)
-      (wisi-containing-action 1 9)
-      (wisi-motion-action [1 4 6 8 12])
-      (wisi-face-apply-action [2 nil font-lock-function-name-face 11 nil 
font-lock-function-name-face])
-
-      ;; test/ada_mode-nominal.adb
-      ;; entry E2
-      ;;   (X : Integer)
-      ;;   when Local_1 = 0 and not
-      ;;     (Local_2 = 1)
-      ;;
-      ;; entry E3
-      ;;   (X : Integer) when Local_1 = 0 and not
-      ;;     (Local_2 = 1)
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored% 4 ada-indent-broken)
-                             0 [ada-indent ada-indent] 0 [ada-indent 
ada-indent] 0 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 6 motion 8 motion 
12 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-containing-action 1 7)
+        (wisi-containing-action 1 9)
+        (wisi-motion-action [1 4 6 8 12])
+        (wisi-face-apply-action [2 nil font-lock-function-name-face 11 nil 
font-lock-function-name-face])
+
+        ;; test/ada_mode-nominal.adb
+        ;; entry E2
+        ;;   (X : Integer)
+        ;;   when Local_1 = 0 and not
+        ;;     (Local_2 = 1)
+        ;;
+        ;; entry E3
+        ;;   (X : Integer) when Local_1 = 0 and not
+        ;;     (Local_2 = 1)
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                                 (wisi-anchored% 4 ada-indent-broken)
+                                 nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil]))))
       (entry_body_formal_part
        ((LEFT_PAREN FOR IDENTIFIER IN discrete_subtype_definition RIGHT_PAREN 
parameter_profile_opt )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 1) 
(wisi-anchored 1 1) (wisi-anchored 1 1)
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) 
(wisi-anchored 1 1) (wisi-anchored 1 1)
                            (wisi-anchored 1 0) ada-indent-broken]))
        ((parameter_profile_opt )))
       (entry_call_alternative
@@ -550,18 +553,20 @@
        ((name sequence_of_statements_opt )))
       (entry_declaration
        ((overriding_indicator_opt ENTRY IDENTIFIER LEFT_PAREN 
discrete_subtype_definition RIGHT_PAREN parameter_profile_opt 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 3 name 8 
statement-end])
-      (wisi-containing-action 2 7) ;; for goto-declaration-start
-      (wisi-face-apply-action [3 nil font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
(wisi-anchored 4 1) (wisi-anchored 4 0)
-                             ada-indent-broken 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 2 7) ;; for goto-declaration-start
+        (wisi-face-apply-action [3 nil font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
(wisi-anchored 4 1) (wisi-anchored 4 0)
+                               ada-indent-broken nil nil])))
        ((overriding_indicator_opt ENTRY IDENTIFIER parameter_profile_opt 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 3 name 6 
statement-end])
-      (wisi-containing-action 2 4) ;; for goto-declaration-start
-      (wisi-face-apply-action [3 nil font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 2 motion 6 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 2 4) ;; for goto-declaration-start
+        (wisi-face-apply-action [3 nil font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (enumeration_literal
        ((IDENTIFIER ))
        ((CHARACTER_LITERAL )))
@@ -570,13 +575,13 @@
        ((enumeration_literal )))
       (enumeration_representation_clause
        ((FOR name USE aggregate SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (enumeration_type_definition
        ((LEFT_PAREN enumeration_literal_list RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)])))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)])))
       (exception_choice
        ((name ))
        ((OTHERS )))
@@ -588,14 +593,14 @@
         (wisi-statement-action [1 statement-start 4 statement-end])))
       (exception_handler
        ((WHEN IDENTIFIER COLON exception_choice_list EQUAL_GREATER 
sequence_of_statements_opt )
-        (progn
-      (wisi-statement-action [1 motion])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+        (progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
                              [ada-indent ada-indent]])))
        ((WHEN exception_choice_list EQUAL_GREATER sequence_of_statements_opt )
-        (progn
-      (wisi-statement-action [1 motion])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]]))))
+        (progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]]))))
       (exception_handler_list
        ((exception_handler_list exception_handler ))
        ((exception_handler ))
@@ -605,9 +610,9 @@
        (()))
       (exit_statement
        ((EXIT identifier_opt WHEN expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-indent-action [0 0 0 ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-indent-action [nil nil nil ada-indent-broken nil])))
        ((EXIT identifier_opt SEMICOLON )
         (wisi-statement-action [1 statement-start 3 statement-end])))
       (expression
@@ -622,27 +627,27 @@
        (()))
       (expression_function_declaration
        ((overriding_indicator_opt function_specification IS paren_expression 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken nil 
nil]))))
       (extended_return_object_declaration
        ((IDENTIFIER COLON aliased_opt constant_opt return_subtype_indication 
COLON_EQUAL expression_opt )
-        (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
                            (wisi-anchored% 6 ada-indent-broken)]))
        ((IDENTIFIER COLON aliased_opt constant_opt return_subtype_indication )
-        (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken])))
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken])))
       (extended_return_object_declaration_opt
        ((extended_return_object_declaration ))
        (()))
       (extended_return_statement
        ((RETURN extended_return_object_declaration_opt DO 
handled_sequence_of_statements END RETURN SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
-      (wisi-containing-action 1 4)
-      (wisi-motion-action [1 3 7])
-      (wisi-indent-action [[0 ada-indent] ada-indent-broken [0 ada-indent] 
[ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 3 7])
+      (wisi-indent-action [[nil ada-indent] ada-indent-broken nil [ada-indent 
ada-indent] nil nil nil])))
        ((RETURN extended_return_object_declaration SEMICOLON )
-        (progn
+        (progn
       (wisi-statement-action [1 statement-start 3 statement-end]))))
       (factor
        ((primary STAR_STAR primary ))
@@ -651,65 +656,67 @@
        ((NOT primary )))
       (formal_object_declaration
        ((identifier_list COLON mode_opt null_exclusion_opt name COLON_EQUAL 
expression_opt aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 9 statement-end])
-      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
-                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))
        ((identifier_list COLON mode_opt access_definition COLON_EQUAL 
expression_opt aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 8 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
-                             (wisi-anchored% 5 ada-indent-broken) 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 5 ada-indent-broken) 
ada-indent-broken nil])))
        ((identifier_list COLON mode_opt null_exclusion_opt name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))
        ((identifier_list COLON mode_opt access_definition 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil]))))
       (formal_part
        ((LEFT_PAREN parameter_specification_list RIGHT_PAREN )
-        (progn
-      (wisi-statement-action [1 misc]) ;; for ada-wisi-in-paramlist-p
-      (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)]))))
+        (progn
+      (wisi-statement-action [1 misc]) ;; for ada-wisi-in-paramlist-p
+      (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))))
       (formal_subprogram_declaration
        ((WITH subprogram_specification IS ABSTRACT subprogram_default 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))
        ((WITH subprogram_specification IS subprogram_default 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))
        ((WITH subprogram_specification IS ABSTRACT aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))
        ((WITH subprogram_specification aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken nil]))))
       (formal_type_declaration
        ((TYPE IDENTIFIER discriminant_part_opt IS formal_type_definition 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken
-                             ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                             ada-indent-broken ada-indent-broken nil])))
        ((TYPE IDENTIFIER discriminant_part_opt IS TAGGED 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))
        ((TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (formal_type_definition
        ((abstract_tagged_limited_opt PRIVATE ))
        ((formal_derived_type_definition ))
@@ -729,35 +736,37 @@
         (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face])))
       (formal_package_declaration
        ((WITH PACKAGE name IS NEW name formal_package_actual_part 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 9 statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 6 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                 6 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (formal_package_actual_part
        ((LEFT_PAREN BOX RIGHT_PAREN ))
        (()))
       (full_type_declaration
        ((TYPE IDENTIFIER discriminant_part_opt IS type_definition 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 7 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-
-      ;; FIXME: indentation of comment after 'is' (and 'with' in
-      ;; derived_type_definition) should be ada-indent-record-rel-type
-      ;; if type_definition is a record. Worse if
-      ;; ada-indent-comment-gnat is t. Need 'anchor to next line'.
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
[ada-indent-broken ada-indent-broken] ada-indent-broken 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+
+        ;; FIXME: indentation of comment after 'is' (and 'with' in
+        ;; derived_type_definition) should be ada-indent-record-rel-type
+        ;; if type_definition is a record. Worse if
+        ;; ada-indent-comment-gnat is t. Need 'anchor to next line'.
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil nil])))
        ((task_type_declaration ))
        ((protected_type_declaration )))
       (function_specification
        ((FUNCTION name parameter_and_result_profile )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken]))))
+        (progn
+        (wisi-statement-action [1 statement-start])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken]))))
       (general_access_modifier_opt
        ((ALL ))
        ((CONSTANT ))
@@ -767,9 +776,9 @@
        ((generic_package_declaration )))
       (generic_formal_part
        ((GENERIC generic_formal_parameter_declarations )
-        (progn
-      (wisi-statement-action [1 statement-start])
-      (wisi-indent-action [0 ada-indent])))
+        (progn
+      (wisi-statement-action [1 statement-start])
+      (wisi-indent-action [nil ada-indent])))
        ((GENERIC )
         (wisi-statement-action [1 statement-start])))
       (generic_formal_parameter_declarations
@@ -784,159 +793,173 @@
        ((use_clause )))
       (generic_instantiation
        ((PACKAGE name IS NEW name aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 7 statement-end])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
-                                 5 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken 0 ada-indent-broken 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))
        ((overriding_indicator_opt PROCEDURE name IS NEW name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 3 name 8 
statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 6 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   6 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil])))
        ((overriding_indicator_opt FUNCTION name IS NEW name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 3 name 8 
statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 6 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken 0 ada-indent-broken 
ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   6 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 nil]))))
       (generic_package_declaration
        ((generic_formal_part package_specification SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 3 statement-end])
-      (wisi-motion-action [1 2 3])
-      (wisi-indent-action [[0 ada-indent] 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 motion 3 statement-end])
+      (wisi-motion-action [1 2 3])
+      (wisi-indent-action [[nil ada-indent] nil nil]))))
       (generic_renaming_declaration
        ((GENERIC PACKAGE name RENAMES name aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 5 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))
        ((GENERIC PROCEDURE name RENAMES name aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 5 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken
+                                 nil])))
        ((GENERIC FUNCTION name RENAMES name aspect_specification_opt SEMICOLON 
)
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 5 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken
+                                 nil]))))
       (generic_subprogram_declaration
        ((generic_formal_part subprogram_specification aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 motion 4 statement-end])
+        (progn
+      (wisi-statement-action [1 statement-start 2 motion 4 statement-end])
       (wisi-motion-action [1 2 4]))))
       (goto_label
        ((LESS_LESS IDENTIFIER GREATER_GREATER )
-        (progn
-      (wisi-face-apply-action [2 nil font-lock-constant-face])
-      (wisi-indent-action [[ada-indent-label 0] 0 0]))))
+        (progn
+      (wisi-face-apply-action [2 nil font-lock-constant-face])
+      (wisi-indent-action [ada-indent-label nil nil]))))
       (handled_sequence_of_statements
        ((sequence_of_statements_opt EXCEPTION exception_handler_list_opt )
-        (progn
-      (wisi-statement-action [2 motion])
-      (wisi-indent-action [[0 0]
-                           (- ada-indent)
+        (progn
+      (wisi-statement-action [2 motion])
+      (wisi-indent-action [[nil nil]
+                           (- ada-indent)
                            [(- ada-indent-when ada-indent) (- ada-indent-when 
ada-indent)]])))
        ((sequence_of_statements_opt )))
       (identifier_list
        ((identifier_list COMMA IDENTIFIER )
-        (wisi-indent-action [0 0 ada-indent-broken]))
-       ((IDENTIFIER )))
+        (progn
+        (wisi-name-action 3)
+        (wisi-indent-action [nil nil ada-indent-broken])))
+       ((IDENTIFIER )
+        (wisi-name-action 1)))
       (identifier_opt
        ((IDENTIFIER ))
        (()))
       (if_expression
        ((IF expression_opt THEN expression_opt elsif_expression_list ELSE 
expression_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 6 motion])
-      (wisi-containing-action 1 2)
-      (wisi-motion-action [1 3 [5 ELSIF THEN] 6])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
ada-indent 0 0 ada-indent])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 6 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 6])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil nil ada-indent])))
        ((IF expression_opt THEN expression_opt ELSE expression_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 5 motion])
-      (wisi-containing-action 1 2)
-      (wisi-motion-action [1 3 5])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
ada-indent 0 ada-indent])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 5 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 5])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil ada-indent])))
        ((IF expression_opt THEN expression_opt elsif_expression_list )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion])
-      (wisi-containing-action 1 2)
-      (wisi-motion-action [1 3 [5 ELSIF THEN]])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
ada-indent 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 [5 ELSIF THEN]])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil])))
        ((IF expression_opt THEN expression_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion])
-      (wisi-containing-action 1 2)
-      (wisi-motion-action [1 3])
-      (wisi-indent-action [0 [ada-indent-broken ada-indent-broken] 0 
ada-indent]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent]))))
       (if_statement
        ((IF expression_opt THEN sequence_of_statements_opt 
elsif_statement_list ELSE sequence_of_statements_opt END IF SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 6 motion 10 
statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-containing-action 1 5)
-      (wisi-containing-action 1 7)
-      (wisi-motion-action [1 3 [5 ELSIF THEN] 6 10])
-      (wisi-indent-action [0 [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
-                              ada-indent-broken]
-                             [0 ada-indent]
-                             [ada-indent ada-indent] 0 [0 ada-indent]
-                             [ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 6 motion 10 
statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 5)
+      (wisi-containing-action 1 7)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 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])))
        ((IF expression_opt THEN sequence_of_statements_opt ELSE 
sequence_of_statements_opt END IF SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 5 motion 9 
statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-containing-action 1 6)
-      (wisi-motion-action [1 3 5 9])
-      (wisi-indent-action [0 [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
-                              ada-indent-broken]
-                             [0 ada-indent]
-                             [ada-indent ada-indent] [0 ada-indent]
-                             [ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 5 motion 9 
statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 6)
+      (wisi-motion-action [1 3 5 9])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil
+                             [ada-indent ada-indent] nil nil nil])))
        ((IF expression_opt THEN sequence_of_statements_opt 
elsif_statement_list END IF SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-containing-action 1 5)
-      (wisi-motion-action [1 3 [5 ELSIF THEN] 8])
-      (wisi-indent-action [0 [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
-                              ada-indent-broken]
-                             [0 ada-indent]
-                             [ada-indent ada-indent] 0 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 5)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 8])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil nil nil nil])))
        ((IF expression_opt THEN sequence_of_statements_opt END IF SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-motion-action [1 3 7])
-      (wisi-indent-action [0 [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
-                              ada-indent-broken]
-                             [0 ada-indent]
-                             [ada-indent ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 3 7])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil nil nil]))))
       (incomplete_type_declaration
        ((TYPE IDENTIFIER discriminant_part_opt IS TAGGED SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))
        ((TYPE IDENTIFIER discriminant_part_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 3 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil]))))
       (index_constraint
        ((LEFT_PAREN discrete_subtype_definition_list RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)])))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)])))
       (index_subtype_definition
        ((name RANGE BOX )))
       (index_subtype_definition_list
@@ -959,9 +982,9 @@
        ((INTERFACE )))
       (iteration_scheme
        ((WHILE expression_opt )
-        (wisi-indent-action [0 [ada-indent-broken ada-indent-broken]]))
+        (wisi-indent-action [nil [ada-indent-broken ada-indent-broken]]))
        ((FOR iterator_specification_opt )
-        (wisi-indent-action [0 [ada-indent-broken ada-indent-broken]])))
+        (wisi-indent-action [nil [ada-indent-broken ada-indent-broken]])))
       (iterator_specification
        ((IDENTIFIER COLON subtype_indication OF REVERSE name ))
        ((IDENTIFIER COLON subtype_indication OF name ))
@@ -976,16 +999,16 @@
        (()))
       (loop_statement
        ((block_label_opt iteration_scheme LOOP sequence_of_statements_opt END 
LOOP identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 misc 3 motion 8 
statement-end])
-      (wisi-containing-action 2 4)
-      (wisi-motion-action [2 3 8])
-      (wisi-indent-action [0 0 [0 ada-indent] [ada-indent ada-indent] 0 0 0 
0])))
+        (progn
+      (wisi-statement-action [1 statement-start 2 misc 3 motion 8 
statement-end])
+      (wisi-containing-action 2 4)
+      (wisi-motion-action [2 3 8])
+      (wisi-indent-action [nil nil nil [ada-indent ada-indent] nil nil nil 
nil])))
        ((block_label_opt LOOP sequence_of_statements_opt END LOOP 
identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 misc 7 statement-end])
-      (wisi-containing-action 2 3)
-      (wisi-indent-action [0 [0 ada-indent] [ada-indent ada-indent] 0 0 0 
0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 misc 7 statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil nil nil nil]))))
       (membership_choice_list
        ((membership_choice_list BAR membership_choice ))
        ((membership_choice )))
@@ -1010,17 +1033,17 @@
        ((name )))
       (name
        ((name LEFT_PAREN range_list RIGHT_PAREN )
-        (wisi-indent-action [0
-                         (wisi-anchored% 1 ada-indent-broken)
-                         (wisi-hanging (wisi-anchored 2 1)
-                                       (wisi-anchored 2 (+ 1 
ada-indent-broken)))
+        (wisi-indent-action [nil
+                         (wisi-anchored% 1 ada-indent-broken)
+                         (wisi-hanging (wisi-anchored 2 1)
+                                       (wisi-anchored 2 (+ 1 
ada-indent-broken)))
                          (wisi-anchored 2 0)]))
        ((name actual_parameter_part )
-        (progn
-      (wisi-statement-action [1 misc])
-      (wisi-containing-action 1 2)
-      (wisi-indent-action [0 (if ada-indent-hanging-rel-exp
-                                 (wisi-anchored 1 ada-indent-broken)
+        (progn
+      (wisi-statement-action [1 misc])
+      (wisi-containing-action 1 2)
+      (wisi-indent-action [nil (if ada-indent-hanging-rel-exp
+                                 (wisi-anchored 1 ada-indent-broken)
                                (wisi-anchored% 1 ada-indent-broken))])))
        ((selected_component ))
        ((attribute_reference ))
@@ -1046,60 +1069,69 @@
         (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face])))
       (null_procedure_declaration
        ((overriding_indicator_opt procedure_specification IS NULL 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
-      (wisi-indent-action [0 0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil]))))
       (object_declaration
        ((identifier_list COLON aliased_opt constant_opt subtype_indication 
COLON_EQUAL expression_opt aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 9 statement-end])
-      (wisi-containing-action 1 7)
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
-                             (wisi-anchored%- 6 ada-indent-broken) 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 7)
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored%- 6 ada-indent-broken) 
ada-indent-broken nil])))
        ((identifier_list COLON aliased_opt constant_opt access_definition 
COLON_EQUAL expression_opt aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 9 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
-                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))
        ((identifier_list COLON aliased_opt constant_opt array_type_definition 
COLON_EQUAL expression_opt aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 9 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
-                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))
        ((identifier_list COLON aliased_opt constant_opt subtype_indication 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))
        ((identifier_list COLON aliased_opt constant_opt access_definition 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))
        ((identifier_list COLON aliased_opt constant_opt array_type_definition 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 5) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))
        ((single_task_declaration ))
        ((single_protected_declaration )))
       (object_renaming_declaration
        ((IDENTIFIER COLON null_exclusion_opt name RENAMES name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 8 statement-end])
-      (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 8 statement-end])
+        (wisi-name-action 1)
+        (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken ada-indent-broken nil])))
        ((IDENTIFIER COLON access_definition RENAMES name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 1)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken nil])))
        ((IDENTIFIER COLON EXCEPTION RENAMES name aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [5 font-lock-function-name-face nil])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 1)
+        (wisi-face-apply-action [5 font-lock-function-name-face nil])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken nil]))))
       (overriding_indicator_opt
        ((NOT OVERRIDING )
         (wisi-statement-action [1 statement-start 2 statement-override]))
@@ -1108,84 +1140,92 @@
        (()))
       (package_body
        ((PACKAGE BODY name aspect_specification_opt IS declarative_part_opt 
BEGIN handled_sequence_of_statements END name_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 5 motion 7 motion 11 
statement-end])
-      (wisi-containing-action 1 6)
-      (wisi-containing-action 1 8)
-      (wisi-motion-action [1 5 7 [8 EXCEPTION WHEN] 11])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 10 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0 0 
[ada-indent ada-indent]
-                             0 [ada-indent ada-indent] 0 ada-indent-broken 
0])))
+        (progn
+        (wisi-statement-action [1 statement-start 5 motion 7 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 5 7 [8 EXCEPTION WHEN] 11])
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   10 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil nil 
[ada-indent ada-indent]
+                             nil [ada-indent ada-indent] nil ada-indent-broken 
nil])))
        ((PACKAGE BODY name aspect_specification_opt IS declarative_part_opt 
END name_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 5 motion 9 
statement-end])
-      (wisi-containing-action 1 6)
-      (wisi-motion-action [1 5 9])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
-                                 8 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 [ada-indent ada-indent] 0 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-motion-action [1 5 9])
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   8 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [ada-indent ada-indent] nil
+                                 nil nil]))))
       (package_body_stub
        ((PACKAGE BODY name IS SEPARATE aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0 
ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
ada-indent-broken ada-indent-broken nil]))))
       (package_declaration
        ((package_specification SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-end])
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-end])
       (wisi-motion-action [[1 PRIVATE] 2]))))
       (package_renaming_declaration
        ((PACKAGE name RENAMES name aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
-                                 4 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   4 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil]))))
       (package_specification
        ((PACKAGE name aspect_specification_opt IS declarative_part_opt PRIVATE 
declarative_part_opt END name_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 4 motion 6 motion])
-      (wisi-containing-action 1 4)
-      (wisi-containing-action 4 5) ;; for goto-declarative-region-start
-      (wisi-containing-action 1 7)
-      (wisi-motion-action [1 4 6])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
-                                 9 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken 0 0 [ada-indent ada-indent] 0 
[ada-indent ada-indent] 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 6 motion])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 4)
+        (wisi-containing-action 4 5) ;; for goto-declarative-region-start
+        (wisi-containing-action 1 7)
+        (wisi-motion-action [1 4 6])
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   9 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
[ada-indent ada-indent] nil
+                             [ada-indent ada-indent] nil nil])))
        ((PACKAGE name aspect_specification_opt IS declarative_part_opt END 
name_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 4 motion])
-      (wisi-containing-action 1 4)
-      (wisi-containing-action 4 5) ;; for goto-declarative-region-start
-      (wisi-motion-action [1 4])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
-                                 7 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0 [ada-indent 
ada-indent] 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 4 motion])
+      (wisi-name-action 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 4 5) ;; for goto-declarative-region-start
+      (wisi-motion-action [1 4])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                 7 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
[ada-indent ada-indent] nil nil]))))
       (parameter_and_result_profile
        ((formal_part result_profile )
-        (wisi-indent-action [0 (ada-indent-return 1 0)]))
+        (wisi-indent-action [nil (ada-indent-return 1 0)]))
        ((result_profile )))
       (parameter_profile_opt
        ((formal_part ))
        (()))
       (parameter_specification
        ((identifier_list COLON aliased_opt mode_opt null_exclusion_opt name 
COLON_EQUAL expression_opt )
-        (progn
-      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+        (progn
+      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
                              ada-indent-broken ada-indent-broken 
(wisi-anchored% 7 ada-indent-broken)])))
        ((identifier_list COLON aliased_opt mode_opt null_exclusion_opt name )
-        (progn
-      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+        (progn
+      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
                              ada-indent-broken])))
        ((identifier_list COLON aliased_opt access_definition COLON_EQUAL 
expression_opt )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
                            (wisi-anchored% 5 ada-indent-broken)]))
        ((identifier_list COLON aliased_opt access_definition )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken]))
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken]))
        (()))
       (parameter_specification_list
        ((parameter_specification_list SEMICOLON parameter_specification )
@@ -1193,30 +1233,30 @@
        ((parameter_specification )))
       (paren_expression
        ((LEFT_PAREN expression_opt RIGHT_PAREN )
-        (wisi-indent-action [0
-                         (wisi-hanging (wisi-anchored 1 1)
-                                       (wisi-anchored 1 (+ 1 
ada-indent-broken)))
+        (wisi-indent-action [nil
+                         (wisi-hanging (wisi-anchored 1 1)
+                                       (wisi-anchored 1 (+ 1 
ada-indent-broken)))
                          (wisi-anchored 1 0)]))
        ((LEFT_PAREN association_list RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)]))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))
        ((LEFT_PAREN conditional_quantified_expression RIGHT_PAREN )
-        (wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)])))
+        (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)])))
       (pragma_g
        ((PRAGMA IDENTIFIER LEFT_PAREN association_list RIGHT_PAREN SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) nil])))
        ((PRAGMA IDENTIFIER LEFT_PAREN conditional_quantified_expression 
RIGHT_PAREN SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) nil])))
        ((PRAGMA IDENTIFIER SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken nil]))))
       (primary
        ((NUMERIC_LITERAL )
         (wisi-face-apply-action [1 nil font-lock-constant-face]))
@@ -1228,29 +1268,33 @@
         (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])))
       (private_extension_declaration
        ((TYPE IDENTIFIER discriminant_part_opt IS 
abstract_limited_synchronized_opt NEW subtype_indication and_interface_list_opt 
WITH PRIVATE aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 12 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
-                             ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 12 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil nil]))))
       (private_type_declaration
        ((TYPE IDENTIFIER discriminant_part_opt IS abstract_tagged_limited_opt 
PRIVATE aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 8 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0 
ada-indent-broken ada-indent-broken 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 8 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
ada-indent-broken ada-indent-broken nil
+                                 nil]))))
       (procedure_call_statement
        ((name SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-end])
-      (wisi-indent-action [(wisi-hanging 0 ada-indent-broken) 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-end])
+      (wisi-indent-action [(wisi-hanging nil ada-indent-broken) nil]))))
       (procedure_specification
        ((PROCEDURE name parameter_profile_opt )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name])
-      (wisi-containing-action 1 3) ;; for goto-declaration-start
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken]))))
+        (progn
+        (wisi-statement-action [1 statement-start])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken]))))
       (proper_body
        ((subprogram_body ))
        ((package_body ))
@@ -1258,28 +1302,30 @@
        ((protected_body )))
       (protected_body
        ((PROTECTED BODY IDENTIFIER aspect_specification_opt IS 
protected_operation_item_list_opt END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 5 motion 9 
statement-end])
-      (wisi-containing-action 1 6)
-      (wisi-motion-action [1 5 9])
-      (wisi-face-apply-action [3 nil font-lock-type-face 8 nil 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 0 0 
ada-indent 0 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-motion-action [1 5 9])
+        (wisi-face-apply-action [3 nil font-lock-type-face 8 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil nil 
ada-indent nil nil nil]))))
       (protected_body_stub
        ((PROTECTED BODY IDENTIFIER IS SEPARATE aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil]))))
       (protected_definition
        ((declarative_part_opt PRIVATE declarative_part_opt END identifier_opt )
-        (progn
-      (wisi-statement-action [2 motion])
-      (wisi-face-apply-action [5 nil font-lock-type-face])
-      (wisi-indent-action [[ada-indent ada-indent] 0 [ada-indent ada-indent] 0 
0])))
+        (progn
+      (wisi-statement-action [2 motion])
+      (wisi-face-apply-action [5 nil font-lock-type-face])
+      (wisi-indent-action [[ada-indent ada-indent] nil [ada-indent ada-indent] 
nil nil])))
        ((declarative_part_opt END identifier_opt )
-        (progn
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [[ada-indent ada-indent] 0 0]))))
+        (progn
+      (wisi-face-apply-action [3 nil font-lock-type-face])
+      (wisi-indent-action [[ada-indent ada-indent] nil nil]))))
       (protected_operation_item
        ((subprogram_declaration ))
        ((subprogram_body ))
@@ -1298,60 +1344,62 @@
        (()))
       (protected_type_declaration
        ((PROTECTED TYPE IDENTIFIER discriminant_part_opt 
aspect_specification_opt IS NEW interface_list WITH protected_definition 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 6 motion 9 motion 11 
statement-end])
-      (wisi-containing-action 1 10)
-      (wisi-motion-action [1 6 [10 PRIVATE] 11])
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0
-                           ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 6 motion 9 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 10)
+        (wisi-motion-action [1 6 [10 PRIVATE] 11])
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil])))
        ((PROTECTED TYPE IDENTIFIER discriminant_part_opt 
aspect_specification_opt IS protected_definition SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 6 motion 8 
statement-end])
-      (wisi-containing-action 1 7)
-      (wisi-motion-action [1 6 [7 PRIVATE] 8])
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 [0 ada-indent] 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 6 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 7)
+        (wisi-motion-action [1 6 [7 PRIVATE] 8])
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [nil ada-indent] nil nil]))))
       (qualified_expression
        ((name tick aggregate )
-        (progn
-      (wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 0 (if ada-indent-hanging-rel-exp
-                                   (wisi-anchored 1 ada-indent-broken)
+        (progn
+      (wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil nil (if ada-indent-hanging-rel-exp
+                                   (wisi-anchored 1 ada-indent-broken)
                                  (wisi-anchored% 1 ada-indent-broken))]))))
       (quantified_expression
        ((FOR quantifier iterator_specification EQUAL_GREATER expression_opt )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored% 4 ada-indent-broken)])))
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored% 4 ada-indent-broken)])))
       (quantifier
        ((ALL ))
        ((SOME )))
       (raise_expression
        ((RAISE name WITH expression_opt )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken)]))
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken)]))
        ((RAISE name )))
       (raise_statement
        ((RAISE name WITH expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 motion 5 statement-end])
-      (wisi-containing-action 1 4)
-      ;; test/ada_mode-nominal.adb
-      ;; raise Constraint_Error with
-      ;;   "help " &
-      ;;   "me!";
-      ;;
-      ;; raise Constraint_Error
-      ;;   with Integer'Image (1) &
-      ;;   "help!";
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken) 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 4 motion 5 statement-end])
+      (wisi-containing-action 1 4)
+      ;; test/ada_mode-nominal.adb
+      ;; raise Constraint_Error with
+      ;;   "help " &
+      ;;   "me!";
+      ;;
+      ;; raise Constraint_Error
+      ;;   with Integer'Image (1) &
+      ;;   "help!";
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken) nil])))
        ((RAISE name SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-indent-action [0 ada-indent-broken 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-indent-action [nil ada-indent-broken nil])))
        ((RAISE SEMICOLON )
         (wisi-statement-action [1 statement-start 2 statement-end])))
       (range_g
        ((name tick RANGE LEFT_PAREN expression_opt RIGHT_PAREN )
-        (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored 4 1) (wisi-anchored 4 0)]))
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored 4 1) (wisi-anchored 4 0)]))
        ((name tick RANGE ))
        ((simple_expression DOT_DOT simple_expression )))
       (range_list
@@ -1362,22 +1410,22 @@
        (()))
       (record_definition
        ((RECORD component_list_opt END RECORD )
-        (wisi-indent-action [[(ada-indent-record* 'TYPE 1 0) 
(ada-indent-record* 'TYPE 1 ada-indent)]
-                         [(ada-indent-record* 'TYPE 1 ada-indent) 
(ada-indent-record* 'TYPE 1 ada-indent)]
-                         (ada-indent-record* 'TYPE 1 0)
-                         0]))
+        (wisi-indent-action [[(ada-indent-record* 'TYPE 1 0) 
(ada-indent-record* 'TYPE 1 ada-indent)]
+                         [(ada-indent-record* 'TYPE 1 ada-indent) 
(ada-indent-record* 'TYPE 1 ada-indent)]
+                         (ada-indent-record* 'TYPE 1 0)
+                         nil]))
        ((NULL RECORD )))
       (record_representation_clause
        ((FOR name USE RECORD mod_clause_opt component_clause_list END RECORD 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken
-                             (ada-indent-record 1 4 0)
-                             (ada-indent-record 1 4 ada-indent)
-                             (ada-indent-record 1 4 ada-indent)
-                             (ada-indent-record 1 4 0)
-                             0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken
+                             (ada-indent-record 1 4 0)
+                             (ada-indent-record 1 4 ada-indent)
+                             (ada-indent-record 1 4 ada-indent)
+                             (ada-indent-record 1 4 0)
+                             nil nil]))))
       (relation_and_list
        ((relation_and_list AND relation ))
        ((relation AND relation )))
@@ -1418,14 +1466,14 @@
         (wisi-statement-action [1 statement-start 3 statement-end])))
       (result_profile
        ((RETURN null_exclusion_opt name_opt )
-        (progn
-      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action* 1
-                           [0
-                            (wisi-anchored* 1 ada-indent-broken)
+        (progn
+      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action* 1
+                           [nil
+                            (wisi-anchored* 1 ada-indent-broken)
                             (wisi-anchored* 1 ada-indent-broken)])))
        ((RETURN access_definition )
-        (wisi-indent-action* 1 [0 (wisi-anchored*- 1 ada-indent-broken)])))
+        (wisi-indent-action* 1 [nil (wisi-anchored*- 1 ada-indent-broken)])))
       (return_subtype_indication
        ((subtype_indication ))
        ((access_definition )))
@@ -1440,39 +1488,39 @@
         (wisi-face-mark-action [1 prefix])))
       (selective_accept
        ((SELECT select_alternative_list_opt ELSE sequence_of_statements_opt 
END SELECT SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-motion-action [1 [2 OR WHEN] 3 7])
-      (wisi-indent-action [[0 ada-indent] [0 ada-indent] [0 ada-indent] 
[ada-indent ada-indent] 0 0 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 [2 OR WHEN] 3 7])
+      (wisi-indent-action [[nil ada-indent] [nil ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))
        ((SELECT select_alternative_list_opt END SELECT SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-motion-action [1 [2 OR WHEN] 5])
-      (wisi-indent-action [[0 ada-indent] [0 ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-motion-action [1 [2 OR WHEN] 5])
+      (wisi-indent-action [[nil ada-indent] [nil ada-indent] nil nil nil]))))
       (select_alternative
        ((WHEN expression_opt EQUAL_GREATER accept_statement 
sequence_of_statements_opt )
-        (progn
-      (wisi-statement-action [1 motion])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken ada-indent 
ada-indent])))
+        (progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken ada-indent 
ada-indent])))
        ((WHEN expression_opt EQUAL_GREATER TERMINATE SEMICOLON )
-        (progn
-      (wisi-statement-action [1 motion 4 statement-start 5 statement-end])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken ada-indent 
0])))
+        (progn
+      (wisi-statement-action [1 motion 4 statement-start 5 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken ada-indent 
nil])))
        ((WHEN expression_opt EQUAL_GREATER delay_alternative )
-        (progn
-      (wisi-statement-action [1 motion])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken ada-indent])))
+        (progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent])))
        ((accept_statement sequence_of_statements_opt ))
        ((TERMINATE SEMICOLON )
         (wisi-statement-action [1 statement-start 2 statement-end]))
        ((delay_alternative )))
       (select_alternative_list
        ((select_alternative_list OR select_alternative )
-        (progn
-      (wisi-statement-action [2 motion])
-      (wisi-indent-action [0 0 ada-indent])))
+        (progn
+      (wisi-statement-action [2 motion])
+      (wisi-indent-action [nil nil ada-indent])))
        ((select_alternative )
         (wisi-indent-action [ada-indent])))
       (select_alternative_list_opt
@@ -1494,18 +1542,18 @@
        ((term_list )))
       (simple_return_statement
        ((RETURN expression_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-indent-action [0 ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-indent-action [nil ada-indent-broken nil]))))
       (simple_statement
        ((NULL SEMICOLON )
         (wisi-statement-action [1 statement-start 2 statement-end]))
        ((assignment_statement ))
        ((exit_statement ))
        ((GOTO IDENTIFIER SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
       (wisi-face-apply-action [2 nil font-lock-constant-face])))
        ((procedure_call_statement ))
        ((simple_return_statement ))
@@ -1517,59 +1565,66 @@
        ((pragma_g )))
       (single_protected_declaration
        ((PROTECTED IDENTIFIER aspect_specification_opt IS NEW interface_list 
WITH protected_definition SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 4 motion 7 motion 9 
statement-end])
-      (wisi-containing-action 1 8)
-      (wisi-motion-action [1 4 7 [8 PRIVATE] 9])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken 0 0 ada-indent-broken 
ada-indent-broken ada-indent-broken 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 7 motion 9 
statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 4 7 [8 PRIVATE] 9])
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil
+                                 nil])))
        ((PROTECTED IDENTIFIER aspect_specification_opt IS protected_definition 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 name 4 motion 6 
statement-end])
-      (wisi-containing-action 1 5)
-      (wisi-motion-action [1 4 [5 PRIVATE] 6])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken 0 [0 ada-indent] 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5)
+        (wisi-motion-action [1 4 [5 PRIVATE] 6])
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil [nil ada-indent] nil 
nil]))))
       (single_task_declaration
        ((TASK IDENTIFIER aspect_specification_opt IS NEW interface_list WITH 
task_definition END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 motion 7 motion 11 
statement-end])
-      (wisi-containing-action 1 8)
-      (wisi-motion-action [1 4 [8 PRIVATE] 11])
-      (wisi-face-apply-action [2 nil font-lock-type-face 9 nil 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken 0 0 ada-indent-broken 
ada-indent-broken ada-indent-broken 0 0 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 7 motion 11 
statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 4 [8 PRIVATE] 11])
+        (wisi-face-apply-action [2 nil font-lock-type-face 9 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil
+                                 nil nil nil])))
        ((TASK IDENTIFIER aspect_specification_opt IS task_definition END 
identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 motion 8 statement-end])
-      (wisi-containing-action 1 5)
-      (wisi-motion-action [1 4 [5 PRIVATE] 8])
-      (wisi-face-apply-action [2 nil font-lock-type-face 6 nil 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken 0 [0 ada-indent] 0 0 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 4 motion 8 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5)
+        (wisi-motion-action [1 4 [5 PRIVATE] 8])
+        (wisi-face-apply-action [2 nil font-lock-type-face 6 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil [nil ada-indent] nil 
nil nil nil])))
        ((TASK IDENTIFIER aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 4 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil]))))
       (statement
        ((goto_label ))
        ((simple_statement ))
        ((compound_statement )))
       (subprogram_body
        ((overriding_indicator_opt subprogram_specification 
aspect_specification_opt IS declarative_part_opt BEGIN 
handled_sequence_of_statements END name_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 4 motion 
6 motion 10 statement-end])
-      (wisi-containing-action 2 4)
-      (wisi-containing-action 4 5) ;; for goto_declarative_region_start
-      (wisi-containing-action 2 7)
-      (wisi-motion-action [1 [2 FUNCTION PROCEDURE] 4 6 10])
-      (wisi-face-apply-action [9 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 [0 ada-indent] 0 0 [ada-indent ada-indent]
-                             0 [ada-indent ada-indent] 0 ada-indent-broken 
0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 4 motion 
6 motion 10 statement-end])
+      (wisi-containing-action 2 4)
+      (wisi-containing-action 4 5) ;; for goto_declarative_region_start
+      (wisi-containing-action 2 7)
+      (wisi-motion-action [1 [2 FUNCTION PROCEDURE] 4 6 10])
+      (wisi-face-apply-action [9 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil [nil ada-indent] nil nil [ada-indent ada-indent]
+                             nil [ada-indent ada-indent] nil ada-indent-broken 
nil]))))
       (subprogram_body_stub
        ((overriding_indicator_opt subprogram_specification IS SEPARATE 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
-      (wisi-indent-action [0 0 0 ada-indent-broken ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil nil ada-indent-broken ada-indent-broken 
nil]))))
       (subprogram_declaration
        ((overriding_indicator_opt subprogram_specification 
aspect_specification_opt SEMICOLON )
         (wisi-statement-action [1 statement-start 2 statement-override 4 
statement-end])))
@@ -1580,19 +1635,20 @@
        ((NULL )))
       (subprogram_renaming_declaration
        ((overriding_indicator_opt subprogram_specification RENAMES name 
aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
-      (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 0 (ada-indent-renames 2) ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil nil (ada-indent-renames 2) ada-indent-broken 
ada-indent-broken nil]))))
       (subprogram_specification
        ((procedure_specification ))
        ((function_specification )))
       (subtype_declaration
        ((SUBTYPE IDENTIFIER IS subtype_indication aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 6 statement-end])
-      (wisi-face-apply-action [2 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil]))))
       (subtype_indication
        ((NOT NULL name constraint )
         (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))
@@ -1604,54 +1660,60 @@
         (wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face])))
       (subunit
        ((SEPARATE LEFT_PAREN name RIGHT_PAREN proper_body )
-        (progn
-      (wisi-statement-action [1 statement-start 5 motion])
-      (wisi-indent-action [0 ada-indent-broken (wisi-anchored 2 1) 
(wisi-anchored 2 0) 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 5 motion])
+      (wisi-indent-action [nil ada-indent-broken (wisi-anchored 2 1) 
(wisi-anchored 2 0) nil]))))
       (task_body
        ((TASK BODY IDENTIFIER aspect_specification_opt IS declarative_part_opt 
BEGIN handled_sequence_of_statements END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 5 motion 7 motion 11 
statement-end])
-      (wisi-containing-action 1 6)
-      (wisi-containing-action 1 8)
-      (wisi-motion-action [1 5 7 11])
-      (wisi-face-apply-action [3 nil font-lock-type-face 10 nil 
font-lock-type-face])
-      (wisi-indent-action [0 0 ada-indent-broken 0 0 [ada-indent ada-indent]
-                             0 [ada-indent ada-indent] 0 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 5 motion 7 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 5 7 11])
+        (wisi-face-apply-action [3 nil font-lock-type-face 10 nil 
font-lock-type-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil nil [ada-indent 
ada-indent]
+                               nil [ada-indent ada-indent] nil nil nil]))))
       (task_body_stub
        ((TASK BODY IDENTIFIER IS SEPARATE aspect_specification_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [0 0 ada-indent-broken 0 ada-indent-broken 
ada-indent-broken 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken nil]))))
       (task_definition
        ((declarative_part_opt PRIVATE declarative_part_opt )
-        (progn
-      (wisi-statement-action [2 motion])
-      (wisi-containing-action 2 3)
-      (wisi-indent-action [[ada-indent ada-indent] 0 [ada-indent 
ada-indent]])))
+        (progn
+      (wisi-statement-action [2 motion])
+      (wisi-containing-action 2 3)
+      (wisi-indent-action [[ada-indent ada-indent] nil [ada-indent 
ada-indent]])))
        ((declarative_part_opt )
         (wisi-indent-action [[ada-indent ada-indent]])))
       (task_type_declaration
        ((TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
IS NEW interface_list WITH task_definition END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 6 motion 9 motion 13 
statement-end])
-      (wisi-containing-action 1 10)
-      (wisi-motion-action [1 6 9 [10 PRIVATE] 13])
-      (wisi-face-apply-action [3 nil font-lock-type-face 12 nil 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0
-                             ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 6 motion 9 motion 13 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 10)
+        (wisi-motion-action [1 6 9 [10 PRIVATE] 13])
+        (wisi-face-apply-action [3 nil font-lock-type-face 12 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil nil nil])))
        ((TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
IS task_definition END identifier_opt SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 6 motion 10 
statement-end])
-      (wisi-containing-action 1 7)
-      (wisi-face-apply-action [3 nil font-lock-type-face 9 nil 
font-lock-type-face])
-      (wisi-motion-action [1 6 [7 PRIVATE] 10])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 [0 ada-indent] 0 0 0 0])))
+        (progn
+        (wisi-statement-action [1 statement-start 6 motion 10 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 7)
+        (wisi-face-apply-action [3 nil font-lock-type-face 9 nil 
font-lock-type-face])
+        (wisi-motion-action [1 6 [7 PRIVATE] 10])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [nil ada-indent] nil nil nil
+                                 nil])))
        ((TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 name 6 statement-end])
-      (wisi-face-apply-action [3 nil font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-broken 0 0]))))
+        (progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil]))))
       (term
        ((term multiplying_operator factor ))
        ((factor )))
@@ -1662,11 +1724,11 @@
        ((TICK_1 )))
       (timed_entry_call
        ((SELECT entry_call_alternative OR delay_alternative END SELECT 
SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 motion 6 statement-end])
-      (wisi-containing-action 1 2)
-      (wisi-containing-action 1 4)
-      (wisi-indent-action [[0 ada-indent] [ada-indent ada-indent] [0 
ada-indent] [ada-indent ada-indent] 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 motion 6 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-indent-action [nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil]))))
       (triggering_alternative
        ((procedure_call_statement sequence_of_statements_opt ))
        ((name sequence_of_statements_opt ))
@@ -1690,59 +1752,59 @@
        ((interface_type_definition )))
       (variant_part
        ((CASE direct_name_opt IS variant_list END CASE SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 7 statement-end])
-      (wisi-containing-action 1 4) ;; for goto-declaration-start
-      (wisi-indent-action [0 ada-indent-broken 0 ada-indent-when 0 0 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken nil ada-indent-when nil nil 
nil]))))
       (variant_list
        ((variant_list variant ))
        ((variant )))
       (variant
        ((WHEN discrete_choice_list EQUAL_GREATER component_list_opt )
-        (progn
-      (wisi-statement-action [1 motion])
-      ;; ada-indent-when applied in variant_part
-      (wisi-indent-action [0 (wisi-hanging 0 ada-indent-broken) ada-indent 
[ada-indent ada-indent]]))))
+        (progn
+      (wisi-statement-action [1 motion])
+      ;; ada-indent-when applied in variant_part
+      (wisi-indent-action [nil (wisi-hanging nil ada-indent-broken) ada-indent 
[ada-indent ada-indent]]))))
       (unary_adding_operator
        ((PLUS ))
        ((MINUS )))
       (use_clause
        ((USE ALL TYPE name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-use 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-use nil])))
        ((USE TYPE name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-type-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-use 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-use nil])))
        ((USE name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-use 0]))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-use nil]))))
       (with_clause
        ((LIMITED PRIVATE WITH name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 5 statement-end])
-      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-broken 
ada-indent-with 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-with nil])))
        ((LIMITED WITH name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-with 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-with nil])))
        ((PRIVATE WITH name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 4 statement-end])
-      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-broken ada-indent-with 0])))
+        (progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-with nil])))
        ((WITH name_list SEMICOLON )
-        (progn
-      (wisi-statement-action [1 statement-start 3 statement-end])
-      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
-      (wisi-indent-action [0 ada-indent-with 0])))))
+        (progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-with nil])))))
      [((default . error) (ACCEPT .  1) (ABORT .  2) (BEGIN . (block_label_opt 
. 1)) (CASE .  3) (DECLARE . (block_label_opt . 1)) (DELAY .  4) (ENTRY . 
(overriding_indicator_opt . 2)) (EXIT .  5) (FOR . ( 6 (block_label_opt . 1))) 
(FUNCTION . (overriding_indicator_opt . 2)) (GENERIC .  8) (GOTO .  9) (IF .  
10) (LIMITED .  11) (LOOP . (block_label_opt . 1)) (NOT .  12) (NULL .  13) 
(OVERRIDING .  14) (PACKAGE .  15) (PRAGMA .  16) (PRIVATE .  17) (PROCEDURE . 
(overriding_indicator_opt .  [...]
       ((default . error) (IDENTIFIER .  118))
       ((default . error) (IDENTIFIER .  119) (STRING_LITERAL .  33) 
(CHARACTER_LITERAL .  34))
diff --git a/packages/ada-mode/ada-mode.el b/packages/ada-mode/ada-mode.el
index ff5edfc..36a4c59 100644
--- a/packages/ada-mode/ada-mode.el
+++ b/packages/ada-mode/ada-mode.el
@@ -6,8 +6,8 @@
 ;; Maintainer: Stephen Leake <address@hidden>
 ;; Keywords: languages
 ;;  ada
-;; Version: 6.1.0
-;; package-requires: ((wisi "2.1.0") (cl-lib "1.0") (emacs "25.0"))
+;; Version: 6.1.1
+;; package-requires: ((wisi "2.1.1") (cl-lib "1.0") (emacs "25.0"))
 ;; url: http://www.nongnu.org/ada-mode/
 ;;
 ;; (Gnu ELPA requires single digits between dots in versions)
@@ -169,7 +169,7 @@
 (defun ada-mode-version ()
   "Return Ada mode version."
   (interactive)
-  (let ((version-string "6.1.0"))
+  (let ((version-string "6.1.1"))
     ;; must match:
     ;; ada-mode.texi
     ;; README-ada-mode
@@ -190,14 +190,16 @@ before file local variables are processed.")
   :group 'languages)
 
 (defcustom ada-auto-case t
-  ;; can be per-buffer
   "Buffer-local value that may override project variable `auto_case'.
 Global value is default for project variable `auto_case'.
-Non-nil means automatically change case of preceding word while typing.
+t means automatically change case of preceding word while typing.
+not-upper-case means only change case if typed word is not all upper-case.
 Casing of Ada keywords is done according to `ada-case-keyword',
 identifiers are Mixed_Case."
-  :type  'boolean
-  :safe  #'booleanp)
+  :type  '(choice (const nil)
+                 (const t)
+                 (const not-upper-case))
+  :safe  (lambda (val) (memq val '(nil t not-upper-case))))
 (make-variable-buffer-local 'ada-auto-case)
 
 (defcustom ada-case-exception-file nil
@@ -323,10 +325,15 @@ slower to load on first use, but gives better error 
recovery."
   :group 'ada-indentation)
 
 (defcustom ada-process-parse-exec-opts nil
-  "List of process start options for ’ada-process-parse-exec’."
+  "List of process start options for `ada-process-parse-exec'."
   :type 'string
   :group 'ada-indentation)
 
+(defcustom ada-which-func-parse-size 30000
+  "Minimum size of the region surrounding point that is parsed for 
`which-function-mode'."
+  :type 'integer
+  :safe #'integerp)
+
 ;;;;; end of user variables
 
 (defconst ada-symbol-end
@@ -562,10 +569,10 @@ button was clicked."
     ;; Partial parse may think 'begin' is just the start of a
     ;; statement, when it's actually part of a larger declaration. So
     ;; don't indent 'begin'. Similarly for 'else'; error recovery will
-    ;; probaly insert 'if then' immediately before it
+    ;; probably insert 'if then' immediately before it
     (forward-char -1)
-    (funcall indent-line-function))
-  (forward-char 1)
+    (funcall indent-line-function)
+    (forward-char 1))
   (funcall indent-line-function))
 
 (defvar ada-indent-statement nil
@@ -635,7 +642,7 @@ Placeholders are defined by the skeleton backend."
      (valid   . (lambda () (ada-align-valid)))
      (modes   . '(ada-mode)))
     (ada-at
-     (regexp . "\\(\\s-+\\)\\(at\\)\\>")
+     (regexp . "\\(\\s-+\\)\\(at\\)\\_>")
      (valid   . (lambda () (ada-align-valid)))
      (modes . '(ada-mode))))
   "Rules to use to align different lines.")
@@ -668,7 +675,7 @@ Placeholders are defined by the skeleton backend."
      "return\\|"
      "type\\|"
      "when"
-     "\\)\\>[^_]\\)")) ;; in case "_" has punctuation syntax
+     "\\)\\_>\\)"))
   "See the variable `align-region-separate' for more information.")
 
 (defun ada-align ()
@@ -1335,7 +1342,7 @@ otherwise, capitalize words in comments and strings.
 If ’ada-auto-case’ is nil, capitalize current word."
   (interactive "P")
   (cond
-   ((or (not ada-auto-case)
+   ((or (null ada-auto-case)
        (and (not in-comment)
             (ada-in-string-or-comment-p)))
     (skip-syntax-backward "w_")
@@ -1377,21 +1384,32 @@ ARG is the prefix the user entered with 
\\[universal-argument]."
   (interactive "P")
 
   ;; character typed has not been inserted yet
-  (let ((lastk last-command-event))
+  (let ((lastk last-command-event)
+       (do-adjust nil))
+    (cond
+     ((null ada-auto-case))
+     ((eq ada-auto-case 'not-upper-case)
+      (save-excursion
+       (let* ((begin (progn (skip-syntax-backward "w_") (point)))
+              (end  (progn (skip-syntax-forward "w_") (point)))
+              (word (buffer-substring-no-properties begin end)))
+         (setq do-adjust (not (string-equal word (upcase word)))))))
+     (t
+      (setq do-adjust t)))
 
     (cond
      ((eq lastk ?\n)
-        (when ada-auto-case
+        (when do-adjust
          (ada-case-adjust lastk))
        (funcall ada-lfd-binding))
 
      ((memq lastk '(?\r return))
-      (when ada-auto-case
+      (when do-adjust
        (ada-case-adjust lastk))
       (funcall ada-ret-binding))
 
      (t
-      (when ada-auto-case
+      (when do-adjust
        (ada-case-adjust lastk))
       (self-insert-command (prefix-numeric-value arg)))
      )))
@@ -2124,7 +2142,6 @@ other file.")
 
 (defun ada-which-function (&optional include-type)
   "See `ada-which-function' variable."
-  (interactive "P")
   (when ada-which-function
     (funcall ada-which-function include-type)))
 
@@ -2164,13 +2181,13 @@ other file.")
     (funcall ada-goto-subunit-name)))
 
 (defun ada-add-log-current-function ()
-  "For `add-log-current-defun-function'; uses `ada-which-function'."
+  "For `add-log-current-defun-function'."
   ;; add-log-current-defun is typically called with point at the start
   ;; of an ediff change section, which is before the start of the
-  ;; declaration of a new item. So go to the end of the current line
-  ;; first, then call `ada-which-function'
+  ;; declaration of a new item. So go to the start of the current line
+  ;; first
   (save-excursion
-    (end-of-line 1)
+    (back-to-indentation)
     (ada-which-function t)))
 
 (defun ada-set-point-accordingly ()
@@ -2239,10 +2256,7 @@ set."
   corresponding specification.
 
 - If point is in a subprogram body or specification, position point
-  on the corresponding specification or body.
-
-If OTHER-WINDOW (set by interactive prefix) is non-nil, show the
-buffer in another window."
+  on the corresponding specification or body."
 
   ;; ff-get-file, ff-find-other file first process
   ;; ff-special-constructs, then run the following hooks:
@@ -2257,7 +2271,7 @@ buffer in another window."
   (interactive)
   (ada-check-current-project (buffer-file-name))
 
-  ;; clear ff-function-name, so it either ff-special-constructs or
+  ;; clear ff-function-name, so either ff-special-constructs or
   ;; ada-which-function will set it.
   (setq ff-function-name nil)
 
@@ -2382,7 +2396,7 @@ LINE, COLUMN are Emacs origin."
     (cond
      ((bufferp buffer)
       ;; use pop-to-buffer, so package other-frame-window works.
-      (pop-to-buffer buffer (list #'display-buffer-same-window) nil))
+      (pop-to-buffer buffer (list #'display-buffer-same-window)))
 
      ((file-exists-p file)
       (find-file file))
@@ -2651,11 +2665,9 @@ compiler-specific compilation filters."
        ))
     ))
 
-(defvar ada-goto-declaration-start #'ignore
+(defvar ada-goto-declaration-start nil
   ;; Supplied by indentation engine.
   ;;
-  ;; This is run from ff-pre-load-hook, so ff-function-name may have
-  ;; been set by ff-treat-special; don't reset it.
   "For `beginning-of-defun-function'. Function to move point to
 start of the generic, package, protected, subprogram, or task
 declaration point is currently in or just after.  Called with no
@@ -2874,9 +2886,11 @@ The paragraph is indented on the first line."
    ;; Grammar actions set `font-lock-face' property for all
    ;; non-keyword tokens that need it.
   (list
-   (list (concat "\\<" (regexp-opt ada-keywords t) "\\>") '(0 
font-lock-keyword-face))
+   (list (concat "\\_<" (regexp-opt ada-keywords t) "\\_>") '(0 
font-lock-keyword-face))
    ))
 
+(defvar which-func-functions nil) ;; which-func.el
+
 ;;;; ada-mode
 
 ;; ada-mode does not derive from prog-mode, because we need to call
@@ -2933,10 +2947,10 @@ The paragraph is indented on the first line."
 
   (set (make-local-variable 'ff-other-file-alist)
        'ada-other-file-alist)
-  (setq ff-post-load-hook    'ada-set-point-accordingly
-       ff-file-created-hook 'ada-ff-create-body)
-  (add-hook 'ff-pre-load-hook 'ada-goto-push-pos)
-  (add-hook 'ff-pre-load-hook 'ada-which-function)
+  (setq ff-post-load-hook    #'ada-set-point-accordingly
+       ff-file-created-hook #'ada-ff-create-body)
+  (add-hook 'ff-pre-load-hook #'ada-goto-push-pos)
+  (add-hook 'ff-pre-load-hook #'ada-which-function)
   (setq ff-search-directories 'compilation-search-path)
   (when (null (car compilation-search-path))
     ;; find-file doesn't handle nil in search path
@@ -2946,10 +2960,12 @@ The paragraph is indented on the first line."
   (ada-set-ff-special-constructs)
 
   (set (make-local-variable 'add-log-current-defun-function)
-       'ada-add-log-current-function)
+       #'ada-add-log-current-function)
 
-  (when (boundp 'which-func-functions)
-    (add-hook 'which-func-functions 'ada-which-function nil t))
+  ;; We set this even if which-func.el is not loaded, because if it is
+  ;; loaded later, it will use the add-log which-function, which
+  ;; forces a navigate parse.
+  (add-hook 'which-func-functions #'ada-which-function nil t)
 
   ;;  Support for align
   (add-to-list 'align-dq-string-modes 'ada-mode)
@@ -2964,7 +2980,7 @@ The paragraph is indented on the first line."
                 (modes   . '(ada-mode))))
   (add-to-list 'align-exclude-rules-list
               '(ada-solo-use
-                (regexp  . "^\\(\\s-*\\)\\<use\\>")
+                (regexp  . "^\\(\\s-*\\)\\_<use\\_>")
                 (modes   . '(ada-mode))))
 
   (setq align-mode-rules-list ada-align-rules)
diff --git a/packages/ada-mode/ada-mode.info b/packages/ada-mode/ada-mode.info
index 26b2b70..35b441f 100644
--- a/packages/ada-mode/ada-mode.info
+++ b/packages/ada-mode/ada-mode.info
@@ -22,7 +22,7 @@ END-INFO-DIR-ENTRY
 
 File: ada-mode.info,  Node: Top,  Next: Overview,  Prev: (dir),  Up: (dir)
 
-Ada Mode Version 6.1.0
+Ada Mode Version 6.1.1
 
    Copyright (C) 1999 - 2019 Free Software Foundation, Inc.
 
@@ -71,8 +71,7 @@ Installation
 
 gpr_query
 
-* Building GNATCOLL 2017::
-* Building GNATCOLL 2018::
+* Building GNATCOLL 2019::
 * Building gpr_query::
 
 Customizing Ada mode
@@ -229,13 +228,11 @@ is an AdaCore extension, not available in FSF GCC.
 must be built.  Its source code is in the 'ada-mode' Gnu ELPA package.
 
    'gpr_query' requires the 'GNATCOLL' library provided by AdaCore,
-distributed with GNAT GPL 2016 or later, and also available at Github
-(<https://github.com/AdaCore/gnatcoll>).  (The 'GNATCOLL' distributed
-with GNAT GPL 2015 does not compile cleanly).  The notes below assume
-that the compiler is installed at '$prefix', e.g.
-'/usr/local/gnat-2017', and that '$prefix/bin' is first on the 'PATH'.
-If you are running Windows, use Cygwin or mingw64 'bash' to run these
-commands.
+distributed with GNAT GPL 2017 or later, and also available at Github
+(<https://github.com/AdaCore/gnatcoll>).  The notes below assume that
+the compiler is installed at '$prefix', e.g.  '/usr/local/gnat-2019',
+and that '$prefix/bin' is first on the 'PATH'.  If you are running
+Windows, use mingw64 'bash' to run these commands.
 
    In general, 'gpr_query' should be compiled with the compiler version
 that is used to generate the user project '.ali' files; the 'ali' file
@@ -243,122 +240,29 @@ format can change with each compiler version.  
'gpr_query' creates a
 database of cross reference information; that database must be deleted
 if the compiler version changes, to force a complete rebuild.
 
-   The default binary gnatcoll distributed with GNAT GPL 2017 and 2018
-does not include the xref package, which is required by 'gpr_query'.  So
-we must build gnatcoll from sources.  The process for doing that changed
-significantly between GPL 2017 and GPL 2018.
+   The default binary gnatcoll distributed with GNAT GPL 2019 does not
+include the xref package, which is required by 'gpr_query'.  So we must
+build gnatcoll xref from sources.
 
 * Menu:
 
-* Building GNATCOLL 2017::
-* Building GNATCOLL 2018::
+* Building GNATCOLL 2019::
 * Building gpr_query::
 
 
-File: ada-mode.info,  Node: Building GNATCOLL 2017,  Next: Building GNATCOLL 
2018,  Up: gpr_query
+File: ada-mode.info,  Node: Building GNATCOLL 2019,  Next: Building gpr_query, 
 Up: gpr_query
 
-2.2.1 Building GNATCOLL 2017
+2.2.1 Building GNATCOLL 2019
 ----------------------------
 
-First install the 'libiconv' library, as follows.
+Download the gnatcoll xref source file from
+<https://github.com/AdaCore/gnatcoll-db>; click on the "clone or
+download" button, select "Download ZIP".
 
-   On many Linux distributions, use the package manager to install the
-development version of 'libiconv' (usually named 'libiconv-dev').
+   Then unpack, build, and install the required components:
 
-   On Windows, one way to get the library is to install MingW32 from the
-MSYS2 project (<http://www.msys2.org/>), use its package manger 'pacman'
-to install 'libiconv', then copy the 'libiconv' files to the GNAT
-installation:
-
-     cp d:/msys64/mingw32/include/iconv.h d:/Apps/GNAT-gpl_2017/include/
-     cp d:/msys64/mingw32/lib/libiconv.a  
d:/Apps/GNAT-gpl_2017/lib/gcc/i686-pc-mingw32/6.3.1/
-
-   Then configure by:
-
-     tar zxf ~/Downloads/gnatcoll-gpl-2017-src.tar.gz
-     cd gnatcoll-gpl-2017-src
-     ./configure --prefix=$prefix
-
-   where '$prefix' is the GNAT installation directory.
-
-   You should see at least the following lines at the end of the
-configure output:
-
-     configure:   Sqlite:                 embedded  (see --with-sqlite)
-     configure:   Iconv:                  yes (see --with-iconv)
-     configure:   Projects:               yes
-     configure:   Xref:                   yes
-
-   If you are using GNAT GPL 2016, the 'Xref' line is not present.
-
-   Then, build and install:
-
-     make
-     sudo make install
-
-   If you are debugging 'gpr_query', you may want to build an sqlite3
-executable that is compatible with the database it creates:
-
-     cd gnatcoll-gpl-2017-src/src/sqlite/amalgamation/
-     gcc -O2 -o sqlite3 shell.c sqlite3.c -ldl -lpthread
-
-
-File: ada-mode.info,  Node: Building GNATCOLL 2018,  Next: Building gpr_query, 
 Prev: Building GNATCOLL 2017,  Up: gpr_query
-
-2.2.2 Building GNATCOLL 2018
-----------------------------
-
-The default gnatcoll distributed with GNAT GPL 2018 does not include the
-xref package, which is required by 'gpr_query'.  So we must build
-gnatcoll from sources.  Here we assume you are using the 64 bit GNAT.
-
-   Download three gnatcoll source files from
-<https://libre.adacore.com/>; click on "More packages, platforms,
-versions and sources" below the main components list.  Select your
-target, click on "Sources" under the GNAT Community component.  Search
-for 'gnatcoll'; the three files are:
-
-     gnatcoll-bindings-gpl-2018-20180523-src.tar.gz
-     gnatcoll-core-gpl-2018-20180523-src.tar.gz
-     gnatcoll-db-gpl-2018-20180523-src.tar.gz
-
-   Install the 'libiconv' library, as follows:
-
-   On many Linux distributions, use the package manager to install the
-development version of 'libiconv'.  On Debian, 'iconv' is provided by
-the 'libc' package.  On Suse, it is proviced by 'glibc-devel'.  On other
-Linux distributions, it may be a separate package named 'libiconv-dev'.
-
-   On Windows, one way to get the library is to install MingW64 from the
-MSYS2 project (<http://www.msys2.org/>), use its package manger 'pacman'
-to install 'libiconv', then copy the 'libiconv' files to the GNAT
-installation:
-
-     cp d:/msys64/mingw64/include/iconv.h d:/Apps/GNAT-gpl_2018/include/
-     cp d:/msys64/mingw64/lib/libiconv.a  
d:/Apps/GNAT-gpl_2018/lib/gcc/x86_64-pc-mingw32/7.3.1/
-
-   Then unpack, build, and install the required components.  On Debian,
-we need to tell the linker where to find 'iconv' via
-'GNATCOLL_ICONV_OPT', which sets a the variable ICONV_OPT in the gpr
-file.  On Suse, ICONV_OPT must be empty, which can only be achieved by
-editing the gpr file.
-
-     tar xf ~/Downloads/gnatcoll-core-gpl-2018-20180524-src.tar.gz
-     cd gnatcoll-core-gpl-2018-src
-     make
-     make install
-     cd ..
-
-     tar xf ~/Downloads/gnatcoll-bindings-gpl-2018-20180524-src.tar.gz
-     cd gnatcoll-bindings-gpl-2018-src
-     cd iconv
-     export GNATCOLL_ICONV_OPT="-lc"
-     ./setup.py build
-     ./setup.py install
-     cd ../..
-
-     tar xf ~/Downloads/gnatcoll-db-gpl-2018-20180524-src.tar.gz
-     cd gnatcoll-db-gpl-2018-src
+     tar xf ~/Downloads/gnatcoll-db-19.2.zip
+     cd gnatcoll-db-19.2
      make -C sql
      make -C sql install
      make -C sqlite
@@ -367,9 +271,9 @@ editing the gpr file.
      make -C xref install
 
 
-File: ada-mode.info,  Node: Building gpr_query,  Prev: Building GNATCOLL 2018, 
 Up: gpr_query
+File: ada-mode.info,  Node: Building gpr_query,  Prev: Building GNATCOLL 2019, 
 Up: gpr_query
 
-2.2.3 Building 'gpr_query'
+2.2.2 Building 'gpr_query'
 --------------------------
 
 To build and install 'gpr_query', assuming the 'ada-mode-6.0.xx' GNU
@@ -1821,8 +1725,8 @@ create a new exception, you are prompted for the file to 
save it in.
 
 'C-c C-w'
      Adjust case of the word at point.  With prefix arg, adjust case
-     even if in comment.  Normally, comments are not affected by case
-     adjust.
+     even if in a comment or string.  Normally, comments and strings are
+     not affected by case adjust.
 
 'Ada | Casing | Adjust case region'
      Adjust case in the active region.
@@ -1924,7 +1828,7 @@ displays keys bound to menu operations.
 
 'C-c C-w'
      *Note Automatic casing::.  Adjust case of the word at point.  With
-     prefix arg, adjust case even if in comment.
+     prefix arg, adjust case even if in comment or string.
 
 'C-c C-x'
      *Note Moving Through Ada Code::.  Show all declarations that
@@ -2783,54 +2687,53 @@ Index
 
 Tag Table:
 Node: Top945
-Node: Overview3584
-Node: Why not LSP?4821
-Node: Installation5163
-Node: Ada Reference Manual6220
-Node: gpr_query6496
-Node: Building GNATCOLL 20178332
-Node: Building GNATCOLL 20189964
-Node: Building gpr_query12413
-Node: process parser12820
-Node: Customization13152
-Node: Slow response13652
-Node: Non-standard file names15540
-Node: Other compiler17381
-Node: Other cross-reference17960
-Node: Other customization18702
-Node: Compiling Executing21922
-Node: Compile commands22657
-Node: Compiling Examples25308
-Node: No project files26140
-Node: Set compiler options31506
-Node: Set source search path33468
-Node: Use GNAT project file35921
-Node: Use multiple GNAT project files38695
-Node: Use a Makefile41415
-Node: Compiler errors42730
-Node: Project files43547
-Node: Project file overview44574
-Node: Project file variables46118
-Node: Moving Through Ada Code50993
-Node: Identifier completion53692
-Node: Indentation54654
-Node: Statement skeletons59224
-Node: Aligning code61009
-Node: Automatic casing61954
-Node: Comment Handling64658
-Node: Key summary65177
-Node: Developer overview67804
-Node: Directory structure68172
-Node: Package organization72143
-Node: Ada mode72378
-Node: gpr mode74574
-Node: GNAT core74857
-Node: Wisi75691
-Node: OpenToken76591
-Node: ELPA77193
-Node: Savannah77803
-Node: ada-france78141
-Node: GNU Free Documentation License78381
-Node: Index103542
+Node: Overview3557
+Node: Why not LSP?4794
+Node: Installation5136
+Node: Ada Reference Manual6193
+Node: gpr_query6469
+Node: Building GNATCOLL 20198110
+Node: Building gpr_query8683
+Node: process parser9090
+Node: Customization9422
+Node: Slow response9922
+Node: Non-standard file names11810
+Node: Other compiler13651
+Node: Other cross-reference14230
+Node: Other customization14972
+Node: Compiling Executing18192
+Node: Compile commands18927
+Node: Compiling Examples21578
+Node: No project files22410
+Node: Set compiler options27776
+Node: Set source search path29738
+Node: Use GNAT project file32191
+Node: Use multiple GNAT project files34965
+Node: Use a Makefile37685
+Node: Compiler errors39000
+Node: Project files39817
+Node: Project file overview40844
+Node: Project file variables42388
+Node: Moving Through Ada Code47263
+Node: Identifier completion49962
+Node: Indentation50924
+Node: Statement skeletons55494
+Node: Aligning code57279
+Node: Automatic casing58224
+Node: Comment Handling60952
+Node: Key summary61471
+Node: Developer overview64108
+Node: Directory structure64476
+Node: Package organization68447
+Node: Ada mode68682
+Node: gpr mode70878
+Node: GNAT core71161
+Node: Wisi71995
+Node: OpenToken72895
+Node: ELPA73497
+Node: Savannah74107
+Node: ada-france74445
+Node: GNU Free Documentation License74685
+Node: Index99846
 
 End Tag Table
diff --git a/packages/ada-mode/ada-mode.texi b/packages/ada-mode/ada-mode.texi
index 3850d17..9f20977 100644
--- a/packages/ada-mode/ada-mode.texi
+++ b/packages/ada-mode/ada-mode.texi
@@ -26,7 +26,7 @@ developing GNU and promoting software freedom.''
 
 @titlepage
 @sp 10
-@title Ada Mode Version 6.1.0
+@title Ada Mode Version 6.1.1
 @page
 @vskip 0pt plus 1filll
 @insertcopying
@@ -36,7 +36,7 @@ developing GNU and promoting software freedom.''
 
 @node Top, Overview, (dir), (dir)
 
-Ada Mode Version 6.1.0
+Ada Mode Version 6.1.1
 
 @ifnottex
 @insertcopying
@@ -75,8 +75,7 @@ Installation
 
 gpr_query
 
-* Building GNATCOLL 2017::
-* Building GNATCOLL 2018::
+* Building GNATCOLL 2019::
 * Building @file{gpr_query}::
 
 Customizing Ada mode
@@ -224,13 +223,12 @@ not available in FSF GCC.
 must be built. Its source code is in the @code{ada-mode} Gnu ELPA package.
 
 @file{gpr_query} requires the @code{GNATCOLL} library provided by
-AdaCore, distributed with GNAT GPL 2016 or later, and also available at
-Github (@url{https://github.com/AdaCore/gnatcoll}). (The
-@code{GNATCOLL} distributed with GNAT GPL 2015 does not compile
-cleanly). The notes below assume that the compiler is installed at
-@file{$prefix}, e.g. @file{/usr/local/gnat-2017}, and that
-@file{$prefix/bin} is first on the @code{PATH}. If you are running
-Windows, use Cygwin or mingw64 @code{bash} to run these commands.
+AdaCore, distributed with GNAT GPL 2017 or later, and also available
+at Github (@url{https://github.com/AdaCore/gnatcoll}). The notes below
+assume that the compiler is installed at @file{$prefix},
+e.g. @file{/usr/local/gnat-2019}, and that @file{$prefix/bin} is first
+on the @code{PATH}. If you are running Windows, use mingw64
+@code{bash} to run these commands.
 
 In general, @file{gpr_query} should be compiled with the compiler
 version that is used to generate the user project @file{.ali} files;
@@ -239,134 +237,27 @@ version. @file{gpr_query} creates a database of cross 
reference
 information; that database must be deleted if the compiler version
 changes, to force a complete rebuild.
 
-The default binary gnatcoll distributed with GNAT GPL 2017 and 2018
+The default binary gnatcoll distributed with GNAT GPL 2019
 does not include the xref package, which is required by
-@file{gpr_query}. So we must build gnatcoll from sources. The process
-for doing that changed significantly between GPL 2017 and GPL 2018.
+@file{gpr_query}. So we must build gnatcoll xref from sources.
 
 @menu
-* Building GNATCOLL 2017::
-* Building GNATCOLL 2018::
+* Building GNATCOLL 2019::
 * Building @file{gpr_query}::
 @end menu
 
-@node Building GNATCOLL 2017
-@subsection Building GNATCOLL 2017
+@node Building GNATCOLL 2019
+@subsection Building GNATCOLL 2019
 
-First install the @code{libiconv} library, as follows.
+Download the gnatcoll xref source file from
+@url{https://github.com/AdaCore/gnatcoll-db}; click on the ``clone or
+download'' button, select ``Download ZIP''.
 
-On many Linux distributions, use the package manager to install the
-development version of @code{libiconv} (usually named
-@code{libiconv-dev}).
-
-On Windows, one way to get the library is to install MingW32 from the
-MSYS2 project (@url{http://www.msys2.org/}), use its package manger
-@code{pacman} to install @code{libiconv}, then copy the
-@code{libiconv} files to the GNAT installation:
-
-@example
-cp d:/msys64/mingw32/include/iconv.h d:/Apps/GNAT-gpl_2017/include/
-cp d:/msys64/mingw32/lib/libiconv.a  
d:/Apps/GNAT-gpl_2017/lib/gcc/i686-pc-mingw32/6.3.1/
-@end example
-
-Then configure by:
-
-@example
-tar zxf ~/Downloads/gnatcoll-gpl-2017-src.tar.gz
-cd gnatcoll-gpl-2017-src
-./configure --prefix=$prefix
-@end example
-
-where @code{$prefix} is the GNAT installation directory.
-
-You should see at least the following lines at the end of the
-configure output:
-
-@example
-configure:   Sqlite:                 embedded  (see --with-sqlite)
-configure:   Iconv:                  yes (see --with-iconv)
-configure:   Projects:               yes
-configure:   Xref:                   yes
-@end example
-
-If you are using GNAT GPL 2016, the @code{Xref} line is not present.
-
-Then, build and install:
-
-@example
-make
-sudo make install
-@end example
-
-If you are debugging @file{gpr_query}, you may want to build an
-sqlite3 executable that is compatible with the database it creates:
-
-@example
-cd gnatcoll-gpl-2017-src/src/sqlite/amalgamation/
-gcc -O2 -o sqlite3 shell.c sqlite3.c -ldl -lpthread
-@end example
-
-@node Building GNATCOLL 2018
-@subsection Building GNATCOLL 2018
-
-The default gnatcoll distributed with GNAT GPL 2018 does not include
-the xref package, which is required by @file{gpr_query}. So we must
-build gnatcoll from sources. Here we assume you are using the 64 bit
-GNAT.
-
-Download three gnatcoll source files from
-@url{https://libre.adacore.com/}; click on ``More packages, platforms,
-versions and sources'' below the main components list. Select your
-target, click on ``Sources'' under the GNAT Community
-component. Search for 'gnatcoll'; the three files are:
-
-@example
-gnatcoll-bindings-gpl-2018-20180523-src.tar.gz
-gnatcoll-core-gpl-2018-20180523-src.tar.gz
-gnatcoll-db-gpl-2018-20180523-src.tar.gz
-@end example
-
-Install the @code{libiconv} library, as follows:
-
-On many Linux distributions, use the package manager to install the
-development version of @code{libiconv}. On Debian, @code{iconv} is
-provided by the @code{libc} package. On Suse, it is proviced by
-@code{glibc-devel}. On other Linux distributions, it
-may be a separate package named @code{libiconv-dev}.
-
-On Windows, one way to get the library is to install MingW64 from the
-MSYS2 project (@url{http://www.msys2.org/}), use its package manger
-@code{pacman} to install @code{libiconv}, then copy the
-@code{libiconv} files to the GNAT installation:
-
-@example
-cp d:/msys64/mingw64/include/iconv.h d:/Apps/GNAT-gpl_2018/include/
-cp d:/msys64/mingw64/lib/libiconv.a  
d:/Apps/GNAT-gpl_2018/lib/gcc/x86_64-pc-mingw32/7.3.1/
-@end example
-
-Then unpack, build, and install the required components. On Debian, we
-need to tell the linker where to find @code{iconv} via
-@code{GNATCOLL_ICONV_OPT}, which sets a the variable @var{Iconv_Opt}
-in the gpr file. On Suse, @var{Iconv_Opt} must be empty, which can
-only be achieved by editing the gpr file.
+Then unpack, build, and install the required components:
 
 @example
-tar xf ~/Downloads/gnatcoll-core-gpl-2018-20180524-src.tar.gz
-cd gnatcoll-core-gpl-2018-src
-make
-make install
-cd ..
-
-tar xf ~/Downloads/gnatcoll-bindings-gpl-2018-20180524-src.tar.gz
-cd gnatcoll-bindings-gpl-2018-src
-cd iconv
-export GNATCOLL_ICONV_OPT="-lc"
-./setup.py build
-./setup.py install
-cd ../..
-
-tar xf ~/Downloads/gnatcoll-db-gpl-2018-20180524-src.tar.gz
-cd gnatcoll-db-gpl-2018-src
+tar xf ~/Downloads/gnatcoll-db-19.2.zip
+cd gnatcoll-db-19.2
 make -C sql
 make -C sql install
 make -C sqlite
@@ -1928,7 +1819,8 @@ Other keys and menu entries are defined:
 @item C-c C-w
 @findex ada-case-adjust-at-point
 Adjust case of the word at point. With prefix arg, adjust case even if
-in comment. Normally, comments are not affected by case adjust.
+in a comment or string. Normally, comments and strings are not
+affected by case adjust.
 
 @item Ada | Casing | Adjust case region
 Adjust case in the active region.
@@ -2041,7 +1933,7 @@ Show all references to the identifier surrounding point.
 @item C-c C-w
 @xref{Automatic casing}.
 Adjust case of the word at point. With prefix arg, adjust case even if
-in comment.
+in comment or string.
 
 @item C-c C-x
 @xref{Moving Through Ada Code}.
diff --git a/packages/ada-mode/ada-process.el b/packages/ada-mode/ada-process.el
index c75e867..6f98540 100644
--- a/packages/ada-mode/ada-process.el
+++ b/packages/ada-mode/ada-process.el
@@ -362,4 +362,129 @@
    nil
    ])
 
+(defconst ada-elisp-keyword-table-raw
+  '(
+   ("abs" . ABS)
+   ("accept" . ACCEPT)
+   ("abort" . ABORT)
+   ("abstract" . ABSTRACT)
+   ("access" . ACCESS)
+   ("aliased" . ALIASED)
+   ("all" . ALL)
+   ("and" . AND)
+   ("array" . ARRAY)
+   ("at" . AT)
+   ("begin" . BEGIN)
+   ("body" . BODY)
+   ("case" . CASE)
+   ("constant" . CONSTANT)
+   ("declare" . DECLARE)
+   ("delay" . DELAY)
+   ("delta" . DELTA)
+   ("digits" . DIGITS)
+   ("do" . DO)
+   ("else" . ELSE)
+   ("elsif" . ELSIF)
+   ("end" . END)
+   ("entry" . ENTRY)
+   ("exception" . EXCEPTION)
+   ("exit" . EXIT)
+   ("for" . FOR)
+   ("function" . FUNCTION)
+   ("generic" . GENERIC)
+   ("goto" . GOTO)
+   ("if" . IF)
+   ("in" . IN)
+   ("interface" . INTERFACE)
+   ("is" . IS)
+   ("limited" . LIMITED)
+   ("loop" . LOOP)
+   ("mod" . MOD)
+   ("new" . NEW)
+   ("not" . NOT)
+   ("null" . NULL)
+   ("of" . OF)
+   ("or" . OR)
+   ("others" . OTHERS)
+   ("out" . OUT)
+   ("overriding" . OVERRIDING)
+   ("package" . PACKAGE)
+   ("pragma" . PRAGMA)
+   ("private" . PRIVATE)
+   ("procedure" . PROCEDURE)
+   ("protected" . PROTECTED)
+   ("raise" . RAISE)
+   ("range" . RANGE)
+   ("record" . RECORD)
+   ("rem" . REM)
+   ("renames" . RENAMES)
+   ("requeue" . REQUEUE)
+   ("return" . RETURN)
+   ("reverse" . REVERSE)
+   ("separate" . SEPARATE)
+   ("select" . SELECT)
+   ("some" . SOME)
+   ("subtype" . SUBTYPE)
+   ("synchronized" . SYNCHRONIZED)
+   ("tagged" . TAGGED)
+   ("task" . TASK)
+   ("terminate" . TERMINATE)
+   ("then" . THEN)
+   ("type" . TYPE)
+   ("until" . UNTIL)
+   ("use" . USE)
+   ("when" . WHEN)
+   ("while" . WHILE)
+   ("with" . WITH)
+   ("xor" . XOR)
+   ))
+
+(defconst ada-elisp-token-table-raw
+  '(
+   ("left-paren"
+    (LEFT_PAREN . "(")
+    )
+   ("right-paren"
+    (RIGHT_PAREN . ")")
+    )
+   ("punctuation"
+    (AMPERSAND . "&")
+    (BAR . "|")
+    (BOX . "<>")
+    (COLON . ":")
+    (COLON_EQUAL . ":=")
+    (COMMA . ",")
+    (DOT . ".")
+    (DOT_DOT . "..")
+    (EQUAL . "=")
+    (EQUAL_GREATER . "=>")
+    (GREATER . ">")
+    (GREATER_EQUAL . ">=")
+    (GREATER_GREATER . ">>")
+    (LESS . "<")
+    (LESS_EQUAL . "<=")
+    (LESS_LESS . "<<")
+    (MINUS . "-")
+    (PLUS . "+")
+    (SEMICOLON . ";")
+    (SLASH . "/")
+    (SLASH_EQUAL . "/=")
+    (STAR . "*")
+    (STAR_STAR . "**")
+    (TICK_1 . "'")
+    )
+   ("number"
+    (NUMERIC_LITERAL ada-wisi-number-p)
+    )
+   ("symbol"
+    (IDENTIFIER . "")
+    )
+   ("string-double"
+    (STRING_LITERAL . "")
+    )
+   ("string-single"
+    (CHARACTER_LITERAL . "")
+    )
+   ))
+
 (provide 'ada-process)
diff --git a/packages/ada-mode/ada-wisi-elisp-parse.el 
b/packages/ada-mode/ada-wisi-elisp-parse.el
index 1a1e2c3..d2facb1 100644
--- a/packages/ada-mode/ada-wisi-elisp-parse.el
+++ b/packages/ada-mode/ada-wisi-elisp-parse.el
@@ -26,7 +26,7 @@
 
 (defun ada-indent-aggregate ()
   ;; Not ada-wisi-elisp-parse--indent-aggregate to match existing grammar files
-  "Return indent for an aggregate (0 or -1)."
+  "Return indent for an aggregate (nil or -1)."
   ;; In our grammar, 'aggregate' can be an Ada aggregate, or a
   ;; parenthesized expression.
   ;;
@@ -49,7 +49,7 @@
          ;;             and then C)
          ;;            or else
          ;;            (D
-         0)
+         nil)
 
         (t ;; if_expression
          (- ada-indent-broken ada-indent))
@@ -73,7 +73,7 @@
          ;; test/ada_mode-long_paren.adb
          ;; RX_Enable                     =>
          ;;   (RX_Torque_Subaddress |
-         0)
+         nil)
         ))
 
       (THEN
@@ -84,14 +84,14 @@
          ;; test/ada_mode-parens.adb
          ;;             and then
          ;;             (C)
-         0)
+         nil)
 
         (t
          ;; in elsif_expression_item or if_expression
          (- ada-indent-broken ada-indent))))
 
       (t
-       0))
+       nil))
     ))
 
 (defun ada-wisi-elisp-parse--indent-hanging (tok delta1 delta2 option 
no-accumulate)
diff --git a/packages/ada-mode/ada-wisi.el b/packages/ada-mode/ada-wisi.el
index 09b4c73..2f8f5e4 100644
--- a/packages/ada-mode/ada-wisi.el
+++ b/packages/ada-mode/ada-wisi.el
@@ -31,6 +31,10 @@
 (require 'wisi-elisp-lexer)
 (require 'wisi-process-parse)
 
+(defconst ada-wisi-language-protocol-version "1"
+  "Defines language-specific parser parameters.
+Must match wisi-ada.ads Language_Protocol_Version.")
+
 (defun ada-wisi-comment-gnat (indent after)
   "Modify INDENT to match gnat rules. Return new indent.
 INDENT must be indent computed by the normal indentation
@@ -241,10 +245,7 @@ For `wisi-indent-calculate-functions'.
                      (wisi-forward-cache)))
 
       (when (eq (wisi-cache-nonterm cache) 'subunit)
-       (wisi-forward-find-class 'name (point-max)) ;; parent name
-       (wisi-forward-token)
-       (wisi-forward-find-class 'name (point-max)) ;; subunit name
-       (setq name-pos (point)))
+       (setq name-pos (car (wisi-next-name-region))))
       )
     (when name-pos
       (goto-char name-pos))
@@ -254,7 +255,10 @@ For `wisi-indent-calculate-functions'.
   "For `ada-goto-declaration-start', which see.
 Also return cache at start."
   (wisi-validate-cache (point-min) (point-max) t 'navigate)
+  (ada-wisi-goto-declaration-start-1 include-type))
 
+(defun ada-wisi-goto-declaration-start-1 (include-type)
+  "Subroutine of `ada-wisi-goto-declaration-start'."
   (let ((cache (wisi-get-cache (point)))
        (done nil))
     (unless cache
@@ -282,6 +286,7 @@ Also return cache at start."
                     (eq (wisi-cache-token cache) 'PROTECTED))
 
                    ((abstract_subprogram_declaration
+                     expression_function_declaration
                      subprogram_body
                      subprogram_declaration
                      subprogram_renaming_declaration
@@ -309,46 +314,38 @@ Also return cache at start."
   (wisi-validate-cache (point-min) (point-max) t 'navigate)
 
   (let ((done nil)
-       (first t)
        start-pos
        (in-package-spec nil)
-       (cache
-        (or
-         (wisi-get-cache (point))
-         ;; we use forward-cache here, to handle the case where point is after 
a subprogram declaration:
-         ;; declare
-         ;;     ...
-         ;;     function ... is ... end;
-         ;;     <point>
-         ;;     function ... is ... end;
-         (wisi-forward-cache))))
-
-    ;; If this is called with point in a comment after 'is', then the
-    ;; declarative region starts after the comment; don't hang in a
-    ;; package spec.
-    (setq start-pos (point))
-    (while (not done)
-      (if (and (or (not in-package-spec)
-                  (< (point) start-pos))
-              (ada-wisi-declarative-region-start-p cache))
-         (progn
-           (wisi-forward-token)
-           (setq done t))
-       (cl-case (wisi-cache-class cache)
-         ((motion statement-end)
-          (goto-char
-           (or (wisi-cache-prev cache)
-               (wisi-cache-containing cache)))
-          (setq cache (wisi-get-cache (point))))
-
-         (statement-start
-          (if first
-              ;; This is the cache at or after point when this
-              ;; command was invoked; we want the declarative region
-              ;; of the containing statement, not the declarative
-              ;; region of this statement.
-              (setq cache (wisi-goto-containing cache t))
-
+       (cache (or (wisi-get-cache (point))
+                  (wisi-backward-cache))))
+
+    ;; We use backward-cache, not forward-cache, to handle the case
+    ;; where point is in the whitespace or comment before a block; we
+    ;; want the containing block, not the next block.
+
+    (when cache ;; nil at bob
+      ;; If this is called with point in a comment after 'is', then the
+      ;; declarative region starts after the comment; don't hang in a
+      ;; package spec.
+      (setq start-pos (point))
+      (while (not done)
+       (if (and (or (not in-package-spec)
+                    (< (point) start-pos))
+                (ada-wisi-declarative-region-start-p cache))
+           (progn
+             (wisi-forward-token)
+             (setq done t))
+         (cl-case (wisi-cache-class cache)
+           (motion
+            (goto-char (wisi-cache-prev cache))
+            (setq cache (wisi-get-cache (point))))
+
+           (statement-end
+            (goto-char (wisi-cache-containing cache));; statement-start
+            (goto-char (wisi-cache-containing (wisi-get-cache (point))));; 
containing scope
+            (setq cache (wisi-get-cache (point))))
+
+           (statement-start
             (cl-case (wisi-cache-nonterm cache)
               (package_declaration
                (setq in-package-spec t)
@@ -370,18 +367,17 @@ Also return cache at start."
 
               (t
                (setq cache (wisi-goto-containing cache t)))
-              )))
+              ))
 
-         (t
-          (setq cache (wisi-goto-containing cache t)))
-         ))
-      (setq first nil))
+           (t
+            (setq cache (wisi-goto-containing cache t)))
+           )))
 
-    ;; point is at start of first code statement after
-    ;; declaration-start keyword and comment; move back to end of
-    ;; keyword.
-    (while (forward-comment -1))
-    ))
+      ;; point is at start of first code statement after
+      ;; declaration-start keyword and comment; move back to end of
+      ;; keyword.
+      (while (forward-comment -1))
+      )))
 
 (defun ada-wisi-in-paramlist-p (&optional parse-result)
   "For `ada-in-paramlist-p'."
@@ -403,10 +399,7 @@ Also return cache at start."
 
   (let* ((begin (point))
         (end (wisi-cache-end (wisi-get-cache (point))))
-        (cache (wisi-forward-find-class 'name end))
-        (name (buffer-substring-no-properties
-               (point)
-               (+ (point) (wisi-cache-last cache)))))
+        (name (wisi-next-name)))
     (goto-char end)
     (newline)
     (insert " is begin\n\nend ");; legal syntax; parse does not fail
@@ -533,8 +526,7 @@ Also return cache at start."
 
 (defun ada-wisi-which-function-1 (keyword add-body)
   "Used in `ada-wisi-which-function'."
-  (let* ((cache (wisi-forward-find-class 'name (point-max)))
-         (result (wisi-cache-text cache)))
+  (let* ((result (wisi-next-name)))
 
     ;; See comment in ada-mode.el ada-which-function on why we don't
     ;; overwrite ff-function-name.
@@ -550,68 +542,72 @@ Also return cache at start."
 
 (defun ada-wisi-which-function (include-type)
   "For `ada-which-function'."
-  ;; No message on parse fail, since this could be called from
+  ;; Fail gracefully and silently, since this could be called from
   ;; which-function-mode.
-  (wisi-validate-cache (point-min) (point) nil 'navigate)
-  (when (wisi-cache-covers-pos 'navigate (point))
-    (save-excursion
-      (let ((result nil)
-           (cache (condition-case nil (ada-wisi-goto-declaration-start 
include-type) (error nil))))
-       (if (null cache)
-           ;; bob or failed parse
-           (setq result "")
-
-         (when (memq (wisi-cache-nonterm cache)
-                     '(generic_package_declaration 
generic_subprogram_declaration))
-           ;; name is after next statement keyword
-           (wisi-next-statement-cache cache)
-           (setq cache (wisi-get-cache (point))))
-
-         ;; add or delete 'body' as needed
-         (cl-ecase (wisi-cache-nonterm cache)
-           ((entry_body entry_declaration)
-            (setq result (ada-wisi-which-function-1 "entry" nil)))
-
-           (full_type_declaration
-            (setq result (ada-wisi-which-function-1 "type" nil)))
-
-           (package_body
-            (setq result (ada-wisi-which-function-1 "package" nil)))
-
-           ((package_declaration
-             generic_package_declaration) ;; after 'generic'
-            (setq result (ada-wisi-which-function-1 "package" t)))
-
-           (protected_body
-            (setq result (ada-wisi-which-function-1 "protected" nil)))
-
-           ((protected_type_declaration single_protected_declaration)
-            (setq result (ada-wisi-which-function-1 "protected" t)))
-
-           ((abstract_subprogram_declaration
-             expression_function_declaration
-             subprogram_declaration
-             subprogram_renaming_declaration
-             generic_subprogram_declaration ;; after 'generic'
-             null_procedure_declaration)
-            (setq result (ada-wisi-which-function-1
-                          (wisi-token-text (wisi-forward-find-token '(FUNCTION 
PROCEDURE) (point-max)))
-                          nil))) ;; no 'body' keyword in subprogram bodies
-
-           (subprogram_body
-            (setq result (ada-wisi-which-function-1
-                          (wisi-token-text (wisi-forward-find-token '(FUNCTION 
PROCEDURE) (point-max)))
-                          nil)))
-
-           ((single_task_declaration task_type_declaration)
-            (setq result (ada-wisi-which-function-1 "task" t)))
-
-
-           (task_body
-            (setq result (ada-wisi-which-function-1 "task" nil)))
-           ))
-       result))
-    ))
+  (let ((parse-begin (max (point-min) (- (point) (/ ada-which-func-parse-size 
2))))
+       (parse-end   (min (point-max) (+ (point) (/ ada-which-func-parse-size 
2)))))
+    (wisi-validate-cache parse-begin parse-end nil 'navigate)
+    (when (wisi-cache-covers-region parse-begin parse-end 'navigate)
+      (save-excursion
+       (condition-case-unless-debug nil
+           (let ((result nil)
+                 (cache (ada-wisi-goto-declaration-start-1 include-type)))
+             (if (null cache)
+                 ;; bob or failed parse
+                 (setq result "")
+
+               (when (memq (wisi-cache-nonterm cache)
+                           '(generic_package_declaration 
generic_subprogram_declaration))
+                 ;; name is after next statement keyword
+                 (wisi-next-statement-cache cache)
+                 (setq cache (wisi-get-cache (point))))
+
+               ;; add or delete 'body' as needed
+               (cl-ecase (wisi-cache-nonterm cache)
+                 ((entry_body entry_declaration)
+                  (setq result (ada-wisi-which-function-1 "entry" nil)))
+
+                 (full_type_declaration
+                  (setq result (ada-wisi-which-function-1 "type" nil)))
+
+                 (package_body
+                  (setq result (ada-wisi-which-function-1 "package" nil)))
+
+                 ((package_declaration
+                   generic_package_declaration) ;; after 'generic'
+                  (setq result (ada-wisi-which-function-1 "package" t)))
+
+                 (protected_body
+                  (setq result (ada-wisi-which-function-1 "protected" nil)))
+
+                 ((protected_type_declaration single_protected_declaration)
+                  (setq result (ada-wisi-which-function-1 "protected" t)))
+
+                 ((abstract_subprogram_declaration
+                   expression_function_declaration
+                   subprogram_declaration
+                   subprogram_renaming_declaration
+                   generic_subprogram_declaration ;; after 'generic'
+                   null_procedure_declaration)
+                  (setq result (ada-wisi-which-function-1
+                                (wisi-token-text (wisi-forward-find-token 
'(FUNCTION PROCEDURE) (point-max)))
+                                nil))) ;; no 'body' keyword in subprogram 
bodies
+
+                 (subprogram_body
+                  (setq result (ada-wisi-which-function-1
+                                (wisi-token-text (wisi-forward-find-token 
'(FUNCTION PROCEDURE) (point-max)))
+                                nil)))
+
+                 ((single_task_declaration task_type_declaration)
+                  (setq result (ada-wisi-which-function-1 "task" t)))
+
+
+                 (task_body
+                  (setq result (ada-wisi-which-function-1 "task" nil)))
+                 ))
+             result)
+         (error "")))
+      )))
 
 (defun ada-wisi-number-p (token-text)
   "Return t if TOKEN-TEXT plus text after point matches the
@@ -732,13 +728,6 @@ TOKEN-TEXT; move point to just past token."
   (concat ada-wisi-partial-begin-regexp
          "\\|;"))
 
-(defun ada-wisi-search-backward-no-string-comment (regexp)
-  (let ((maybe-found-p (search-backward-regexp regexp nil t)))
-    (while (and maybe-found-p
-               (ada-in-string-or-comment-p)
-               (setq maybe-found-p (search-backward-regexp regexp nil t))))
-    maybe-found-p))
-
 (defun ada-wisi-find-begin ()
   "Starting at current point, search backward for a parse start point."
 
@@ -763,7 +752,12 @@ TOKEN-TEXT; move point to just past token."
   ;; This is handled by the set of keywords in
   ;; ada-wisi-partial-begin-regexp.
   (cond
-   ((ada-wisi-search-backward-no-string-comment ada-wisi-partial-begin-regexp)
+   ((wisi-search-backward-skip
+     ada-wisi-partial-begin-regexp
+     (lambda ()
+       (or (ada-in-string-or-comment-p)
+          (eq 'ACCESS (wisi-tok-token (save-excursion 
(wisi-backward-token)))))))
+
     (let ((found (match-string 0))
          cache)
       (cond
@@ -787,7 +781,8 @@ TOKEN-TEXT; move point to just past token."
 
 (defun ada-wisi-find-end ()
   "Starting at current point, search forward for a reasonable parse end point."
-  (unless (bolp) (forward-line 1)) ;; get out of any current comment
+  (forward-comment (point-max)) ;; get past any current comments
+  (forward-line 1) ;; contain at least some code (see 
ada_mode-partial_parse.adb 'blank line before "end"')
 
   (let ((start (point))
        match
@@ -865,15 +860,6 @@ Point must have been set by `ada-wisi-find-begin'."
        ))
     result))
 
-(defun ada-wisi-show-expanded-region ()
-  "For debugging. Expand currently selected region."
-  (interactive)
-  (let ((region (wisi-parse-expand-region wisi--parser (region-beginning) 
(region-end))))
-    (message "pre (%d . %d) post %s" (region-beginning) (region-end) region)
-    (set-mark (car region))
-    (goto-char (cdr region))
-    ))
-
 (cl-defmethod wisi-parse-adjust-indent ((_parser ada-wisi-parser) indent 
repair)
   (cond
    ((or (wisi-list-memq (wisi--parse-error-repair-inserted repair) '(BEGIN IF 
LOOP))
@@ -881,10 +867,11 @@ Point must have been set by `ada-wisi-find-begin'."
     ;; Error token terminates the block containing the start token
     (- indent ada-indent))
 
-   ((memq 'CASE (wisi--parse-error-repair-inserted repair))
-    ;; We don't need to handle comments between 'case' and 'when'; the
-    ;; 'case' is virtual.
-    (- indent (+ ada-indent ada-indent-when)))
+   ((equal '(CASE IS) (wisi--parse-error-repair-inserted repair))
+        (- indent (+ ada-indent ada-indent-when)))
+
+   ((equal '(END CASE SEMICOLON) (wisi--parse-error-repair-inserted repair))
+        (+ indent (+ ada-indent ada-indent-when)))
 
    (t indent)
    ))
@@ -919,6 +906,7 @@ Point must have been set by `ada-wisi-find-begin'."
           (wisi-process-parse-get
            (make-ada-wisi-parser
             :label "Ada"
+            :language-protocol-version ada-wisi-language-protocol-version
             :exec-file ada-process-parse-exec
             :exec-opts ada-process-parse-exec-opts
             :face-table ada-process-face-table
diff --git a/packages/ada-mode/ada.wy b/packages/ada-mode/ada.wy
new file mode 100644
index 0000000..912be15
--- /dev/null
+++ b/packages/ada-mode/ada.wy
@@ -0,0 +1,2740 @@
+;;; WisiToken grammar for Ada
+;;
+;; Author: Stephen Leake <address@hidden>
+;; Maintainer: Stephen Leake <address@hidden>
+;; Created: Sept 2012
+;; Keywords: syntax
+;;
+%code copyright_license %{
+;;  Copyright (C) 2013 - 2019 Free Software Foundation, Inc.
+
+;;  This program is free software; you can redistribute it and/or
+;;  modify it under the terms of the GNU General Public License as
+;;  published by the Free Software Foundation; either version 3, or (at
+;;  your option) any later version.
+;;
+;;  This software is distributed in the hope that it will be useful,
+;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;  General Public License for more details.
+;;
+;;  You should have received a copy of the GNU General Public License
+;;  along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+}%
+
+%code actions spec post %{
+   Partial_Parse_Active    : Boolean := False;
+   Partial_Parse_Byte_Goal : WisiToken.Buffer_Pos := WisiToken.Buffer_Pos'Last;
+}%
+
+;;; Commentary:
+;;
+;; This is a wisi grammar file for the Ada language. It is derived
+;; from the 2012 Ada Reference Manual (ARM) with Technical Corrigendum
+;; 1, which is available as (info "(aarm2012)") or at
+;; http://www.ada-auth.org/standards/ada12.html, under the license in
+;; ada_license.text.
+;;
+;; see wisi.el for discussion of using the wisi parser for an
+;; indentation engine.
+
+%generate LALR elisp elisp
+%generate LALR Ada_Emacs re2c Process
+%generate LR1 Ada_Emacs text_rep re2c Process
+
+%case_insensitive
+
+%keyword ABS "abs"
+%keyword ACCEPT "accept"
+%keyword ABORT "abort"
+%keyword ABSTRACT "abstract"
+%keyword ACCESS "access"
+%keyword ALIASED "aliased"
+%keyword ALL "all"
+%keyword AND "and"
+%keyword ARRAY "array"
+%keyword AT "at"
+%keyword BEGIN "begin"
+%keyword BODY "body"
+%keyword CASE "case"
+%keyword CONSTANT "constant"
+%keyword DECLARE "declare"
+%keyword DELAY "delay"
+%keyword DELTA "delta"
+%keyword DIGITS "digits"
+%keyword DO "do"
+%keyword ELSE "else"
+%keyword ELSIF "elsif"
+%keyword END "end"
+%keyword ENTRY "entry"
+%keyword EXCEPTION "exception"
+%keyword EXIT "exit"
+%keyword FOR "for"
+%keyword FUNCTION "function"
+%keyword GENERIC "generic"
+%keyword GOTO "goto"
+%keyword IF "if"
+%keyword IN "in"
+%keyword INTERFACE "interface"
+%keyword IS "is"
+%keyword LIMITED "limited"
+%keyword LOOP "loop"
+%keyword MOD "mod"
+%keyword NEW "new"
+%keyword NOT "not"
+%keyword NULL "null"
+%keyword OF "of"
+%keyword OR "or"
+%keyword OTHERS "others"
+%keyword OUT "out"
+%keyword OVERRIDING "overriding"
+%keyword PACKAGE "package"
+%keyword PRAGMA "pragma"
+%keyword PRIVATE "private"
+%keyword PROCEDURE "procedure"
+%keyword PROTECTED "protected"
+%keyword RAISE "raise"
+%keyword RANGE "range"
+%keyword RECORD "record"
+%keyword REM "rem"
+%keyword RENAMES "renames"
+%keyword REQUEUE "requeue"
+%keyword RETURN "return"
+%keyword REVERSE "reverse"
+%keyword SEPARATE "separate"
+%keyword SELECT "select"
+%keyword SOME "some"
+%keyword SUBTYPE "subtype"
+%keyword SYNCHRONIZED "synchronized"
+%keyword TAGGED "tagged"
+%keyword TASK "task"
+%keyword TERMINATE "terminate"
+%keyword THEN "then"
+%keyword TYPE "type"
+%keyword UNTIL "until"
+%keyword USE "use"
+%keyword WHEN "when"
+%keyword WHILE "while"
+%keyword WITH "with"
+%keyword XOR "xor"
+
+%token <left-paren> LEFT_PAREN "("
+%token <right-paren> RIGHT_PAREN ")"
+
+%token <punctuation> AMPERSAND "&"
+%token <punctuation> BAR "|"
+%token <punctuation> BOX "<>"
+%token <punctuation> COLON ":"
+%token <punctuation> COLON_EQUAL ":="
+%token <punctuation> COMMA ","
+%token <punctuation> DOT "."
+%token <punctuation> DOT_DOT ".."
+%token <punctuation> EQUAL "="
+%token <punctuation> EQUAL_GREATER "=>"
+%token <punctuation> GREATER ">"
+%token <punctuation> GREATER_EQUAL ">="
+%token <punctuation> GREATER_GREATER ">>"
+%token <punctuation> LESS "<"
+%token <punctuation> LESS_EQUAL "<="
+%token <punctuation> LESS_LESS "<<"
+%token <punctuation> MINUS "-"
+%token <punctuation> PLUS "+"
+%token <punctuation> SEMICOLON ";"
+%token <punctuation> SLASH "/"
+%token <punctuation> SLASH_EQUAL "/="
+%token <punctuation> STAR "*"
+%token <punctuation> STAR_STAR "**"
+
+;; Support GNAT character coding in names and character and string
+;; literals (see test/non_ascii.ads)
+%re2c_regexp GNAT_Char_Coding %[ ("[\""[0-9A-Fa-f]+"\"]") ]%
+
+;; re2c lookahead regular expression; this is not a character literal.
+;; re2c does not allow combining | with /, so we need three tokens for
+;; this (sigh).
+%token <punctuation> TICK_1 "'"
+
+%if lexer = re2c
+%token <punctuation> TICK_2 %[ "'" / 
"('"([\x20-\U0010FFFF]|GNAT_Char_Coding)"'" ]%
+%end if
+
+%if lexer = elisp
+%token <number> NUMERIC_LITERAL ada-wisi-number-p
+%end if
+%if lexer = re2c
+;; This regexp allows a lot of things that are not Ada numeric
+;; literals, but it's faster than a strictly conforming regexp. For
+;; non-based literals, force a trailing integer so (1..Length) is
+;; parsed correctly.
+%token <number> NUMERIC_LITERAL %[ 
([0-9])|([0-9][0-9eE._-]*[0-9])|([0-9]+"#"[0-9a-fA-F._-]+"#") ]%
+%end if
+
+;; non_grammar are not seen by the elisp lexer, but are needed by the re2c 
lexer
+%non_grammar <non-reporting> WHITESPACE %[ [ \t]+ ]%
+
+;; handle DOS or Unix newline
+%non_grammar <new-line> NEW_LINE %[ [\x0a]|[\x0d][\x0a] ]%
+
+;; Treat Ada comments, gnatprep preprocessor lines, and skeleton
+;; placeholders as comments. x04 is EOF.
+%non_grammar <comment> COMMENT %[ 
(("--"|"#if"|"#elsif"|"#else"|"#end")[^\n\x04]*)|("{"[^}]*"}") ]%
+
+;; '$' for gnatprep symbols.
+%token <symbol> IDENTIFIER
+    %[ 
([$a-zA-Z\x80-\U0010FFFF]|GNAT_Char_Coding)([0-9a-zA-Z_\x80-\U0010FFFF]|GNAT_Char_Coding)*
 ]%
+
+%token <string-double> STRING_LITERAL %[ 
(["]([\x20-\x21\x23-\U0010FFFF]|GNAT_Char_Coding)*["])+ ]%
+
+%token <string-single> CHARACTER_LITERAL %[ 
"'"([\x20-\U0010FFFF]|GNAT_Char_Coding)"'" ]%
+
+%start compilation_unit_list
+
+%elisp_face font-lock-constant-face
+%elisp_face font-lock-function-name-face
+%elisp_face font-lock-type-face
+%elisp_face nil
+
+%elisp_indent ada-indent-aggregate Ada_Indent_Aggregate
+%elisp_indent ada-indent-renames Ada_Indent_Renames_0
+%elisp_indent ada-indent-return Ada_Indent_Return_0
+%elisp_indent ada-indent-record Ada_Indent_Record_0
+%elisp_indent "ada-indent-record*" Ada_Indent_Record_1
+
+;; Set McKenzie error recovery costs.
+;;
+;; We assume the user is typing new code more often than deleting or
+;; changing old. Minimal_Complete reduces cost for insert, so the
+;; default cost for insert, delete is the same. Often insert requires
+;; push_back first, to get the parser in the right state, so push_back
+;; is cheaper.
+;;
+;; We need a balance between Minimal_Complete and other solutions; if
+;; Minimal_Complete is too cheap, it will complete the entire
+;; compilation_Unit before the error point, when doing something else
+;; at some point is better (see test/ada_mode-recover_29.adb, _15,
+;; _24). On the other hand, doing lots of Minimal_Complete is very
+;; common when writing new code (see test/ada_mode-recover_10.adb,
+;; _error_during_resume_01). So we reduce the cost of inserting 'end
+;; ;'.
+;;
+;; test/ada_mode-recover_change_name.adb needs 'ignore check fail' cost 2
+;;
+;; Default cost for insert, delete, push back/undo_reduce, ignore check fail.
+%mckenzie_cost_default 4 4 2 2
+%mckenzie_minimal_complete_cost_delta -3
+
+;; END is cheaper, because it always requires at least one other
+;; keyword to follow.
+%mckenzie_cost_insert END 3
+
+;; This cost is applied once, independent of token count.
+%mckenzie_cost_matching_begin 3
+
+;; Prefer doing more work at the current error point over moving
+;; forward to a new one; there is normally only one real error point.
+;; But not too much; test/ada_mode-recover_partial_02_lr1.adb requires
+;; cost 2.
+%mckenzie_cost_fast_forward 2
+
+;; Handle converting 'if' to 'case' (and vice-versa), since that is a
+;; common operation. See test/ada_mode-recover_29.adb. This also makes
+;; inserting 'end if;' free; that's used a lot. But this defeats
+;; Forbid_Minimal_Complete; see
+;; test/ada_mode-recover_constant_as_statement_1.adb.
+%mckenzie_cost_insert CASE 2
+%mckenzie_cost_insert IF 2
+
+;; Prefer undo_reduce over push_back; consider the code:
+;;
+;; loop
+;;    if then
+;;       statement;
+;;    -- missing 'end if;'
+;; end loop;
+;; -- ^ error here
+;;
+;; Error recovery will insert 'end if;', after push_back or
+;; undo_reduce of the handled_sequence_of_statements including
+;; 'statement'. If it uses push_back, then 'end if;' is before
+;; 'statement'; if undo_reduce, after, which is the desired result.;;
+%mckenzie_cost_undo_reduce handled_sequence_of_statements 0
+%mckenzie_cost_undo_reduce sequence_of_statements 0
+%mckenzie_cost_undo_reduce sequence_of_statements_opt 0
+%mckenzie_cost_undo_reduce declarative_part_opt 0
+
+;; Missing or extra closing paren are common; missing handled by
+;; Minimal_Complete.
+%mckenzie_cost_delete RIGHT_PAREN 1
+
+;; test/ada_mode-recover_29.adb requires 30_000
+;; test/ada_mode-recover_partial_02_lr1.adb requires 45_000
+%mckenzie_enqueue_limit 45_000
+
+;; 4 required for test/ada_mode-recover_match_names.adb.
+%mckenzie_check_limit 4
+
+;; After finding 1 solution, only check 100 more before giving up.
+;; Reduces solution time on complex errors.
+%mckenzie_check_delta_limit 100
+
+%end_names_optional_option End_Names_Optional
+
+;; known conflicts that are resolved by generalized LALR parser
+%conflict REDUCE/REDUCE in state abstract_limited_opt, 
abstract_limited_synchronized_opt on token NEW
+%conflict REDUCE/REDUCE in state actual_parameter_part, actual_parameter_part  
on token RIGHT_PAREN
+%conflict REDUCE/REDUCE in state association_opt, expression_opt on token 
RIGHT_PAREN
+%conflict REDUCE/REDUCE in state derived_type_definition, 
derived_type_definition  on token WITH
+%conflict REDUCE/REDUCE in state full_type_declaration, full_type_declaration  
on token NEW
+%conflict REDUCE/REDUCE in state identifier_list, name on token COMMA
+%conflict REDUCE/REDUCE in state name, direct_name on token USE
+%conflict REDUCE/REDUCE in state paren_expression, paren_expression  on token 
RIGHT_PAREN
+%conflict REDUCE/REDUCE in state primary, subtype_indication on token COMMA
+%if parser = LALR
+%conflict REDUCE/REDUCE in state primary, subtype_indication on token 
EQUAL_GREATER
+%end if
+%conflict REDUCE/REDUCE in state primary, subtype_indication on token 
RIGHT_PAREN
+%conflict REDUCE/REDUCE in state range_list, discrete_subtype_definition on 
token COMMA
+%conflict REDUCE/REDUCE in state range_list, discrete_subtype_definition on 
token RIGHT_PAREN
+%conflict SHIFT/REDUCE in state abstract_subprogram_declaration, 
abstract_subprogram_declaration  on token IS
+%conflict SHIFT/REDUCE in state accept_statement, accept_statement  on token 
LEFT_PAREN
+%conflict SHIFT/REDUCE in state aspect_clause, name on token USE
+%conflict SHIFT/REDUCE in state association_opt, name on token EQUAL_GREATER
+%conflict SHIFT/REDUCE in state attribute_reference, attribute_designator  on 
token TICK_1
+%conflict SHIFT/REDUCE in state block_label, identifier_list  on token COLON
+%conflict SHIFT/REDUCE in state compilation_unit_list, compilation_unit_list  
on token FOR
+%conflict SHIFT/REDUCE in state declaration, declaration  on token CONSTANT
+%conflict SHIFT/REDUCE in state expression_function_declaration, 
subprogram_specification on token IS
+%conflict SHIFT/REDUCE in state formal_derived_type_definition, 
formal_derived_type_definition on token WITH
+%conflict SHIFT/REDUCE in state generic_instantiation, generic_instantiation  
on token IS
+%conflict SHIFT/REDUCE in state generic_renaming_declaration, 
generic_formal_part  on token FUNCTION
+%conflict SHIFT/REDUCE in state generic_renaming_declaration, 
generic_formal_part  on token PACKAGE
+%conflict SHIFT/REDUCE in state generic_renaming_declaration, 
generic_formal_part  on token PROCEDURE
+%conflict SHIFT/REDUCE in state membership_choice_list, relation  on token BAR
+%conflict SHIFT/REDUCE in state name, attribute_designator  on token LEFT_PAREN
+%conflict SHIFT/REDUCE in state null_procedure_declaration, 
subprogram_specification on token IS
+%conflict SHIFT/REDUCE in state object_renaming_declaration, identifier_list  
on token COLON
+%conflict SHIFT/REDUCE in state package_body, package_body  on token IS
+%conflict SHIFT/REDUCE in state parameter_specification, 
parameter_specification  on token NOT
+%conflict SHIFT/REDUCE in state protected_body, protected_body  on token IS
+%conflict SHIFT/REDUCE in state raise_expression, raise_expression on token 
WITH
+%conflict SHIFT/REDUCE in state relation_and_list, expression  on token AND
+%conflict SHIFT/REDUCE in state relation_and_then_list, expression  on token 
AND
+%conflict SHIFT/REDUCE in state relation_or_else_list, expression  on token OR
+%conflict SHIFT/REDUCE in state relation_or_list, expression  on token OR
+%conflict SHIFT/REDUCE in state relation_xor_list, expression  on token XOR
+%conflict SHIFT/REDUCE in state selected_component, attribute_designator  on 
token DOT
+%conflict SHIFT/REDUCE in state task_body, task_body  on token IS
+%conflict SHIFT/REDUCE in state wisitoken_accept, wisitoken_accept  on token 
FOR
+
+%if lexer = re2c
+%conflict SHIFT/REDUCE in state attribute_reference, attribute_designator  on 
token TICK_2
+%end if
+
+;;;; grammar rules
+;;
+;; The actions cache information in keywords that are significant for
+;; indentation and motion.
+;;
+;; BNF copied from:
+;;
+;; (info "(aarm2012)Annex P" "*info Annex P*")
+;; 
file:///C:/Projects/arm_info/org.adaic.arm_form/build/html/aarm2012/AA-P.html
+;;
+;; but listed in alphabetical order. Repeating constructs are
+;; implemented with extra productions. Optional constructs are
+;; implemented by repeated productions. Most names are simplified to
+;; just "name".
+;;
+;; The EBNF in LRM Annex P is not LALR(1), so we use a generalized
+;; LALR(1) parser.
+;;
+;; Annex P overloads several keywords as grammar elements; 'body',
+;; 'pragma', some others. That matters in the generated Ada code. We
+;; resolve this by appending _g to the grammar element name.
+;;
+;; To tolerate some invalid syntax during editing, we relax the
+;; grammar, mainly by allowing many items to be empty.
+
+abstract_limited_synchronized_opt
+  : ABSTRACT LIMITED
+  | ABSTRACT SYNCHRONIZED
+  | ABSTRACT
+  | LIMITED
+  | SYNCHRONIZED
+  | ;; empty
+  ;
+
+abstract_limited_opt
+  : ABSTRACT LIMITED
+  | LIMITED
+  | ABSTRACT
+  | ;; empty
+  ;
+
+abstract_tagged_limited_opt
+  : ABSTRACT TAGGED LIMITED
+  | ABSTRACT TAGGED
+  | TAGGED LIMITED
+  | TAGGED
+  | LIMITED
+  | ;; empty
+  ;
+
+abstract_subprogram_declaration
+  : overriding_indicator_opt subprogram_specification IS ABSTRACT 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken nil 
nil])))%
+  ;
+
+accept_statement
+  : ACCEPT IDENTIFIER actual_parameter_part_opt parameter_profile_opt DO 
handled_sequence_of_statements END identifier_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-containing-action 1 6) ;; ""
+      (wisi-motion-action [1 5 [6 EXCEPTION WHEN] 9])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 8 nil 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken [nil ada-indent] [ada-indent ada-indent] nil nil nil])))%
+    %((wisi-match-names 2 8))%
+
+  | ACCEPT IDENTIFIER actual_parameter_part_opt parameter_profile_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+;; same as access_type_definition for our purposes
+access_definition
+  : null_exclusion_opt ACCESS protected_opt PROCEDURE parameter_profile_opt
+ ;; test/ada_mode-nomina.ads
+ ;; type Procedure_Access_Type_8 is access
+ ;;   protected procedure
+ ;;     (A_Param : out Integer);
+    %((wisi-indent-action [nil nil nil nil (wisi-anchored% 4 
ada-indent-broken)]))%
+
+  | null_exclusion_opt ACCESS protected_opt FUNCTION 
parameter_and_result_profile
+ ;; test/ada_mode-nominal.ads
+ ;; type Function_Access_Type_10 is access
+ ;;   protected function
+ ;;     (A_Param : in Float)
+ ;;     return Standard.Float;
+    %((wisi-indent-action [nil nil nil nil (wisi-anchored%- 4 
ada-indent-broken)]))%
+
+  | null_exclusion_opt ACCESS general_access_modifier_opt name
+    %((wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+actual_parameter_part
+  : LEFT_PAREN association_list RIGHT_PAREN
+ ;; see note in test/ada_mode-parens.adb Local_10 about right paren indent.
+    %((wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))%
+ ;; ARM 4.5.7(7), ARM 4.5.8(4) allow ( conditional|quantified_expression ) 
instead of (( ... ))
+  | LEFT_PAREN conditional_quantified_expression RIGHT_PAREN
+    %((wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))%
+  ;
+
+actual_parameter_part_opt
+  : actual_parameter_part
+  | ;; empty
+  ;
+
+;; All LEFT_PAREN in aggregate are indented 0 here. Special cases for
+;; -1 are handled in 'primary'.
+aggregate
+  : LEFT_PAREN expression_opt WITH NULL RECORD RIGHT_PAREN ;; 
extension_aggregate with null record
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) nil nil 
(wisi-anchored 1 0)]))%
+  | LEFT_PAREN expression_opt WITH association_list RIGHT_PAREN ;; 
extension_aggregate
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) 
[(wisi-anchored 1 1) (wisi-anchored 1 1)]
+                         (wisi-anchored 1 0)]))%
+  | LEFT_PAREN NULL RECORD RIGHT_PAREN
+
+ ;; ARM 4.5.7(7), ARM 4.5.8(4) allow ( conditional|quantified_expression ) 
instead of (( ... ))
+  | LEFT_PAREN conditional_quantified_expression RIGHT_PAREN
+    %((wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))%
+  | LEFT_PAREN association_list RIGHT_PAREN ;; record_aggregate, 
named_array_aggregate, positional_array_aggregate
+    %((wisi-indent-action [nil [(wisi-anchored 1 1) (wisi-anchored 1 1)] 
(wisi-anchored 1 0)]))%
+  ;
+
+aliased_opt
+  : ALIASED
+  | ;; empty
+  ;
+
+and_interface_list_opt
+  : AND interface_list
+  | ;; empty
+  ;
+
+array_type_definition
+  : ARRAY LEFT_PAREN index_subtype_definition_list RIGHT_PAREN OF 
component_definition
+ ;; unconstrained_array_definition
+    %((wisi-indent-action [nil nil (wisi-anchored 2 1) (wisi-anchored 2 0) nil 
nil]))%
+
+  | ARRAY LEFT_PAREN discrete_subtype_definition_list RIGHT_PAREN OF 
component_definition
+ ;; constrained_array_definition
+    %((wisi-indent-action [nil nil (wisi-anchored 2 1) (wisi-anchored 2 0) nil 
nil]))%
+  ;
+
+aspect_clause
+  : FOR attribute_reference USE expression_opt SEMICOLON ;; 
attribute_definition_clause
+    %((wisi-statement-action [1 statement-start 5 statement-end]))%
+  | enumeration_representation_clause
+  | record_representation_clause
+  | at_clause
+  ;
+
+;; aspect_mark ::= aspect_identifier[Class]
+
+;; aspect_specification ::=
+;;   with aspect_mark [=> aspect_definition] {,
+;;        aspect_mark [=> aspect_definition] }
+aspect_specification_opt
+  : WITH association_list ;; overkill, but simpler.
+    %((wisi-indent-action [nil ada-indent-broken]))%
+  | ;; empty
+  ;
+
+assignment_statement
+  : name COLON_EQUAL expression_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-containing-action 1 3)
+      (wisi-indent-action [nil
+                           ada-indent-broken
+                           (wisi-hanging
+                            (wisi-anchored% 2 ada-indent-broken)
+                            (wisi-anchored% 3 ada-indent-broken))
+                           nil])))%
+  ;
+
+association_opt
+  : CHARACTER_LITERAL EQUAL_GREATER expression_opt ;; part of selector_name 
that does not overlap name
+    %((wisi-indent-action [nil ada-indent-broken
+                         [(wisi-anchored% 2 ada-indent-broken) (wisi-anchored% 
2 ada-indent-broken)]]))%
+  | CHARACTER_LITERAL EQUAL_GREATER BOX ;; from formal_package_association_list
+  | discrete_choice_list EQUAL_GREATER expression_opt
+ ;; We need wisi-hanging on expression_opt to recognize aspect_specification 
for a special case.
+ ;; test/aspects.ads
+ ;; with Pre => X > 10 and
+ ;;             X < 50 and
+ ;;             F (X),
+ ;;   Post =>
+ ;;     Y >= X and
+ ;;     Some_Very_Verbose_Predicate (X, Y);
+ ;;
+ ;; test/indent.ads
+ ;;   1 => --  Used to be aligned on "CSCL_Type'"
+ ;;        --  aligned with previous comment.
+ ;;     IO_CPU_Control_State_S_Pkg.CPU2_Fault_Status_Type'
+ ;;       (Unused2  => 10,  -- Used to be aligned on "1 =>"
+ ;;   requires '-' on wisi-hanging%-
+    %((wisi-indent-action [(wisi-hanging nil ada-indent-broken)
+                           ada-indent-broken
+                           [(wisi-hanging%- (wisi-anchored% 2 
ada-indent-broken)
+                                            (wisi-anchored% 2 (* 2 
ada-indent-broken)))
+                            (wisi-hanging%- (wisi-anchored% 2 
ada-indent-broken)
+                                            (wisi-anchored% 2 (* 2 
ada-indent-broken)))]]))%
+  | discrete_choice_list EQUAL_GREATER BOX
+    %((wisi-indent-action [(wisi-hanging nil ada-indent-broken) 
ada-indent-broken nil]))%
+  | expression
+ ;; test/ada_mode-parens.adb Hello
+    %((wisi-indent-action [[(wisi-hanging nil ada-indent-broken) (wisi-hanging 
nil ada-indent-broken)]]))%
+  | ;; empty
+  ;
+
+association_list
+  : association_list COMMA association_opt
+  | association_opt
+  ;
+
+asynchronous_select
+  : SELECT triggering_alternative THEN ABORT sequence_of_statements_opt END 
SELECT SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 5)
+      (wisi-indent-action [nil [ada-indent ada-indent] [nil ada-indent-broken] 
ada-indent-broken
+                           [ada-indent ada-indent] nil nil nil])))%
+  ;
+
+at_clause
+  : FOR direct_name USE AT expression_opt SEMICOLON
+    %((wisi-statement-action [1 statement-start 6 statement-end]))%
+  ;
+
+attribute_reference : name tick attribute_designator ;
+
+attribute_designator
+;; IDENTIFIER LEFT_PAREN expression RIGHT_PAREN is redundant with name
+  : name
+  | ACCESS
+  | DELTA
+  | DIGITS
+  | MOD
+  ;
+
+;; basic_declarative_item merged into declaration
+;; basic_declaration merged into declaration
+
+binary_adding_operator : PLUS | MINUS | AMPERSAND ; ;; + | - | &
+
+block_label
+  : IDENTIFIER COLON
+    %((wisi-indent-action [ada-indent-label nil]))%
+    %((wisi-propagate-name 1))%
+  ;
+
+block_label_opt
+  : block_label
+    %()%
+    %((wisi-propagate-name 1))%
+  | ;; empty
+  ;
+
+block_statement
+  : block_label_opt DECLARE declarative_part_opt BEGIN 
handled_sequence_of_statements END identifier_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 misc 4 motion 8 
statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-containing-action 2 5)
+      (wisi-motion-action [2 4 [5 EXCEPTION WHEN] 8])
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))%
+    %((wisi-match-names 1 7))%
+  | block_label_opt BEGIN handled_sequence_of_statements END identifier_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 misc 6 statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-motion-action [2 [3 EXCEPTION WHEN] 6])
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil nil nil])))%
+    %((wisi-match-names 1 5))%
+  ;
+
+body_g : proper_body | body_stub ;
+
+body_stub
+  : subprogram_body_stub | package_body_stub | task_body_stub | 
protected_body_stub ;
+
+case_expression
+  : CASE expression_opt IS case_expression_alternative_list
+    %((wisi-indent-action [nil ada-indent-broken nil ada-indent-when]))%
+  ;
+
+case_expression_alternative
+  : WHEN discrete_choice_list EQUAL_GREATER expression_opt
+ ;; test/ada_mode-conditional_expressions.adb
+ ;; when A =>
+ ;;    J = 4
+ ;;      or else M, --  test case from Piotr Trojanek
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken
+                           (wisi-hanging (wisi-anchored% 1 ada-indent)
+                                         (wisi-anchored% 1 (+ ada-indent 
ada-indent-broken)))]))%
+  ;
+
+case_expression_alternative_list
+  : case_expression_alternative_list COMMA case_expression_alternative
+    %((wisi-indent-action [nil [nil ada-indent-when] nil]))%
+  | case_expression_alternative
+  ;
+
+case_statement
+  : CASE expression_opt IS case_statement_alternative_list END CASE SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 [4 WHEN] 7])
+      (wisi-indent-action [nil ada-indent-broken nil [ada-indent-when 
ada-indent-when] nil nil nil])))%
+  ;
+
+case_statement_alternative
+  : WHEN discrete_choice_list EQUAL_GREATER sequence_of_statements_opt
+    %((progn
+      (wisi-statement-action [1 motion])
+      ;; ada-indent-when added in case_statement
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]])))%
+  ;
+
+;; We don't allow an empty list here; that leads to parallel parser
+;; explosion in nested case statements. Note that ada-skel-case
+;; inserts an empty when =>
+case_statement_alternative_list
+  : case_statement_alternative_list case_statement_alternative
+  | case_statement_alternative
+  ;
+
+;; choice_expression use 'expression' to avoid conflicts
+
+;; choice_relation* - use 'relation*', to avoid conflicts
+
+;; Since we allow multiple compilation units in one parse, and don't
+;; require a library_item in order to be user friendly, we don't need
+;; a context_clause, since a list of context_items is just a
+;; compilation_unit_list. Since context_item includes pragma, this
+;; also allows a pragma following a compilation_unit.
+;;
+;; We allow additional items here for partial syntax in mako-ada
+;; templates and grammar actions.
+compilation_unit
+  : with_clause
+  | subunit
+  | PRIVATE declaration
+    %((wisi-indent-action [0 0]))%
+  | declaration
+  | statement
+  ;
+
+;; Compute indent for trailing comments.
+compilation_unit_list
+  : compilation_unit_list compilation_unit
+    %((wisi-indent-action [0 [0 0]]))%
+  | compilation_unit
+    %((wisi-indent-action [[0 0]]))%
+    %((wisi-terminate-partial-parse))%
+  ;
+
+component_clause
+  : IDENTIFIER AT simple_expression RANGE simple_expression DOT_DOT 
simple_expression SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+component_clause_list
+  : component_clause_list component_clause
+  | component_clause
+  ;
+
+component_declaration
+  : identifier_list COLON component_definition COLON_EQUAL expression_opt 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 3) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                               (wisi-anchored% 4 ada-indent-broken)
+                               ada-indent-broken nil])))%
+  | identifier_list COLON component_definition aspect_specification_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-containing-action 1 3) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+component_definition
+  : ALIASED subtype_indication
+  | subtype_indication
+  | ALIASED access_definition
+  | access_definition
+  ;
+
+component_item
+  : component_declaration
+  | aspect_clause
+  ;
+
+component_list
+  : component_list component_item
+  | component_list variant_part
+  | component_item
+  | variant_part
+  | NULL SEMICOLON
+    %((wisi-statement-action [1 statement-start 2 statement-end]))%
+  ;
+
+component_list_opt
+  : component_list
+  | ;; empty
+  ;
+
+compound_statement
+  : if_statement
+  | case_statement
+  | loop_statement
+  | block_statement
+  | extended_return_statement
+  | accept_statement
+  | select_statement
+  ;
+
+conditional_entry_call
+  : SELECT entry_call_alternative ELSE sequence_of_statements_opt END SELECT 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-indent-action [nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))%
+  ;
+
+conditional_quantified_expression
+  : if_expression
+  | case_expression
+  | quantified_expression
+  ;
+
+constant_opt
+  : CONSTANT
+  | ;; empty
+  ;
+
+constraint
+  : RANGE range_g ;; range_constraint
+ ;; FIXME: | digits_constraint
+ ;; FIXME: | delta_constraint
+  | index_constraint
+ ;; | discriminant_constraint same as aspect_specification
+  ;
+
+constraint_opt
+  : constraint
+  | ;; empty
+  ;
+
+;; context_item not needed; see compilation_unit
+
+declaration
+  : abstract_subprogram_declaration
+  | aspect_clause
+  | body_g
+  | entry_declaration
+  | exception_declaration
+  | expression_function_declaration
+  | generic_declaration
+  | generic_instantiation
+  | null_procedure_declaration
+  | identifier_list COLON CONSTANT COLON_EQUAL expression_opt SEMICOLON ;; 
number_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-containing-action 1 5)
+      (wisi-indent-action [(wisi-hanging nil ada-indent-broken) 
ada-indent-broken ada-indent-broken ada-indent-broken
+                           (wisi-anchored% 4 ada-indent-broken) nil])))%
+  | object_declaration
+  | package_declaration
+  | renaming_declaration
+  | subprogram_declaration
+  | subtype_declaration
+  | type_declaration
+  | use_clause
+  ;
+
+;; pragma_g is not a 'declaration' in ARM, but it must be in the
+;; grammar. We don't include it in 'declaration', to avoid conflicts
+;; with 'pragma_g' in statements via compilation_unit.
+declarations
+  : declarations declaration
+  | declarations pragma_g
+  | declaration
+  | pragma_g
+  ;
+
+declarative_part_opt
+  : declarations
+  | ;; empty
+  ;
+
+;; declarative_item merged into declaration
+
+delay_alternative
+  : delay_statement sequence_of_statements_opt
+  ;
+
+delay_statement
+  : DELAY UNTIL expression_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil])))%
+  | DELAY expression_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-indent-action [nil ada-indent-broken nil])))%
+  ;
+
+derived_type_definition
+  : abstract_limited_opt NEW name and_interface_list_opt WITH record_definition
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  | abstract_limited_opt NEW name constraint_opt
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+direct_name
+  : IDENTIFIER
+  | STRING_LITERAL ;; operator_symbol
+  ;
+
+direct_name_opt
+  : direct_name
+  | ;; empty
+  ;
+
+discrete_choice
+  : expression ;; includes 'name'
+  | NOT NULL name ;; from subytpe_indication, excluding constructs covered by 
'name'
+  | range_g
+  | OTHERS
+  ;
+
+discrete_choice_list
+  : discrete_choice_list BAR discrete_choice
+  | discrete_choice
+  | ;; empty for skeleton indentation
+  ;
+
+ ;; discrete_range is the same as discrete_subtype_definition
+
+ ;; discrete_range_list is the same as discrete_subtype_definition_list
+
+discrete_subtype_definition : subtype_indication | range_g ;
+
+discrete_subtype_definition_list
+  : discrete_subtype_definition_list COMMA discrete_subtype_definition
+  | discrete_subtype_definition
+  ;
+
+discriminant_part_opt
+  : LEFT_PAREN BOX RIGHT_PAREN ;; (<>) unknown_discriminant_part
+  | LEFT_PAREN discriminant_specification_list RIGHT_PAREN;; 
known_discriminant_part
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+  | ;; empty
+  ;
+
+discriminant_specification_opt
+  : identifier_list COLON null_exclusion_opt_name_type COLON_EQUAL 
expression_opt
+  | identifier_list COLON access_definition COLON_EQUAL expression_opt
+  | identifier_list COLON null_exclusion_opt_name_type
+  | identifier_list COLON access_definition
+  | ;; empty
+  ;
+
+discriminant_specification_list
+  : discriminant_specification_list SEMICOLON discriminant_specification_opt
+  | discriminant_specification_opt
+  ;
+
+elsif_expression_item
+  : ELSIF expression_opt THEN expression_opt
+    %((progn
+      (wisi-statement-action [1 motion 3 motion])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent])))%
+ ;; motion set in if_expression
+  ;
+
+elsif_expression_list
+  : elsif_expression_list elsif_expression_item
+  | elsif_expression_item
+  ;
+
+elsif_statement_item
+  : ELSIF expression_opt THEN sequence_of_statements_opt
+    %((progn
+      (wisi-statement-action [1 motion 3 motion])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
[ada-indent ada-indent]])))%
+ ;; motion set in if_statement
+  ;
+
+elsif_statement_list
+  : elsif_statement_list elsif_statement_item
+  | elsif_statement_item
+  ;
+
+entry_body
+  : ENTRY IDENTIFIER entry_body_formal_part WHEN expression_opt
+    IS declarative_part_opt BEGIN handled_sequence_of_statements END 
identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 6 motion 8 motion 
12 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-containing-action 1 7)
+        (wisi-containing-action 1 9)
+        (wisi-motion-action [1 4 6 8 12])
+        (wisi-face-apply-action [2 nil font-lock-function-name-face 11 nil 
font-lock-function-name-face])
+
+        ;; test/ada_mode-nominal.adb
+        ;; entry E2
+        ;;   (X : Integer)
+        ;;   when Local_1 = 0 and not
+        ;;     (Local_2 = 1)
+        ;;
+        ;; entry E3
+        ;;   (X : Integer) when Local_1 = 0 and not
+        ;;     (Local_2 = 1)
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                                 (wisi-anchored% 4 ada-indent-broken)
+                                 nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))%
+    %((wisi-match-names 2 11))%
+  ;
+
+entry_body_formal_part
+  : LEFT_PAREN FOR IDENTIFIER IN discrete_subtype_definition RIGHT_PAREN 
parameter_profile_opt
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 1) 
(wisi-anchored 1 1) (wisi-anchored 1 1)
+                           (wisi-anchored 1 0) ada-indent-broken]))%
+  | parameter_profile_opt
+  ;
+
+entry_call_alternative
+  : procedure_call_statement sequence_of_statements_opt
+  | name sequence_of_statements_opt ;; entry_call_statement
+  ;
+
+entry_declaration
+  : overriding_indicator_opt ENTRY IDENTIFIER LEFT_PAREN 
discrete_subtype_definition RIGHT_PAREN
+    parameter_profile_opt aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 2 7) ;; for goto-declaration-start
+        (wisi-face-apply-action [3 nil font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
(wisi-anchored 4 1) (wisi-anchored 4 0)
+                               ada-indent-broken nil nil])))%
+  | overriding_indicator_opt ENTRY IDENTIFIER parameter_profile_opt 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 2 motion 6 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 2 4) ;; for goto-declaration-start
+        (wisi-face-apply-action [3 nil font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+enumeration_literal ;; enumeration_literal_specification
+  : IDENTIFIER
+  | CHARACTER_LITERAL
+  ;
+
+enumeration_literal_list
+  : enumeration_literal_list COMMA enumeration_literal
+  | enumeration_literal
+  ;
+
+enumeration_representation_clause
+  : FOR name USE aggregate SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+enumeration_type_definition
+  : LEFT_PAREN enumeration_literal_list RIGHT_PAREN
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+  ;
+
+exception_choice : name | OTHERS ;
+
+exception_choice_list
+  : exception_choice_list BAR exception_choice
+  | exception_choice
+  ;
+
+;; FIXME: leaving out [renaming] [aspect_specification]
+exception_declaration
+  : identifier_list COLON EXCEPTION SEMICOLON
+    %((wisi-statement-action [1 statement-start 4 statement-end]))%
+  ;
+
+exception_handler
+  : WHEN IDENTIFIER COLON exception_choice_list EQUAL_GREATER
+    sequence_of_statements_opt
+    %((progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                             [ada-indent ada-indent]])))%
+  | WHEN exception_choice_list EQUAL_GREATER sequence_of_statements_opt
+    %((progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken [ada-indent 
ada-indent]])))%
+  ;
+
+exception_handler_list
+  : exception_handler_list exception_handler
+  | exception_handler
+  | pragma_g
+  ;
+
+exception_handler_list_opt
+  : exception_handler_list
+  | ;; empty for user friendly
+  ;
+
+exit_statement
+  : EXIT identifier_opt WHEN expression_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-indent-action [nil nil nil ada-indent-broken nil])))%
+  | EXIT identifier_opt SEMICOLON
+    %((wisi-statement-action [1 statement-start 3 statement-end]))%
+  ;
+
+expression
+  : relation
+  | relation_and_list
+  | relation_and_then_list
+  | relation_or_list
+  | relation_or_else_list
+  | relation_xor_list
+  ;
+
+expression_opt
+  : expression
+  | ;; empty for user friendly
+  ;
+
+expression_function_declaration
+  : overriding_indicator_opt function_specification IS paren_expression 
aspect_specification_opt SEMICOLON
+ ;; IS does not start a block, so it is not "motion".
+ ;;
+ ;; We override the cache on "function_specification", so
+ ;; wisi-statement-action will handle an empty
+ ;; "overriding_indicator_opt" correctly.
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken nil 
nil])))%
+  ;
+
+extended_return_object_declaration
+  : IDENTIFIER COLON aliased_opt constant_opt return_subtype_indication 
COLON_EQUAL expression_opt
+    %((wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                           (wisi-anchored% 6 ada-indent-broken)]))%
+  | IDENTIFIER COLON aliased_opt constant_opt return_subtype_indication
+    %((wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken]))%
+  ;
+
+extended_return_object_declaration_opt
+  : extended_return_object_declaration
+  | ;; empty
+  ;
+
+extended_return_statement
+  : RETURN extended_return_object_declaration_opt DO 
handled_sequence_of_statements END RETURN SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 3 7])
+      (wisi-indent-action [[nil ada-indent] ada-indent-broken nil [ada-indent 
ada-indent] nil nil nil])))%
+  | RETURN extended_return_object_declaration SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])))%
+      ;; indent the same as a simple return statment
+      ;; test/ada_mode-nominal.adb
+      ;; return B : Integer :=
+      ;;   (Local_Function);
+      ;; (wisi-indent-action [nil nil nil]))
+  ;
+
+;; designator is merged with name
+
+factor
+  : primary STAR_STAR primary
+  | primary
+  | ABS primary
+  | NOT primary
+  ;
+
+formal_object_declaration
+  : identifier_list COLON mode_opt null_exclusion_opt name COLON_EQUAL
+    expression_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))%
+  | identifier_list COLON mode_opt access_definition COLON_EQUAL
+    expression_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 5 ada-indent-broken) 
ada-indent-broken nil])))%
+  | identifier_list COLON mode_opt null_exclusion_opt name 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-face-apply-action [5 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))%
+  | identifier_list COLON mode_opt access_definition aspect_specification_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+formal_part
+  : LEFT_PAREN parameter_specification_list RIGHT_PAREN
+    %((progn
+      (wisi-statement-action [1 misc]) ;; for ada-wisi-in-paramlist-p
+      (wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)])))%
+  ;
+
+formal_subprogram_declaration
+  : WITH subprogram_specification IS ABSTRACT subprogram_default 
aspect_specification_opt SEMICOLON
+ ;; formal_abstract_subprogram_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  | WITH subprogram_specification IS subprogram_default 
aspect_specification_opt SEMICOLON
+ ;; formal_concrete_subprogram_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  | WITH subprogram_specification IS ABSTRACT aspect_specification_opt 
SEMICOLON
+ ;; formal_abstract_subprogram_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  | WITH subprogram_specification aspect_specification_opt SEMICOLON ;; 
formal_concrete_subprogram_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken nil])))%
+  ;
+
+formal_type_declaration
+  : TYPE IDENTIFIER discriminant_part_opt IS formal_type_definition 
aspect_specification_opt SEMICOLON
+ ;; formal_complete_type_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken
+                             ada-indent-broken ada-indent-broken nil])))%
+  | TYPE IDENTIFIER discriminant_part_opt IS TAGGED aspect_specification_opt 
SEMICOLON
+ ;; formal_incomplete_type_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))%
+  | TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+formal_type_definition
+  : abstract_tagged_limited_opt PRIVATE ;; formal_private_type_definition
+  | formal_derived_type_definition
+  | LEFT_PAREN BOX RIGHT_PAREN ;; formal_discrete_type_definition
+  | RANGE BOX ;; formal_signed_integer_type_definition
+  | MOD BOX ;; formal_modular_type_definition
+  | DIGITS BOX ;; formal_floating_point_definition
+  | DELTA BOX DIGITS BOX ;; formal_decimal_fixed_point_definition
+  | DELTA BOX ;; formal_ordinary_fixed_point_definition
+  | array_type_definition ;; formal_array_type_definition
+  | access_definition ;; access_type_definition, formal_access_type_definition
+  | interface_type_definition ;; formal_interface_type_definition
+  ;
+
+;; formal_derived_type_definition ::=
+;;   [abstract] [limited | synchronized] new subtype_mark [[and 
interface_list]with private]
+formal_derived_type_definition
+  : abstract_limited_synchronized_opt NEW name and_interface_list_opt WITH 
PRIVATE
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  | abstract_limited_synchronized_opt NEW name and_interface_list_opt
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+formal_package_declaration
+  : WITH PACKAGE name IS NEW name formal_package_actual_part 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                 6 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+formal_package_actual_part
+  : LEFT_PAREN BOX RIGHT_PAREN ;; (<>)
+  | ;; empty generic actual part
+
+ ;; | LEFT_PAREN association_list RIGHT_PAREN
+ ;; covered by name <empty formal_package_actual_part) in 
formal_package_declaration
+ ;; covers others => <>
+  ;
+
+;; formal_package_association_list is merged into association_list to avoid 
reduce/reduce conflict
+
+full_type_declaration
+  : TYPE IDENTIFIER discriminant_part_opt IS type_definition 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+
+        ;; FIXME: indentation of comment after 'is' (and 'with' in
+        ;; derived_type_definition) should be ada-indent-record-rel-type
+        ;; if type_definition is a record. Worse if
+        ;; ada-indent-comment-gnat is t. Need 'anchor to next line'.
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil nil])))%
+  | task_type_declaration
+  | protected_type_declaration
+  ;
+
+function_specification
+  : FUNCTION name parameter_and_result_profile
+    %((progn
+        (wisi-statement-action [1 statement-start])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken])))%
+    %((wisi-propagate-name 2))%
+  ;
+
+general_access_modifier_opt
+  : ALL
+  | CONSTANT
+  | ;; empty
+  ;
+
+;; generic_actual_part is not needed; see generic_instantiation
+
+;; generic_association is merged into association
+
+generic_declaration
+  : generic_subprogram_declaration
+  | generic_package_declaration
+  ;
+
+generic_formal_part
+  : GENERIC generic_formal_parameter_declarations
+    %((progn
+      (wisi-statement-action [1 statement-start])
+      (wisi-indent-action [nil ada-indent])))%
+  | GENERIC
+    %((wisi-statement-action [1 statement-start]))%
+  ;
+
+generic_formal_parameter_declarations
+  : generic_formal_parameter_declarations generic_formal_parameter_declaration
+  | generic_formal_parameter_declaration
+  ;
+
+generic_formal_parameter_declaration
+  : formal_object_declaration
+  | formal_type_declaration
+  | formal_subprogram_declaration
+  | formal_package_declaration
+  | pragma_g
+  | use_clause
+  ;
+
+generic_instantiation
+ ;; name generic_actual_part is included in name as a function call
+  : PACKAGE name IS NEW name aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  | overriding_indicator_opt PROCEDURE name IS NEW name 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   6 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil])))%
+  | overriding_indicator_opt FUNCTION name IS NEW name 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 2 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   6 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 nil])))%
+  ;
+
+generic_package_declaration
+  : generic_formal_part package_specification SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 motion 3 statement-end])
+      (wisi-motion-action [1 2 3])
+      (wisi-indent-action [[nil ada-indent] nil nil])))%
+  ;
+
+generic_renaming_declaration
+  : GENERIC PACKAGE name RENAMES name aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  | GENERIC PROCEDURE name RENAMES name aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken
+                                 nil])))%
+  | GENERIC FUNCTION name RENAMES name aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   5 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil nil ada-indent-broken (ada-indent-renames 3) 
ada-indent-broken ada-indent-broken
+                                 nil])))%
+  ;
+
+generic_subprogram_declaration
+  : generic_formal_part subprogram_specification aspect_specification_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 motion 4 statement-end])
+      (wisi-motion-action [1 2 4])))%
+  ;
+
+goto_label
+  : LESS_LESS IDENTIFIER GREATER_GREATER
+    %((progn
+      (wisi-face-apply-action [2 nil font-lock-constant-face])
+      (wisi-indent-action [ada-indent-label nil nil])))%
+  ;
+
+handled_sequence_of_statements
+  : sequence_of_statements_opt EXCEPTION exception_handler_list_opt
+    %((progn
+      (wisi-statement-action [2 motion])
+      (wisi-indent-action [[nil nil]
+                           (- ada-indent)
+                           [(- ada-indent-when ada-indent) (- ada-indent-when 
ada-indent)]])))%
+  | sequence_of_statements_opt
+  ;
+
+identifier_list
+  : identifier_list COMMA IDENTIFIER
+    %((progn
+        (wisi-name-action 3)
+        (wisi-indent-action [nil nil ada-indent-broken])))%
+  | IDENTIFIER
+    %((wisi-name-action 1))%
+  ;
+
+identifier_opt
+  : IDENTIFIER
+    %()%
+    %((wisi-propagate-name 1))%
+  | ;; empty
+  ;
+
+if_expression
+  : IF expression_opt THEN expression_opt elsif_expression_list ELSE 
expression_opt
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 6 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 6])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil nil ada-indent])))%
+  | IF expression_opt THEN expression_opt ELSE expression_opt
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 5 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 5])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil ada-indent])))%
+  | IF expression_opt THEN expression_opt elsif_expression_list
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3 [5 ELSIF THEN]])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent nil])))%
+  | IF expression_opt THEN expression_opt
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion])
+      (wisi-containing-action 1 2)
+      (wisi-motion-action [1 3])
+      (wisi-indent-action [nil [ada-indent-broken ada-indent-broken] nil 
ada-indent])))%
+  ;
+
+if_statement
+  : IF expression_opt THEN sequence_of_statements_opt elsif_statement_list ELSE
+    sequence_of_statements_opt END IF SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 6 motion 10 
statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 5)
+      (wisi-containing-action 1 7)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 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])))%
+  | IF expression_opt THEN sequence_of_statements_opt ELSE 
sequence_of_statements_opt END IF SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 5 motion 9 
statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 6)
+      (wisi-motion-action [1 3 5 9])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil
+                             [ada-indent ada-indent] nil nil nil])))%
+  | IF expression_opt THEN sequence_of_statements_opt elsif_statement_list END 
IF SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 8 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 1 5)
+      (wisi-motion-action [1 3 [5 ELSIF THEN] 8])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil nil nil nil])))%
+  | IF expression_opt THEN sequence_of_statements_opt END IF SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 3 7])
+      (wisi-indent-action [nil [(wisi-hanging% ada-indent-broken (* 2 
ada-indent-broken))
+                              ada-indent-broken]
+                             nil
+                             [ada-indent ada-indent] nil nil nil])))%
+  ;
+
+incomplete_type_declaration
+  : TYPE IDENTIFIER discriminant_part_opt IS TAGGED SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  | TYPE IDENTIFIER discriminant_part_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 3 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+index_constraint
+  : LEFT_PAREN discrete_subtype_definition_list RIGHT_PAREN
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+  ;
+
+index_subtype_definition : name RANGE BOX ;
+
+index_subtype_definition_list
+  : index_subtype_definition_list COMMA index_subtype_definition
+  | index_subtype_definition
+  ;
+
+interface_list
+  : interface_list AND name
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  | name
+    %((wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+interface_type_definition
+  : LIMITED INTERFACE AND interface_list
+  | TASK INTERFACE AND interface_list
+  | PROTECTED INTERFACE AND interface_list
+  | SYNCHRONIZED INTERFACE AND interface_list
+  | LIMITED INTERFACE
+  | TASK INTERFACE
+  | PROTECTED INTERFACE
+  | SYNCHRONIZED INTERFACE
+  | INTERFACE
+;
+
+iteration_scheme
+  : WHILE expression_opt
+    %((wisi-indent-action [nil [ada-indent-broken ada-indent-broken]]))%
+  | FOR iterator_specification_opt
+    %((wisi-indent-action [nil [ada-indent-broken ada-indent-broken]]))%
+  ;
+
+iterator_specification
+ ;; also loop_parameter_specification, to avoid redundancy bewteen
+ ;; iterator_name and discrete_subtype_definition; both can be just
+ ;; 'name'. For example, a name could be either
+ ;; 'Package_Name.Type_Name' from a loop_parameter_specification, or
+ ;; "Object_Name.Iterator' from iterator_specification.
+ ;;
+ ;; That means both get marked with the same face, when they should
+ ;; not be. If we include the conflict to get different face actions,
+ ;; it will be resolved by identical stacks, one will be terminated at
+ ;; random, and the wrong face action might still be applied. This can
+ ;; only be fixed with true name resolution, so we remove any faces
+ ;; that have been applied.
+ ;;
+  : IDENTIFIER COLON subtype_indication OF REVERSE name
+  | IDENTIFIER COLON subtype_indication OF name
+  | IDENTIFIER IN REVERSE discrete_subtype_definition
+    %((wisi-face-remove-action [4]))%
+
+ ;; The following can only be iterator_specifications. The name could
+ ;; include a package name, but we can't tell that without full name
+ ;; resolution.
+  | IDENTIFIER OF REVERSE name
+  | IDENTIFIER OF name
+
+  | IDENTIFIER IN discrete_subtype_definition
+    %((wisi-face-remove-action [3]))%
+  ;
+
+iterator_specification_opt
+  : iterator_specification
+  | ;; empty
+  ;
+
+;; library_*  not needed; 'declaration' in compilation_unit
+
+loop_statement
+  : block_label_opt iteration_scheme LOOP sequence_of_statements_opt END LOOP 
identifier_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 misc 3 motion 8 
statement-end])
+      (wisi-containing-action 2 4)
+      (wisi-motion-action [2 3 8])
+      (wisi-indent-action [nil nil nil [ada-indent ada-indent] nil nil nil 
nil])))%
+    %((wisi-match-names 1 7))%
+  | block_label_opt LOOP sequence_of_statements_opt END LOOP identifier_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 misc 7 statement-end])
+      (wisi-containing-action 2 3)
+      (wisi-indent-action [nil nil [ada-indent ada-indent] nil nil nil nil])))%
+    %((wisi-match-names 1 6))%
+  ;
+
+membership_choice_list
+  : membership_choice_list BAR membership_choice
+  | membership_choice
+  ;
+
+membership_choice
+  : simple_expression
+ ;; ARM has choice_expression here, but that leads to a shift/reduce conflict, 
because of the following productions:
+ ;; membership_choice_list => membership_choice => choice_expression => 
choice_relation_and_list
+ ;; relation => simple_expression IN choice_relation_and_list
+ ;; thus 'choice_relation_and_list AND' could be followed by relation (=> 
reduce) or choice_relation (=> shift)
+ ;; This only occurs in legal Ada in expressions such as 'True in 1 and 3'; 
not useful, so we leave it out.
+  | range_g
+ ;;  | name ;; subtype_mark - also covered by simple_expression; avoid 
reduce/reduce conflict
+  ;
+
+mod_clause_opt
+  : AT MOD expression_opt SEMICOLON
+  | ;; empty
+  ;
+
+mode_opt
+  : IN
+  | IN OUT
+  | OUT
+  | ;; empty
+  ;
+
+multiplying_operator : STAR | SLASH | MOD | REM ; ;; * | / | mod | rem
+
+name_list
+  : name_list COMMA name
+  | name
+  ;
+
+name
+ ;; ARM has name ( discrete_subtype_definition ) here, but that's
+ ;; partly redundant with name actual_parameter_part, and partly with
+ ;; subtype_indication; this is the part that is not redundant.
+  : name LEFT_PAREN range_list RIGHT_PAREN ;; slice or constraint
+ ;; test/ada_mode_nominal.ads Access_Unconstrained_Array_Type_1
+ ;; test/ada_mode-parens.adb
+ ;; Slice_1
+ ;;   (1,
+ ;;    C
+ ;;      (1 .. 2));
+ ;;
+ ;; tests/g-comlin.adb
+ ;; return CL.Argument (The_Switch.Arg_Num)
+ ;;   (The_Switch.First ..
+ ;;      The_Switch.Last);
+    %((wisi-indent-action [nil
+                         (wisi-anchored% 1 ada-indent-broken)
+                         (wisi-hanging (wisi-anchored 2 1)
+                                       (wisi-anchored 2 (+ 1 
ada-indent-broken)))
+                         (wisi-anchored 2 0)]))%
+
+  | name actual_parameter_part
+ ;; type_conversion, function_call, procedure call, generic
+ ;; instantiation, indexed_component.
+ ;;
+ ;; test/ada_mode-parens.adb
+ ;; No_Conditional_Set : constant Ada.Strings.Maps.Character_Set :=
+ ;;   Ada.Strings.Maps."or"
+ ;;     (Ada.Strings.Maps.To_Set (' '),
+ ;;
+ ;; Local_11 : Local_11_Type := Local_11_Type'
+ ;;   (A => Integer
+ ;;      (1.0),
+ ;; indented by association
+ ;;
+ ;;test/hanging.adb; sets ada-indent-hanging-rel-exp: t
+ ;; X_Long_Name
+ ;;   := F_Long_Name
+ ;;        (A => True,
+ ;;         B => True);
+    %((progn
+      (wisi-statement-action [1 misc])
+      (wisi-containing-action 1 2)
+      (wisi-indent-action [nil (if ada-indent-hanging-rel-exp
+                                 (wisi-anchored 1 ada-indent-broken)
+                               (wisi-anchored% 1 ada-indent-broken))])))%
+
+  | selected_component ;; starts with name
+    %()%
+    %((wisi-propagate-name 1))%
+
+  | attribute_reference ;; starts with name
+  | qualified_expression ;; starts with name
+
+  | IDENTIFIER ;; from direct_name
+ ;; marking this for possible later face-apply, to prevent applying
+ ;; face to the aggregate of an allocator, and other similar cases.
+ ;; test/ada_mode-nominal.adb
+ ;;    Object_3 : access Record_Type_3 := new Record_Type_3 (...)
+    %((wisi-face-mark-action [1 suffix]))%
+    %((wisi-propagate-name 1))%
+
+  | CHARACTER_LITERAL ;; only in an expression, so no type or function-name 
face
+
+  | STRING_LITERAL ;; operator_symbol, designator
+    %()%
+    %((wisi-propagate-name 1))%
+
+  ;; | explicit_dereference in selected_component
+  ;; | indexed_component same as 'name actual_parameter_part' above
+  ;; | generalized_reference same as 'name'
+  ;; | generalized_indexing same as 'indexed_component'
+  ;
+
+name_opt
+  : name
+    %()%
+    %((wisi-propagate-name 1))%
+  | ;; empty
+  ;
+
+null_exclusion_opt
+  : NOT NULL
+  | ;; empty
+  ;
+
+;; use _only_ to avoid a conflict between name and null_exclusion_opt; name 
must be a type
+null_exclusion_opt_name_type
+  : IDENTIFIER
+    %((wisi-face-apply-action [1 nil font-lock-type-face]))%
+  | selected_component
+    %((wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face]))%
+  | NOT NULL IDENTIFIER
+    %((wisi-face-apply-action [3 nil font-lock-type-face]))%
+  | NOT NULL selected_component
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+null_procedure_declaration
+  : overriding_indicator_opt procedure_specification IS NULL 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+object_declaration
+  : identifier_list COLON aliased_opt constant_opt subtype_indication 
COLON_EQUAL
+    expression_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 7)
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored%- 6 ada-indent-broken) 
ada-indent-broken nil])))%
+  | identifier_list COLON aliased_opt constant_opt access_definition 
COLON_EQUAL
+    expression_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))%
+  | identifier_list COLON aliased_opt constant_opt array_type_definition 
COLON_EQUAL
+    expression_opt aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                             (wisi-anchored% 6 ada-indent-broken) 
ada-indent-broken nil])))%
+  | identifier_list COLON aliased_opt constant_opt subtype_indication 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))%
+  | identifier_list COLON aliased_opt constant_opt access_definition 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))%
+  | identifier_list COLON aliased_opt constant_opt array_type_definition 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 5) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                               ada-indent-broken nil])))%
+  | single_task_declaration
+  | single_protected_declaration
+  ;
+
+object_renaming_declaration
+  : IDENTIFIER COLON null_exclusion_opt name RENAMES name 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 8 statement-end])
+        (wisi-name-action 1)
+        (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken ada-indent-broken nil])))%
+  | IDENTIFIER COLON access_definition RENAMES name aspect_specification_opt 
SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 1)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken nil])))%
+  | IDENTIFIER COLON EXCEPTION RENAMES name aspect_specification_opt SEMICOLON 
;; exception_renaming_declaration
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 1)
+        (wisi-face-apply-action [5 font-lock-function-name-face nil])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                                 ada-indent-broken nil])))%
+  ;
+
+;; operator_symbol is STRING_LITERAL, in name
+
+overriding_indicator_opt
+  : NOT OVERRIDING
+    %((wisi-statement-action [1 statement-start 2 statement-override]))%
+  | OVERRIDING
+    %((wisi-statement-action [1 statement-start]))%
+  | ;; empty - following keyword is statement-start
+  ;
+
+package_body
+  : PACKAGE BODY name aspect_specification_opt IS declarative_part_opt
+    BEGIN handled_sequence_of_statements END name_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 5 motion 7 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 5 7 [8 EXCEPTION WHEN] 11])
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   10 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil nil 
[ada-indent ada-indent]
+                             nil [ada-indent ada-indent] nil ada-indent-broken 
nil])))%
+    %((wisi-match-names 3 10))%
+
+  | PACKAGE BODY name aspect_specification_opt IS declarative_part_opt END 
name_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-motion-action [1 5 9])
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face
+                                   8 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [ada-indent ada-indent] nil
+                                 nil nil])))%
+    %((wisi-match-names 3 8))%
+  ;
+
+package_body_stub
+  : PACKAGE BODY name IS SEPARATE aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+package_declaration
+  : package_specification SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-end])
+      (wisi-motion-action [[1 PRIVATE] 2])))%
+  ;
+
+package_renaming_declaration
+  : PACKAGE name RENAMES name aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   4 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+package_specification
+  : PACKAGE name aspect_specification_opt IS declarative_part_opt PRIVATE 
declarative_part_opt END name_opt
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 6 motion])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 4)
+        (wisi-containing-action 4 5) ;; for goto-declarative-region-start
+        (wisi-containing-action 1 7)
+        (wisi-motion-action [1 4 6])
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                   9 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
[ada-indent ada-indent] nil
+                             [ada-indent ada-indent] nil nil])))%
+    %((wisi-match-names 2 9))%
+  | PACKAGE name aspect_specification_opt IS declarative_part_opt END name_opt
+    %((progn
+      (wisi-statement-action [1 statement-start 4 motion])
+      (wisi-name-action 2)
+      (wisi-containing-action 1 4)
+      (wisi-containing-action 4 5) ;; for goto-declarative-region-start
+      (wisi-motion-action [1 4])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face
+                                 7 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
[ada-indent ada-indent] nil nil])))%
+    %((wisi-match-names 2 7))%
+  ;
+
+parameter_and_result_profile
+  : formal_part result_profile
+    %((wisi-indent-action [nil (ada-indent-return 1 0)]))%
+  | result_profile
+  ;
+
+;; parameter_association is merged into association
+;; parameter_association_list is merged into association_list
+
+parameter_profile_opt
+  : formal_part
+  | ;; empty
+  ;
+
+parameter_specification
+  : identifier_list COLON aliased_opt mode_opt null_exclusion_opt name 
COLON_EQUAL expression_opt
+    %((progn
+      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                             ada-indent-broken ada-indent-broken 
(wisi-anchored% 7 ada-indent-broken)])))%
+  | identifier_list COLON aliased_opt mode_opt null_exclusion_opt name
+    %((progn
+      (wisi-face-apply-action [6 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                             ada-indent-broken])))%
+  | identifier_list COLON aliased_opt access_definition COLON_EQUAL 
expression_opt
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken
+                           (wisi-anchored% 5 ada-indent-broken)]))%
+  | identifier_list COLON aliased_opt access_definition
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken]))%
+  | ;; empty
+  ;
+
+parameter_specification_list
+  : parameter_specification_list SEMICOLON parameter_specification
+    %((wisi-statement-action [2 motion]))% ;; not integrated with higher level 
motion; just a local stopping point
+  | parameter_specification
+  ;
+
+paren_expression
+  : LEFT_PAREN expression_opt RIGHT_PAREN
+ ;;test/ada_mode-parens.ads
+ ;; function Expression_Function_1 (V : Integer) return Boolean
+ ;;   is ((V = V and then True)
+ ;;         or else True);
+    %((wisi-indent-action [nil
+                         (wisi-hanging (wisi-anchored 1 1)
+                                       (wisi-anchored 1 (+ 1 
ada-indent-broken)))
+                         (wisi-anchored 1 0)]))%
+
+  | LEFT_PAREN association_list RIGHT_PAREN
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+
+ ;; ARM 4.5.7(7), ARM 4.5.8(4) allow ( conditional|quantified_expression ) 
instead of (( ... ))
+  | LEFT_PAREN conditional_quantified_expression RIGHT_PAREN
+    %((wisi-indent-action [nil (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+  ;
+
+pragma_g
+  : PRAGMA IDENTIFIER LEFT_PAREN association_list RIGHT_PAREN SEMICOLON
+ ;; ARM has 'pragma_argument_association'; this is a superset, and reduces 
redundancy
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) nil])))%
+ ;; ARM 4.5.7(7), ARM 4.5.8(4) allow ( conditional|quantified_expression ) 
instead of (( ... ))
+  | PRAGMA IDENTIFIER LEFT_PAREN conditional_quantified_expression RIGHT_PAREN 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored 3 1) (wisi-anchored 3 0) nil])))%
+  | PRAGMA IDENTIFIER SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken nil])))%
+  ;
+
+;; prefix is name
+
+primary
+  : NUMERIC_LITERAL
+    %((wisi-face-apply-action [1 nil font-lock-constant-face]))%
+  | NULL
+ ;; | STRING_LITERAL in name
+  | aggregate
+    %((wisi-indent-action [(ada-indent-aggregate)]))%
+  | name
+  | NEW name
+ ;; allocator, FIXME: leaving out subpool_specification.
+    %((wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face]))%
+ ;; | LEFT_PAREN expression RIGHT_PAREN ;; covered by aggregate
+ ;; | LEFT_PAREN conditional_quantified_expression RIGHT_PAREN ; covered by 
aggregate
+  ;
+
+private_extension_declaration
+  : TYPE IDENTIFIER discriminant_part_opt IS abstract_limited_synchronized_opt 
NEW
+    subtype_indication and_interface_list_opt WITH PRIVATE 
aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 12 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken nil nil])))%
+  ;
+
+private_type_declaration
+  : TYPE IDENTIFIER discriminant_part_opt IS abstract_tagged_limited_opt 
PRIVATE aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 8 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil 
ada-indent-broken ada-indent-broken nil
+                                 nil])))%
+  ;
+
+procedure_call_statement
+  : name SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-end])
+      (wisi-indent-action [(wisi-hanging nil ada-indent-broken) nil])))%
+  ;
+
+procedure_specification
+  : PROCEDURE name parameter_profile_opt
+    %((progn
+        (wisi-statement-action [1 statement-start])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 3) ;; for goto-declaration-start
+        (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken])))%
+    %((wisi-propagate-name 2))%
+  ;
+
+proper_body
+  : subprogram_body
+  | package_body
+  | task_body
+  | protected_body
+  ;
+
+protected_body
+  : PROTECTED BODY IDENTIFIER aspect_specification_opt IS 
protected_operation_item_list_opt END identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 5 motion 9 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-motion-action [1 5 9])
+        (wisi-face-apply-action [3 nil font-lock-type-face 8 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken nil nil 
ada-indent nil nil nil])))%
+    %((wisi-match-names 3 8))%
+  ;
+
+protected_body_stub
+  : PROTECTED BODY IDENTIFIER IS SEPARATE aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken ada-indent-broken ada-indent-broken nil])))%
+  ;
+
+protected_definition
+  : declarative_part_opt PRIVATE declarative_part_opt END identifier_opt
+    %((progn
+      (wisi-statement-action [2 motion])
+      (wisi-face-apply-action [5 nil font-lock-type-face])
+      (wisi-indent-action [[ada-indent ada-indent] nil [ada-indent ada-indent] 
nil nil])))%
+    %((wisi-propagate-name 5))%
+
+  | declarative_part_opt END identifier_opt
+    %((progn
+      (wisi-face-apply-action [3 nil font-lock-type-face])
+      (wisi-indent-action [[ada-indent ada-indent] nil nil])))%
+    %((wisi-propagate-name 3))%
+  ;
+
+protected_operation_item
+  : subprogram_declaration
+  | subprogram_body
+  | entry_body
+  | expression_function_declaration
+  | null_procedure_declaration
+  | aspect_clause
+  ;
+
+protected_operation_item_list
+  : protected_operation_item_list protected_operation_item
+  | protected_operation_item
+  ;
+
+protected_operation_item_list_opt
+  : protected_operation_item_list
+  | ;; empty
+  ;
+
+protected_opt
+  : PROTECTED
+  | ;; empty
+  ;
+
+protected_type_declaration
+  : PROTECTED TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt IS
+    NEW interface_list WITH protected_definition SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 motion 9 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 10)
+        (wisi-motion-action [1 6 [10 PRIVATE] 11])
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil])))%
+    %((wisi-match-names 3 10))%
+  | PROTECTED TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
IS protected_definition SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 motion 8 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 7)
+        (wisi-motion-action [1 6 [7 PRIVATE] 8])
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [nil ada-indent] nil nil])))%
+    %((wisi-match-names 3 7))%
+  ;
+
+;; protected_operation_declaration merged into declaration
+
+qualified_expression
+  : name tick aggregate
+    %((progn
+      (wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil nil (if ada-indent-hanging-rel-exp
+                                   (wisi-anchored 1 ada-indent-broken)
+                                 (wisi-anchored% 1 ada-indent-broken))])))%
+    ;
+
+quantified_expression
+  : FOR quantifier iterator_specification EQUAL_GREATER expression_opt
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored% 4 ada-indent-broken)]))%
+  ;
+
+quantifier : ALL | SOME ;
+
+raise_expression
+  : RAISE name WITH expression_opt
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken)]))%
+  | RAISE name
+  ;
+
+raise_statement
+  : RAISE name WITH expression_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 motion 5 statement-end])
+      (wisi-containing-action 1 4)
+      ;; test/ada_mode-nominal.adb
+      ;; raise Constraint_Error with
+      ;;   "help " &
+      ;;   "me!";
+      ;;
+      ;; raise Constraint_Error
+      ;;   with Integer'Image (1) &
+      ;;   "help!";
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
(wisi-anchored% 3 ada-indent-broken) nil])))%
+  | RAISE name SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-indent-action [nil ada-indent-broken nil])))%
+  | RAISE SEMICOLON
+    %((wisi-statement-action [1 statement-start 2 statement-end]))%
+  ;
+
+range_g
+  : name tick RANGE LEFT_PAREN expression_opt RIGHT_PAREN ;; 
range_attribute_reference
+    %((wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken (wisi-anchored 4 1) (wisi-anchored 4 0)]))%
+  | name tick RANGE ;; range_attribute_reference
+  | simple_expression DOT_DOT simple_expression
+  ;
+
+range_list
+  : range_list COMMA range_g
+  | range_g
+  ;
+
+real_range_specification_opt
+  : RANGE simple_expression DOT_DOT simple_expression
+  | ;; empty
+  ;
+
+record_definition
+  : RECORD component_list_opt END RECORD
+    %((wisi-indent-action [[(ada-indent-record* 'TYPE 1 0) (ada-indent-record* 
'TYPE 1 ada-indent)]
+                         [(ada-indent-record* 'TYPE 1 ada-indent) 
(ada-indent-record* 'TYPE 1 ada-indent)]
+                         (ada-indent-record* 'TYPE 1 0)
+                         nil]))%
+ ;; ' terminate quote
+  | NULL RECORD
+  ;
+
+record_representation_clause
+  : FOR name USE RECORD mod_clause_opt component_clause_list END RECORD 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken
+                             (ada-indent-record 1 4 0)
+                             (ada-indent-record 1 4 ada-indent)
+                             (ada-indent-record 1 4 ada-indent)
+                             (ada-indent-record 1 4 0)
+                             nil nil])))%
+  ;
+
+relation_and_list
+  : relation_and_list AND relation
+  | relation AND relation
+  ;
+
+relation_and_then_list
+  : relation_and_then_list AND THEN relation
+  | relation AND THEN relation
+  ;
+
+relation_or_list
+  : relation_or_list OR relation
+  | relation OR relation
+  ;
+
+relation_or_else_list
+  : relation_or_else_list OR ELSE relation
+  | relation OR ELSE relation
+  ;
+
+relation_xor_list
+  : relation_xor_list XOR relation
+  | relation XOR relation
+  ;
+
+;; http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0022-1.txt?rev=1.13
+;; adds raise_expression
+relation
+  : simple_expression NOT IN membership_choice_list
+  | simple_expression IN membership_choice_list
+  | simple_expression relational_operator simple_expression
+  | simple_expression
+  | raise_expression
+  ;
+
+relational_operator
+  : EQUAL | SLASH_EQUAL | LESS | LESS_EQUAL | GREATER | GREATER_EQUAL ;
+  ;;  =   | /=          | <    |  <=        | >       | >=
+
+renaming_declaration
+  : object_renaming_declaration ;; includes exception_renaming_declaration
+  | package_renaming_declaration
+  | subprogram_renaming_declaration
+  | generic_renaming_declaration
+  ;
+
+requeue_statement
+  : REQUEUE name WITH ABORT SEMICOLON
+    %((wisi-statement-action [1 statement-start 5 statement-end]))%
+  | REQUEUE name SEMICOLON
+    %((wisi-statement-action [1 statement-start 3 statement-end]))%
+  ;
+
+;; not in LRM; used to implement consistent indentation
+result_profile
+  : RETURN null_exclusion_opt name_opt
+    %((progn
+      (wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action* 1
+                           [nil
+                            (wisi-anchored* 1 ada-indent-broken)
+                            (wisi-anchored* 1 ada-indent-broken)])))%
+  | RETURN access_definition
+ ;; test/ada_mode-nominal.adb
+ ;; function Function_Access_1
+ ;;   (A_Param : in Float)
+ ;;   return access
+ ;;     Standard.Float
+    %((wisi-indent-action* 1 [nil (wisi-anchored*- 1 ada-indent-broken)]))%
+  ;
+
+return_subtype_indication
+  : subtype_indication
+  | access_definition
+  ;
+
+selected_component
+  : name DOT IDENTIFIER
+    %((wisi-face-mark-action [1 prefix 3 suffix]))%
+    %((wisi-merge-names 1 3))%
+
+  | name DOT CHARACTER_LITERAL
+    %((wisi-face-mark-action [1 prefix]))%
+
+  | name DOT STRING_LITERAL
+    %((wisi-face-mark-action [1 prefix]))%
+    %((wisi-merge-names 1 3))%
+
+  | name DOT ALL
+    %((wisi-face-mark-action [1 prefix]))%
+  ;
+
+;; selector_name - IDENTIFIER, STRING_LITERAL overlap name; CHARACTER_LITERAL 
used separately
+;;  : IDENTIFIER | CHARACTER_LITERAL | STRING_LITERAL ; ;; operator_symbol
+
+selective_accept
+  : SELECT select_alternative_list_opt ELSE sequence_of_statements_opt END 
SELECT SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 7 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-motion-action [1 [2 OR WHEN] 3 7])
+      (wisi-indent-action [[nil ada-indent] [nil ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))%
+  | SELECT select_alternative_list_opt END SELECT SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-motion-action [1 [2 OR WHEN] 5])
+      (wisi-indent-action [[nil ada-indent] [nil ada-indent] nil nil nil])))%
+  ;
+
+select_alternative
+ ;; we can't use guard_opt here because when present a guard is a
+ ;; block-start, but when absent there is no block-start
+  : WHEN expression_opt EQUAL_GREATER accept_statement 
sequence_of_statements_opt ;; guard accept_alternative
+    %((progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken ada-indent 
ada-indent])))%
+  | WHEN expression_opt EQUAL_GREATER TERMINATE SEMICOLON ;; 
terminate_alternative
+    %((progn
+      (wisi-statement-action [1 motion 4 statement-start 5 statement-end])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken ada-indent 
nil])))%
+  | WHEN expression_opt EQUAL_GREATER delay_alternative
+    %((progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent])))%
+  | accept_statement sequence_of_statements_opt ;; accept_alternative
+  | TERMINATE SEMICOLON ;; terminate_alternative
+    %((wisi-statement-action [1 statement-start 2 statement-end]))%
+  | delay_alternative
+  ;
+
+select_alternative_list
+  : select_alternative_list OR select_alternative
+    %((progn
+      (wisi-statement-action [2 motion])
+      (wisi-indent-action [nil nil ada-indent])))%
+  | select_alternative
+    %((wisi-indent-action [ada-indent]))%
+  ;
+
+select_alternative_list_opt
+  : select_alternative_list
+  | ;; empty
+  ;
+
+select_statement
+  : selective_accept
+  | timed_entry_call
+  | conditional_entry_call
+  | asynchronous_select
+  ;
+
+sequence_of_statements
+  : sequence_of_statements statement
+  | statement
+  ;
+
+;; Wherever the ARM requires a sequence_of_statements, we allow
+;; nothing; this simplifies indenting skeletons (see ada-skel), and is
+;; more user-friendly for indenting while editing.
+sequence_of_statements_opt
+  : sequence_of_statements
+  | ;; empty
+  ;
+
+simple_expression
+  : unary_adding_operator term_list
+  | term_list
+  ;
+
+simple_return_statement
+  : RETURN expression_opt SEMICOLON
+ ;; test/ada_mode-parens.adb Function_3
+ ;; return
+ ;;   1.0 +
+ ;;   2.0;
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-indent-action [nil ada-indent-broken nil])))%
+  ;
+
+simple_statement
+  : NULL SEMICOLON;; null_statement
+    %((wisi-statement-action [1 statement-start 2 statement-end]))%
+  | assignment_statement
+  | exit_statement
+  | GOTO IDENTIFIER SEMICOLON ;; goto_statement
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-constant-face])))%
+  | procedure_call_statement
+  | simple_return_statement
+ ;; | entry_call_statement ; covered by procedure_call_statement
+  | requeue_statement
+  | delay_statement
+  | ABORT name SEMICOLON ;; abort_statement; ignoring list of tasks
+    %((wisi-statement-action [1 statement-start 3 statement-end]))%
+  | raise_statement
+  ;; | code_statement
+  | pragma_g
+  ;
+
+single_protected_declaration
+  : PROTECTED IDENTIFIER aspect_specification_opt IS NEW interface_list WITH 
protected_definition SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 7 motion 9 
statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 4 7 [8 PRIVATE] 9])
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil
+                                 nil])))%
+    %((wisi-match-names 2 8))%
+
+  | PROTECTED IDENTIFIER aspect_specification_opt IS protected_definition 
SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5)
+        (wisi-motion-action [1 4 [5 PRIVATE] 6])
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil [nil ada-indent] nil 
nil])))%
+    %((wisi-match-names 2 5))%
+  ;
+
+single_task_declaration
+  : TASK IDENTIFIER aspect_specification_opt IS NEW interface_list WITH 
task_definition END identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 7 motion 11 
statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 4 [8 PRIVATE] 11])
+        (wisi-face-apply-action [2 nil font-lock-type-face 9 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil ada-indent-broken 
ada-indent-broken ada-indent-broken nil
+                                 nil nil nil])))%
+    %((wisi-match-names 2 10))%
+
+  | TASK IDENTIFIER aspect_specification_opt IS task_definition END 
identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 motion 8 statement-end])
+        (wisi-name-action 2)
+        (wisi-containing-action 1 5)
+        (wisi-motion-action [1 4 [5 PRIVATE] 8])
+        (wisi-face-apply-action [2 nil font-lock-type-face 6 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil [nil ada-indent] nil 
nil nil nil])))%
+    %((wisi-match-names 2 7))%
+
+  | TASK IDENTIFIER aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 4 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken nil nil])))%
+  ;
+
+statement
+  : goto_label
+  | simple_statement
+  | compound_statement
+  ;
+
+subprogram_body
+  : overriding_indicator_opt subprogram_specification aspect_specification_opt 
IS declarative_part_opt
+    BEGIN handled_sequence_of_statements END name_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 4 motion 
6 motion 10 statement-end])
+      (wisi-containing-action 2 4)
+      (wisi-containing-action 4 5) ;; for goto_declarative_region_start
+      (wisi-containing-action 2 7)
+      (wisi-motion-action [1 [2 FUNCTION PROCEDURE] 4 6 10])
+      (wisi-face-apply-action [9 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil [nil ada-indent] nil nil [ada-indent ada-indent]
+                             nil [ada-indent ada-indent] nil ada-indent-broken 
nil])))%
+    %((wisi-match-names 2 9))%
+  ;
+
+subprogram_body_stub
+  : overriding_indicator_opt subprogram_specification IS SEPARATE 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-indent-action [nil nil nil ada-indent-broken ada-indent-broken 
nil])))%
+  ;
+
+subprogram_declaration
+  : overriding_indicator_opt subprogram_specification aspect_specification_opt 
SEMICOLON
+    %((wisi-statement-action [1 statement-start 2 statement-override 4 
statement-end]))%
+  ;
+
+subprogram_default
+  : name
+    %((wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-function-name-face]))%
+  | BOX
+  | NULL ;
+
+subprogram_renaming_declaration
+  : overriding_indicator_opt subprogram_specification RENAMES name 
aspect_specification_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 2 statement-override 6 
statement-end])
+      (wisi-face-apply-action [4 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil nil (ada-indent-renames 2) ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+subprogram_specification
+  : procedure_specification
+    %()%
+    %((wisi-propagate-name 1))%
+  | function_specification
+    %()%
+    %((wisi-propagate-name 1))%
+  ;
+
+subtype_declaration
+  : SUBTYPE IDENTIFIER IS subtype_indication aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 2)
+        (wisi-face-apply-action [2 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil])))%
+  ;
+
+subtype_indication
+  : NOT NULL name constraint
+ ;; The last component of a selected_component could be an iterator
+ ;; function in a loop iteration_scheme, not a type. See the comment
+ ;; in iterator_specification.
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  | NOT NULL name
+    %((wisi-face-apply-action [3 font-lock-function-name-face 
font-lock-type-face]))%
+  | name constraint
+    %((wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face]))%
+  | name
+    %((wisi-face-apply-action [1 font-lock-function-name-face 
font-lock-type-face]))%
+  ;
+
+;; subtype_mark replaced by name
+
+subunit
+  : SEPARATE LEFT_PAREN name RIGHT_PAREN proper_body
+    %((progn
+      (wisi-statement-action [1 statement-start 5 motion])
+      (wisi-indent-action [nil ada-indent-broken (wisi-anchored 2 1) 
(wisi-anchored 2 0) nil])))%
+  ;
+
+task_body
+  : TASK BODY IDENTIFIER aspect_specification_opt IS declarative_part_opt
+    BEGIN handled_sequence_of_statements END identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 5 motion 7 motion 11 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 6)
+        (wisi-containing-action 1 8)
+        (wisi-motion-action [1 5 7 11])
+        (wisi-face-apply-action [3 nil font-lock-type-face 10 nil 
font-lock-type-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil nil [ada-indent 
ada-indent]
+                               nil [ada-indent ada-indent] nil nil nil])))%
+    %((wisi-match-names 3 10))%
+  ;
+
+task_body_stub
+  : TASK BODY IDENTIFIER IS SEPARATE aspect_specification_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 7 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil nil ada-indent-broken nil ada-indent-broken 
ada-indent-broken nil])))%
+  ;
+
+;; LRM includes 'end identifier' here; we put that in
+;; task_type_declaration, single_task_declaration to simplify motion
+;; actions.
+task_definition
+  : declarative_part_opt PRIVATE declarative_part_opt
+    %((progn
+      (wisi-statement-action [2 motion])
+      (wisi-containing-action 2 3)
+      (wisi-indent-action [[ada-indent ada-indent] nil [ada-indent 
ada-indent]])))%
+  | declarative_part_opt
+    %((wisi-indent-action [[ada-indent ada-indent]]))%
+  ;
+
+;; task_item replaced by declaration
+
+task_type_declaration
+  : TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt IS
+    NEW interface_list WITH task_definition END identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 motion 9 motion 13 
statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 10)
+        (wisi-motion-action [1 6 9 [10 PRIVATE] 13])
+        (wisi-face-apply-action [3 nil font-lock-type-face 12 nil 
font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil
+                               ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil nil nil])))%
+    %((wisi-match-names 3 12))%
+  | TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt IS 
task_definition END identifier_opt SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 motion 10 statement-end])
+        (wisi-name-action 3)
+        (wisi-containing-action 1 7)
+        (wisi-face-apply-action [3 nil font-lock-type-face 9 nil 
font-lock-type-face])
+        (wisi-motion-action [1 6 [7 PRIVATE] 10])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil [nil ada-indent] nil nil nil
+                                 nil])))%
+    %((wisi-match-names 3 9))%
+
+  | TASK TYPE IDENTIFIER discriminant_part_opt aspect_specification_opt 
SEMICOLON
+    %((progn
+        (wisi-statement-action [1 statement-start 6 statement-end])
+        (wisi-name-action 3)
+        (wisi-face-apply-action [3 nil font-lock-type-face])
+        (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-broken nil nil])))%
+  ;
+
+term
+  : term multiplying_operator factor
+  | factor
+  ;
+
+term_list
+  : term_list binary_adding_operator term
+  | term
+  ;
+
+tick
+  : TICK_1
+%if lexer = re2c
+  | TICK_2
+%end if
+  ;
+
+timed_entry_call
+  : SELECT entry_call_alternative OR delay_alternative END SELECT SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 motion 6 statement-end])
+      (wisi-containing-action 1 2)
+      (wisi-containing-action 1 4)
+      (wisi-indent-action [nil [ada-indent ada-indent] nil [ada-indent 
ada-indent] nil nil nil])))%
+  ;
+
+triggering_alternative
+  : procedure_call_statement sequence_of_statements_opt
+  | name sequence_of_statements_opt ;; entry_call_statement
+  | delay_statement sequence_of_statements_opt
+  ;
+
+type_declaration
+  : full_type_declaration
+  | incomplete_type_declaration
+  | private_type_declaration
+  | private_extension_declaration
+  ;
+
+type_definition
+  : enumeration_type_definition
+  | RANGE simple_expression DOT_DOT simple_expression ;; 
integer_type_definition
+  | MOD expression_opt
+  | DIGITS expression_opt real_range_specification_opt ;; 
real_type_definition, floating_point_type_definition
+  | DELTA expression_opt DIGITS expression_opt real_range_specification_opt ;; 
decimal_fixed_point_definition
+  | DELTA expression_opt real_range_specification_opt ;; 
ordinary_fixed_point_definition
+  | array_type_definition
+  | abstract_tagged_limited_opt record_definition ;;record_type_definition
+  | access_definition ;; access_type_definition
+  | derived_type_definition
+  | interface_type_definition
+  ;
+
+variant_part
+  : CASE direct_name_opt IS variant_list END CASE SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 4) ;; for goto-declaration-start
+      (wisi-indent-action [nil ada-indent-broken nil ada-indent-when nil nil 
nil])))%
+  ;
+
+variant_list
+  : variant_list variant
+  | variant
+  ;
+
+variant
+  : WHEN discrete_choice_list EQUAL_GREATER component_list_opt
+    %((progn
+      (wisi-statement-action [1 motion])
+      ;; ada-indent-when applied in variant_part
+      (wisi-indent-action [nil (wisi-hanging nil ada-indent-broken) ada-indent 
[ada-indent ada-indent]])))%
+  ;
+
+unary_adding_operator : PLUS | MINUS ; ;; + | -
+
+use_clause
+  : USE ALL TYPE name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-use nil])))%
+  | USE TYPE name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-type-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-use nil])))%
+  | USE name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-use nil])))%
+  ;
+
+with_clause
+  : LIMITED PRIVATE WITH name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-list-action [4 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-broken 
ada-indent-with nil])))%
+  | LIMITED WITH name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-with nil])))%
+  | PRIVATE WITH name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-face-apply-list-action [3 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-broken ada-indent-with nil])))%
+  | WITH name_list SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 3 statement-end])
+      (wisi-face-apply-list-action [2 font-lock-function-name-face 
font-lock-function-name-face])
+      (wisi-indent-action [nil ada-indent-with nil])))%
+  ;
+
+;;; end of file
diff --git a/packages/ada-mode/ada_lr1_parse_table.txt.gz 
b/packages/ada-mode/ada_lr1_parse_table.txt.gz
index 8dd52ba..9a9fe47 100644
Binary files a/packages/ada-mode/ada_lr1_parse_table.txt.gz and 
b/packages/ada-mode/ada_lr1_parse_table.txt.gz differ
diff --git a/packages/ada-mode/ada_mode_wisi_lalr_parse.ads 
b/packages/ada-mode/ada_mode_wisi_lalr_parse.ads
index 321edfc..fb83eaf 100644
--- a/packages/ada-mode/ada_mode_wisi_lalr_parse.ads
+++ b/packages/ada-mode/ada_mode_wisi_lalr_parse.ads
@@ -24,11 +24,12 @@ with Gen_Emacs_Wisi_LR_Parse;
 with WisiToken.Parse.LR.McKenzie_Recover.Ada;
 with Wisi.Ada;
 procedure Ada_Mode_Wisi_LALR_Parse is new Gen_Emacs_Wisi_LR_Parse
-  (Parse_Data_Type                       => Wisi.Ada.Parse_Data_Type,
-   Name                                  => "Ada_mode_wisi_lalr_parse",
-   Descriptor                            => Ada_Process_Actions.Descriptor,
-   Partial_Parse_Active                  => 
Ada_Process_Actions.Partial_Parse_Active,
-   Language_Fixes                        => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
-   Language_Use_Minimal_Complete_Actions => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Use_Minimal_Complete_Actions'Access,
-   Language_String_ID_Set                => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
-   Create_Parser                         => 
Ada_Process_LALR_Main.Create_Parser);
+  (Parse_Data_Type                => Wisi.Ada.Parse_Data_Type,
+   Language_Protocol_Version      => Wisi.Ada.Language_Protocol_Version,
+   Name                           => "Ada_mode_wisi_lalr_parse",
+   Descriptor                     => Ada_Process_Actions.Descriptor,
+   Partial_Parse_Active           => Ada_Process_Actions.Partial_Parse_Active,
+   Language_Fixes                 => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
+   Language_Matching_Begin_Tokens => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Matching_Begin_Tokens'Access,
+   Language_String_ID_Set         => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
+   Create_Parser                  => Ada_Process_LALR_Main.Create_Parser);
diff --git a/packages/ada-mode/ada_mode_wisi_lr1_parse.ads 
b/packages/ada-mode/ada_mode_wisi_lr1_parse.ads
index 52af611..e86387d 100644
--- a/packages/ada-mode/ada_mode_wisi_lr1_parse.ads
+++ b/packages/ada-mode/ada_mode_wisi_lr1_parse.ads
@@ -24,12 +24,13 @@ with Gen_Emacs_Wisi_LR_Text_Rep_Parse;
 with WisiToken.Parse.LR.McKenzie_Recover.Ada;
 with Wisi.Ada;
 procedure Ada_Mode_Wisi_LR1_Parse is new Gen_Emacs_Wisi_LR_Text_Rep_Parse
-  (Parse_Data_Type                       => Wisi.Ada.Parse_Data_Type,
-   Name                                  => "Ada_mode_wisi_lr1_parse",
-   Descriptor                            => Ada_Process_Actions.Descriptor,
-   Partial_Parse_Active                  => 
Ada_Process_Actions.Partial_Parse_Active,
-   Language_Fixes                        => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
-   Language_Use_Minimal_Complete_Actions => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Use_Minimal_Complete_Actions'Access,
-   Language_String_ID_Set                => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
-   Text_Rep_File_Name                    => "ada_lr1_parse_table.txt",
-   Create_Parser                         => 
Ada_Process_LR1_Main.Create_Parser);
+  (Parse_Data_Type                => Wisi.Ada.Parse_Data_Type,
+   Language_Protocol_Version      => Wisi.Ada.Language_Protocol_Version,
+   Name                           => "Ada_mode_wisi_lr1_parse",
+   Descriptor                     => Ada_Process_Actions.Descriptor,
+   Partial_Parse_Active           => Ada_Process_Actions.Partial_Parse_Active,
+   Language_Fixes                 => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
+   Language_Matching_Begin_Tokens => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.Matching_Begin_Tokens'Access,
+   Language_String_ID_Set         => 
WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
+   Text_Rep_File_Name             => "ada_lr1_parse_table.txt",
+   Create_Parser                  => Ada_Process_LR1_Main.Create_Parser);
diff --git a/packages/ada-mode/ada_process_actions.adb 
b/packages/ada-mode/ada_process_actions.adb
index a4e8035..ba5a0bc 100644
--- a/packages/ada-mode/ada_process_actions.adb
+++ b/packages/ada-mode/ada_process_actions.adb
@@ -39,9 +39,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Label => 
None)))));
       end case;
    end abstract_subprogram_declaration_0;
 
@@ -63,11 +63,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 3, 1), (8, 
3, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (True, (Simple, (Int, 0)), (Simple, (Int, 
Ada_Indent))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (True, (Simple, (Label => None)), (Simple, 
(Int, Ada_Indent))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Label 
=> None))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None)))));
       end case;
    end accept_statement_0;
 
@@ -78,8 +78,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 8, End_Names_Optional);
    end accept_statement_0_check;
@@ -99,9 +98,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end accept_statement_1;
 
@@ -119,9 +118,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Anchored_1, 4,
-         Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Anchored_1, 4, Ada_Indent_Broken)))));
       end case;
    end access_definition_0;
 
@@ -139,9 +138,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Anchored_2, 4,
-         Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Anchored_2, 4, Ada_Indent_Broken)))));
       end case;
    end access_definition_1;
 
@@ -177,8 +176,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Anchored_0,
-         1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 
1, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Anchored_0, 1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, 
(Anchored_0, 1, 0)))));
       end case;
    end actual_parameter_part_0;
 
@@ -196,8 +195,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Anchored_0,
-         1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 
1, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Anchored_0, 1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, 
(Anchored_0, 1, 0)))));
       end case;
    end actual_parameter_part_1;
 
@@ -215,9 +214,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
-         (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 1))), (False, 
(Simple, (Int, 0))), (False, (Simple,
-         (Int, 0))), (False, (Simple, (Anchored_0, 1, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 1))), (False, 
(Simple, (Label => None))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end aggregate_0;
 
@@ -235,7 +234,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 1))), (True, 
(Simple, (Anchored_0, 1, 1)), (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
@@ -255,8 +254,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Anchored_0,
-         1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 
1, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Anchored_0, 1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, 
(Anchored_0, 1, 0)))));
       end case;
    end aggregate_3;
 
@@ -274,8 +273,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Anchored_0,
-         1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 
1, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Anchored_0, 1, 1)), (Simple, (Anchored_0, 1, 1))), (False, (Simple, 
(Anchored_0, 1, 0)))));
       end case;
    end aggregate_4;
 
@@ -293,9 +292,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Anchored_0, 2, 1))), (False, (Simple, (Anchored_0, 
2, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Anchored_0, 2, 1))), (False, 
(Simple, (Anchored_0, 2, 0))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end array_type_definition_0;
 
@@ -313,9 +312,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Anchored_0, 2, 1))), (False, (Simple, (Anchored_0, 
2, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Anchored_0, 2, 1))), (False, 
(Simple, (Anchored_0, 2, 0))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end array_type_definition_1;
 
@@ -351,8 +350,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken)))));
       end case;
    end aspect_specification_opt_0;
 
@@ -371,9 +370,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Hanging_0, (Anchored_1, 2, 
Ada_Indent_Broken), (Anchored_1, 3,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Hanging_0, (Anchored_1, 2, 
Ada_Indent_Broken), (Anchored_1, 3,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end assignment_statement_0;
 
@@ -391,8 +390,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (True, (Simple, (Anchored_1, 2, 
Ada_Indent_Broken)), (Simple, (Anchored_1, 2,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (True, (Simple, (Anchored_1, 2, 
Ada_Indent_Broken)), (Simple, (Anchored_1, 2,
          Ada_Indent_Broken)))));
       end case;
    end association_opt_0;
@@ -411,10 +410,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Int, 0), (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (True, (Hanging_2, 
(Anchored_1, 2, Ada_Indent_Broken),
-         (Anchored_1, 2, 2 * Ada_Indent_Broken)), (Hanging_2, (Anchored_1, 2, 
Ada_Indent_Broken), (Anchored_1, 2, 2 *
-         Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Label => None), (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Hanging_3, (Anchored_1, 2,
+         Ada_Indent_Broken), (Anchored_1, 2, 2 * Ada_Indent_Broken)), 
(Hanging_3, (Anchored_1, 2, Ada_Indent_Broken),
+         (Anchored_1, 2, 2 * Ada_Indent_Broken)))));
       end case;
    end association_opt_2;
 
@@ -432,8 +431,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Int, 0), (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Label => None), (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end association_opt_3;
 
@@ -451,8 +450,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, (1 => (True, 
(Hanging_0, (Int, 0), (Int,
-         Ada_Indent_Broken)), (Hanging_0, (Int, 0), (Int, 
Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, (1 => (True, 
(Hanging_0, (Label => None), (Int,
+         Ada_Indent_Broken)), (Hanging_0, (Label => None), (Int, 
Ada_Indent_Broken)))));
       end case;
    end association_opt_4;
 
@@ -472,11 +471,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(True, (Simple, (Int, 0)), (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (True, (Simple, (Label => 
None)), (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Simple, (Int, Ada_Indent)),
-         (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0)))));
+         (Simple, (Int, Ada_Indent))), (False, (Simple, (Label => None))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Label => None)))));
       end case;
    end asynchronous_select_0;
 
@@ -513,7 +512,7 @@ package body Ada_Process_Actions is
          null;
       when Indent =>
          Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, Ada_Indent_Label))), (False,
-         (Simple, (Int, 0)))));
+         (Simple, (Label => None)))));
       end case;
    end block_label_0;
 
@@ -524,8 +523,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end block_label_0_check;
@@ -537,8 +535,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end block_label_opt_0_check;
@@ -562,10 +559,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int, 0)),
-         (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), 
(Simple, (Int, Ada_Indent))), (True,
-         (Simple, (Int, 0)), (Simple, (Int, Ada_Indent))), (True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None))), (False, (Simple, (Label 
=> None)))));
       end case;
    end block_statement_0;
 
@@ -576,8 +573,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 1, 7, End_Names_Optional);
    end block_statement_0_check;
@@ -598,9 +594,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int, 0)),
-         (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), 
(Simple, (Int, Ada_Indent))), (False,
-         (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end block_statement_1;
 
@@ -611,8 +607,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 1, 5, End_Names_Optional);
    end block_statement_1_check;
@@ -631,8 +626,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, Ada_Indent_When)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Int, Ada_Indent_When)))));
       end case;
    end case_expression_0;
 
@@ -650,8 +645,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Hanging_0, (Anchored_1, 1,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Hanging_0, (Anchored_1, 1,
          Ada_Indent), (Anchored_1, 1, Ada_Indent + Ada_Indent_Broken)))));
       end case;
    end case_expression_alternative_0;
@@ -670,8 +665,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int, 0)),
-         (Simple, (Int, Ada_Indent_When))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Label => None)), (Simple, (Int, Ada_Indent_When))), (False, (Simple, 
(Label => None)))));
       end case;
    end case_expression_alternative_list_0;
 
@@ -691,10 +686,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (True, (Simple, (Int, 0)), (Simple, (Int, 
Ada_Indent_When))), (True, (Simple, (Int,
-         Ada_Indent_When)), (Simple, (Int, Ada_Indent_When))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(True, (Simple, (Int, Ada_Indent_When)),
+         (Simple, (Int, Ada_Indent_When))), (False, (Simple, (Label => 
None))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Label => None)))));
       end case;
    end case_statement_0;
 
@@ -712,8 +707,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Simple, (Int, Ada_Indent)),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int, Ada_Indent)),
          (Simple, (Int, Ada_Indent)))));
       end case;
    end case_statement_alternative_0;
@@ -781,8 +776,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Tokens);
+      pragma Unreferenced (Lexer, Tokens);
    begin
       return Terminate_Partial_Parse (Partial_Parse_Active, 
Partial_Parse_Byte_Goal, Recover_Active, Nonterm);
    end compilation_unit_list_1_check;
@@ -801,10 +795,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
          (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end component_clause_0;
 
@@ -823,10 +817,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 4, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end component_declaration_0;
 
@@ -845,9 +839,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end component_declaration_1;
 
@@ -885,10 +879,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(True, (Simple, (Int, 0)), (Simple, (Int,
-         Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Label 
=> None))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Label 
=> None))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None)))));
       end case;
    end conditional_entry_call_0;
 
@@ -907,10 +901,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Int, 0), (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 4, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Label => None), (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 4,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end declaration_9;
 
@@ -928,8 +922,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end delay_statement_0;
 
@@ -947,8 +941,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end delay_statement_1;
 
@@ -1002,7 +996,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end discriminant_part_opt_1;
@@ -1021,9 +1015,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent)))));
       end case;
    end elsif_expression_item_0;
 
@@ -1041,9 +1035,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (True, (Simple,
+         (Int, Ada_Indent)), (Simple, (Int, Ada_Indent)))));
       end case;
    end elsif_statement_item_0;
 
@@ -1057,8 +1051,9 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (4, Motion), (6,
-         Motion), (8, Motion), (12, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (6, Motion), (8,
+         Motion), (12, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 7);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 9);
@@ -1067,12 +1062,12 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 3, 1), 
(11, 3, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 4, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0))),
-         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(False, (Simple, (Int, 0))), (True, (Simple,
-         (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 4, 
Ada_Indent_Broken))), (False, (Simple, (Label =>
+         None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label => None))),
+         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end entry_body_0;
 
@@ -1083,8 +1078,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 11, 
End_Names_Optional);
    end entry_body_0_check;
@@ -1103,7 +1097,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 1))), (False, 
(Simple, (Anchored_0, 1, 1))), (False,
          (Simple, (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0))), 
(False, (Simple, (Int,
          Ada_Indent_Broken)))));
@@ -1120,16 +1114,16 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (3, Name), (8,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 2, 7);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Anchored_0, 4, 1))), (False, (Simple, (Anchored_0, 4, 0))), (False, 
(Simple, (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Anchored_0, 4, 1))), (False, (Simple, (Anchored_0, 
4, 0))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end entry_declaration_0;
 
@@ -1143,15 +1137,15 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (3, Name), (6,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 2, 4);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Label 
=> None)))));
       end case;
    end entry_declaration_1;
 
@@ -1169,9 +1163,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end enumeration_representation_clause_0;
 
@@ -1189,7 +1183,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end enumeration_type_definition_0;
@@ -1226,8 +1220,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Simple, (Int, Ada_Indent)),
          (Simple, (Int, Ada_Indent)))));
       end case;
@@ -1247,8 +1241,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Simple, (Int, Ada_Indent)),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int, Ada_Indent)),
          (Simple, (Int, Ada_Indent)))));
       end case;
    end exception_handler_1;
@@ -1267,8 +1261,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None))), (False, 
(Simple, (Int, Ada_Indent_Broken))), (False,
+         (Simple, (Label => None)))));
       end case;
    end exit_statement_0;
 
@@ -1305,9 +1300,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Label => 
None)))));
       end case;
    end expression_function_declaration_0;
 
@@ -1325,10 +1320,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
          (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 6,
-         Ada_Indent_Broken)))));
+         (Anchored_1, 6, Ada_Indent_Broken)))));
       end case;
    end extended_return_object_declaration_0;
 
@@ -1346,9 +1341,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Int, Ada_Indent_Broken)))));
       end case;
    end extended_return_object_declaration_1;
 
@@ -1368,10 +1363,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (True, (Simple, (Int, 
0)), (Simple, (Int, Ada_Indent))), (True,
-         (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Label => None)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (True,
+         (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Label => None))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end extended_return_statement_0;
 
@@ -1407,11 +1402,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (5, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 6, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_object_declaration_0;
 
@@ -1429,10 +1424,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 5,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end formal_object_declaration_1;
 
@@ -1450,10 +1445,10 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (5, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_object_declaration_2;
 
@@ -1471,9 +1466,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end formal_object_declaration_3;
 
@@ -1491,7 +1486,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end formal_part_0;
@@ -1510,9 +1505,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
          (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         (Label => None)))));
       end case;
    end formal_subprogram_declaration_0;
 
@@ -1530,9 +1526,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Label 
=> None)))));
       end case;
    end formal_subprogram_declaration_1;
 
@@ -1550,9 +1546,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end formal_subprogram_declaration_2;
 
@@ -1570,8 +1566,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end formal_subprogram_declaration_3;
 
@@ -1590,10 +1586,10 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_type_declaration_0;
 
@@ -1611,10 +1607,10 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_type_declaration_1;
 
@@ -1632,9 +1628,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_type_declaration_2;
 
@@ -1688,11 +1684,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (6, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end formal_package_declaration_0;
 
@@ -1706,15 +1702,16 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (7, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 5);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(True, (Simple, (Int, Ada_Indent_Broken)),
-         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Label => None)))));
       end case;
    end full_type_declaration_0;
 
@@ -1728,13 +1725,14 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (1, 
Statement_Start)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 1, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken)))));
       end case;
    end function_specification_0;
 
@@ -1745,8 +1743,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 2);
    end function_specification_0_check;
@@ -1765,8 +1762,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent)))));
       end case;
    end generic_formal_part_0;
 
@@ -1798,14 +1795,15 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (7, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 1, 1), (5, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, Ada_Indent_Broken))), (False,
-         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
+         (Label => None)))));
       end case;
    end generic_instantiation_0;
 
@@ -1819,15 +1817,15 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (3, Name), (8,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (6, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
          (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end generic_instantiation_1;
 
@@ -1841,15 +1839,15 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (3, Name), (8,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Motion), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (6, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end generic_instantiation_2;
 
@@ -1868,8 +1866,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Label => None)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end generic_package_declaration_0;
 
@@ -1884,12 +1882,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (5, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
          (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         (Label => None)))));
       end case;
    end generic_renaming_declaration_0;
 
@@ -1904,13 +1904,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (5, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, 
(Language, Ada_Indent_Renames_0'Access, +3))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Language,
+         Ada_Indent_Renames_0'Access, +3))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end generic_renaming_declaration_1;
 
@@ -1925,13 +1926,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (5, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, 
(Language, Ada_Indent_Renames_0'Access, +3))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Language,
+         Ada_Indent_Renames_0'Access, +3))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end generic_renaming_declaration_2;
 
@@ -1968,8 +1970,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
0)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, Ada_Indent_Label)), (Simple, (Int,
-         0))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, Ada_Indent_Label))), (False,
+         (Simple, (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end goto_label_0;
 
@@ -1987,9 +1989,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, 0))), (False,
-         (Simple, (Int, -Ada_Indent))), (True, (Simple, (Int, Ada_Indent_When 
- Ada_Indent)), (Simple, (Int,
-         Ada_Indent_When - Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Label => None)), (Simple, (Label =>
+         None))), (False, (Simple, (Int, -Ada_Indent))), (True, (Simple, (Int, 
Ada_Indent_When - Ada_Indent)), (Simple,
+         (Int, Ada_Indent_When - Ada_Indent)))));
       end case;
    end handled_sequence_of_statements_0;
 
@@ -2003,15 +2005,33 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         null;
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken)))));
       end case;
    end identifier_list_0;
 
+   procedure identifier_list_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      Parse_Data : Wisi.Parse_Data_Type renames Wisi.Parse_Data_Type 
(User_Data);
+   begin
+      case Parse_Data.Post_Parse_Action is
+      when Navigate =>
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 1);
+      when Face =>
+         null;
+      when Indent =>
+         null;
+      end case;
+   end identifier_list_1;
+
    function identifier_opt_0_check
     (Lexer          : access constant WisiToken.Lexer.Instance'Class;
      Nonterm        : in out WisiToken.Recover_Token;
@@ -2019,8 +2039,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end identifier_opt_0_check;
@@ -2042,10 +2061,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int,
-         Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent)))));
       end case;
    end if_expression_0;
 
@@ -2065,9 +2084,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent))), (False, (Simple, (Label => None))), (False, 
(Simple, (Int, Ada_Indent)))));
       end case;
    end if_expression_1;
 
@@ -2087,9 +2106,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent))), (False, (Simple, (Label => None)))));
       end case;
    end if_expression_2;
 
@@ -2109,9 +2128,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent)))));
       end case;
    end if_expression_3;
 
@@ -2136,12 +2155,12 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Hanging_1, (Int,
-         Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int,
-         0)), (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))), (False,
-         (Simple, (Int, 0))), (True, (Simple, (Int, 0)), (Simple, (Int, 
Ada_Indent))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Hanging_2,
+         (Int, Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, 
(Int, Ada_Indent_Broken))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label
+         => None)))));
       end case;
    end if_statement_0;
 
@@ -2165,11 +2184,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Hanging_1, (Int,
-         Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int,
-         0)), (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))), (True,
-         (Simple, (Int, 0)), (Simple, (Int, Ada_Indent))), (True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Hanging_2,
+         (Int, Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, 
(Int, Ada_Indent_Broken))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None))), (False, (Simple, (Label 
=> None)))));
       end case;
    end if_statement_1;
 
@@ -2192,10 +2211,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Hanging_1, (Int,
-         Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int,
-         0)), (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))), (False,
-         (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Hanging_2,
+         (Int, Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, 
(Int, Ada_Indent_Broken))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label =>
+         None)))));
       end case;
    end if_statement_2;
 
@@ -2216,10 +2236,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Hanging_1, (Int,
-         Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, (Int, 
Ada_Indent_Broken))), (True, (Simple, (Int,
-         0)), (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))), (False,
-         (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Hanging_2,
+         (Int, Ada_Indent_Broken), (Int, 2 * Ada_Indent_Broken)), (Simple, 
(Int, Ada_Indent_Broken))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end if_statement_3;
 
@@ -2234,12 +2254,13 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end incomplete_type_declaration_0;
 
@@ -2254,11 +2275,12 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end incomplete_type_declaration_1;
 
@@ -2276,7 +2298,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end index_constraint_0;
@@ -2331,7 +2353,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
          Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken)))));
       end case;
    end iteration_scheme_0;
@@ -2350,7 +2372,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
          Ada_Indent_Broken)), (Simple, (Int, Ada_Indent_Broken)))));
       end case;
    end iteration_scheme_1;
@@ -2408,10 +2430,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (True, (Simple, (Int, 0)), (Simple, (Int, Ada_Indent))), (True, 
(Simple, (Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None))), (True, 
(Simple, (Int, Ada_Indent)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None)))));
       end case;
    end loop_statement_0;
 
@@ -2422,8 +2444,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 1, 7, End_Names_Optional);
    end loop_statement_0_check;
@@ -2443,9 +2464,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int, 0)),
-         (Simple, (Int, Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), 
(Simple, (Int, Ada_Indent))), (False,
-         (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label =>
+         None)))));
       end case;
    end loop_statement_1;
 
@@ -2456,8 +2478,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 1, 6, End_Names_Optional);
    end loop_statement_1_check;
@@ -2476,7 +2497,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_1, 1, Ada_Indent_Broken))), (False, (Hanging_0, 
(Anchored_0, 2, 1), (Anchored_0, 2, 1 +
          Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 2, 0)))));
       end case;
@@ -2497,7 +2518,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (if
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple, (if
          Ada_Indent_Hanging_Rel_Exp then (Anchored_0, 1, Ada_Indent_Broken) 
else (Anchored_1, 1,
          Ada_Indent_Broken))))));
       end case;
@@ -2510,8 +2531,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end name_2_check;
@@ -2541,8 +2561,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end name_5_check;
@@ -2554,8 +2573,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end name_7_check;
@@ -2567,8 +2585,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end name_opt_0_check;
@@ -2660,9 +2677,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
-         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Label 
=> None)))));
       end case;
    end null_procedure_declaration_0;
 
@@ -2681,11 +2698,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_2, 6, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_0;
 
@@ -2704,11 +2721,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 6, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_1;
 
@@ -2727,11 +2744,11 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 6, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_2;
 
@@ -2749,10 +2766,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_3;
 
@@ -2771,10 +2788,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_4;
 
@@ -2793,10 +2810,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_declaration_5;
 
@@ -2811,13 +2828,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 1);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (4, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end object_renaming_declaration_0;
 
@@ -2832,14 +2850,15 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 1);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 3);
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_renaming_declaration_1;
 
@@ -2854,13 +2873,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 1);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (5, 1, 
3)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end object_renaming_declaration_2;
 
@@ -2910,8 +2930,9 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (5, Motion), (7,
-         Motion), (11, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (5, Motion), (7, Motion), (11,
+         Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 6);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 8);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(5, Empty_IDs) & (7, Empty_IDs) & (8, 26 &
@@ -2919,11 +2940,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), 
(10, 1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0))), (True, (Simple, (Int, Ada_Indent)), (Simple, 
(Int, Ada_Indent))), (False, (Simple, (Int,
-         0))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Label => None))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))), (False,
+         (Simple, (Label => None))), (True, (Simple, (Int, Ada_Indent)), 
(Simple, (Int, Ada_Indent))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end package_body_0;
 
@@ -2934,8 +2955,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 10, 
End_Names_Optional);
    end package_body_0_check;
@@ -2950,17 +2970,18 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (5, Motion), (9,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (5, Motion), (9, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 6);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(5, Empty_IDs) & (9, Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 1, 1), (8, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (True, 
(Simple, (Int, Ada_Indent)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label
+         => None)))));
       end case;
    end package_body_1;
 
@@ -2971,8 +2992,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 8, End_Names_Optional);
    end package_body_1_check;
@@ -2988,13 +3008,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 1, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
+         (Label => None)))));
       end case;
    end package_body_stub_0;
 
@@ -3028,12 +3049,13 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 1, 1), (4, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end package_renaming_declaration_0;
 
@@ -3047,8 +3069,8 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (4, Motion), (6,
-         Motion)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (6, Motion)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 4);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 4, 5);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 7);
@@ -3056,10 +3078,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 1, 1), (9, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 
0))), (True, (Simple, (Int, Ada_Indent)),
-         (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(False, (Simple, (Label => None))), (True,
+         (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Label => None))), (False,
+         (Simple, (Label => None)))));
       end case;
    end package_specification_0;
 
@@ -3070,8 +3093,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 9, End_Names_Optional);
    end package_specification_0_check;
@@ -3086,17 +3108,18 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (4, Motion)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 4);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 4, 5);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(4, Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 1, 1), (7, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0))), (True,
-         (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Label => None)))));
       end case;
    end package_specification_1;
 
@@ -3107,8 +3130,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 7, End_Names_Optional);
    end package_specification_1_check;
@@ -3127,8 +3149,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Language,
-         Ada_Indent_Return_0'Access, 1 & 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Language, Ada_Indent_Return_0'Access, 1 & 0)))));
       end case;
    end parameter_and_result_profile_0;
 
@@ -3146,8 +3168,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (6, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 7,
          Ada_Indent_Broken)))));
@@ -3168,8 +3190,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (6, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken)))));
       end case;
@@ -3189,8 +3211,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 5,
          Ada_Indent_Broken)))));
       end case;
@@ -3210,8 +3232,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken)))));
       end case;
    end parameter_specification_3;
@@ -3248,7 +3270,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Hanging_0,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Hanging_0,
          (Anchored_0, 1, 1), (Anchored_0, 1, 1 + Ada_Indent_Broken))), (False, 
(Simple, (Anchored_0, 1, 0)))));
       end case;
    end paren_expression_0;
@@ -3267,7 +3289,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end paren_expression_1;
@@ -3286,7 +3308,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
          (Anchored_0, 1, 1))), (False, (Simple, (Anchored_0, 1, 0)))));
       end case;
    end paren_expression_2;
@@ -3305,9 +3327,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_0, 3, 1))),
-         (False, (Simple, (Anchored_0, 3, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 3,
+         1))), (False, (Simple, (Anchored_0, 3, 0))), (False, (Simple, (Label 
=> None)))));
       end case;
    end pragma_g_0;
 
@@ -3325,9 +3347,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_0, 3, 1))),
-         (False, (Simple, (Anchored_0, 3, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 3,
+         1))), (False, (Simple, (Anchored_0, 3, 0))), (False, (Simple, (Label 
=> None)))));
       end case;
    end pragma_g_1;
 
@@ -3345,8 +3367,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end pragma_g_2;
 
@@ -3415,16 +3437,17 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (12, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (12, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end private_extension_declaration_0;
 
@@ -3438,14 +3461,15 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (8, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end private_type_declaration_0;
 
@@ -3463,8 +3487,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Int, 0), (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, 
(Hanging_0, (Label => None), (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end procedure_call_statement_0;
 
@@ -3478,13 +3502,14 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (1, 
Statement_Start)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 1, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken)))));
       end case;
    end procedure_specification_0;
 
@@ -3495,8 +3520,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 2);
    end procedure_specification_0_check;
@@ -3511,17 +3535,17 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (5, Motion), (9,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (5, Motion), (9, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 6);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(5, Empty_IDs) & (9, Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 3, 2), (8, 
3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0))), (False, (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Label => 
None)))));
       end case;
    end protected_body_0;
 
@@ -3532,8 +3556,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 8, End_Names_Optional);
    end protected_body_0_check;
@@ -3549,13 +3572,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end protected_body_stub_0;
 
@@ -3574,8 +3598,8 @@ package body Ada_Process_Actions is
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (5, 3, 
2)));
       when Indent =>
          Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Ada_Indent))), (False, (Simple, (Label => None))), (True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end protected_definition_0;
 
@@ -3586,8 +3610,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 5);
    end protected_definition_0_check;
@@ -3607,7 +3630,7 @@ package body Ada_Process_Actions is
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
          Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0)))));
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end protected_definition_1;
 
@@ -3618,8 +3641,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 3);
    end protected_definition_1_check;
@@ -3634,19 +3656,20 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (6, Motion), (9,
-         Motion), (11, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Motion), (9, Motion), (11,
+         Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 10);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(6, Empty_IDs) & (10, +49) & (11,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end protected_type_declaration_0;
 
@@ -3657,8 +3680,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 10, 
End_Names_Optional);
    end protected_type_declaration_0_check;
@@ -3673,18 +3695,18 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (6, Motion), (8,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Motion), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 7);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(6, Empty_IDs) & (7, +49) & (8,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (True, 
(Simple, (Label => None)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end protected_type_declaration_1;
 
@@ -3695,8 +3717,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 7, End_Names_Optional);
    end protected_type_declaration_1_check;
@@ -3715,9 +3736,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (1, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (if Ada_Indent_Hanging_Rel_Exp then (Anchored_0, 1, 
Ada_Indent_Broken) else (Anchored_1, 1,
-         Ada_Indent_Broken))))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (if Ada_Indent_Hanging_Rel_Exp 
then (Anchored_0, 1, Ada_Indent_Broken)
+         else (Anchored_1, 1, Ada_Indent_Broken))))));
       end case;
    end qualified_expression_0;
 
@@ -3735,8 +3756,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 4, 
Ada_Indent_Broken)))));
       end case;
    end quantified_expression_0;
@@ -3755,8 +3776,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 3,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 3,
          Ada_Indent_Broken)))));
       end case;
    end raise_expression_0;
@@ -3776,9 +3797,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Anchored_1, 3,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Anchored_1, 3,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end raise_statement_0;
 
@@ -3796,8 +3817,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end raise_statement_1;
 
@@ -3833,8 +3854,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
          Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 4, 1))), (False, 
(Simple, (Anchored_0, 4, 0)))));
       end case;
    end range_g_0;
@@ -3856,8 +3877,8 @@ package body Ada_Process_Actions is
          Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Language, Ada_Indent_Record_1'Access, 69
          & 1 & 0)), (Simple, (Language, Ada_Indent_Record_1'Access, 69 & 1 & 
Ada_Indent))), (True, (Simple, (Language,
          Ada_Indent_Record_1'Access, 69 & 1 & Ada_Indent)), (Simple, 
(Language, Ada_Indent_Record_1'Access, 69 & 1 &
-         Ada_Indent))), (False, (Simple, (Language, 
Ada_Indent_Record_1'Access, 69 & 1 & 0))), (False, (Simple, (Int,
-         0)))));
+         Ada_Indent))), (False, (Simple, (Language, 
Ada_Indent_Record_1'Access, 69 & 1 & 0))), (False, (Simple, (Label
+         => None)))));
       end case;
    end record_definition_0;
 
@@ -3875,12 +3896,12 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 1, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Language,
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Language,
          Ada_Indent_Record_0'Access, 1 & 4 & 0))), (False, (Simple, (Language, 
Ada_Indent_Record_0'Access, 1 & 4 &
          Ada_Indent))), (False, (Simple, (Language, 
Ada_Indent_Record_0'Access, 1 & 4 & Ada_Indent))), (False, (Simple,
-         (Language, Ada_Indent_Record_0'Access, 1 & 4 & 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         0)))));
+         (Language, Ada_Indent_Record_0'Access, 1 & 4 & 0))), (False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None)))));
       end case;
    end record_representation_clause_0;
 
@@ -3934,7 +3955,7 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 1, 
2)));
       when Indent =>
-         Indent_Action_1 (Parse_Data, Tree, Nonterm, Tokens, 1, ((False, 
(Simple, (Int, 0))), (False, (Simple,
+         Indent_Action_1 (Parse_Data, Tree, Nonterm, Tokens, 1, ((False, 
(Simple, (Label => None))), (False, (Simple,
          (Anchored_3, 1, Ada_Indent_Broken))), (False, (Simple, (Anchored_3, 
1, Ada_Indent_Broken)))));
       end case;
    end result_profile_0;
@@ -3953,7 +3974,7 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_1 (Parse_Data, Tree, Nonterm, Tokens, 1, ((False, 
(Simple, (Int, 0))), (False, (Simple,
+         Indent_Action_1 (Parse_Data, Tree, Nonterm, Tokens, 1, ((False, 
(Simple, (Label => None))), (False, (Simple,
          (Anchored_4, 1, Ada_Indent_Broken)))));
       end case;
    end result_profile_1;
@@ -3983,8 +4004,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Merge_Names (Nonterm, Tokens, 1, 3);
    end selected_component_0_check;
@@ -4032,8 +4052,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Merge_Names (Nonterm, Tokens, 1, 3);
    end selected_component_2_check;
@@ -4074,10 +4093,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (True, (Simple, (Int, 0)), (Simple, (Int, Ada_Indent))), (True, 
(Simple, (Int, 0)), (Simple, (Int,
-         Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Label => None)), (Simple, (Int,
+         Ada_Indent))), (True, (Simple, (Label => None)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label =>
+         None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label => None))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Label => 
None)))));
       end case;
    end selective_accept_0;
 
@@ -4096,9 +4115,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (True, (Simple, (Int, 0)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Label => None)), (Simple, (Int,
+         Ada_Indent))), (True, (Simple, (Label => None)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None))), (False, (Simple, (Label 
=> None)))));
       end case;
    end selective_accept_1;
 
@@ -4116,8 +4135,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent))),
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent))),
          (False, (Simple, (Int, Ada_Indent)))));
       end case;
    end select_alternative_0;
@@ -4136,9 +4155,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent))),
+         (False, (Simple, (Label => None)))));
       end case;
    end select_alternative_1;
 
@@ -4156,8 +4175,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent)))));
       end case;
    end select_alternative_2;
 
@@ -4193,8 +4213,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent)))));
       end case;
    end select_alternative_list_0;
 
@@ -4231,8 +4251,8 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None)))));
       end case;
    end simple_return_statement_0;
 
@@ -4300,18 +4320,19 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (4, Motion), (7,
-         Motion), (9, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (7, Motion), (9,
+         Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 8);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(4, Empty_IDs) & (7, Empty_IDs) & (8, +49)
          & (9, Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end single_protected_declaration_0;
 
@@ -4322,8 +4343,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 8, End_Names_Optional);
    end single_protected_declaration_0_check;
@@ -4338,17 +4358,17 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (2, Name), (4, Motion), (6,
-         Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 5);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(4, Empty_IDs) & (5, +49) & (6,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(True, (Simple, (Label => None)), (Simple,
+         (Int, Ada_Indent))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end single_protected_declaration_1;
 
@@ -4359,8 +4379,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 5, End_Names_Optional);
    end single_protected_declaration_1_check;
@@ -4377,17 +4396,18 @@ package body Ada_Process_Actions is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (7, Motion), (11,
          Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 8);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(4, Empty_IDs) & (8, +49) & (11,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 3, 2), (9, 
3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end single_task_declaration_0;
 
@@ -4398,8 +4418,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 10, 
End_Names_Optional);
    end single_task_declaration_0_check;
@@ -4415,16 +4434,17 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Motion), (8, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 5);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(4, Empty_IDs) & (5, +49) & (8,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((2, 3, 2), (6, 
3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(True, (Simple, (Label => None)), (Simple,
+         (Int, Ada_Indent))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end single_task_declaration_1;
 
@@ -4435,8 +4455,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 7, End_Names_Optional);
    end single_task_declaration_1_check;
@@ -4452,11 +4471,12 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (4, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Label => None)))));
       end case;
    end single_task_declaration_2;
 
@@ -4480,11 +4500,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (9, 1, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (True, (Simple, (Int, 0)),
-         (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, 0))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 
0))), (True, (Simple, (Int, Ada_Indent)),
-         (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple,
+         (Label => None)), (Simple, (Int, Ada_Indent))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label =>
+         None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label => None))),
+         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Label => 
None)))));
       end case;
    end subprogram_body_0;
 
@@ -4495,8 +4515,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 9, End_Names_Optional);
    end subprogram_body_0_check;
@@ -4516,9 +4535,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None))), (False, 
(Simple, (Int, Ada_Indent_Broken))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Label => 
None)))));
       end case;
    end subprogram_body_stub_0;
 
@@ -4574,9 +4593,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (4, 1, 
1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Language, Ada_Indent_Renames_0'Access, +2))), 
(False, (Simple, (Int, Ada_Indent_Broken))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Language, 
Ada_Indent_Renames_0'Access, +2))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None)))));
       end case;
    end subprogram_renaming_declaration_0;
 
@@ -4587,8 +4606,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end subprogram_specification_0_check;
@@ -4600,8 +4618,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end subprogram_specification_1_check;
@@ -4617,12 +4634,13 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 2);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end subtype_declaration_0;
 
@@ -4712,9 +4730,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 2, 1))), (False, 
(Simple, (Anchored_0, 2, 0))), (False,
-         (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Anchored_0, 2, 1))), 
(False, (Simple, (Anchored_0, 2, 0))),
+         (False, (Simple, (Label => None)))));
       end case;
    end subunit_0;
 
@@ -4728,8 +4746,9 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (5, Motion), (7,
-         Motion), (11, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (5, Motion), (7, Motion), (11,
+         Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 6);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 8);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(5, Empty_IDs) & (7, Empty_IDs) & (11,
@@ -4737,11 +4756,11 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 3, 2), 
(10, 3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0))), (True,
-         (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, 
(Simple, (Int, 0))), (True, (Simple, (Int,
-         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int, 0))), (False,
-         (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Label => None))), (True, (Simple, (Int, Ada_Indent)), 
(Simple, (Int, Ada_Indent))), (False, (Simple,
+         (Label => None))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None)))));
       end case;
    end task_body_0;
 
@@ -4752,8 +4771,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 10, 
End_Names_Optional);
    end task_body_0_check;
@@ -4769,12 +4787,14 @@ package body Ada_Process_Actions is
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (7, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Label => None))), (False,
+         (Simple, (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Label =>
+         None)))));
       end case;
    end task_body_stub_0;
 
@@ -4794,7 +4814,8 @@ package body Ada_Process_Actions is
          null;
       when Indent =>
          Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
-         Ada_Indent))), (False, (Simple, (Int, 0))), (True, (Simple, (Int, 
Ada_Indent)), (Simple, (Int, Ada_Indent)))));
+         Ada_Indent))), (False, (Simple, (Label => None))), (True, (Simple, 
(Int, Ada_Indent)), (Simple, (Int,
+         Ada_Indent)))));
       end case;
    end task_definition_0;
 
@@ -4827,20 +4848,21 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (6, Motion), (9,
-         Motion), (13, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Motion), (9, Motion), (13,
+         Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 10);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(6, Empty_IDs) & (9, Empty_IDs) & (10,
          +49) & (13, Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 3, 2), 
(12, 3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None))), (False, (Simple,
+         (Label => None))), (False, (Simple, (Label => None)))));
       end case;
    end task_type_declaration_0;
 
@@ -4851,8 +4873,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 12, 
End_Names_Optional);
    end task_type_declaration_0_check;
@@ -4867,19 +4888,20 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (6, Motion), (10,
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Motion), (10,
          Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
          Containing_Action (Parse_Data, Tree, Nonterm, Tokens, 1, 7);
          Motion_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, Empty_IDs) & 
(6, Empty_IDs) & (7, +49) & (10,
          Empty_IDs)));
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, ((3, 3, 2), (9, 
3, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0))), (False, 
(Simple, (Int, 0))), (False, (Simple, (Int,
-         0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (True, 
(Simple, (Label => None)), (Simple, (Int,
+         Ada_Indent))), (False, (Simple, (Label => None))), (False, (Simple, 
(Label => None))), (False, (Simple, (Label
+         => None))), (False, (Simple, (Label => None)))));
       end case;
    end task_type_declaration_1;
 
@@ -4890,8 +4912,7 @@ package body Ada_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 3, 9, End_Names_Optional);
    end task_type_declaration_1_check;
@@ -4906,13 +4927,14 @@ package body Ada_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
-         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (3, Name), (6, Statement_End)));
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (6, Statement_End)));
+         Name_Action (Parse_Data, Tree, Nonterm, Tokens, 3);
       when Face =>
          Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 3, 
2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Broken))), (False, (Simple, (Label => None))), (False, 
(Simple, (Label => None)))));
       end case;
    end task_type_declaration_2;
 
@@ -4932,10 +4954,10 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((True, (Simple, 
(Int, 0)), (Simple, (Int, Ada_Indent))),
-         (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, Ada_Indent))), 
(True, (Simple, (Int, 0)), (Simple, (Int,
-         Ada_Indent))), (True, (Simple, (Int, Ada_Indent)), (Simple, (Int, 
Ada_Indent))), (False, (Simple, (Int, 0))),
-         (False, (Simple, (Int, 0))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Label 
=> None))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent))), (False, (Simple, (Label 
=> None))), (False, (Simple, (Label =>
+         None))), (False, (Simple, (Label => None)))));
       end case;
    end timed_entry_call_0;
 
@@ -4954,9 +4976,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, 0))), (False, (Simple, 
(Int, Ada_Indent_When))), (False, (Simple,
-         (Int, 0))), (False, (Simple, (Int, 0))), (False, (Simple, (Int, 
0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Label => None))), 
(False, (Simple, (Int, Ada_Indent_When))),
+         (False, (Simple, (Label => None))), (False, (Simple, (Label => 
None))), (False, (Simple, (Label => None)))));
       end case;
    end variant_part_0;
 
@@ -4974,9 +4996,9 @@ package body Ada_Process_Actions is
       when Face =>
          null;
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Hanging_0, (Int,
-         0), (Int, Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent))), 
(True, (Simple, (Int, Ada_Indent)),
-         (Simple, (Int, Ada_Indent)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Hanging_0,
+         (Label => None), (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent))), (True, (Simple, (Int,
+         Ada_Indent)), (Simple, (Int, Ada_Indent)))));
       end case;
    end variant_0;
 
@@ -4994,9 +5016,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (4, 
1, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_Use))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_Use))), (False, (Simple, (Label => None)))));
       end case;
    end use_clause_0;
 
@@ -5014,8 +5036,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 
1, 2)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Use))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Use))), 
(False, (Simple, (Label => None)))));
       end case;
    end use_clause_1;
 
@@ -5033,8 +5055,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Use))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Use))), (False, (Simple, (Label => None)))));
       end case;
    end use_clause_2;
 
@@ -5052,9 +5074,9 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (4, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_Broken))), 
(False, (Simple, (Int, Ada_Indent_With))),
-         (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_Broken))), (False, (Simple, (Int,
+         Ada_Indent_With))), (False, (Simple, (Label => None)))));
       end case;
    end with_clause_0;
 
@@ -5072,8 +5094,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_With))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_With))), (False, (Simple, (Label => None)))));
       end case;
    end with_clause_1;
 
@@ -5091,8 +5113,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (3, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_Broken))), (False, (Simple, (Int, Ada_Indent_With))), 
(False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_Broken))), (False, (Simple, (Int, 
Ada_Indent_With))), (False, (Simple, (Label => None)))));
       end case;
    end with_clause_2;
 
@@ -5110,8 +5132,8 @@ package body Ada_Process_Actions is
       when Face =>
          Face_Apply_List_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 
1, 1)));
       when Indent =>
-         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
-         Ada_Indent_With))), (False, (Simple, (Int, 0)))));
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Label => None))), (False, (Simple,
+         (Int, Ada_Indent_With))), (False, (Simple, (Label => None)))));
       end case;
    end with_clause_3;
 
diff --git a/packages/ada-mode/ada_process_actions.ads 
b/packages/ada-mode/ada_process_actions.ads
index 6b61e0a..31a4f2c 100644
--- a/packages/ada-mode/ada_process_actions.ads
+++ b/packages/ada-mode/ada_process_actions.ads
@@ -23,21 +23,17 @@ with WisiToken.Semantic_Checks;
 package Ada_Process_Actions is
 
    Descriptor : aliased WisiToken.Descriptor :=
-     (First_Terminal                => 3,
-      Last_Terminal                 => 107,
-      First_Nonterminal             => 108,
-      Last_Nonterminal              => 332,
-      EOI_ID                        => 107,
-      Accept_ID                     => 108,
-      Case_Insensitive              => True,
-      New_Line_ID                   => 1,
-      Comment_ID                    => 2,
-      Left_Paren_ID                 => 76,
-      Right_Paren_ID                => 77,
-      String_1_ID                   => 106,
-      String_2_ID                   => 105,
-      Embedded_Quote_Escape_Doubled => True,
-      Image                         =>
+     (First_Terminal    => 3,
+      Last_Terminal     => 107,
+      First_Nonterminal => 108,
+      Last_Nonterminal  => 332,
+      EOI_ID            => 107,
+      Accept_ID         => 108,
+      Case_Insensitive  => True,
+      New_Line_ID       => 1,
+      String_1_ID       => 106,
+      String_2_ID       => 105,
+      Image             =>
         (new String'("WHITESPACE"),
          new String'("NEW_LINE"),
          new String'("COMMENT"),
@@ -1183,6 +1179,11 @@ package Ada_Process_Actions is
      Tree      : in out WisiToken.Syntax_Trees.Tree;
      Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
      Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure identifier_list_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
    procedure if_expression_0
     (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
      Tree      : in out WisiToken.Syntax_Trees.Tree;
diff --git a/packages/ada-mode/ada_process_lalr_main.adb 
b/packages/ada-mode/ada_process_lalr_main.adb
index a95a398..186dbcd 100644
--- a/packages/ada-mode/ada_process_lalr_main.adb
+++ b/packages/ada-mode/ada_process_lalr_main.adb
@@ -29,10 +29,9 @@ package body Ada_Process_LALR_Main is
       ada_re2c_c.Next_Token);
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
       Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access)
@@ -44,30 +43,40 @@ package body Ada_Process_LALR_Main is
          First_Nonterminal => 108,
          Last_Nonterminal  => 332,
          Insert =>
-           (3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 1, 
3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 3,
-            3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 
2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3,
-            3, 2, 1, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 3, 
4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
          Delete =>
-           (3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 2, 3, 1, 3, 3, 3, 3, 1, 3, 2, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 3,
-            3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-            3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
          Push_Back =>
-           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2),
-         Ignore_Check_Fail  => 0,
+         Undo_Reduce =>
+           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2),
+         Minimal_Complete_Cost_Delta => -3,
+         Fast_Forward =>  2,
+         Matching_Begin =>  3,
+         Ignore_Check_Fail  => 2,
          Task_Count  => 0,
-         Cost_Limit  => 20,
          Check_Limit => 4,
-         Check_Delta_Limit => 200,
-         Enqueue_Limit => 15000);
+         Check_Delta_Limit => 100,
+         Enqueue_Limit => 45000);
 
       Table : constant Parse_Table_Ptr := new Parse_Table
         (State_First       => 0,
@@ -81,7 +90,6 @@ package body Ada_Process_LALR_Main is
       declare
          procedure Subr_1
          is begin
-            Table.States (0).Productions := WisiToken.To_Vector ((1 => (108, 
0)));
             Add_Action (Table.States (0), 4, 1);
             Add_Action (Table.States (0), 5, 2);
             Add_Action (Table.States (0), 13, Reduce, (132, 1), 0, null, null);
@@ -90,7 +98,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (0), 18, 4);
             Add_Action (Table.States (0), 25, Reduce, (246, 2), 0, null, null);
             Add_Action (Table.States (0), 27, 5);
-            Add_Action (Table.States (0), 28, 6, (132, 1), 0, null, null);
+            Add_Action (Table.States (0), 28, 6);
+            Add_Conflict (Table.States (0), 28, (132, 1), 0, null, null);
             Add_Action (Table.States (0), 29, Reduce, (246, 2), 0, null, null);
             Add_Action (Table.States (0), 30, 8);
             Add_Action (Table.States (0), 31, 9);
@@ -204,12 +213,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (0), 325, 115);
             Add_Goto (Table.States (0), 331, 116);
             Add_Goto (Table.States (0), 332, 117);
-            Table.States (0).Minimal_Complete_Action := (Shift, 41, 13);
-            Table.States (1).Productions := WisiToken.To_Vector (((113, 0), 
(113, 1)));
+            Table.States (0).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 13)));
             Add_Action (Table.States (1), 104, 118);
             Add_Error (Table.States (1));
-            Table.States (1).Minimal_Complete_Action := (Shift, 104, 118);
-            Table.States (2).Productions := WisiToken.To_Vector ((1 => (303, 
8)));
+            Table.States (1).Kernel := To_Vector (((113, 4, 4, False), (113, 
4, 2, False)));
+            Table.States (1).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 118)));
             Add_Action (Table.States (2), 104, 119);
             Add_Action (Table.States (2), 105, 33);
             Add_Action (Table.States (2), 106, 34);
@@ -218,8 +226,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (2), 239, 120);
             Add_Goto (Table.States (2), 272, 92);
             Add_Goto (Table.States (2), 293, 97);
-            Table.States (2).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (3).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (2).Kernel := To_Vector ((0 => (303, 5, 2, False)));
+            Table.States (2).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (3), 3, 121);
             Add_Action (Table.States (3), 35, Reduce, (192, 1), 0, null, null);
             Add_Action (Table.States (3), 39, 122);
@@ -254,8 +262,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (3), 320, 144);
             Add_Goto (Table.States (3), 321, 145);
             Add_Goto (Table.States (3), 330, 146);
-            Table.States (3).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (4).Productions := WisiToken.To_Vector (((161, 0), 
(161, 1)));
+            Table.States (3).Kernel := To_Vector ((0 => (139, 15, 6, False)));
+            Table.States (3).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (4), 3, 121);
             Add_Action (Table.States (4), 39, 122);
             Add_Action (Table.States (4), 40, 123);
@@ -291,15 +299,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (4), 320, 144);
             Add_Goto (Table.States (4), 321, 145);
             Add_Goto (Table.States (4), 330, 146);
-            Table.States (4).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (5).Productions := WisiToken.To_Vector (((190, 0), 
(190, 1)));
+            Table.States (4).Kernel := To_Vector (((161, 18, 2, False), (161, 
18, 1, False)));
+            Table.States (4).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (5), 72, Reduce, (220, 1), 0, null, null);
             Add_Action (Table.States (5), 96, Reduce, (220, 1), 0, null, null);
             Add_Action (Table.States (5), 104, 149);
             Add_Error (Table.States (5));
             Add_Goto (Table.States (5), 220, 150);
-            Table.States (5).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (6).Productions := WisiToken.To_Vector (((121, 0), 
(127, 0), (182, 0), (229, 1), (281, 0)));
+            Table.States (5).Kernel := To_Vector (((190, 27, 2, False), (190, 
27, 1, False)));
+            Table.States (5).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (6), 104, 151);
             Add_Action (Table.States (6), 105, 152);
             Add_Action (Table.States (6), 106, 34);
@@ -311,8 +319,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (6), 239, 157);
             Add_Goto (Table.States (6), 272, 92);
             Add_Goto (Table.States (6), 293, 97);
-            Table.States (6).Minimal_Complete_Action := (Reduce, 231, 0);
-            Table.States (7).Productions := WisiToken.To_Vector ((1 => (207, 
0)));
+            Table.States (6).Kernel := To_Vector (((121, 28, 5, False), (127, 
28, 4, False), (182, 28, 5, False), (229,
+            28, 0, False), (281, 28, 14, False)));
+            Table.States (6).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 231, 0)));
             Add_Action (Table.States (7), 104, 119);
             Add_Action (Table.States (7), 105, 33);
             Add_Action (Table.States (7), 106, 34);
@@ -321,12 +330,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (7), 239, 158);
             Add_Goto (Table.States (7), 272, 92);
             Add_Goto (Table.States (7), 293, 97);
-            Table.States (7).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (8).Productions := WisiToken.To_Vector (((210, 0), 
(210, 1), (215, 0), (215, 1), (215, 2)));
-            Add_Action (Table.States (8), 29, 159, (210, 1), 1, 
generic_formal_part_1'Access, null);
-            Add_Action (Table.States (8), 47, 160, (210, 1), 1, 
generic_formal_part_1'Access, null);
+            Table.States (7).Kernel := To_Vector ((0 => (207, 29, 2, False)));
+            Table.States (7).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Add_Action (Table.States (8), 29, 159);
+            Add_Conflict (Table.States (8), 29, (210, 1), 1, 
generic_formal_part_1'Access, null);
+            Add_Action (Table.States (8), 47, 160);
+            Add_Conflict (Table.States (8), 47, (210, 1), 1, 
generic_formal_part_1'Access, null);
             Add_Action (Table.States (8), 48, 16);
-            Add_Action (Table.States (8), 50, 161, (210, 1), 1, 
generic_formal_part_1'Access, null);
+            Add_Action (Table.States (8), 50, 161);
+            Add_Conflict (Table.States (8), 50, (210, 1), 1, 
generic_formal_part_1'Access, null);
             Add_Action (Table.States (8), 69, 162);
             Add_Action (Table.States (8), 71, 28);
             Add_Action (Table.States (8), 74, 163);
@@ -341,12 +353,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (8), 219, 171);
             Add_Goto (Table.States (8), 257, 172);
             Add_Goto (Table.States (8), 331, 173);
-            Table.States (8).Minimal_Complete_Action := (Reduce, 210, 1);
-            Table.States (9).Productions := WisiToken.To_Vector ((1 => (303, 
3)));
+            Table.States (8).Kernel := To_Vector (((210, 30, 3, False), (210, 
30, 0, False), (215, 30, 5, False), (215,
+            30, 5, False), (215, 30, 5, False)));
+            Table.States (8).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 210, 1)));
             Add_Action (Table.States (9), 104, 174);
             Add_Error (Table.States (9));
-            Table.States (9).Minimal_Complete_Action := (Shift, 104, 174);
-            Table.States (10).Productions := WisiToken.To_Vector (((222, 0), 
(222, 1), (222, 2), (222, 3)));
+            Table.States (9).Kernel := To_Vector ((0 => (303, 31, 2, False)));
+            Table.States (9).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 174)));
             Add_Action (Table.States (10), 3, 121);
             Add_Action (Table.States (10), 39, 122);
             Add_Action (Table.States (10), 40, 123);
@@ -381,25 +394,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (10), 320, 144);
             Add_Goto (Table.States (10), 321, 145);
             Add_Goto (Table.States (10), 330, 146);
-            Table.States (10).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (11).Productions := WisiToken.To_Vector (((332, 0), 
(332, 1)));
+            Table.States (10).Kernel := To_Vector (((222, 32, 7, False), (222, 
32, 5, False), (222, 32, 6, False),
+            (222, 32, 4, False)));
+            Table.States (10).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (11), 49, 176);
             Add_Action (Table.States (11), 74, 177);
             Add_Error (Table.States (11));
-            Table.States (11).Minimal_Complete_Action := (Shift, 74, 177);
-            Table.States (12).Productions := WisiToken.To_Vector ((1 => (246, 
0)));
+            Table.States (11).Kernel := To_Vector (((332, 36, 4, False), (332, 
36, 3, False)));
+            Table.States (11).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 177)));
             Add_Action (Table.States (12), 46, 178);
             Add_Error (Table.States (12));
-            Table.States (12).Minimal_Complete_Action := (Shift, 46, 178);
-            Table.States (13).Productions := WisiToken.To_Vector ((1 => (303, 
0)));
+            Table.States (12).Kernel := To_Vector ((0 => (246, 40, 1, False)));
+            Table.States (12).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 46, 178)));
             Add_Action (Table.States (13), 96, 179);
             Add_Error (Table.States (13));
-            Table.States (13).Minimal_Complete_Action := (Shift, 96, 179);
-            Table.States (14).Productions := WisiToken.To_Vector ((1 => (246, 
1)));
+            Table.States (13).Kernel := To_Vector ((0 => (303, 41, 1, False)));
+            Table.States (13).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 179)));
             Add_Action (Table.States (14), (25, 29, 50), (246, 1), 1, 
overriding_indicator_opt_1'Access, null);
-            Table.States (14).Minimal_Complete_Action := (Reduce, 246, 1);
-            Table.States (15).Productions := WisiToken.To_Vector (((213, 0), 
(247, 0), (247, 1), (248, 0), (250, 0),
-            (251, 0), (251, 1)));
+            Table.States (14).Kernel := To_Vector ((0 => (246, 46, 0, False)));
+            Table.States (14).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 246, 1)));
             Add_Action (Table.States (15), 14, 180);
             Add_Action (Table.States (15), 104, 119);
             Add_Action (Table.States (15), 105, 33);
@@ -409,12 +422,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (15), 239, 181);
             Add_Goto (Table.States (15), 272, 92);
             Add_Goto (Table.States (15), 293, 97);
-            Table.States (15).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (16).Productions := WisiToken.To_Vector (((257, 0), 
(257, 1), (257, 2)));
+            Table.States (15).Kernel := To_Vector (((213, 47, 5, False), (247, 
47, 6, False), (247, 47, 5, False),
+            (248, 47, 5, False), (250, 47, 4, False), (251, 47, 4, False), 
(251, 47, 3, False)));
+            Table.States (15).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (16), 104, 182);
             Add_Error (Table.States (16));
-            Table.States (16).Minimal_Complete_Action := (Shift, 104, 182);
-            Table.States (17).Productions := WisiToken.To_Vector (((142, 2), 
(332, 2)));
+            Table.States (16).Kernel := To_Vector (((257, 48, 4, False), (257, 
48, 6, False), (257, 48, 2, False)));
+            Table.States (16).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 182)));
             Add_Action (Table.States (17), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (17), 28, 183);
             Add_Action (Table.States (17), 29, Reduce, (246, 2), 0, null, 
null);
@@ -481,8 +495,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (17), 319, 113);
             Add_Goto (Table.States (17), 325, 115);
             Add_Goto (Table.States (17), 331, 116);
-            Table.States (17).Minimal_Complete_Action := (Reduce, 246, 0);
-            Table.States (18).Productions := WisiToken.To_Vector ((1 => (262, 
0)));
+            Table.States (17).Kernel := To_Vector (((142, 49, 3, False), (332, 
49, 3, False)));
+            Table.States (17).Minimal_Complete_Actions := To_Vector (((Reduce, 
246, 0), (Shift, 74, 184)));
             Add_Action (Table.States (18), 104, 119);
             Add_Action (Table.States (18), 105, 33);
             Add_Action (Table.States (18), 106, 34);
@@ -491,15 +505,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (18), 239, 187);
             Add_Goto (Table.States (18), 272, 92);
             Add_Goto (Table.States (18), 293, 97);
-            Table.States (18).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (19).Productions := WisiToken.To_Vector (((264, 0), 
(265, 0), (271, 0), (271, 1), (304, 0),
-            (304, 1)));
+            Table.States (18).Kernel := To_Vector ((0 => (262, 50, 1, False)));
+            Table.States (18).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (19), 14, 188);
             Add_Action (Table.States (19), 69, 189);
             Add_Action (Table.States (19), 104, 190);
             Add_Error (Table.States (19));
-            Table.States (19).Minimal_Complete_Action := (Shift, 104, 190);
-            Table.States (20).Productions := WisiToken.To_Vector (((276, 0), 
(276, 1), (276, 2)));
+            Table.States (19).Kernel := To_Vector (((264, 51, 5, False), (265, 
51, 5, False), (271, 51, 8, False),
+            (271, 51, 5, False), (304, 51, 7, False), (304, 51, 4, False)));
+            Table.States (19).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 190)));
             Add_Action (Table.States (20), 96, 191);
             Add_Action (Table.States (20), 104, 119);
             Add_Action (Table.States (20), 105, 33);
@@ -509,8 +523,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (20), 239, 192);
             Add_Goto (Table.States (20), 272, 92);
             Add_Goto (Table.States (20), 293, 97);
-            Table.States (20).Minimal_Complete_Action := (Shift, 96, 191);
-            Table.States (21).Productions := WisiToken.To_Vector (((290, 0), 
(290, 1)));
+            Table.States (20).Kernel := To_Vector (((276, 52, 3, False), (276, 
52, 2, False), (276, 52, 1, False)));
+            Table.States (20).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 191)));
             Add_Action (Table.States (21), 104, 119);
             Add_Action (Table.States (21), 105, 33);
             Add_Action (Table.States (21), 106, 34);
@@ -519,8 +533,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (21), 239, 193);
             Add_Goto (Table.States (21), 272, 92);
             Add_Goto (Table.States (21), 293, 97);
-            Table.States (21).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (22).Productions := WisiToken.To_Vector (((196, 0), 
(196, 1), (302, 0)));
+            Table.States (21).Kernel := To_Vector (((290, 57, 4, False), (290, 
57, 2, False)));
+            Table.States (21).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (22), 3, 121);
             Add_Action (Table.States (22), 21, Reduce, (195, 1), 0, null, 
null);
             Add_Action (Table.States (22), 39, 122);
@@ -558,12 +572,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (22), 320, 144);
             Add_Goto (Table.States (22), 321, 145);
             Add_Goto (Table.States (22), 330, 146);
-            Table.States (22).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (23).Productions := WisiToken.To_Vector ((1 => (315, 
0)));
+            Table.States (22).Kernel := To_Vector (((196, 58, 4, False), (196, 
58, 4, False), (302, 58, 1, False)));
+            Table.States (22).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (23), 76, 198);
             Add_Error (Table.States (23));
-            Table.States (23).Minimal_Complete_Action := (Shift, 76, 198);
-            Table.States (24).Productions := WisiToken.To_Vector (((126, 0), 
(152, 0), (294, 0), (294, 1), (323, 0)));
+            Table.States (23).Kernel := To_Vector ((0 => (315, 60, 9, False)));
+            Table.States (23).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 76, 198)));
             Add_Action (Table.States (24), 4, 1);
             Add_Action (Table.States (24), 18, 4);
             Add_Action (Table.States (24), 22, Reduce, (297, 1), 0, null, 
null);
@@ -587,23 +601,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (24), 296, 208);
             Add_Goto (Table.States (24), 297, 209);
             Add_Goto (Table.States (24), 324, 210);
-            Table.States (24).Minimal_Complete_Action := (Reduce, 297, 0);
-            Table.States (25).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (24).Kernel := To_Vector (((126, 61, 6, False), (152, 
61, 5, False), (294, 61, 4, False),
+            (294, 61, 3, False), (323, 61, 7, False)));
+            Table.States (24).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 297, 0)));
             Add_Action (Table.States (25), 104, 211);
             Add_Error (Table.States (25));
-            Table.States (25).Minimal_Complete_Action := (Shift, 104, 211);
-            Table.States (26).Productions := WisiToken.To_Vector (((305, 0), 
(305, 1), (305, 2), (316, 0), (317, 0),
-            (319, 0), (319, 1), (319, 2)));
+            Table.States (25).Kernel := To_Vector ((0 => (313, 63, 4, False)));
+            Table.States (25).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 211)));
             Add_Action (Table.States (26), 14, 212);
             Add_Action (Table.States (26), 69, 213);
             Add_Action (Table.States (26), 104, 214);
             Add_Error (Table.States (26));
-            Table.States (26).Minimal_Complete_Action := (Shift, 104, 214);
-            Table.States (27).Productions := WisiToken.To_Vector (((206, 0), 
(223, 0), (223, 1), (259, 0), (260, 0)));
+            Table.States (26).Kernel := To_Vector (((305, 66, 7, False), (305, 
66, 4, False), (305, 66, 2, False),
+            (316, 66, 6, False), (317, 66, 5, False), (319, 66, 8, False), 
(319, 66, 5, False), (319, 66, 3, False)));
+            Table.States (26).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 214)));
             Add_Action (Table.States (27), 104, 215);
             Add_Error (Table.States (27));
-            Table.States (27).Minimal_Complete_Action := (Shift, 104, 215);
-            Table.States (28).Productions := WisiToken.To_Vector (((331, 0), 
(331, 1), (331, 2)));
+            Table.States (27).Kernel := To_Vector (((206, 69, 4, False), (223, 
69, 4, False), (223, 69, 2, False),
+            (259, 69, 7, False), (260, 69, 4, False)));
+            Table.States (27).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 215)));
             Add_Action (Table.States (28), 9, 216);
             Add_Action (Table.States (28), 69, 217);
             Add_Action (Table.States (28), 104, 119);
@@ -615,8 +631,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (28), 239, 219);
             Add_Goto (Table.States (28), 272, 92);
             Add_Goto (Table.States (28), 293, 97);
-            Table.States (28).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (29).Productions := WisiToken.To_Vector ((1 => (229, 
0)));
+            Table.States (28).Kernel := To_Vector (((331, 71, 4, False), (331, 
71, 3, False), (331, 71, 2, False)));
+            Table.States (28).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (29), 3, 121);
             Add_Action (Table.States (29), 37, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (29), 39, 122);
@@ -651,8 +667,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (29), 320, 144);
             Add_Goto (Table.States (29), 321, 145);
             Add_Goto (Table.States (29), 330, 146);
-            Table.States (29).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (30).Productions := WisiToken.To_Vector ((1 => (332, 
3)));
+            Table.States (29).Kernel := To_Vector ((0 => (229, 73, 0, False)));
+            Table.States (29).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (30), 104, 119);
             Add_Action (Table.States (30), 105, 33);
             Add_Action (Table.States (30), 106, 34);
@@ -662,73 +678,75 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (30), 239, 219);
             Add_Goto (Table.States (30), 272, 92);
             Add_Goto (Table.States (30), 293, 97);
-            Table.States (30).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (31).Productions := WisiToken.To_Vector ((1 => (217, 
0)));
+            Table.States (30).Kernel := To_Vector ((0 => (332, 74, 2, False)));
+            Table.States (30).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (31), 104, 222);
             Add_Error (Table.States (31));
-            Table.States (31).Minimal_Complete_Action := (Shift, 104, 222);
-            Table.States (32).Productions := WisiToken.To_Vector (((131, 0), 
(219, 1), (239, 5), (245, 0), (245, 1),
-            (245, 2)));
+            Table.States (31).Kernel := To_Vector ((0 => (217, 93, 2, False)));
+            Table.States (31).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 222)));
             Add_Action (Table.States (32), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
-            Add_Action (Table.States (32), 81, 223, (219, 1), 1, null, null);
+            Add_Action (Table.States (32), 81, 223);
+            Add_Conflict (Table.States (32), 81, (219, 1), 1, 
identifier_list_1'Access, null);
             Add_Action (Table.States (32), 82, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
-            Add_Action (Table.States (32), 83, Reduce, (219, 1), 1, null, 
null);
+            Add_Action (Table.States (32), 83, Reduce, (219, 1), 1, 
identifier_list_1'Access, null);
             Add_Action (Table.States (32), 84, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (32), 96, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (32), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (32), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (32));
-            Table.States (32).Minimal_Complete_Action := (Reduce, 219, 1);
-            Table.States (33).Productions := WisiToken.To_Vector ((1 => (239, 
7)));
+            Table.States (32).Kernel := To_Vector (((131, 104, 1, False), 
(219, 104, 0, False), (239, 104, 0, False),
+            (245, 104, 5, False), (245, 104, 6, False), (245, 104, 5, False)));
+            Table.States (32).Minimal_Complete_Actions := To_Vector (((Reduce, 
219, 1), (Reduce, 239, 1)));
             Add_Action (Table.States (33), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 7), 1, null,
             name_7_check'Access);
-            Table.States (33).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (34).Productions := WisiToken.To_Vector ((1 => (239, 
6)));
+            Table.States (33).Kernel := To_Vector ((0 => (239, 105, 0, 
False)));
+            Table.States (33).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (34), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 6), 1, null, null);
-            Table.States (34).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (35).Productions := WisiToken.To_Vector ((1 => (157, 
0)));
+            Table.States (34).Kernel := To_Vector ((0 => (239, 106, 0, 
False)));
+            Table.States (34).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (35), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 0), 1, null,
             null);
-            Table.States (35).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (36).Productions := WisiToken.To_Vector ((1 => (151, 
5)));
+            Table.States (35).Kernel := To_Vector ((0 => (157, 112, 0, 
False)));
+            Table.States (35).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (36), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 5), 1, null, null);
-            Table.States (36).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (37).Productions := WisiToken.To_Vector ((1 => (157, 
1)));
+            Table.States (36).Kernel := To_Vector ((0 => (151, 113, 0, 
False)));
+            Table.States (36).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (37), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 1), 1, null,
             null);
-            Table.States (37).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (38).Productions := WisiToken.To_Vector ((1 => (303, 
1)));
+            Table.States (37).Kernel := To_Vector ((0 => (157, 121, 0, 
False)));
+            Table.States (37).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (38), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 1), 1, null, null);
-            Table.States (38).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (39).Productions := WisiToken.To_Vector ((1 => (298, 
3)));
+            Table.States (38).Kernel := To_Vector ((0 => (303, 123, 0, 
False)));
+            Table.States (38).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (39), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (298, 3), 1, null, null);
-            Table.States (39).Minimal_Complete_Action := (Reduce, 298, 1);
-            Table.States (40).Productions := WisiToken.To_Vector ((1 => (121, 
3)));
+            Table.States (39).Kernel := To_Vector ((0 => (298, 126, 0, 
False)));
+            Table.States (39).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 298, 1)));
             Add_Action (Table.States (40), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (121, 3), 1,
             null, null);
-            Table.States (40).Minimal_Complete_Action := (Reduce, 121, 1);
-            Table.States (41).Productions := WisiToken.To_Vector ((1 => (239, 
3)));
+            Table.States (40).Kernel := To_Vector ((0 => (121, 127, 0, 
False)));
+            Table.States (40).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 121, 1)));
             Add_Action (Table.States (41), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 3), 1, null, null);
-            Table.States (41).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (42).Productions := WisiToken.To_Vector ((1 => (132, 
0)));
+            Table.States (41).Kernel := To_Vector ((0 => (239, 128, 0, True)));
+            Table.States (41).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
+            Table.States (41).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (42), (13, 17, 28, 37, 73), (132, 0), 1, 
null, block_label_opt_0_check'Access);
-            Table.States (42).Minimal_Complete_Action := (Reduce, 132, 1);
-            Table.States (43).Productions := WisiToken.To_Vector (((133, 0), 
(133, 1), (232, 0), (232, 1)));
+            Table.States (42).Kernel := To_Vector ((0 => (132, 131, 0, 
False)));
+            Table.States (42).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 132, 1)));
             Add_Action (Table.States (43), 13, 224);
             Add_Action (Table.States (43), 17, 225);
             Add_Action (Table.States (43), 28, 226);
@@ -736,33 +754,34 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (43), 73, 29);
             Add_Error (Table.States (43));
             Add_Goto (Table.States (43), 229, 228);
-            Table.States (43).Minimal_Complete_Action := (Shift, 13, 224);
-            Table.States (44).Productions := WisiToken.To_Vector ((1 => (151, 
3)));
+            Table.States (43).Kernel := To_Vector (((133, 132, 4, False), 
(133, 132, 3, False), (232, 132, 5, False),
+            (232, 132, 4, False)));
+            Table.States (43).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 224)));
             Add_Action (Table.States (44), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 3), 1, null, null);
-            Table.States (44).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (45).Productions := WisiToken.To_Vector ((1 => (157, 
2)));
+            Table.States (44).Kernel := To_Vector ((0 => (151, 133, 0, 
False)));
+            Table.States (44).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (45), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 2), 1, null,
             null);
-            Table.States (45).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (46).Productions := WisiToken.To_Vector ((1 => (134, 
1)));
+            Table.States (45).Kernel := To_Vector ((0 => (157, 134, 0, 
False)));
+            Table.States (45).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (46), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (134, 1), 1, null,
             null);
-            Table.States (46).Minimal_Complete_Action := (Reduce, 134, 1);
-            Table.States (47).Productions := WisiToken.To_Vector ((1 => (151, 
1)));
+            Table.States (46).Kernel := To_Vector ((0 => (134, 135, 0, 
False)));
+            Table.States (46).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 134, 1)));
             Add_Action (Table.States (47), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 1), 1, null, null);
-            Table.States (47).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (48).Productions := WisiToken.To_Vector ((1 => (143, 
1)));
+            Table.States (47).Kernel := To_Vector ((0 => (151, 139, 0, 
False)));
+            Table.States (47).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (48), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (143, 1), 1,
             compilation_unit_list_1'Access, 
compilation_unit_list_1_check'Access);
-            Table.States (48).Minimal_Complete_Action := (Reduce, 143, 1);
-            Table.States (49).Productions := WisiToken.To_Vector (((108, 0), 
(143, 0)));
+            Table.States (48).Kernel := To_Vector ((0 => (143, 142, 0, 
False)));
+            Table.States (48).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 143, 1)));
             Add_Action (Table.States (49), 4, 1);
             Add_Action (Table.States (49), 5, 2);
             Add_Action (Table.States (49), 13, Reduce, (132, 1), 0, null, 
null);
@@ -771,7 +790,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (49), 18, 4);
             Add_Action (Table.States (49), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (49), 27, 5);
-            Add_Action (Table.States (49), 28, 6, (132, 1), 0, null, null);
+            Add_Action (Table.States (49), 28, 6);
+            Add_Conflict (Table.States (49), 28, (132, 1), 0, null, null);
             Add_Action (Table.States (49), 29, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (49), 30, 8);
             Add_Action (Table.States (49), 31, 9);
@@ -885,73 +905,73 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (49), 325, 115);
             Add_Goto (Table.States (49), 331, 116);
             Add_Goto (Table.States (49), 332, 117);
+            Table.States (49).Kernel := To_Vector (((108, 143, 1, False), 
(143, 143, 2, True)));
          end Subr_1;
          procedure Subr_2
          is begin
-            Table.States (50).Productions := WisiToken.To_Vector ((1 => (306, 
2)));
             Add_Action (Table.States (50), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (306, 2), 1, null, null);
-            Table.States (50).Minimal_Complete_Action := (Reduce, 306, 1);
-            Table.States (51).Productions := WisiToken.To_Vector ((1 => (298, 
2)));
+            Table.States (50).Kernel := To_Vector ((0 => (306, 151, 0, 
False)));
+            Table.States (50).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 306, 1)));
             Add_Action (Table.States (51), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (298, 2), 1, null, null);
-            Table.States (51).Minimal_Complete_Action := (Reduce, 298, 1);
-            Table.States (52).Productions := WisiToken.To_Vector ((1 => (142, 
3)));
+            Table.States (51).Kernel := To_Vector ((0 => (298, 152, 0, 
False)));
+            Table.States (51).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 298, 1)));
             Add_Action (Table.States (52), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (142, 3), 1, null,
             null);
-            Table.States (52).Minimal_Complete_Action := (Reduce, 142, 1);
-            Table.States (53).Productions := WisiToken.To_Vector ((1 => (303, 
7)));
+            Table.States (52).Kernel := To_Vector ((0 => (142, 157, 0, 
False)));
+            Table.States (52).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 142, 1)));
             Add_Action (Table.States (53), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 7), 1, null, null);
-            Table.States (53).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (54).Productions := WisiToken.To_Vector ((1 => (157, 
3)));
+            Table.States (53).Kernel := To_Vector ((0 => (303, 161, 0, 
False)));
+            Table.States (53).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (54), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 3), 1, null,
             null);
-            Table.States (54).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (55).Productions := WisiToken.To_Vector ((1 => (121, 
1)));
+            Table.States (54).Kernel := To_Vector ((0 => (157, 179, 0, 
False)));
+            Table.States (54).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (55), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (121, 1), 1,
             null, null);
-            Table.States (55).Minimal_Complete_Action := (Reduce, 121, 1);
-            Table.States (56).Productions := WisiToken.To_Vector ((1 => (157, 
4)));
+            Table.States (55).Kernel := To_Vector ((0 => (121, 182, 0, 
False)));
+            Table.States (55).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 121, 1)));
             Add_Action (Table.States (56), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 4), 1, null,
             null);
-            Table.States (56).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (57).Productions := WisiToken.To_Vector ((1 => (303, 
2)));
+            Table.States (56).Kernel := To_Vector ((0 => (157, 186, 0, 
False)));
+            Table.States (56).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (57), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 2), 1, null, null);
-            Table.States (57).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (58).Productions := WisiToken.To_Vector ((1 => (157, 
5)));
+            Table.States (57).Kernel := To_Vector ((0 => (303, 190, 0, 
False)));
+            Table.States (57).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (58), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 5), 1, null,
             null);
-            Table.States (58).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (59).Productions := WisiToken.To_Vector ((1 => (151, 
4)));
+            Table.States (58).Kernel := To_Vector ((0 => (157, 193, 0, 
False)));
+            Table.States (58).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (59), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 4), 1, null, null);
-            Table.States (59).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (60).Productions := WisiToken.To_Vector ((1 => (325, 
0)));
+            Table.States (59).Kernel := To_Vector ((0 => (151, 196, 0, 
False)));
+            Table.States (59).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (60), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (325, 0), 1, null,
             null);
-            Table.States (60).Minimal_Complete_Action := (Reduce, 325, 1);
-            Table.States (61).Productions := WisiToken.To_Vector ((1 => (312, 
1)));
+            Table.States (60).Kernel := To_Vector ((0 => (325, 206, 0, 
False)));
+            Table.States (60).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 325, 1)));
             Add_Action (Table.States (61), (35, 74, 96), (312, 1), 1, null, 
subprogram_specification_1_check'Access);
-            Table.States (61).Minimal_Complete_Action := (Reduce, 312, 1);
-            Table.States (62).Productions := WisiToken.To_Vector ((1 => (157, 
6)));
+            Table.States (61).Kernel := To_Vector ((0 => (312, 207, 0, 
False)));
+            Table.States (61).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 312, 1)));
             Add_Action (Table.States (62), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 6), 1, null,
             null);
-            Table.States (62).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (63).Productions := WisiToken.To_Vector (((214, 0), 
(216, 0)));
+            Table.States (62).Kernel := To_Vector ((0 => (157, 209, 0, 
False)));
+            Table.States (62).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (63), 29, 7);
             Add_Action (Table.States (63), 47, 230);
             Add_Action (Table.States (63), 50, 18);
@@ -960,55 +980,55 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (63), 251, 231);
             Add_Goto (Table.States (63), 262, 87);
             Add_Goto (Table.States (63), 312, 232);
-            Table.States (63).Minimal_Complete_Action := (Shift, 50, 18);
-            Table.States (64).Productions := WisiToken.To_Vector ((1 => (157, 
7)));
+            Table.States (63).Kernel := To_Vector (((214, 210, 5, False), 
(216, 210, 3, False)));
+            Table.States (63).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 50, 18)));
             Add_Action (Table.States (64), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 7), 1, null,
             null);
-            Table.States (64).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (65).Productions := WisiToken.To_Vector ((1 => (209, 
1)));
+            Table.States (64).Kernel := To_Vector ((0 => (157, 213, 0, 
False)));
+            Table.States (64).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (65), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (209, 1), 1, null,
             null);
-            Table.States (65).Minimal_Complete_Action := (Reduce, 209, 1);
-            Table.States (66).Productions := WisiToken.To_Vector ((1 => (289, 
3)));
+            Table.States (65).Kernel := To_Vector ((0 => (209, 214, 0, 
False)));
+            Table.States (65).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 209, 1)));
             Add_Action (Table.States (66), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (289, 3), 1, null,
             null);
-            Table.States (66).Minimal_Complete_Action := (Reduce, 289, 1);
-            Table.States (67).Productions := WisiToken.To_Vector ((1 => (209, 
0)));
+            Table.States (66).Kernel := To_Vector ((0 => (289, 215, 0, 
False)));
+            Table.States (66).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 289, 1)));
             Add_Action (Table.States (67), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (209, 0), 1, null,
             null);
-            Table.States (67).Minimal_Complete_Action := (Reduce, 209, 1);
-            Table.States (68).Productions := WisiToken.To_Vector ((1 => (306, 
0)));
+            Table.States (67).Kernel := To_Vector ((0 => (209, 216, 0, 
False)));
+            Table.States (67).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 209, 1)));
             Add_Action (Table.States (68), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (306, 0), 1, null, null);
-            Table.States (68).Minimal_Complete_Action := (Reduce, 306, 1);
-            Table.States (69).Productions := WisiToken.To_Vector (((157, 9), 
(186, 0), (219, 0), (244, 0), (244, 1),
-            (244, 2), (244, 3), (244, 4), (244, 5)));
+            Table.States (68).Kernel := To_Vector ((0 => (306, 217, 0, 
False)));
+            Table.States (68).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 306, 1)));
             Add_Action (Table.States (69), 81, 233);
             Add_Action (Table.States (69), 83, 234);
             Add_Error (Table.States (69));
-            Table.States (69).Minimal_Complete_Action := (Shift, 81, 233);
-            Table.States (70).Productions := WisiToken.To_Vector ((1 => (151, 
0)));
+            Table.States (69).Kernel := To_Vector (((157, 219, 4, False), 
(186, 219, 3, False), (219, 219, 2, True),
+            (244, 219, 4, False), (244, 219, 5, False), (244, 219, 11, False), 
(244, 219, 3, False), (244, 219, 4,
+            False), (244, 219, 10, False)));
+            Table.States (69).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 81, 233)));
             Add_Action (Table.States (70), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 0), 1, null, null);
-            Table.States (70).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (71).Productions := WisiToken.To_Vector ((1 => (325, 
1)));
+            Table.States (70).Kernel := To_Vector ((0 => (151, 222, 0, 
False)));
+            Table.States (70).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (71), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (325, 1), 1, null,
             null);
-            Table.States (71).Minimal_Complete_Action := (Reduce, 325, 1);
-            Table.States (72).Productions := WisiToken.To_Vector ((1 => (151, 
2)));
+            Table.States (71).Kernel := To_Vector ((0 => (325, 223, 0, 
False)));
+            Table.States (71).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 325, 1)));
             Add_Action (Table.States (72), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 2), 1, null, null);
-            Table.States (72).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (73).Productions := WisiToken.To_Vector (((123, 0), 
(128, 0), (239, 0), (239, 1), (261, 0),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (72).Kernel := To_Vector ((0 => (151, 232, 0, 
False)));
+            Table.States (72).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (73), 76, 235);
             Add_Action (Table.States (73), 82, 236);
             Add_Action (Table.States (73), 84, 237);
@@ -1018,24 +1038,25 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (73));
             Add_Goto (Table.States (73), 115, 241);
             Add_Goto (Table.States (73), 322, 242);
-            Table.States (73).Minimal_Complete_Action := (Shift, 96, 238);
-            Table.States (74).Productions := WisiToken.To_Vector ((1 => (157, 
8)));
+            Table.States (73).Kernel := To_Vector (((123, 239, 2, False), 
(128, 239, 2, True), (239, 239, 5, True),
+            (239, 239, 2, True), (261, 239, 1, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (73).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 238)));
             Add_Action (Table.States (74), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 8), 1, null,
             null);
-            Table.States (74).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (75).Productions := WisiToken.To_Vector ((1 => (157, 
10)));
+            Table.States (74).Kernel := To_Vector ((0 => (157, 243, 0, 
False)));
+            Table.States (74).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (75), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 10), 1,
             null, null);
-            Table.States (75).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (76).Productions := WisiToken.To_Vector ((1 => (289, 
0)));
+            Table.States (75).Kernel := To_Vector ((0 => (157, 244, 0, 
False)));
+            Table.States (75).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (76), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (289, 0), 1, null,
             null);
-            Table.States (76).Minimal_Complete_Action := (Reduce, 289, 1);
-            Table.States (77).Productions := WisiToken.To_Vector (((112, 0), 
(179, 0), (179, 1), (193, 0), (213, 1),
-            (213, 2), (243, 0), (307, 0), (308, 0), (309, 0), (311, 0)));
+            Table.States (76).Kernel := To_Vector ((0 => (289, 245, 0, 
False)));
+            Table.States (76).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 289, 1)));
             Add_Action (Table.States (77), 25, 243);
             Add_Action (Table.States (77), 29, 244);
             Add_Action (Table.States (77), 50, 245);
@@ -1043,221 +1064,225 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (77), 207, 246);
             Add_Goto (Table.States (77), 262, 247);
             Add_Goto (Table.States (77), 312, 248);
-            Table.States (77).Minimal_Complete_Action := (Shift, 25, 243);
-            Table.States (78).Productions := WisiToken.To_Vector ((1 => (263, 
1)));
+            Table.States (77).Kernel := To_Vector (((112, 246, 5, False), 
(179, 246, 6, False), (179, 246, 3, False),
+            (193, 246, 7, False), (213, 246, 6, False), (213, 246, 6, False), 
(243, 246, 5, False), (307, 246, 6,
+            False), (308, 246, 5, False), (309, 246, 3, False), (311, 246, 5, 
False)));
+            Table.States (77).Minimal_Complete_Actions := To_Vector (((Shift, 
25, 243), (Shift, 50, 245)));
             Add_Action (Table.States (78), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (263, 1), 1, null,
             null);
-            Table.States (78).Minimal_Complete_Action := (Reduce, 263, 1);
-            Table.States (79).Productions := WisiToken.To_Vector ((1 => (135, 
1)));
+            Table.States (78).Kernel := To_Vector ((0 => (263, 247, 0, 
False)));
+            Table.States (78).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 263, 1)));
             Add_Action (Table.States (79), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (135, 1), 1, null,
             null);
-            Table.States (79).Minimal_Complete_Action := (Reduce, 135, 1);
-            Table.States (80).Productions := WisiToken.To_Vector ((1 => (157, 
11)));
+            Table.States (79).Kernel := To_Vector ((0 => (135, 248, 0, 
False)));
+            Table.States (79).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 135, 1)));
             Add_Action (Table.States (80), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 11), 1,
             null, null);
-            Table.States (80).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (81).Productions := WisiToken.To_Vector ((1 => (289, 
1)));
+            Table.States (80).Kernel := To_Vector ((0 => (157, 249, 0, 
False)));
+            Table.States (80).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (81), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (289, 1), 1, null,
             null);
-            Table.States (81).Minimal_Complete_Action := (Reduce, 289, 1);
-            Table.States (82).Productions := WisiToken.To_Vector ((1 => (249, 
0)));
+            Table.States (81).Kernel := To_Vector ((0 => (289, 250, 0, 
False)));
+            Table.States (81).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 289, 1)));
             Add_Action (Table.States (82), 96, 249);
             Add_Error (Table.States (82));
-            Table.States (82).Minimal_Complete_Action := (Shift, 96, 249);
-            Table.States (83).Productions := WisiToken.To_Vector ((1 => (303, 
10)));
+            Table.States (82).Kernel := To_Vector ((0 => (249, 251, 1, 
False)));
+            Table.States (82).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 249)));
             Add_Action (Table.States (83), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 10), 1, null, null);
-            Table.States (83).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (84).Productions := WisiToken.To_Vector ((1 => (325, 
3)));
+            Table.States (83).Kernel := To_Vector ((0 => (303, 257, 0, 
False)));
+            Table.States (83).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (84), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (325, 3), 1, null,
             null);
-            Table.States (84).Minimal_Complete_Action := (Reduce, 325, 1);
-            Table.States (85).Productions := WisiToken.To_Vector ((1 => (325, 
2)));
+            Table.States (84).Kernel := To_Vector ((0 => (325, 259, 0, 
False)));
+            Table.States (84).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 325, 1)));
             Add_Action (Table.States (85), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (325, 2), 1, null,
             null);
-            Table.States (85).Minimal_Complete_Action := (Reduce, 325, 1);
-            Table.States (86).Productions := WisiToken.To_Vector ((1 => (303, 
4)));
+            Table.States (85).Kernel := To_Vector ((0 => (325, 260, 0, 
False)));
+            Table.States (85).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 325, 1)));
             Add_Action (Table.States (86), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 4), 1, null, null);
-            Table.States (86).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (87).Productions := WisiToken.To_Vector ((1 => (312, 
0)));
+            Table.States (86).Kernel := To_Vector ((0 => (303, 261, 0, 
False)));
+            Table.States (86).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (87), (35, 74, 96), (312, 0), 1, null, 
subprogram_specification_0_check'Access);
-            Table.States (87).Minimal_Complete_Action := (Reduce, 312, 1);
-            Table.States (88).Productions := WisiToken.To_Vector ((1 => (134, 
0)));
+            Table.States (87).Kernel := To_Vector ((0 => (312, 262, 0, 
False)));
+            Table.States (87).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 312, 1)));
             Add_Action (Table.States (88), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (134, 0), 1, null,
             null);
-            Table.States (88).Minimal_Complete_Action := (Reduce, 134, 1);
-            Table.States (89).Productions := WisiToken.To_Vector ((1 => (263, 
3)));
+            Table.States (88).Kernel := To_Vector ((0 => (134, 263, 0, 
False)));
+            Table.States (88).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 134, 1)));
             Add_Action (Table.States (89), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (263, 3), 1, null,
             null);
-            Table.States (89).Minimal_Complete_Action := (Reduce, 263, 1);
-            Table.States (90).Productions := WisiToken.To_Vector ((1 => (135, 
3)));
+            Table.States (89).Kernel := To_Vector ((0 => (263, 264, 0, 
False)));
+            Table.States (89).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 263, 1)));
             Add_Action (Table.States (90), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (135, 3), 1, null,
             null);
-            Table.States (90).Minimal_Complete_Action := (Reduce, 135, 1);
-            Table.States (91).Productions := WisiToken.To_Vector ((1 => (206, 
2)));
+            Table.States (90).Kernel := To_Vector ((0 => (135, 265, 0, 
False)));
+            Table.States (90).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 135, 1)));
             Add_Action (Table.States (91), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (206, 2), 1, null,
             null);
-            Table.States (91).Minimal_Complete_Action := (Reduce, 206, 1);
-            Table.States (92).Productions := WisiToken.To_Vector ((1 => (239, 
4)));
+            Table.States (91).Kernel := To_Vector ((0 => (206, 271, 0, 
False)));
+            Table.States (91).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 206, 1)));
             Add_Action (Table.States (92), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 4), 1, null, null);
-            Table.States (92).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (93).Productions := WisiToken.To_Vector ((1 => (303, 
9)));
+            Table.States (92).Kernel := To_Vector ((0 => (239, 272, 0, True)));
+            Table.States (92).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
+            Table.States (92).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (93), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 9), 1, null, null);
-            Table.States (93).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (94).Productions := WisiToken.To_Vector ((1 => (121, 
2)));
+            Table.States (93).Kernel := To_Vector ((0 => (303, 276, 0, 
False)));
+            Table.States (93).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (94), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (121, 2), 1,
             null, null);
-            Table.States (94).Minimal_Complete_Action := (Reduce, 121, 1);
-            Table.States (95).Productions := WisiToken.To_Vector ((1 => (157, 
12)));
+            Table.States (94).Kernel := To_Vector ((0 => (121, 281, 0, 
False)));
+            Table.States (94).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 121, 1)));
             Add_Action (Table.States (95), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 12), 1,
             null, null);
-            Table.States (95).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (96).Productions := WisiToken.To_Vector ((1 => (303, 
6)));
+            Table.States (95).Kernel := To_Vector ((0 => (157, 289, 0, 
False)));
+            Table.States (95).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (96), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 6), 1, null, null);
-            Table.States (96).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (97).Productions := WisiToken.To_Vector ((1 => (239, 
2)));
+            Table.States (96).Kernel := To_Vector ((0 => (303, 290, 0, 
False)));
+            Table.States (96).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (97), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 2), 1, null,
             name_2_check'Access);
-            Table.States (97).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (98).Productions := WisiToken.To_Vector ((1 => (298, 
0)));
+            Table.States (97).Kernel := To_Vector ((0 => (239, 293, 0, True)));
+            Table.States (97).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
+            Table.States (97).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (98), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (298, 0), 1, null, null);
-            Table.States (98).Minimal_Complete_Action := (Reduce, 298, 1);
-            Table.States (99).Productions := WisiToken.To_Vector ((1 => (151, 
6)));
+            Table.States (98).Kernel := To_Vector ((0 => (298, 294, 0, 
False)));
+            Table.States (98).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 298, 1)));
             Add_Action (Table.States (99), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (151, 6), 1, null, null);
-            Table.States (99).Minimal_Complete_Action := (Reduce, 151, 1);
-            Table.States (100).Productions := WisiToken.To_Vector ((1 => (303, 
5)));
+            Table.States (99).Kernel := To_Vector ((0 => (151, 298, 0, 
False)));
+            Table.States (99).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 151, 1)));
             Add_Action (Table.States (100), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 5), 1, null, null);
-            Table.States (100).Minimal_Complete_Action := (Reduce, 303, 1);
-            Table.States (101).Productions := WisiToken.To_Vector ((1 => (306, 
1)));
+            Table.States (100).Kernel := To_Vector ((0 => (303, 302, 0, 
False)));
+            Table.States (100).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 1)));
             Add_Action (Table.States (101), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (306, 1), 1, null, null);
-            Table.States (101).Minimal_Complete_Action := (Reduce, 306, 1);
-            Table.States (102).Productions := WisiToken.To_Vector ((1 => (244, 
7)));
+            Table.States (101).Kernel := To_Vector ((0 => (306, 303, 0, 
False)));
+            Table.States (101).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 306, 1)));
             Add_Action (Table.States (102), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 7), 1, null,
             null);
-            Table.States (102).Minimal_Complete_Action := (Reduce, 244, 1);
-            Table.States (103).Productions := WisiToken.To_Vector ((1 => (244, 
6)));
+            Table.States (102).Kernel := To_Vector ((0 => (244, 304, 0, 
False)));
+            Table.States (102).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 1)));
             Add_Action (Table.States (103), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 6), 1, null,
             null);
-            Table.States (103).Minimal_Complete_Action := (Reduce, 244, 1);
-            Table.States (104).Productions := WisiToken.To_Vector ((1 => (142, 
4)));
+            Table.States (103).Kernel := To_Vector ((0 => (244, 305, 0, 
False)));
+            Table.States (103).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 1)));
             Add_Action (Table.States (104), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (142, 4), 1, null,
             null);
-            Table.States (104).Minimal_Complete_Action := (Reduce, 142, 1);
-            Table.States (105).Productions := WisiToken.To_Vector ((1 => (263, 
0)));
+            Table.States (104).Kernel := To_Vector ((0 => (142, 306, 0, 
False)));
+            Table.States (104).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 142, 1)));
             Add_Action (Table.States (105), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (263, 0), 1, null,
             null);
-            Table.States (105).Minimal_Complete_Action := (Reduce, 263, 1);
-            Table.States (106).Productions := WisiToken.To_Vector ((1 => (135, 
0)));
+            Table.States (105).Kernel := To_Vector ((0 => (263, 307, 0, 
False)));
+            Table.States (105).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 263, 1)));
             Add_Action (Table.States (106), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (135, 0), 1, null,
             null);
-            Table.States (106).Minimal_Complete_Action := (Reduce, 135, 1);
-            Table.States (107).Productions := WisiToken.To_Vector ((1 => (157, 
13)));
+            Table.States (106).Kernel := To_Vector ((0 => (135, 308, 0, 
False)));
+            Table.States (106).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 135, 1)));
             Add_Action (Table.States (107), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 13), 1,
             null, null);
-            Table.States (107).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (108).Productions := WisiToken.To_Vector ((1 => (289, 
2)));
+            Table.States (107).Kernel := To_Vector ((0 => (157, 309, 0, 
False)));
+            Table.States (107).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (108), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (289, 2), 1, null,
             null);
-            Table.States (108).Minimal_Complete_Action := (Reduce, 289, 1);
-            Table.States (109).Productions := WisiToken.To_Vector ((1 => (157, 
14)));
+            Table.States (108).Kernel := To_Vector ((0 => (289, 311, 0, 
False)));
+            Table.States (108).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 289, 1)));
             Add_Action (Table.States (109), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 14), 1,
             null, null);
-            Table.States (109).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (110).Productions := WisiToken.To_Vector ((1 => (142, 
1)));
+            Table.States (109).Kernel := To_Vector ((0 => (157, 313, 0, 
False)));
+            Table.States (109).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (110), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (142, 1), 1, null,
             null);
-            Table.States (110).Minimal_Complete_Action := (Reduce, 142, 1);
-            Table.States (111).Productions := WisiToken.To_Vector ((1 => (263, 
2)));
+            Table.States (110).Kernel := To_Vector ((0 => (142, 315, 0, 
False)));
+            Table.States (110).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 142, 1)));
             Add_Action (Table.States (111), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (263, 2), 1, null,
             null);
-            Table.States (111).Minimal_Complete_Action := (Reduce, 263, 1);
-            Table.States (112).Productions := WisiToken.To_Vector ((1 => (135, 
2)));
+            Table.States (111).Kernel := To_Vector ((0 => (263, 316, 0, 
False)));
+            Table.States (111).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 263, 1)));
             Add_Action (Table.States (112), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (135, 2), 1, null,
             null);
-            Table.States (112).Minimal_Complete_Action := (Reduce, 135, 1);
-            Table.States (113).Productions := WisiToken.To_Vector ((1 => (206, 
1)));
+            Table.States (112).Kernel := To_Vector ((0 => (135, 317, 0, 
False)));
+            Table.States (112).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 135, 1)));
             Add_Action (Table.States (113), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (206, 1), 1, null,
             null);
-            Table.States (113).Minimal_Complete_Action := (Reduce, 206, 1);
-            Table.States (114).Productions := WisiToken.To_Vector ((1 => (298, 
1)));
+            Table.States (113).Kernel := To_Vector ((0 => (206, 319, 0, 
False)));
+            Table.States (113).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 206, 1)));
             Add_Action (Table.States (114), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (298, 1), 1, null, null);
-            Table.States (114).Minimal_Complete_Action := (Reduce, 298, 1);
-            Table.States (115).Productions := WisiToken.To_Vector ((1 => (157, 
15)));
+            Table.States (114).Kernel := To_Vector ((0 => (298, 323, 0, 
False)));
+            Table.States (114).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 298, 1)));
             Add_Action (Table.States (115), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 15), 1,
             null, null);
-            Table.States (115).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (116).Productions := WisiToken.To_Vector ((1 => (157, 
16)));
+            Table.States (115).Kernel := To_Vector ((0 => (157, 325, 0, 
False)));
+            Table.States (115).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (116), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 16), 1,
             null, null);
-            Table.States (116).Minimal_Complete_Action := (Reduce, 157, 1);
-            Table.States (117).Productions := WisiToken.To_Vector ((1 => (142, 
0)));
+            Table.States (116).Kernel := To_Vector ((0 => (157, 331, 0, 
False)));
+            Table.States (116).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 1)));
             Add_Action (Table.States (117), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (142, 0), 1, null,
             null);
-            Table.States (117).Minimal_Complete_Action := (Reduce, 142, 1);
-            Table.States (118).Productions := WisiToken.To_Vector (((113, 0), 
(113, 1)));
+            Table.States (117).Kernel := To_Vector ((0 => (142, 332, 0, 
False)));
+            Table.States (117).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 142, 1)));
             Add_Action (Table.States (118), 21, Reduce, (116, 1), 0, null, 
null);
-            Add_Action (Table.States (118), 76, 250, (116, 1), 0, null, null);
+            Add_Action (Table.States (118), 76, 250);
+            Add_Conflict (Table.States (118), 76, (116, 1), 0, null, null);
             Add_Action (Table.States (118), 96, Reduce, (116, 1), 0, null, 
null);
             Add_Error (Table.States (118));
             Add_Goto (Table.States (118), 115, 251);
             Add_Goto (Table.States (118), 116, 252);
-            Table.States (118).Minimal_Complete_Action := (Reduce, 116, 0);
-            Table.States (119).Productions := WisiToken.To_Vector ((1 => (239, 
5)));
+            Table.States (118).Kernel := To_Vector (((113, 104, 3, False), 
(113, 104, 1, False)));
+            Table.States (118).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 116, 0)));
             Add_Action (Table.States (119), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 5), 1, name_5'Access,
             name_5_check'Access);
-            Table.States (119).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (120).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (303, 8)));
+            Table.States (119).Kernel := To_Vector ((0 => (239, 104, 0, 
False)));
+            Table.States (119).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (120), 76, 235);
             Add_Action (Table.States (120), 84, 237);
             Add_Action (Table.States (120), 96, 253);
@@ -1266,8 +1291,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (120));
             Add_Goto (Table.States (120), 115, 241);
             Add_Goto (Table.States (120), 322, 242);
-            Table.States (120).Minimal_Complete_Action := (Shift, 96, 253);
-            Table.States (121).Productions := WisiToken.To_Vector ((1 => (197, 
2)));
+            Table.States (120).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (303, 239, 1, False)));
+            Table.States (120).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 253)));
             Add_Action (Table.States (121), 39, 122);
             Add_Action (Table.States (121), 41, 124);
             Add_Action (Table.States (121), 76, 126);
@@ -1282,8 +1309,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (121), 258, 254);
             Add_Goto (Table.States (121), 272, 92);
             Add_Goto (Table.States (121), 293, 97);
-            Table.States (121).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (122).Productions := WisiToken.To_Vector ((1 => (258, 
4)));
+            Table.States (121).Kernel := To_Vector ((0 => (197, 3, 1, False)));
+            Table.States (121).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (122), 104, 119);
             Add_Action (Table.States (122), 105, 33);
             Add_Action (Table.States (122), 106, 34);
@@ -1292,8 +1319,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (122), 239, 255);
             Add_Goto (Table.States (122), 272, 92);
             Add_Goto (Table.States (122), 293, 97);
-            Table.States (122).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (123).Productions := WisiToken.To_Vector ((1 => (197, 
3)));
+            Table.States (122).Kernel := To_Vector ((0 => (258, 39, 1, 
False)));
+            Table.States (122).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (123), 39, 122);
             Add_Action (Table.States (123), 41, 124);
             Add_Action (Table.States (123), 76, 126);
@@ -1308,12 +1335,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (123), 258, 256);
             Add_Goto (Table.States (123), 272, 92);
             Add_Goto (Table.States (123), 293, 97);
-            Table.States (123).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (124).Productions := WisiToken.To_Vector ((1 => (258, 
1)));
+            Table.States (123).Kernel := To_Vector ((0 => (197, 40, 1, 
False)));
+            Table.States (123).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (124), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99, 100), (258, 1), 1, null, null);
-            Table.States (124).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (125).Productions := WisiToken.To_Vector (((275, 0), 
(275, 1)));
+            Table.States (124).Kernel := To_Vector ((0 => (258, 41, 0, 
False)));
+            Table.States (124).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (125), 104, 119);
             Add_Action (Table.States (125), 105, 33);
             Add_Action (Table.States (125), 106, 34);
@@ -1322,8 +1349,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (125), 239, 257);
             Add_Goto (Table.States (125), 272, 92);
             Add_Goto (Table.States (125), 293, 97);
-            Table.States (125).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (126).Productions := WisiToken.To_Vector (((117, 0), 
(117, 1), (117, 2), (117, 3), (117, 4)));
+            Table.States (125).Kernel := To_Vector (((275, 52, 2, True), (275, 
52, 1, False)));
+            Table.States (125).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (126), 3, 121);
             Add_Action (Table.States (126), 15, 258);
             Add_Action (Table.States (126), 28, 259);
@@ -1375,37 +1402,38 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (126), 320, 144);
             Add_Goto (Table.States (126), 321, 145);
             Add_Goto (Table.States (126), 330, 146);
-            Table.States (126).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (127).Productions := WisiToken.To_Vector ((1 => (330, 
1)));
+            Table.States (126).Kernel := To_Vector (((117, 76, 4, False), 
(117, 76, 2, False), (117, 76, 3, False),
+            (117, 76, 3, False), (117, 76, 1, False)));
+            Table.States (126).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
             Add_Action (Table.States (127), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (330, 1), 1, null, null);
-            Table.States (127).Minimal_Complete_Action := (Reduce, 330, 1);
-            Table.States (128).Productions := WisiToken.To_Vector ((1 => (330, 
0)));
+            Table.States (127).Kernel := To_Vector ((0 => (330, 94, 0, 
False)));
+            Table.States (127).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 330, 1)));
             Add_Action (Table.States (128), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (330, 0), 1, null, null);
-            Table.States (128).Minimal_Complete_Action := (Reduce, 330, 1);
-            Table.States (129).Productions := WisiToken.To_Vector ((1 => (258, 
0)));
+            Table.States (128).Kernel := To_Vector ((0 => (330, 95, 0, 
False)));
+            Table.States (128).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 330, 1)));
             Add_Action (Table.States (129), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99, 100), (258, 0), 1, primary_0'Access,
             null);
-            Table.States (129).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (130).Productions := WisiToken.To_Vector ((1 => (258, 
2)));
+            Table.States (129).Kernel := To_Vector ((0 => (258, 103, 0, 
False)));
+            Table.States (129).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (130), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99, 100), (258, 2), 1, primary_2'Access,
             null);
-            Table.States (130).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (131).Productions := WisiToken.To_Vector ((1 => (192, 
0)));
+            Table.States (130).Kernel := To_Vector ((0 => (258, 117, 0, 
False)));
+            Table.States (130).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (131), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (192,
             0), 1, null, null);
-            Table.States (131).Minimal_Complete_Action := (Reduce, 192, 1);
-            Table.States (132).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (131).Kernel := To_Vector ((0 => (192, 191, 0, 
True)));
+            Table.States (131).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 1)));
+            Table.States (131).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (132), 35, 278);
             Add_Error (Table.States (132));
-            Table.States (132).Minimal_Complete_Action := (Shift, 35, 278);
-            Table.States (133).Productions := WisiToken.To_Vector ((1 => (320, 
1)));
+            Table.States (132).Kernel := To_Vector ((0 => (139, 192, 6, 
False)));
+            Table.States (132).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 278)));
             Add_Action (Table.States (133), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99), (320, 1), 1, null, null);
-            Table.States (133).Minimal_Complete_Action := (Reduce, 320, 1);
-            Table.States (134).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (258, 3), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (133).Kernel := To_Vector ((0 => (320, 197, 0, 
False)));
+            Table.States (133).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 320, 1)));
             Add_Action (Table.States (134), 10, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (134), 20, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (134), 21, Reduce, (258, 3), 1, null, 
null);
@@ -1449,8 +1477,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (134));
             Add_Goto (Table.States (134), 115, 241);
             Add_Goto (Table.States (134), 322, 242);
-            Table.States (134).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (135).Productions := WisiToken.To_Vector (((197, 0), 
(197, 1)));
+            Table.States (134).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (258, 239, 0, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (134).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (135), 10, Reduce, (197, 1), 1, null, 
null);
             Add_Action (Table.States (135), 20, Reduce, (197, 1), 1, null, 
null);
             Add_Action (Table.States (135), 21, Reduce, (197, 1), 1, null, 
null);
@@ -1488,13 +1518,15 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (135), 99, Reduce, (197, 1), 1, null, 
null);
             Add_Action (Table.States (135), 100, 279);
             Add_Error (Table.States (135));
-            Table.States (135).Minimal_Complete_Action := (Reduce, 197, 1);
-            Table.States (136).Productions := WisiToken.To_Vector ((1 => (287, 
4)));
+            Table.States (135).Kernel := To_Vector (((197, 258, 2, False), 
(197, 258, 0, False)));
+            Table.States (135).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 197, 1)));
             Add_Action (Table.States (136), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (287,
             4), 1, null, null);
-            Table.States (136).Minimal_Complete_Action := (Reduce, 287, 1);
-            Table.States (137).Productions := WisiToken.To_Vector (((191, 1), 
(282, 0)));
-            Add_Action (Table.States (137), 10, 280, (191, 1), 1, null, null);
+            Table.States (136).Kernel := To_Vector ((0 => (287, 275, 0, 
True)));
+            Table.States (136).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 1)));
+            Table.States (136).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (137), 10, 280);
+            Add_Conflict (Table.States (137), 10, (191, 1), 1, null, null);
             Add_Action (Table.States (137), 20, Reduce, (191, 1), 1, null, 
null);
             Add_Action (Table.States (137), 21, Reduce, (191, 1), 1, null, 
null);
             Add_Action (Table.States (137), 22, Reduce, (191, 1), 1, null, 
null);
@@ -1512,9 +1544,11 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (137), 87, Reduce, (191, 1), 1, null, 
null);
             Add_Action (Table.States (137), 96, Reduce, (191, 1), 1, null, 
null);
             Add_Error (Table.States (137));
-            Table.States (137).Minimal_Complete_Action := (Reduce, 191, 1);
-            Table.States (138).Productions := WisiToken.To_Vector (((191, 2), 
(283, 0)));
-            Add_Action (Table.States (138), 10, 281, (191, 2), 1, null, null);
+            Table.States (137).Kernel := To_Vector (((191, 282, 0, True), 
(282, 282, 2, True)));
+            Table.States (137).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (137).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (138), 10, 281);
+            Add_Conflict (Table.States (138), 10, (191, 2), 1, null, null);
             Add_Action (Table.States (138), 20, Reduce, (191, 2), 1, null, 
null);
             Add_Action (Table.States (138), 21, Reduce, (191, 2), 1, null, 
null);
             Add_Action (Table.States (138), 22, Reduce, (191, 2), 1, null, 
null);
@@ -1532,8 +1566,9 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (138), 87, Reduce, (191, 2), 1, null, 
null);
             Add_Action (Table.States (138), 96, Reduce, (191, 2), 1, null, 
null);
             Add_Error (Table.States (138));
-            Table.States (138).Minimal_Complete_Action := (Reduce, 191, 1);
-            Table.States (139).Productions := WisiToken.To_Vector (((191, 3), 
(284, 0)));
+            Table.States (138).Kernel := To_Vector (((191, 283, 0, True), 
(283, 283, 3, True)));
+            Table.States (138).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (138).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (139), 10, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 20, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 21, Reduce, (191, 3), 1, null, 
null);
@@ -1541,7 +1576,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (139), 23, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 35, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 37, Reduce, (191, 3), 1, null, 
null);
-            Add_Action (Table.States (139), 43, 282, (191, 3), 1, null, null);
+            Add_Action (Table.States (139), 43, 282);
+            Add_Conflict (Table.States (139), 43, (191, 3), 1, null, null);
             Add_Action (Table.States (139), 53, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 68, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 74, Reduce, (191, 3), 1, null, 
null);
@@ -1552,8 +1588,9 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (139), 87, Reduce, (191, 3), 1, null, 
null);
             Add_Action (Table.States (139), 96, Reduce, (191, 3), 1, null, 
null);
             Add_Error (Table.States (139));
-            Table.States (139).Minimal_Complete_Action := (Reduce, 191, 1);
-            Table.States (140).Productions := WisiToken.To_Vector (((191, 4), 
(285, 0)));
+            Table.States (139).Kernel := To_Vector (((191, 284, 0, True), 
(284, 284, 2, True)));
+            Table.States (139).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (139).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (140), 10, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 20, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 21, Reduce, (191, 4), 1, null, 
null);
@@ -1561,7 +1598,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (140), 23, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 35, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 37, Reduce, (191, 4), 1, null, 
null);
-            Add_Action (Table.States (140), 43, 283, (191, 4), 1, null, null);
+            Add_Action (Table.States (140), 43, 283);
+            Add_Conflict (Table.States (140), 43, (191, 4), 1, null, null);
             Add_Action (Table.States (140), 53, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 68, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 74, Reduce, (191, 4), 1, null, 
null);
@@ -1572,8 +1610,12 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (140), 87, Reduce, (191, 4), 1, null, 
null);
             Add_Action (Table.States (140), 96, Reduce, (191, 4), 1, null, 
null);
             Add_Error (Table.States (140));
-            Table.States (140).Minimal_Complete_Action := (Reduce, 191, 1);
-            Table.States (141).Productions := WisiToken.To_Vector (((191, 5), 
(286, 0)));
+            Table.States (140).Kernel := To_Vector (((191, 285, 0, True), 
(285, 285, 3, True)));
+            Table.States (140).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (140).Minimal_Complete_Actions_Recursive := True;
+         end Subr_2;
+         procedure Subr_3
+         is begin
             Add_Action (Table.States (141), 10, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 20, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 21, Reduce, (191, 5), 1, null, 
null);
@@ -1585,39 +1627,42 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (141), 53, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 68, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 74, Reduce, (191, 5), 1, null, 
null);
-            Add_Action (Table.States (141), 75, 284, (191, 5), 1, null, null);
+            Add_Action (Table.States (141), 75, 284);
+            Add_Conflict (Table.States (141), 75, (191, 5), 1, null, null);
             Add_Action (Table.States (141), 77, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 79, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 83, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 87, Reduce, (191, 5), 1, null, 
null);
             Add_Action (Table.States (141), 96, Reduce, (191, 5), 1, null, 
null);
             Add_Error (Table.States (141));
-            Table.States (141).Minimal_Complete_Action := (Reduce, 191, 1);
-         end Subr_2;
-         procedure Subr_3
-         is begin
-            Table.States (142).Productions := WisiToken.To_Vector (((191, 0), 
(282, 1), (283, 1), (284, 1), (285, 1),
-            (286, 1)));
-            Add_Action (Table.States (142), 10, 285, (191, 0), 1, null, null);
+            Table.States (141).Kernel := To_Vector (((191, 286, 0, True), 
(286, 286, 2, True)));
+            Table.States (141).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (141).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (142), 10, 285);
+            Add_Conflict (Table.States (142), 10, (191, 0), 1, null, null);
             Add_Action (Table.States (142), 20, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 21, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 22, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 23, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 35, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 37, Reduce, (191, 0), 1, null, 
null);
-            Add_Action (Table.States (142), 43, 286, (191, 0), 1, null, null);
+            Add_Action (Table.States (142), 43, 286);
+            Add_Conflict (Table.States (142), 43, (191, 0), 1, null, null);
             Add_Action (Table.States (142), 53, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 68, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 74, Reduce, (191, 0), 1, null, 
null);
-            Add_Action (Table.States (142), 75, 287, (191, 0), 1, null, null);
+            Add_Action (Table.States (142), 75, 287);
+            Add_Conflict (Table.States (142), 75, (191, 0), 1, null, null);
             Add_Action (Table.States (142), 77, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 79, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 83, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 87, Reduce, (191, 0), 1, null, 
null);
             Add_Action (Table.States (142), 96, Reduce, (191, 0), 1, null, 
null);
             Add_Error (Table.States (142));
-            Table.States (142).Minimal_Complete_Action := (Reduce, 191, 1);
-            Table.States (143).Productions := WisiToken.To_Vector (((287, 0), 
(287, 1), (287, 2), (287, 3)));
+            Table.States (142).Kernel := To_Vector (((191, 287, 0, True), 
(282, 287, 2, True), (283, 287, 3, True),
+            (284, 287, 2, True), (285, 287, 3, True), (286, 287, 2, True)));
+            Table.States (142).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 191, 1)));
+            Table.States (142).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (143), 10, Reduce, (287, 3), 1, null, 
null);
             Add_Action (Table.States (143), 20, Reduce, (287, 3), 1, null, 
null);
             Add_Action (Table.States (143), 21, Reduce, (287, 3), 1, null, 
null);
@@ -1645,8 +1690,9 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (143), 98, 295);
             Add_Error (Table.States (143));
             Add_Goto (Table.States (143), 288, 296);
-            Table.States (143).Minimal_Complete_Action := (Reduce, 287, 1);
-            Table.States (144).Productions := WisiToken.To_Vector (((320, 0), 
(321, 1)));
+            Table.States (143).Kernel := To_Vector (((287, 301, 3, False), 
(287, 301, 2, False), (287, 301, 2, False),
+            (287, 301, 0, False)));
+            Table.States (143).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 1)));
             Add_Action (Table.States (144), 10, Reduce, (321, 1), 1, null, 
null);
             Add_Action (Table.States (144), 20, Reduce, (321, 1), 1, null, 
null);
             Add_Action (Table.States (144), 21, Reduce, (321, 1), 1, null, 
null);
@@ -1684,8 +1730,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (144), 99, 300);
             Add_Error (Table.States (144));
             Add_Goto (Table.States (144), 237, 301);
-            Table.States (144).Minimal_Complete_Action := (Reduce, 321, 1);
-            Table.States (145).Productions := WisiToken.To_Vector (((301, 1), 
(321, 0)));
+            Table.States (144).Kernel := To_Vector (((320, 320, 2, True), 
(321, 320, 0, False)));
+            Table.States (144).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 321, 1)));
             Add_Action (Table.States (145), 10, Reduce, (301, 1), 1, null, 
null);
             Add_Action (Table.States (145), 20, Reduce, (301, 1), 1, null, 
null);
             Add_Action (Table.States (145), 21, Reduce, (301, 1), 1, null, 
null);
@@ -1719,8 +1765,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (145), 98, Reduce, (301, 1), 1, null, 
null);
             Add_Error (Table.States (145));
             Add_Goto (Table.States (145), 130, 305);
-            Table.States (145).Minimal_Complete_Action := (Reduce, 301, 1);
-            Table.States (146).Productions := WisiToken.To_Vector ((1 => (301, 
0)));
+            Table.States (145).Kernel := To_Vector (((301, 321, 0, False), 
(321, 321, 2, True)));
+            Table.States (145).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 301, 1)));
             Add_Action (Table.States (146), 3, 121);
             Add_Action (Table.States (146), 39, 122);
             Add_Action (Table.States (146), 40, 123);
@@ -1740,8 +1786,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (146), 293, 97);
             Add_Goto (Table.States (146), 320, 144);
             Add_Goto (Table.States (146), 321, 306);
-            Table.States (146).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (147).Productions := WisiToken.To_Vector ((1 => (161, 
0)));
+            Table.States (146).Kernel := To_Vector ((0 => (301, 330, 1, 
False)));
+            Table.States (146).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (147), 3, 121);
             Add_Action (Table.States (147), 39, 122);
             Add_Action (Table.States (147), 40, 123);
@@ -1776,61 +1822,63 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (147), 320, 144);
             Add_Goto (Table.States (147), 321, 145);
             Add_Goto (Table.States (147), 330, 146);
-            Table.States (147).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (148).Productions := WisiToken.To_Vector ((1 => (161, 
1)));
+            Table.States (147).Kernel := To_Vector ((0 => (161, 70, 1, 
False)));
+            Table.States (147).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (148), 96, 308);
             Add_Error (Table.States (148));
-            Table.States (148).Minimal_Complete_Action := (Shift, 96, 308);
-            Table.States (149).Productions := WisiToken.To_Vector ((1 => (220, 
0)));
+            Table.States (148).Kernel := To_Vector ((0 => (161, 192, 1, 
False)));
+            Table.States (148).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 308)));
             Add_Action (Table.States (149), (72, 96), (220, 0), 1, null, 
identifier_opt_0_check'Access);
-            Table.States (149).Minimal_Complete_Action := (Reduce, 220, 1);
-            Table.States (150).Productions := WisiToken.To_Vector (((190, 0), 
(190, 1)));
+            Table.States (149).Kernel := To_Vector ((0 => (220, 104, 0, 
False)));
+            Table.States (149).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 1)));
             Add_Action (Table.States (150), 72, 309);
             Add_Action (Table.States (150), 96, 310);
             Add_Error (Table.States (150));
-            Table.States (150).Minimal_Complete_Action := (Shift, 96, 310);
-            Table.States (151).Productions := WisiToken.To_Vector (((163, 0), 
(230, 0), (230, 1), (230, 2), (230, 3),
-            (230, 4), (230, 5), (239, 5)));
+            Table.States (150).Kernel := To_Vector (((190, 220, 2, False), 
(190, 220, 1, False)));
+            Table.States (150).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 310)));
             Add_Action (Table.States (151), 33, 311);
             Add_Action (Table.States (151), 42, 312);
-            Add_Action (Table.States (151), 71, Reduce, (163, 0), 1, null, 
null, (239, 5), 1, name_5'Access,
-            name_5_check'Access);
+            Add_Action (Table.States (151), 71, Reduce, (163, 0), 1, null, 
null);
+            Add_Conflict (Table.States (151), 71, (239, 5), 1, name_5'Access, 
name_5_check'Access);
             Add_Action (Table.States (151), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (151), 81, 313);
             Add_Action (Table.States (151), 84, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (151), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (151), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (151));
-            Table.States (151).Minimal_Complete_Action := (Reduce, 163, 1);
-            Table.States (152).Productions := WisiToken.To_Vector (((163, 1), 
(239, 7)));
-            Add_Action (Table.States (152), 71, Reduce, (163, 1), 1, null, 
null, (239, 7), 1, null,
-            name_7_check'Access);
+            Table.States (151).Kernel := To_Vector (((163, 104, 0, False), 
(230, 104, 5, False), (230, 104, 4, False),
+            (230, 104, 3, False), (230, 104, 3, False), (230, 104, 2, False), 
(230, 104, 2, False), (239, 104, 0,
+            False)));
+            Table.States (151).Minimal_Complete_Actions := To_Vector 
(((Reduce, 163, 1), (Reduce, 239, 1)));
+            Add_Action (Table.States (152), 71, Reduce, (163, 1), 1, null, 
null);
+            Add_Conflict (Table.States (152), 71, (239, 7), 1, null, 
name_7_check'Access);
             Add_Action (Table.States (152), 76, Reduce, (239, 7), 1, null, 
name_7_check'Access);
             Add_Action (Table.States (152), 84, Reduce, (239, 7), 1, null, 
name_7_check'Access);
             Add_Action (Table.States (152), 101, Reduce, (239, 7), 1, null, 
name_7_check'Access);
             Add_Action (Table.States (152), 102, Reduce, (239, 7), 1, null, 
name_7_check'Access);
             Add_Error (Table.States (152));
-            Table.States (152).Minimal_Complete_Action := (Reduce, 163, 1);
-            Table.States (153).Productions := WisiToken.To_Vector (((121, 0), 
(239, 3)));
-            Add_Action (Table.States (153), 71, 314, (239, 3), 1, null, null);
+            Table.States (152).Kernel := To_Vector (((163, 105, 0, False), 
(239, 105, 0, False)));
+            Table.States (152).Minimal_Complete_Actions := To_Vector 
(((Reduce, 163, 1), (Reduce, 239, 1)));
+            Add_Action (Table.States (153), 71, 314);
+            Add_Conflict (Table.States (153), 71, (239, 3), 1, null, null);
             Add_Action (Table.States (153), 76, Reduce, (239, 3), 1, null, 
null);
             Add_Action (Table.States (153), 84, Reduce, (239, 3), 1, null, 
null);
             Add_Action (Table.States (153), 101, Reduce, (239, 3), 1, null, 
null);
             Add_Action (Table.States (153), 102, Reduce, (239, 3), 1, null, 
null);
             Add_Error (Table.States (153));
-            Table.States (153).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (154).Productions := WisiToken.To_Vector ((1 => (127, 
0)));
+            Table.States (153).Kernel := To_Vector (((121, 128, 2, False), 
(239, 128, 0, True)));
+            Table.States (153).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
+            Table.States (153).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (154), 71, 315);
             Add_Error (Table.States (154));
-            Table.States (154).Minimal_Complete_Action := (Shift, 71, 315);
-            Table.States (155).Productions := WisiToken.To_Vector ((1 => (231, 
0)));
+            Table.States (154).Kernel := To_Vector ((0 => (127, 163, 3, 
False)));
+            Table.States (154).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 71, 315)));
             Add_Action (Table.States (155), (1 =>  37), (231, 0), 1, null, 
null);
-            Table.States (155).Minimal_Complete_Action := (Reduce, 231, 1);
-            Table.States (156).Productions := WisiToken.To_Vector ((1 => (229, 
1)));
+            Table.States (155).Kernel := To_Vector ((0 => (231, 230, 0, 
False)));
+            Table.States (155).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 231, 1)));
             Add_Action (Table.States (156), (1 =>  37), (229, 1), 2, 
iteration_scheme_1'Access, null);
-            Table.States (156).Minimal_Complete_Action := (Reduce, 229, 2);
-            Table.States (157).Productions := WisiToken.To_Vector (((128, 0), 
(182, 0), (239, 0), (239, 1), (272, 0),
-            (281, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (156).Kernel := To_Vector ((0 => (229, 231, 0, 
False)));
+            Table.States (156).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 229, 2)));
             Add_Action (Table.States (157), 71, 316);
             Add_Action (Table.States (157), 76, 235);
             Add_Action (Table.States (157), 84, 237);
@@ -1839,9 +1887,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (157));
             Add_Goto (Table.States (157), 115, 241);
             Add_Goto (Table.States (157), 322, 242);
-            Table.States (157).Minimal_Complete_Action := (Shift, 71, 316);
-            Table.States (158).Productions := WisiToken.To_Vector (((128, 0), 
(207, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (157).Kernel := To_Vector (((128, 239, 2, True), 
(182, 239, 4, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (281, 239, 13, False), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (157).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 71, 316)));
             Add_Action (Table.States (158), 58, 317);
             Add_Action (Table.States (158), 76, 318);
             Add_Action (Table.States (158), 84, 237);
@@ -1853,8 +1902,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (158), 252, 320);
             Add_Goto (Table.States (158), 291, 321);
             Add_Goto (Table.States (158), 322, 242);
-            Table.States (158).Minimal_Complete_Action := (Shift, 58, 317);
-            Table.States (159).Productions := WisiToken.To_Vector ((1 => (215, 
2)));
+            Table.States (158).Kernel := To_Vector (((128, 239, 2, True), 
(207, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (158).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 58, 317)));
             Add_Action (Table.States (159), 104, 119);
             Add_Action (Table.States (159), 105, 33);
             Add_Action (Table.States (159), 106, 34);
@@ -1863,8 +1914,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (159), 239, 322);
             Add_Goto (Table.States (159), 272, 92);
             Add_Goto (Table.States (159), 293, 97);
-            Table.States (159).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (160).Productions := WisiToken.To_Vector ((1 => (215, 
0)));
+            Table.States (159).Kernel := To_Vector ((0 => (215, 29, 4, 
False)));
+            Table.States (159).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (160), 104, 119);
             Add_Action (Table.States (160), 105, 33);
             Add_Action (Table.States (160), 106, 34);
@@ -1873,8 +1924,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (160), 239, 323);
             Add_Goto (Table.States (160), 272, 92);
             Add_Goto (Table.States (160), 293, 97);
-            Table.States (160).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (161).Productions := WisiToken.To_Vector ((1 => (215, 
1)));
+            Table.States (160).Kernel := To_Vector ((0 => (215, 47, 4, 
False)));
+            Table.States (160).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (161), 104, 119);
             Add_Action (Table.States (161), 105, 33);
             Add_Action (Table.States (161), 106, 34);
@@ -1883,12 +1934,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (161), 239, 324);
             Add_Goto (Table.States (161), 272, 92);
             Add_Goto (Table.States (161), 293, 97);
-            Table.States (161).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (162).Productions := WisiToken.To_Vector (((201, 0), 
(201, 1), (201, 2)));
+            Table.States (161).Kernel := To_Vector ((0 => (215, 50, 4, 
False)));
+            Table.States (161).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (162), 104, 325);
             Add_Error (Table.States (162));
-            Table.States (162).Minimal_Complete_Action := (Shift, 104, 325);
-            Table.States (163).Productions := WisiToken.To_Vector (((200, 0), 
(200, 1), (200, 2), (200, 3), (204, 0)));
+            Table.States (162).Kernel := To_Vector (((201, 69, 4, False), 
(201, 69, 4, False), (201, 69, 2, False)));
+            Table.States (162).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 325)));
             Add_Action (Table.States (163), 29, 7);
             Add_Action (Table.States (163), 47, 326);
             Add_Action (Table.States (163), 50, 18);
@@ -1896,23 +1947,24 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (163), 207, 61);
             Add_Goto (Table.States (163), 262, 87);
             Add_Goto (Table.States (163), 312, 327);
-            Table.States (163).Minimal_Complete_Action := (Shift, 50, 18);
-            Table.States (164).Productions := WisiToken.To_Vector ((1 => (219, 
1)));
-            Add_Action (Table.States (164), (81, 83), (219, 1), 1, null, null);
-            Table.States (164).Minimal_Complete_Action := (Reduce, 219, 1);
-            Table.States (165).Productions := WisiToken.To_Vector ((1 => (212, 
0)));
+            Table.States (163).Kernel := To_Vector (((200, 74, 6, False), 
(200, 74, 5, False), (200, 74, 5, False),
+            (200, 74, 3, False), (204, 74, 6, False)));
+            Table.States (163).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 50, 18)));
+            Add_Action (Table.States (164), (81, 83), (219, 1), 1, 
identifier_list_1'Access, null);
+            Table.States (164).Kernel := To_Vector ((0 => (219, 104, 0, 
False)));
+            Table.States (164).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 219, 1)));
             Add_Action (Table.States (165), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 0), 1, null, null);
-            Table.States (165).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (166).Productions := WisiToken.To_Vector ((1 => (212, 
2)));
+            Table.States (165).Kernel := To_Vector ((0 => (212, 198, 0, 
False)));
+            Table.States (165).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (166), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 2), 1, null, null);
-            Table.States (166).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (167).Productions := WisiToken.To_Vector ((1 => (212, 
1)));
+            Table.States (166).Kernel := To_Vector ((0 => (212, 200, 0, 
False)));
+            Table.States (166).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (167), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 1), 1, null, null);
-            Table.States (167).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (168).Productions := WisiToken.To_Vector ((1 => (212, 
3)));
+            Table.States (167).Kernel := To_Vector ((0 => (212, 201, 0, 
False)));
+            Table.States (167).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (168), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 3), 1, null, null);
-            Table.States (168).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (169).Productions := WisiToken.To_Vector (((210, 0), 
(211, 0)));
+            Table.States (168).Kernel := To_Vector ((0 => (212, 204, 0, 
False)));
+            Table.States (168).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (169), 29, Reduce, (210, 0), 2, 
generic_formal_part_0'Access, null);
             Add_Action (Table.States (169), 47, Reduce, (210, 0), 2, 
generic_formal_part_0'Access, null);
             Add_Action (Table.States (169), 48, 16);
@@ -1930,34 +1982,36 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (169), 219, 171);
             Add_Goto (Table.States (169), 257, 172);
             Add_Goto (Table.States (169), 331, 173);
-            Table.States (169).Minimal_Complete_Action := (Reduce, 210, 2);
-            Table.States (170).Productions := WisiToken.To_Vector ((1 => (211, 
1)));
+            Table.States (169).Kernel := To_Vector (((210, 211, 0, False), 
(211, 211, 3, True)));
+            Table.States (169).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 210, 2)));
             Add_Action (Table.States (170), (29, 47, 48, 50, 69, 71, 74, 104), 
(211, 1), 1, null, null);
-            Table.States (170).Minimal_Complete_Action := (Reduce, 211, 1);
-            Table.States (171).Productions := WisiToken.To_Vector (((198, 0), 
(198, 1), (198, 2), (198, 3), (219, 0)));
+            Table.States (170).Kernel := To_Vector ((0 => (211, 212, 0, 
False)));
+            Table.States (170).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 211, 1)));
             Add_Action (Table.States (171), 81, 329);
             Add_Action (Table.States (171), 83, 234);
             Add_Error (Table.States (171));
-            Table.States (171).Minimal_Complete_Action := (Shift, 81, 329);
-            Table.States (172).Productions := WisiToken.To_Vector ((1 => (212, 
4)));
+            Table.States (171).Kernel := To_Vector (((198, 219, 4, False), 
(198, 219, 5, False), (198, 219, 3, False),
+            (198, 219, 4, False), (219, 219, 2, True)));
+            Table.States (171).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 81, 329)));
             Add_Action (Table.States (172), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 4), 1, null, null);
-            Table.States (172).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (173).Productions := WisiToken.To_Vector ((1 => (212, 
5)));
+            Table.States (172).Kernel := To_Vector ((0 => (212, 257, 0, 
False)));
+            Table.States (172).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (173), (29, 47, 48, 50, 69, 71, 74, 104), 
(212, 5), 1, null, null);
-            Table.States (173).Minimal_Complete_Action := (Reduce, 212, 1);
-            Table.States (174).Productions := WisiToken.To_Vector ((1 => (303, 
3)));
+            Table.States (173).Kernel := To_Vector ((0 => (212, 331, 0, 
False)));
+            Table.States (173).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 212, 1)));
             Add_Action (Table.States (174), 96, 330);
             Add_Error (Table.States (174));
-            Table.States (174).Minimal_Complete_Action := (Shift, 96, 330);
-            Table.States (175).Productions := WisiToken.To_Vector (((222, 0), 
(222, 1), (222, 2), (222, 3)));
+            Table.States (174).Kernel := To_Vector ((0 => (303, 104, 1, 
False)));
+            Table.States (174).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 330)));
             Add_Action (Table.States (175), 68, 331);
             Add_Error (Table.States (175));
-            Table.States (175).Minimal_Complete_Action := (Shift, 68, 331);
-            Table.States (176).Productions := WisiToken.To_Vector ((1 => (332, 
0)));
+            Table.States (175).Kernel := To_Vector (((222, 192, 7, False), 
(222, 192, 5, False), (222, 192, 6, False),
+            (222, 192, 4, False)));
+            Table.States (175).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 331)));
             Add_Action (Table.States (176), 74, 332);
             Add_Error (Table.States (176));
-            Table.States (176).Minimal_Complete_Action := (Shift, 74, 332);
-            Table.States (177).Productions := WisiToken.To_Vector ((1 => (332, 
1)));
+            Table.States (176).Kernel := To_Vector ((0 => (332, 49, 3, 
False)));
+            Table.States (176).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 332)));
             Add_Action (Table.States (177), 104, 119);
             Add_Action (Table.States (177), 105, 33);
             Add_Action (Table.States (177), 106, 34);
@@ -1967,16 +2021,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (177), 239, 219);
             Add_Goto (Table.States (177), 272, 92);
             Add_Goto (Table.States (177), 293, 97);
-            Table.States (177).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (178).Productions := WisiToken.To_Vector ((1 => (246, 
0)));
+            Table.States (177).Kernel := To_Vector ((0 => (332, 74, 2, 
False)));
+            Table.States (177).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (178), (25, 29, 50), (246, 0), 2, 
overriding_indicator_opt_0'Access, null);
-            Table.States (178).Minimal_Complete_Action := (Reduce, 246, 2);
-            Table.States (179).Productions := WisiToken.To_Vector ((1 => (303, 
0)));
+            Table.States (178).Kernel := To_Vector ((0 => (246, 46, 0, 
False)));
+            Table.States (178).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 246, 2)));
             Add_Action (Table.States (179), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 0), 2, simple_statement_0'Access, null);
-            Table.States (179).Minimal_Complete_Action := (Reduce, 303, 2);
-            Table.States (180).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1), (248, 0)));
+            Table.States (179).Kernel := To_Vector ((0 => (303, 96, 0, 
False)));
+            Table.States (179).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 2)));
             Add_Action (Table.States (180), 104, 119);
             Add_Action (Table.States (180), 105, 33);
             Add_Action (Table.States (180), 106, 34);
@@ -1985,10 +2039,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (180), 239, 334);
             Add_Goto (Table.States (180), 272, 92);
             Add_Goto (Table.States (180), 293, 97);
-            Table.States (180).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (181).Productions := WisiToken.To_Vector (((128, 0), 
(213, 0), (239, 0), (239, 1), (250, 0),
-            (251, 0), (251, 1), (272, 0), (293, 0), (293, 1), (293, 2), (293, 
3)));
-            Add_Action (Table.States (181), 35, 335, (122, 1), 0, null, null);
+            Table.States (180).Kernel := To_Vector (((247, 14, 5, False), 
(247, 14, 4, False), (248, 14, 4, False)));
+            Table.States (180).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Add_Action (Table.States (181), 35, 335);
+            Add_Conflict (Table.States (181), 35, (122, 1), 0, null, null);
             Add_Action (Table.States (181), 56, 336);
             Add_Action (Table.States (181), 74, 337);
             Add_Action (Table.States (181), 76, 235);
@@ -1999,13 +2053,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (181), 115, 241);
             Add_Goto (Table.States (181), 122, 338);
             Add_Goto (Table.States (181), 322, 242);
-            Table.States (181).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (182).Productions := WisiToken.To_Vector (((257, 0), 
(257, 1), (257, 2)));
+            Table.States (181).Kernel := To_Vector (((128, 239, 2, True), 
(213, 239, 4, False), (239, 239, 5, True),
+            (239, 239, 2, True), (250, 239, 3, False), (251, 239, 3, False), 
(251, 239, 2, False), (272, 239, 3, True),
+            (293, 239, 2, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True)));
+            Table.States (181).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (182), 76, 339);
             Add_Action (Table.States (182), 96, 340);
             Add_Error (Table.States (182));
-            Table.States (182).Minimal_Complete_Action := (Shift, 96, 340);
-            Table.States (183).Productions := WisiToken.To_Vector (((121, 0), 
(127, 0), (182, 0), (281, 0)));
+            Table.States (182).Kernel := To_Vector (((257, 104, 3, False), 
(257, 104, 5, False), (257, 104, 1,
+            False)));
+            Table.States (182).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 340)));
             Add_Action (Table.States (183), 104, 341);
             Add_Action (Table.States (183), 105, 152);
             Add_Action (Table.States (183), 106, 34);
@@ -2015,8 +2072,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (183), 239, 157);
             Add_Goto (Table.States (183), 272, 92);
             Add_Goto (Table.States (183), 293, 97);
-            Table.States (183).Minimal_Complete_Action := (Shift, 104, 341);
-            Table.States (184).Productions := WisiToken.To_Vector ((1 => (332, 
2)));
+            Table.States (183).Kernel := To_Vector (((121, 28, 5, False), 
(127, 28, 4, False), (182, 28, 5, False),
+            (281, 28, 14, False)));
+            Table.States (183).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 341)));
             Add_Action (Table.States (184), 104, 119);
             Add_Action (Table.States (184), 105, 33);
             Add_Action (Table.States (184), 106, 34);
@@ -2026,19 +2084,20 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (184), 239, 219);
             Add_Goto (Table.States (184), 272, 92);
             Add_Goto (Table.States (184), 293, 97);
-            Table.States (184).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (185).Productions := WisiToken.To_Vector (((219, 1), 
(245, 0), (245, 1), (245, 2)));
-            Add_Action (Table.States (185), 81, 343, (219, 1), 1, null, null);
-            Add_Action (Table.States (185), 83, Reduce, (219, 1), 1, null, 
null);
+            Table.States (184).Kernel := To_Vector ((0 => (332, 74, 2, 
False)));
+            Table.States (184).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Add_Action (Table.States (185), 81, 343);
+            Add_Conflict (Table.States (185), 81, (219, 1), 1, 
identifier_list_1'Access, null);
+            Add_Action (Table.States (185), 83, Reduce, (219, 1), 1, 
identifier_list_1'Access, null);
             Add_Error (Table.States (185));
-            Table.States (185).Minimal_Complete_Action := (Reduce, 219, 1);
-            Table.States (186).Productions := WisiToken.To_Vector ((1 => (142, 
2)));
+            Table.States (185).Kernel := To_Vector (((219, 104, 0, False), 
(245, 104, 5, False), (245, 104, 6, False),
+            (245, 104, 5, False)));
+            Table.States (185).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 219, 1)));
             Add_Action (Table.States (186), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (142, 2), 2,
             compilation_unit_2'Access, null);
-            Table.States (186).Minimal_Complete_Action := (Reduce, 142, 2);
-            Table.States (187).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (262, 0), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (186).Kernel := To_Vector ((0 => (142, 157, 0, 
False)));
+            Table.States (186).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 142, 2)));
             Add_Action (Table.States (187), 35, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (187), 74, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (187), 76, 318);
@@ -2051,28 +2110,29 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (187), 199, 344);
             Add_Goto (Table.States (187), 253, 345);
             Add_Goto (Table.States (187), 322, 242);
-            Table.States (187).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (188).Productions := WisiToken.To_Vector (((264, 0), 
(265, 0)));
+            Table.States (187).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (262, 239, 0, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (187).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (188), 104, 346);
             Add_Error (Table.States (188));
-            Table.States (188).Minimal_Complete_Action := (Shift, 104, 346);
-            Table.States (189).Productions := WisiToken.To_Vector (((271, 0), 
(271, 1)));
+            Table.States (188).Kernel := To_Vector (((264, 14, 4, False), 
(265, 14, 4, False)));
+            Table.States (188).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 346)));
             Add_Action (Table.States (189), 104, 347);
             Add_Error (Table.States (189));
-            Table.States (189).Minimal_Complete_Action := (Shift, 104, 347);
-            Table.States (190).Productions := WisiToken.To_Vector (((304, 0), 
(304, 1)));
+            Table.States (189).Kernel := To_Vector (((271, 69, 7, False), 
(271, 69, 4, False)));
+            Table.States (189).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 347)));
             Add_Action (Table.States (190), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (190), 74, 337);
             Add_Error (Table.States (190));
             Add_Goto (Table.States (190), 122, 348);
-            Table.States (190).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (191).Productions := WisiToken.To_Vector ((1 => (276, 
2)));
+            Table.States (190).Kernel := To_Vector (((304, 104, 6, False), 
(304, 104, 3, False)));
+            Table.States (190).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (191), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (276, 2), 2, raise_statement_2'Access, null);
-            Table.States (191).Minimal_Complete_Action := (Reduce, 276, 2);
-            Table.States (192).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (276, 0),
-            (276, 1), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (191).Kernel := To_Vector ((0 => (276, 96, 0, 
False)));
+            Table.States (191).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 276, 2)));
             Add_Action (Table.States (192), 74, 349);
             Add_Action (Table.States (192), 76, 235);
             Add_Action (Table.States (192), 84, 237);
@@ -2082,9 +2142,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (192));
             Add_Goto (Table.States (192), 115, 241);
             Add_Goto (Table.States (192), 322, 242);
-            Table.States (192).Minimal_Complete_Action := (Shift, 96, 350);
-            Table.States (193).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (290, 0),
-            (290, 1), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (192).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (276, 239, 2, False), (276, 239, 1, False), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (192).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 350)));
             Add_Action (Table.States (193), 74, 351);
             Add_Action (Table.States (193), 76, 235);
             Add_Action (Table.States (193), 84, 237);
@@ -2094,8 +2155,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (193));
             Add_Goto (Table.States (193), 115, 241);
             Add_Goto (Table.States (193), 322, 242);
-            Table.States (193).Minimal_Complete_Action := (Shift, 96, 352);
-            Table.States (194).Productions := WisiToken.To_Vector (((194, 0), 
(194, 1), (239, 5)));
+            Table.States (193).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (290, 239, 3, False), (290, 239, 1, False), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (193).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 352)));
             Add_Action (Table.States (194), 10, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (194), 33, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (194), 38, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
@@ -2122,21 +2185,22 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (194), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (194), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (194));
-            Table.States (194).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (195).Productions := WisiToken.To_Vector ((1 => (302, 
0)));
+            Table.States (194).Kernel := To_Vector (((194, 104, 3, False), 
(194, 104, 2, False), (239, 104, 0,
+            False)));
+            Table.States (194).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (195), 96, 354);
             Add_Error (Table.States (195));
-            Table.States (195).Minimal_Complete_Action := (Shift, 96, 354);
-            Table.States (196).Productions := WisiToken.To_Vector (((195, 0), 
(196, 1)));
+            Table.States (195).Kernel := To_Vector ((0 => (302, 192, 1, 
False)));
+            Table.States (195).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 354)));
             Add_Action (Table.States (196), 21, Reduce, (195, 0), 1, null, 
null);
             Add_Action (Table.States (196), 96, 355);
             Add_Error (Table.States (196));
-            Table.States (196).Minimal_Complete_Action := (Reduce, 195, 1);
-            Table.States (197).Productions := WisiToken.To_Vector ((1 => (196, 
0)));
+            Table.States (196).Kernel := To_Vector (((195, 194, 0, False), 
(196, 194, 1, False)));
+            Table.States (196).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 195, 1)));
             Add_Action (Table.States (197), 21, 356);
             Add_Error (Table.States (197));
-            Table.States (197).Minimal_Complete_Action := (Shift, 21, 356);
-            Table.States (198).Productions := WisiToken.To_Vector ((1 => (315, 
0)));
+            Table.States (197).Kernel := To_Vector ((0 => (196, 195, 4, 
False)));
+            Table.States (197).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 356)));
             Add_Action (Table.States (198), 104, 119);
             Add_Action (Table.States (198), 105, 33);
             Add_Action (Table.States (198), 106, 34);
@@ -2145,12 +2209,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (198), 239, 357);
             Add_Goto (Table.States (198), 272, 92);
             Add_Goto (Table.States (198), 293, 97);
-            Table.States (198).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (199).Productions := WisiToken.To_Vector ((1 => (295, 
4)));
+            Table.States (198).Kernel := To_Vector ((0 => (315, 76, 8, 
False)));
+            Table.States (198).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (199), 96, 358);
             Add_Error (Table.States (199));
-            Table.States (199).Minimal_Complete_Action := (Shift, 96, 358);
-            Table.States (200).Productions := WisiToken.To_Vector (((295, 0), 
(295, 1), (295, 2)));
+            Table.States (199).Kernel := To_Vector ((0 => (295, 67, 1, 
False)));
+            Table.States (199).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 358)));
             Add_Action (Table.States (200), 3, 121);
             Add_Action (Table.States (200), 39, 122);
             Add_Action (Table.States (200), 40, 123);
@@ -2185,8 +2249,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (200), 320, 144);
             Add_Goto (Table.States (200), 321, 145);
             Add_Goto (Table.States (200), 330, 146);
-            Table.States (200).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (201).Productions := WisiToken.To_Vector ((1 => (295, 
3)));
+            Table.States (200).Kernel := To_Vector (((295, 72, 4, False), 
(295, 72, 3, False), (295, 72, 3, False)));
+            Table.States (200).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
+         end Subr_3;
+         procedure Subr_4
+         is begin
             Add_Action (Table.States (201), 4, 1);
             Add_Action (Table.States (201), 5, 2);
             Add_Action (Table.States (201), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2244,14 +2311,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (201), 303, 101);
             Add_Goto (Table.States (201), 306, 363);
             Add_Goto (Table.States (201), 323, 114);
-            Table.States (201).Minimal_Complete_Action := (Reduce, 300, 0);
-         end Subr_3;
-         procedure Subr_4
-         is begin
-            Table.States (202).Productions := WisiToken.To_Vector ((1 => (295, 
5)));
+            Table.States (201).Kernel := To_Vector ((0 => (295, 113, 0, 
False)));
+            Table.States (201).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (202), (22, 24, 43), (295, 5), 1, null, 
null);
-            Table.States (202).Minimal_Complete_Action := (Reduce, 295, 1);
-            Table.States (203).Productions := WisiToken.To_Vector (((160, 0), 
(324, 2)));
+            Table.States (202).Kernel := To_Vector ((0 => (295, 160, 0, 
False)));
+            Table.States (202).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 1)));
             Add_Action (Table.States (203), 4, 1);
             Add_Action (Table.States (203), 5, 2);
             Add_Action (Table.States (203), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2310,14 +2374,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (203), 303, 101);
             Add_Goto (Table.States (203), 306, 363);
             Add_Goto (Table.States (203), 323, 114);
-            Table.States (203).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (204).Productions := WisiToken.To_Vector (((152, 0), 
(323, 0)));
+            Table.States (203).Kernel := To_Vector (((160, 161, 0, False), 
(324, 161, 0, False)));
+            Table.States (203).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (204), 22, 365);
             Add_Action (Table.States (204), 43, 366);
             Add_Error (Table.States (204));
-            Table.States (204).Minimal_Complete_Action := (Shift, 22, 365);
-            Table.States (205).Productions := WisiToken.To_Vector (((128, 0), 
(178, 1), (239, 0), (239, 1), (261, 0),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3), (324, 1)));
+            Table.States (204).Kernel := To_Vector (((152, 178, 4, False), 
(323, 178, 6, False)));
+            Table.States (204).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 22, 365)));
             Add_Action (Table.States (205), 4, 1);
             Add_Action (Table.States (205), 5, 2);
             Add_Action (Table.States (205), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2382,8 +2445,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (205), 306, 363);
             Add_Goto (Table.States (205), 322, 242);
             Add_Goto (Table.States (205), 323, 114);
-            Table.States (205).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (206).Productions := WisiToken.To_Vector (((178, 0), 
(324, 0)));
+            Table.States (205).Kernel := To_Vector (((128, 239, 2, True), 
(178, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (261, 239, 1, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True), (324, 239, 0, False)));
+            Table.States (205).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (206), 4, 1);
             Add_Action (Table.States (206), 5, 2);
             Add_Action (Table.States (206), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2441,56 +2506,58 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (206), 303, 101);
             Add_Goto (Table.States (206), 306, 363);
             Add_Goto (Table.States (206), 323, 114);
-            Table.States (206).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (207).Productions := WisiToken.To_Vector ((1 => (296, 
1)));
+            Table.States (206).Kernel := To_Vector (((178, 261, 0, False), 
(324, 261, 0, False)));
+            Table.States (206).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (207), (22, 24, 43), (296, 1), 1, 
select_alternative_list_1'Access, null);
-            Table.States (207).Minimal_Complete_Action := (Reduce, 296, 1);
-            Table.States (208).Productions := WisiToken.To_Vector (((296, 0), 
(297, 0)));
+            Table.States (207).Kernel := To_Vector ((0 => (296, 295, 0, 
False)));
+            Table.States (207).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 296, 1)));
             Add_Action (Table.States (208), 22, Reduce, (297, 0), 1, null, 
null);
             Add_Action (Table.States (208), 24, Reduce, (297, 0), 1, null, 
null);
             Add_Action (Table.States (208), 43, 369);
             Add_Error (Table.States (208));
-            Table.States (208).Minimal_Complete_Action := (Reduce, 297, 1);
-            Table.States (209).Productions := WisiToken.To_Vector (((294, 0), 
(294, 1)));
+            Table.States (208).Kernel := To_Vector (((296, 296, 3, True), 
(297, 296, 0, False)));
+            Table.States (208).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 297, 1)));
             Add_Action (Table.States (209), 22, 370);
             Add_Action (Table.States (209), 24, 371);
             Add_Error (Table.States (209));
-            Table.States (209).Minimal_Complete_Action := (Shift, 24, 371);
-            Table.States (210).Productions := WisiToken.To_Vector ((1 => (126, 
0)));
+            Table.States (209).Kernel := To_Vector (((294, 297, 4, False), 
(294, 297, 3, False)));
+            Table.States (209).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 371)));
             Add_Action (Table.States (210), 68, 372);
             Add_Error (Table.States (210));
-            Table.States (210).Minimal_Complete_Action := (Shift, 68, 372);
-            Table.States (211).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (210).Kernel := To_Vector ((0 => (126, 324, 5, 
False)));
+            Table.States (210).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 372)));
             Add_Action (Table.States (211), 35, 373);
             Add_Error (Table.States (211));
-            Table.States (211).Minimal_Complete_Action := (Shift, 35, 373);
-            Table.States (212).Productions := WisiToken.To_Vector (((316, 0), 
(317, 0)));
+            Table.States (211).Kernel := To_Vector ((0 => (313, 104, 3, 
False)));
+            Table.States (211).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 373)));
             Add_Action (Table.States (212), 104, 374);
             Add_Error (Table.States (212));
-            Table.States (212).Minimal_Complete_Action := (Shift, 104, 374);
-            Table.States (213).Productions := WisiToken.To_Vector (((319, 0), 
(319, 1), (319, 2)));
+            Table.States (212).Kernel := To_Vector (((316, 14, 5, False), 
(317, 14, 4, False)));
+            Table.States (212).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 374)));
             Add_Action (Table.States (213), 104, 375);
             Add_Error (Table.States (213));
-            Table.States (213).Minimal_Complete_Action := (Shift, 104, 375);
-            Table.States (214).Productions := WisiToken.To_Vector (((305, 0), 
(305, 1), (305, 2)));
+            Table.States (213).Kernel := To_Vector (((319, 69, 7, False), 
(319, 69, 4, False), (319, 69, 2, False)));
+            Table.States (213).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 375)));
             Add_Action (Table.States (214), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (214), 74, 337);
             Add_Action (Table.States (214), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (214));
             Add_Goto (Table.States (214), 122, 376);
-            Table.States (214).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (215).Productions := WisiToken.To_Vector (((206, 0), 
(223, 0), (223, 1), (259, 0), (260, 0)));
+            Table.States (214).Kernel := To_Vector (((305, 104, 6, False), 
(305, 104, 3, False), (305, 104, 1,
+            False)));
+            Table.States (214).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (215), 35, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (215), 76, 377);
             Add_Action (Table.States (215), 96, Reduce, (169, 2), 0, null, 
null);
             Add_Error (Table.States (215));
             Add_Goto (Table.States (215), 169, 378);
-            Table.States (215).Minimal_Complete_Action := (Reduce, 169, 0);
-            Table.States (216).Productions := WisiToken.To_Vector ((1 => (331, 
0)));
+            Table.States (215).Kernel := To_Vector (((206, 104, 3, False), 
(223, 104, 3, False), (223, 104, 1, False),
+            (259, 104, 6, False), (260, 104, 3, False)));
+            Table.States (215).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 0)));
             Add_Action (Table.States (216), 69, 379);
             Add_Error (Table.States (216));
-            Table.States (216).Minimal_Complete_Action := (Shift, 69, 379);
-            Table.States (217).Productions := WisiToken.To_Vector ((1 => (331, 
1)));
+            Table.States (216).Kernel := To_Vector ((0 => (331, 9, 3, False)));
+            Table.States (216).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 69, 379)));
             Add_Action (Table.States (217), 104, 119);
             Add_Action (Table.States (217), 105, 33);
             Add_Action (Table.States (217), 106, 34);
@@ -2500,14 +2567,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (217), 239, 219);
             Add_Goto (Table.States (217), 272, 92);
             Add_Goto (Table.States (217), 293, 97);
-            Table.States (217).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (218).Productions := WisiToken.To_Vector (((238, 0), 
(331, 2)));
+            Table.States (217).Kernel := To_Vector ((0 => (331, 69, 2, 
False)));
+            Table.States (217).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (218), 83, 381);
             Add_Action (Table.States (218), 96, 382);
             Add_Error (Table.States (218));
-            Table.States (218).Minimal_Complete_Action := (Shift, 96, 382);
-            Table.States (219).Productions := WisiToken.To_Vector (((128, 0), 
(238, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (218).Kernel := To_Vector (((238, 238, 2, True), 
(331, 238, 1, False)));
+            Table.States (218).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 382)));
             Add_Action (Table.States (219), 76, 235);
             Add_Action (Table.States (219), 83, Reduce, (238, 1), 1, null, 
null);
             Add_Action (Table.States (219), 84, 237);
@@ -2517,20 +2583,22 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (219));
             Add_Goto (Table.States (219), 115, 241);
             Add_Goto (Table.States (219), 322, 242);
-            Table.States (219).Minimal_Complete_Action := (Reduce, 238, 1);
-            Table.States (220).Productions := WisiToken.To_Vector ((1 => (229, 
0)));
+            Table.States (219).Kernel := To_Vector (((128, 239, 2, True), 
(238, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (219).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 238, 1)));
             Add_Action (Table.States (220), (1 =>  37), (229, 0), 2, 
iteration_scheme_0'Access, null);
-            Table.States (220).Minimal_Complete_Action := (Reduce, 229, 2);
-            Table.States (221).Productions := WisiToken.To_Vector (((238, 0), 
(332, 3)));
+            Table.States (220).Kernel := To_Vector ((0 => (229, 192, 0, 
False)));
+            Table.States (220).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 229, 2)));
             Add_Action (Table.States (221), 83, 381);
             Add_Action (Table.States (221), 96, 383);
             Add_Error (Table.States (221));
-            Table.States (221).Minimal_Complete_Action := (Shift, 96, 383);
-            Table.States (222).Productions := WisiToken.To_Vector ((1 => (217, 
0)));
+            Table.States (221).Kernel := To_Vector (((238, 238, 2, True), 
(332, 238, 1, False)));
+            Table.States (221).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 383)));
             Add_Action (Table.States (222), 90, 384);
             Add_Error (Table.States (222));
-            Table.States (222).Minimal_Complete_Action := (Shift, 90, 384);
-            Table.States (223).Productions := WisiToken.To_Vector (((131, 0), 
(245, 0), (245, 1), (245, 2)));
+            Table.States (222).Kernel := To_Vector ((0 => (217, 104, 1, 
False)));
+            Table.States (222).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 90, 384)));
             Add_Action (Table.States (223), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (223), 13, Reduce, (131, 0), 2, 
block_label_0'Access, block_label_0_check'Access);
             Add_Action (Table.States (223), 17, Reduce, (131, 0), 2, 
block_label_0'Access, block_label_0_check'Access);
@@ -2545,8 +2613,9 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (223));
             Add_Goto (Table.States (223), 114, 387);
             Add_Goto (Table.States (223), 241, 388);
-            Table.States (223).Minimal_Complete_Action := (Reduce, 131, 2);
-            Table.States (224).Productions := WisiToken.To_Vector ((1 => (133, 
1)));
+            Table.States (223).Kernel := To_Vector (((131, 81, 0, False), 
(245, 81, 4, False), (245, 81, 5, False),
+            (245, 81, 4, False)));
+            Table.States (223).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 131, 2)));
             Add_Action (Table.States (224), 4, 1);
             Add_Action (Table.States (224), 5, 2);
             Add_Action (Table.States (224), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2604,8 +2673,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (224), 303, 101);
             Add_Goto (Table.States (224), 306, 363);
             Add_Goto (Table.States (224), 323, 114);
-            Table.States (224).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (225).Productions := WisiToken.To_Vector ((1 => (133, 
0)));
+            Table.States (224).Kernel := To_Vector ((0 => (133, 13, 2, 
False)));
+            Table.States (224).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (225), 13, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (225), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (225), 28, 183);
@@ -2676,15 +2745,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (225), 319, 113);
             Add_Goto (Table.States (225), 325, 115);
             Add_Goto (Table.States (225), 331, 116);
-            Table.States (225).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (226).Productions := WisiToken.To_Vector ((1 => (229, 
1)));
+            Table.States (225).Kernel := To_Vector ((0 => (133, 17, 3, 
False)));
+            Table.States (225).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (226), 37, Reduce, (231, 1), 0, null, 
null);
             Add_Action (Table.States (226), 104, 395);
             Add_Error (Table.States (226));
             Add_Goto (Table.States (226), 230, 155);
             Add_Goto (Table.States (226), 231, 156);
-            Table.States (226).Minimal_Complete_Action := (Reduce, 231, 0);
-            Table.States (227).Productions := WisiToken.To_Vector ((1 => (232, 
1)));
+            Table.States (226).Kernel := To_Vector ((0 => (229, 28, 0, 
False)));
+            Table.States (226).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 231, 0)));
             Add_Action (Table.States (227), 4, 1);
             Add_Action (Table.States (227), 5, 2);
             Add_Action (Table.States (227), 13, Reduce, (132, 1), 0, null, 
null);
@@ -2740,17 +2809,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (227), 303, 101);
             Add_Goto (Table.States (227), 306, 363);
             Add_Goto (Table.States (227), 323, 114);
-            Table.States (227).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (228).Productions := WisiToken.To_Vector ((1 => (232, 
0)));
+            Table.States (227).Kernel := To_Vector ((0 => (232, 37, 3, 
False)));
+            Table.States (227).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (228), 37, 397);
             Add_Error (Table.States (228));
-            Table.States (228).Minimal_Complete_Action := (Shift, 37, 397);
-            Table.States (229).Productions := WisiToken.To_Vector ((1 => (143, 
0)));
+            Table.States (228).Kernel := To_Vector ((0 => (232, 229, 4, 
False)));
+            Table.States (228).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 397)));
             Add_Action (Table.States (229), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (143, 0), 2,
             compilation_unit_list_0'Access, null);
-            Table.States (229).Minimal_Complete_Action := (Reduce, 143, 2);
-            Table.States (230).Productions := WisiToken.To_Vector (((251, 0), 
(251, 1)));
+            Table.States (229).Kernel := To_Vector ((0 => (143, 142, 0, 
True)));
+            Table.States (229).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 143, 2)));
+            Table.States (229).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (230), 104, 119);
             Add_Action (Table.States (230), 105, 33);
             Add_Action (Table.States (230), 106, 34);
@@ -2759,23 +2829,23 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (230), 239, 398);
             Add_Goto (Table.States (230), 272, 92);
             Add_Goto (Table.States (230), 293, 97);
-            Table.States (230).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (231).Productions := WisiToken.To_Vector ((1 => (214, 
0)));
+            Table.States (230).Kernel := To_Vector (((251, 47, 4, False), 
(251, 47, 3, False)));
+            Table.States (230).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (231), 96, 399);
             Add_Error (Table.States (231));
-            Table.States (231).Minimal_Complete_Action := (Shift, 96, 399);
-            Table.States (232).Productions := WisiToken.To_Vector ((1 => (216, 
0)));
+            Table.States (231).Kernel := To_Vector ((0 => (214, 251, 1, 
False)));
+            Table.States (231).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 399)));
             Add_Action (Table.States (232), 74, 337);
             Add_Action (Table.States (232), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (232));
             Add_Goto (Table.States (232), 122, 400);
-            Table.States (232).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (233).Productions := WisiToken.To_Vector (((157, 9), 
(186, 0), (244, 0), (244, 1), (244, 2),
-            (244, 3), (244, 4), (244, 5)));
+            Table.States (232).Kernel := To_Vector ((0 => (216, 312, 1, 
False)));
+            Table.States (232).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (233), 7, Reduce, (118, 1), 0, null, 
null);
             Add_Action (Table.States (233), 8, 401);
             Add_Action (Table.States (233), 11, Reduce, (118, 1), 0, null, 
null);
-            Add_Action (Table.States (233), 16, 402, (118, 1), 0, null, null);
+            Add_Action (Table.States (233), 16, 402);
+            Add_Conflict (Table.States (233), 16, (118, 1), 0, null, null);
             Add_Action (Table.States (233), 26, 403);
             Add_Action (Table.States (233), 40, Reduce, (118, 1), 0, null, 
null);
             Add_Action (Table.States (233), 74, Reduce, (118, 1), 0, null, 
null);
@@ -2786,12 +2856,14 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (233), 106, Reduce, (118, 1), 0, null, 
null);
             Add_Error (Table.States (233));
             Add_Goto (Table.States (233), 118, 404);
-            Table.States (233).Minimal_Complete_Action := (Shift, 26, 403);
-            Table.States (234).Productions := WisiToken.To_Vector ((1 => (219, 
0)));
+            Table.States (233).Kernel := To_Vector (((157, 81, 3, False), 
(186, 81, 2, False), (244, 81, 3, False),
+            (244, 81, 4, False), (244, 81, 10, False), (244, 81, 2, False), 
(244, 81, 3, False), (244, 81, 9, False)));
+            Table.States (233).Minimal_Complete_Actions := To_Vector (((Shift, 
26, 403), (Reduce, 118, 0)));
             Add_Action (Table.States (234), 104, 405);
             Add_Error (Table.States (234));
-            Table.States (234).Minimal_Complete_Action := (Shift, 104, 405);
-            Table.States (235).Productions := WisiToken.To_Vector (((115, 0), 
(115, 1), (239, 0)));
+            Table.States (234).Kernel := To_Vector ((0 => (219, 83, 1, True)));
+            Table.States (234).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 405)));
+            Table.States (234).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (235), 3, 121);
             Add_Action (Table.States (235), 15, 258);
             Add_Action (Table.States (235), 28, 259);
@@ -2842,8 +2914,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (235), 320, 144);
             Add_Goto (Table.States (235), 321, 145);
             Add_Goto (Table.States (235), 330, 146);
-            Table.States (235).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (236).Productions := WisiToken.To_Vector ((1 => (123, 
0)));
+            Table.States (235).Kernel := To_Vector (((115, 76, 1, False), 
(115, 76, 3, False), (239, 76, 4, True)));
+            Table.States (235).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
+            Table.States (235).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (236), 3, 121);
             Add_Action (Table.States (236), 39, 122);
             Add_Action (Table.States (236), 40, 123);
@@ -2878,32 +2951,39 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (236), 320, 144);
             Add_Goto (Table.States (236), 321, 145);
             Add_Goto (Table.States (236), 330, 146);
-            Table.States (236).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (237).Productions := WisiToken.To_Vector (((293, 0), 
(293, 1), (293, 2), (293, 3)));
+            Table.States (236).Kernel := To_Vector ((0 => (123, 82, 1, 
False)));
+            Table.States (236).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
+         end Subr_4;
+         procedure Subr_5
+         is begin
             Add_Action (Table.States (237), 9, 412);
             Add_Action (Table.States (237), 104, 413);
             Add_Action (Table.States (237), 105, 414);
             Add_Action (Table.States (237), 106, 415);
             Add_Error (Table.States (237));
-            Table.States (237).Minimal_Complete_Action := (Shift, 104, 413);
-            Table.States (238).Productions := WisiToken.To_Vector ((1 => (261, 
0)));
+            Table.States (237).Kernel := To_Vector (((293, 84, 1, True), (293, 
84, 1, True), (293, 84, 1, True), (293,
+            84, 1, True)));
+            Table.States (237).Minimal_Complete_Actions := To_Vector (((Shift, 
104, 413), (Shift, 106, 415), (Shift,
+            105, 414), (Shift, 9, 412)));
+            Table.States (237).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (238), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (261, 0), 2, procedure_call_statement_0'Access, null);
-            Table.States (238).Minimal_Complete_Action := (Reduce, 261, 2);
-            Table.States (239).Productions := WisiToken.To_Vector ((1 => (322, 
0)));
+            Table.States (238).Kernel := To_Vector ((0 => (261, 96, 0, 
False)));
+            Table.States (238).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 261, 2)));
             Add_Action (Table.States (239), (7, 19, 20, 38, 53, 76, 104, 105, 
106), (322, 0), 1, null, null);
-            Table.States (239).Minimal_Complete_Action := (Reduce, 322, 1);
-            Table.States (240).Productions := WisiToken.To_Vector ((1 => (322, 
1)));
+            Table.States (239).Kernel := To_Vector ((0 => (322, 101, 0, 
False)));
+            Table.States (239).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 322, 1)));
             Add_Action (Table.States (240), (7, 19, 20, 38, 53, 76, 104, 105, 
106), (322, 1), 1, null, null);
-            Table.States (240).Minimal_Complete_Action := (Reduce, 322, 1);
-            Table.States (241).Productions := WisiToken.To_Vector ((1 => (239, 
1)));
+            Table.States (240).Kernel := To_Vector ((0 => (322, 102, 0, 
False)));
+            Table.States (240).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 322, 1)));
             Add_Action (Table.States (241), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 1), 2, name_1'Access,
             null);
-            Table.States (241).Minimal_Complete_Action := (Reduce, 239, 2);
-            Table.States (242).Productions := WisiToken.To_Vector (((128, 0), 
(272, 0)));
+            Table.States (241).Kernel := To_Vector ((0 => (239, 115, 0, 
True)));
+            Table.States (241).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 2)));
+            Table.States (241).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (242), 7, 416);
             Add_Action (Table.States (242), 19, 417);
             Add_Action (Table.States (242), 20, 418);
@@ -2919,12 +2999,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (242), 239, 422);
             Add_Goto (Table.States (242), 272, 92);
             Add_Goto (Table.States (242), 293, 97);
-            Table.States (242).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (243).Productions := WisiToken.To_Vector (((179, 0), 
(179, 1)));
+            Table.States (242).Kernel := To_Vector (((128, 322, 1, True), 
(272, 322, 2, True)));
+            Table.States (242).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (242).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (243), 104, 423);
             Add_Error (Table.States (243));
-            Table.States (243).Minimal_Complete_Action := (Shift, 104, 423);
-            Table.States (244).Productions := WisiToken.To_Vector (((207, 0), 
(213, 2)));
+            Table.States (243).Kernel := To_Vector (((179, 25, 5, False), 
(179, 25, 2, False)));
+            Table.States (243).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 423)));
             Add_Action (Table.States (244), 104, 119);
             Add_Action (Table.States (244), 105, 33);
             Add_Action (Table.States (244), 106, 34);
@@ -2933,8 +3014,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (244), 239, 424);
             Add_Goto (Table.States (244), 272, 92);
             Add_Goto (Table.States (244), 293, 97);
-            Table.States (244).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (245).Productions := WisiToken.To_Vector (((213, 1), 
(262, 0)));
+            Table.States (244).Kernel := To_Vector (((207, 29, 2, False), 
(213, 29, 5, False)));
+            Table.States (244).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (245), 104, 119);
             Add_Action (Table.States (245), 105, 33);
             Add_Action (Table.States (245), 106, 34);
@@ -2943,38 +3024,39 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (245), 239, 425);
             Add_Goto (Table.States (245), 272, 92);
             Add_Goto (Table.States (245), 293, 97);
-            Table.States (245).Minimal_Complete_Action := (Shift, 104, 119);
-         end Subr_4;
-         procedure Subr_5
-         is begin
-            Table.States (246).Productions := WisiToken.To_Vector (((193, 0), 
(312, 1)));
-            Add_Action (Table.States (246), 35, 426, (312, 1), 1, null, 
subprogram_specification_1_check'Access);
+            Table.States (245).Kernel := To_Vector (((213, 50, 5, False), 
(262, 50, 1, False)));
+            Table.States (245).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Add_Action (Table.States (246), 35, 426);
+            Add_Conflict (Table.States (246), 35, (312, 1), 1, null, 
subprogram_specification_1_check'Access);
             Add_Action (Table.States (246), 56, Reduce, (312, 1), 1, null, 
subprogram_specification_1_check'Access);
             Add_Action (Table.States (246), 74, Reduce, (312, 1), 1, null, 
subprogram_specification_1_check'Access);
             Add_Action (Table.States (246), 96, Reduce, (312, 1), 1, null, 
subprogram_specification_1_check'Access);
             Add_Error (Table.States (246));
-            Table.States (246).Minimal_Complete_Action := (Reduce, 312, 1);
-            Table.States (247).Productions := WisiToken.To_Vector (((243, 0), 
(312, 0)));
-            Add_Action (Table.States (247), 35, 427, (312, 0), 1, null, 
subprogram_specification_0_check'Access);
+            Table.States (246).Kernel := To_Vector (((193, 207, 4, False), 
(312, 207, 0, False)));
+            Table.States (246).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 312, 1)));
+            Add_Action (Table.States (247), 35, 427);
+            Add_Conflict (Table.States (247), 35, (312, 0), 1, null, 
subprogram_specification_0_check'Access);
             Add_Action (Table.States (247), 56, Reduce, (312, 0), 1, null, 
subprogram_specification_0_check'Access);
             Add_Action (Table.States (247), 74, Reduce, (312, 0), 1, null, 
subprogram_specification_0_check'Access);
             Add_Action (Table.States (247), 96, Reduce, (312, 0), 1, null, 
subprogram_specification_0_check'Access);
             Add_Error (Table.States (247));
-            Table.States (247).Minimal_Complete_Action := (Reduce, 312, 1);
-            Table.States (248).Productions := WisiToken.To_Vector (((112, 0), 
(307, 0), (308, 0), (309, 0), (311, 0)));
-            Add_Action (Table.States (248), 35, 428, (122, 1), 0, null, null);
+            Table.States (247).Kernel := To_Vector (((243, 262, 3, False), 
(312, 262, 0, False)));
+            Table.States (247).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 312, 1)));
+            Add_Action (Table.States (248), 35, 428);
+            Add_Conflict (Table.States (248), 35, (122, 1), 0, null, null);
             Add_Action (Table.States (248), 56, 429);
             Add_Action (Table.States (248), 74, 337);
             Add_Action (Table.States (248), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (248));
             Add_Goto (Table.States (248), 122, 430);
-            Table.States (248).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (249).Productions := WisiToken.To_Vector ((1 => (249, 
0)));
+            Table.States (248).Kernel := To_Vector (((112, 312, 3, False), 
(307, 312, 4, False), (308, 312, 3, False),
+            (309, 312, 1, False), (311, 312, 3, False)));
+            Table.States (248).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (249), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (249, 0), 2,
             package_declaration_0'Access, null);
-            Table.States (249).Minimal_Complete_Action := (Reduce, 249, 2);
-            Table.States (250).Productions := WisiToken.To_Vector (((115, 0), 
(115, 1)));
+            Table.States (249).Kernel := To_Vector ((0 => (249, 96, 0, 
False)));
+            Table.States (249).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 249, 2)));
             Add_Action (Table.States (250), 3, 121);
             Add_Action (Table.States (250), 15, 258);
             Add_Action (Table.States (250), 28, 259);
@@ -3024,29 +3106,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (250), 320, 144);
             Add_Goto (Table.States (250), 321, 145);
             Add_Goto (Table.States (250), 330, 146);
-            Table.States (250).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (251).Productions := WisiToken.To_Vector ((1 => (116, 
0)));
+            Table.States (250).Kernel := To_Vector (((115, 76, 1, False), 
(115, 76, 3, False)));
+            Table.States (250).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
             Add_Action (Table.States (251), (21, 76, 96), (116, 0), 1, null, 
null);
-            Table.States (251).Minimal_Complete_Action := (Reduce, 116, 1);
-            Table.States (252).Productions := WisiToken.To_Vector (((113, 0), 
(113, 1)));
+            Table.States (251).Kernel := To_Vector ((0 => (116, 115, 0, 
False)));
+            Table.States (251).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 116, 1)));
             Add_Action (Table.States (252), 21, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (252), 76, 431);
             Add_Action (Table.States (252), 96, Reduce, (253, 1), 0, null, 
null);
             Add_Error (Table.States (252));
             Add_Goto (Table.States (252), 199, 344);
             Add_Goto (Table.States (252), 253, 432);
-            Table.States (252).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (253).Productions := WisiToken.To_Vector ((1 => (303, 
8)));
+            Table.States (252).Kernel := To_Vector (((113, 116, 3, False), 
(113, 116, 1, False)));
+            Table.States (252).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (253), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 8), 3, simple_statement_8'Access, null);
-            Table.States (253).Minimal_Complete_Action := (Reduce, 303, 3);
-            Table.States (254).Productions := WisiToken.To_Vector ((1 => (197, 
2)));
+            Table.States (253).Kernel := To_Vector ((0 => (303, 96, 0, 
False)));
+            Table.States (253).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 3)));
             Add_Action (Table.States (254), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99), (197, 2), 2, null, null);
-            Table.States (254).Minimal_Complete_Action := (Reduce, 197, 2);
-            Table.States (255).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (258, 4), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (254).Kernel := To_Vector ((0 => (197, 258, 0, 
False)));
+            Table.States (254).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 197, 2)));
             Add_Action (Table.States (255), 10, Reduce, (258, 4), 2, 
primary_4'Access, null);
             Add_Action (Table.States (255), 20, Reduce, (258, 4), 2, 
primary_4'Access, null);
             Add_Action (Table.States (255), 21, Reduce, (258, 4), 2, 
primary_4'Access, null);
@@ -3090,13 +3171,14 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (255));
             Add_Goto (Table.States (255), 115, 241);
             Add_Goto (Table.States (255), 322, 242);
-            Table.States (255).Minimal_Complete_Action := (Reduce, 258, 2);
-            Table.States (256).Productions := WisiToken.To_Vector ((1 => (197, 
3)));
+            Table.States (255).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (258, 239, 0, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (255).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 2)));
             Add_Action (Table.States (256), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99), (197, 3), 2, null, null);
-            Table.States (256).Minimal_Complete_Action := (Reduce, 197, 2);
-            Table.States (257).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (275, 0),
-            (275, 1), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (256).Kernel := To_Vector ((0 => (197, 258, 0, 
False)));
+            Table.States (256).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 197, 2)));
             Add_Action (Table.States (257), 10, Reduce, (275, 1), 2, null, 
null);
             Add_Action (Table.States (257), 20, Reduce, (275, 1), 2, null, 
null);
             Add_Action (Table.States (257), 21, Reduce, (275, 1), 2, null, 
null);
@@ -3107,7 +3189,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (257), 43, Reduce, (275, 1), 2, null, 
null);
             Add_Action (Table.States (257), 53, Reduce, (275, 1), 2, null, 
null);
             Add_Action (Table.States (257), 68, Reduce, (275, 1), 2, null, 
null);
-            Add_Action (Table.States (257), 74, 433, (275, 1), 2, null, null);
+            Add_Action (Table.States (257), 74, 433);
+            Add_Conflict (Table.States (257), 74, (275, 1), 2, null, null);
             Add_Action (Table.States (257), 75, Reduce, (275, 1), 2, null, 
null);
             Add_Action (Table.States (257), 76, 235);
             Add_Action (Table.States (257), 77, Reduce, (275, 1), 2, null, 
null);
@@ -3121,8 +3204,11 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (257));
             Add_Goto (Table.States (257), 115, 241);
             Add_Goto (Table.States (257), 322, 242);
-            Table.States (257).Minimal_Complete_Action := (Reduce, 275, 2);
-            Table.States (258).Productions := WisiToken.To_Vector ((1 => (136, 
0)));
+            Table.States (257).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (275, 239, 1, True), (275, 239, 0, False), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (257).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 275, 2)));
+            Table.States (257).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (258), 3, 121);
             Add_Action (Table.States (258), 35, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (258), 39, 122);
@@ -3157,14 +3243,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (258), 320, 144);
             Add_Goto (Table.States (258), 321, 145);
             Add_Goto (Table.States (258), 330, 146);
-            Table.States (258).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (259).Productions := WisiToken.To_Vector ((1 => (273, 
0)));
+            Table.States (258).Kernel := To_Vector ((0 => (136, 15, 3, 
False)));
+            Table.States (258).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (259), 9, 435);
             Add_Action (Table.States (259), 62, 436);
             Add_Error (Table.States (259));
             Add_Goto (Table.States (259), 274, 437);
-            Table.States (259).Minimal_Complete_Action := (Shift, 9, 435);
-            Table.States (260).Productions := WisiToken.To_Vector (((221, 0), 
(221, 1), (221, 2), (221, 3)));
+            Table.States (259).Kernel := To_Vector ((0 => (273, 28, 5, 
False)));
+            Table.States (259).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 9, 435)));
             Add_Action (Table.States (260), 3, 121);
             Add_Action (Table.States (260), 39, 122);
             Add_Action (Table.States (260), 40, 123);
@@ -3199,8 +3285,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (260), 320, 144);
             Add_Goto (Table.States (260), 321, 145);
             Add_Goto (Table.States (260), 330, 146);
-            Table.States (260).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (261).Productions := WisiToken.To_Vector (((165, 1), 
(197, 3)));
+            Table.States (260).Kernel := To_Vector (((221, 32, 4, False), 
(221, 32, 2, False), (221, 32, 3, False),
+            (221, 32, 1, False)));
+            Table.States (260).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (261), 39, 122);
             Add_Action (Table.States (261), 41, 439);
             Add_Action (Table.States (261), 76, 126);
@@ -3215,8 +3302,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (261), 258, 256);
             Add_Goto (Table.States (261), 272, 92);
             Add_Goto (Table.States (261), 293, 97);
-            Table.States (261).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (262).Productions := WisiToken.To_Vector (((117, 2), 
(258, 1)));
+            Table.States (261).Kernel := To_Vector (((165, 40, 2, False), 
(197, 40, 1, False)));
+            Table.States (261).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (262), 10, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (262), 33, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (262), 38, Reduce, (258, 1), 1, null, 
null);
@@ -3244,11 +3331,11 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (262), 99, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (262), 100, Reduce, (258, 1), 1, null, 
null);
             Add_Error (Table.States (262));
-            Table.States (262).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (263).Productions := WisiToken.To_Vector ((1 => (165, 
3)));
+            Table.States (262).Kernel := To_Vector (((117, 41, 2, False), 
(258, 41, 0, False)));
+            Table.States (262).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (263), (79, 87), (165, 3), 1, null, null);
-            Table.States (263).Minimal_Complete_Action := (Reduce, 165, 1);
-            Table.States (264).Productions := WisiToken.To_Vector (((124, 0), 
(124, 1), (239, 6)));
+            Table.States (263).Kernel := To_Vector ((0 => (165, 44, 0, 
False)));
+            Table.States (263).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 165, 1)));
             Add_Action (Table.States (264), 10, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 33, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 35, Reduce, (239, 6), 1, null, 
null);
@@ -3267,7 +3354,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (264), 84, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 85, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 86, Reduce, (239, 6), 1, null, 
null);
-            Add_Action (Table.States (264), 87, 441, (239, 6), 1, null, null);
+            Add_Action (Table.States (264), 87, 441);
+            Add_Conflict (Table.States (264), 87, (239, 6), 1, null, null);
             Add_Action (Table.States (264), 88, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 89, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 91, Reduce, (239, 6), 1, null, 
null);
@@ -3282,48 +3370,50 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (264), 101, Reduce, (239, 6), 1, null, 
null);
             Add_Action (Table.States (264), 102, Reduce, (239, 6), 1, null, 
null);
             Add_Error (Table.States (264));
-            Table.States (264).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (265).Productions := WisiToken.To_Vector ((1 => (125, 
1)));
+            Table.States (264).Kernel := To_Vector (((124, 106, 1, False), 
(124, 106, 2, False), (239, 106, 0,
+            False)));
+            Table.States (264).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (265), (35, 77, 83, 96), (125, 1), 1, 
null, null);
-            Table.States (265).Minimal_Complete_Action := (Reduce, 125, 1);
-            Table.States (266).Productions := WisiToken.To_Vector (((117, 4), 
(125, 0)));
+            Table.States (265).Kernel := To_Vector ((0 => (125, 124, 0, 
False)));
+            Table.States (265).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 1)));
             Add_Action (Table.States (266), 77, 442);
             Add_Action (Table.States (266), 83, 443);
             Add_Error (Table.States (266));
-            Table.States (266).Minimal_Complete_Action := (Shift, 77, 442);
-            Table.States (267).Productions := WisiToken.To_Vector ((1 => (153, 
1)));
+            Table.States (266).Kernel := To_Vector (((117, 125, 1, False), 
(125, 125, 1, True)));
+            Table.States (266).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 442)));
             Add_Action (Table.States (267), (1 =>  77), (153, 1), 1, null, 
null);
-            Table.States (267).Minimal_Complete_Action := (Reduce, 153, 1);
-            Table.States (268).Productions := WisiToken.To_Vector ((1 => (117, 
3)));
+            Table.States (267).Kernel := To_Vector ((0 => (153, 136, 0, 
False)));
+            Table.States (267).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 153, 1)));
             Add_Action (Table.States (268), 77, 444);
             Add_Error (Table.States (268));
-            Table.States (268).Minimal_Complete_Action := (Shift, 77, 444);
-            Table.States (269).Productions := WisiToken.To_Vector ((1 => (166, 
1)));
+            Table.States (268).Kernel := To_Vector ((0 => (117, 153, 1, 
False)));
+            Table.States (268).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 444)));
             Add_Action (Table.States (269), (79, 87), (166, 1), 1, null, null);
-            Table.States (269).Minimal_Complete_Action := (Reduce, 166, 1);
-            Table.States (270).Productions := WisiToken.To_Vector (((124, 2), 
(124, 3), (166, 0)));
+            Table.States (269).Kernel := To_Vector ((0 => (166, 165, 0, 
False)));
+            Table.States (269).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 166, 1)));
             Add_Action (Table.States (270), 79, 445);
             Add_Action (Table.States (270), 87, 446);
             Add_Error (Table.States (270));
-            Table.States (270).Minimal_Complete_Action := (Shift, 87, 446);
-            Table.States (271).Productions := WisiToken.To_Vector (((124, 4), 
(165, 0), (192, 0)));
+            Table.States (270).Kernel := To_Vector (((124, 166, 1, False), 
(124, 166, 2, False), (166, 166, 2, True)));
+            Table.States (270).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 446)));
             Add_Action (Table.States (271), 74, Reduce, (192, 0), 1, null, 
null);
-            Add_Action (Table.States (271), 77, Reduce, (124, 4), 1, 
association_opt_4'Access, null, (192, 0), 1, null,
-            null);
+            Add_Action (Table.States (271), 77, Reduce, (124, 4), 1, 
association_opt_4'Access, null);
+            Add_Conflict (Table.States (271), 77, (192, 0), 1, null, null);
             Add_Action (Table.States (271), 79, Reduce, (165, 0), 1, null, 
null);
             Add_Action (Table.States (271), 83, Reduce, (124, 4), 1, 
association_opt_4'Access, null);
             Add_Action (Table.States (271), 87, Reduce, (165, 0), 1, null, 
null);
             Add_Error (Table.States (271));
-            Table.States (271).Minimal_Complete_Action := (Reduce, 124, 1);
-            Table.States (272).Productions := WisiToken.To_Vector (((117, 0), 
(117, 1)));
+            Table.States (271).Kernel := To_Vector (((124, 191, 0, False), 
(165, 191, 0, False), (192, 191, 0, True)));
+            Table.States (271).Minimal_Complete_Actions := To_Vector 
(((Reduce, 124, 1), (Reduce, 165, 1), (Reduce,
+            192, 1)));
+            Table.States (271).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (272), 74, 447);
             Add_Error (Table.States (272));
-            Table.States (272).Minimal_Complete_Action := (Shift, 74, 447);
-            Table.States (273).Productions := WisiToken.To_Vector ((1 => (153, 
0)));
+            Table.States (272).Kernel := To_Vector (((117, 192, 4, False), 
(117, 192, 2, False)));
+            Table.States (272).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 447)));
             Add_Action (Table.States (273), (1 =>  77), (153, 0), 1, null, 
null);
-            Table.States (273).Minimal_Complete_Action := (Reduce, 153, 1);
-            Table.States (274).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (258, 3), (272, 0),
-            (277, 0), (277, 1), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (273).Kernel := To_Vector ((0 => (153, 221, 0, 
False)));
+            Table.States (273).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 153, 1)));
             Add_Action (Table.States (274), 10, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (274), 20, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (274), 21, Reduce, (258, 3), 1, null, 
null);
@@ -3365,14 +3455,16 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (274));
             Add_Goto (Table.States (274), 115, 241);
             Add_Goto (Table.States (274), 322, 448);
-            Table.States (274).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (275).Productions := WisiToken.To_Vector ((1 => (153, 
2)));
+            Table.States (274).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (258, 239, 0, False), (272, 239, 3, True), (277, 239, 4, False), 
(277, 239, 2, False), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (274).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (275), (1 =>  77), (153, 2), 1, null, 
null);
-            Table.States (275).Minimal_Complete_Action := (Reduce, 153, 1);
-            Table.States (276).Productions := WisiToken.To_Vector ((1 => (165, 
2)));
+            Table.States (275).Kernel := To_Vector ((0 => (153, 273, 0, 
False)));
+            Table.States (275).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 153, 1)));
             Add_Action (Table.States (276), (79, 87), (165, 2), 1, null, null);
-            Table.States (276).Minimal_Complete_Action := (Reduce, 165, 1);
-            Table.States (277).Productions := WisiToken.To_Vector (((277, 2), 
(287, 0), (287, 1), (287, 2), (287, 3)));
+            Table.States (276).Kernel := To_Vector ((0 => (165, 277, 0, 
False)));
+            Table.States (276).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 165, 1)));
             Add_Action (Table.States (277), 10, Reduce, (287, 3), 1, null, 
null);
             Add_Action (Table.States (277), 33, 288);
             Add_Action (Table.States (277), 35, Reduce, (287, 3), 1, null, 
null);
@@ -3394,14 +3486,15 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (277), 98, 295);
             Add_Error (Table.States (277));
             Add_Goto (Table.States (277), 288, 296);
-            Table.States (277).Minimal_Complete_Action := (Reduce, 287, 1);
-            Table.States (278).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (277).Kernel := To_Vector (((277, 301, 2, False), 
(287, 301, 3, False), (287, 301, 2, False),
+            (287, 301, 2, False), (287, 301, 0, False)));
+            Table.States (277).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 1)));
             Add_Action (Table.States (278), 72, 450);
             Add_Error (Table.States (278));
             Add_Goto (Table.States (278), 140, 451);
             Add_Goto (Table.States (278), 141, 452);
-            Table.States (278).Minimal_Complete_Action := (Shift, 72, 450);
-            Table.States (279).Productions := WisiToken.To_Vector ((1 => (197, 
0)));
+            Table.States (278).Kernel := To_Vector ((0 => (139, 35, 5, 
False)));
+            Table.States (278).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 72, 450)));
             Add_Action (Table.States (279), 39, 122);
             Add_Action (Table.States (279), 41, 124);
             Add_Action (Table.States (279), 76, 126);
@@ -3416,8 +3509,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (279), 258, 453);
             Add_Goto (Table.States (279), 272, 92);
             Add_Goto (Table.States (279), 293, 97);
-            Table.States (279).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (280).Productions := WisiToken.To_Vector ((1 => (282, 
0)));
+            Table.States (279).Kernel := To_Vector ((0 => (197, 100, 1, 
False)));
+            Table.States (279).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (280), 3, 121);
             Add_Action (Table.States (280), 39, 122);
             Add_Action (Table.States (280), 40, 123);
@@ -3444,12 +3537,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (280), 320, 144);
             Add_Goto (Table.States (280), 321, 145);
             Add_Goto (Table.States (280), 330, 146);
-            Table.States (280).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (281).Productions := WisiToken.To_Vector ((1 => (283, 
0)));
+            Table.States (280).Kernel := To_Vector ((0 => (282, 10, 1, True)));
+            Table.States (280).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (280).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (281), 68, 455);
             Add_Error (Table.States (281));
-            Table.States (281).Minimal_Complete_Action := (Shift, 68, 455);
-            Table.States (282).Productions := WisiToken.To_Vector ((1 => (284, 
0)));
+            Table.States (281).Kernel := To_Vector ((0 => (283, 10, 2, True)));
+            Table.States (281).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 455)));
+            Table.States (281).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (282), 3, 121);
             Add_Action (Table.States (282), 39, 122);
             Add_Action (Table.States (282), 40, 123);
@@ -3476,12 +3571,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (282), 320, 144);
             Add_Goto (Table.States (282), 321, 145);
             Add_Goto (Table.States (282), 330, 146);
-            Table.States (282).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (283).Productions := WisiToken.To_Vector ((1 => (285, 
0)));
+            Table.States (282).Kernel := To_Vector ((0 => (284, 43, 1, True)));
+            Table.States (282).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (282).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (283), 22, 457);
             Add_Error (Table.States (283));
-            Table.States (283).Minimal_Complete_Action := (Shift, 22, 457);
-            Table.States (284).Productions := WisiToken.To_Vector ((1 => (286, 
0)));
+            Table.States (283).Kernel := To_Vector ((0 => (285, 43, 2, True)));
+            Table.States (283).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 22, 457)));
+            Table.States (283).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (284), 3, 121);
             Add_Action (Table.States (284), 39, 122);
             Add_Action (Table.States (284), 40, 123);
@@ -3508,8 +3605,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (284), 320, 144);
             Add_Goto (Table.States (284), 321, 145);
             Add_Goto (Table.States (284), 330, 146);
-            Table.States (284).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (285).Productions := WisiToken.To_Vector (((282, 1), 
(283, 1)));
+            Table.States (284).Kernel := To_Vector ((0 => (286, 75, 1, True)));
+            Table.States (284).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (284).Minimal_Complete_Actions_Recursive := True;
+         end Subr_5;
+         procedure Subr_6
+         is begin
             Add_Action (Table.States (285), 3, 121);
             Add_Action (Table.States (285), 39, 122);
             Add_Action (Table.States (285), 40, 123);
@@ -3537,8 +3638,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (285), 320, 144);
             Add_Goto (Table.States (285), 321, 145);
             Add_Goto (Table.States (285), 330, 146);
-            Table.States (285).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (286).Productions := WisiToken.To_Vector (((284, 1), 
(285, 1)));
+            Table.States (285).Kernel := To_Vector (((282, 10, 1, True), (283, 
10, 2, True)));
+            Table.States (285).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (285).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (286), 3, 121);
             Add_Action (Table.States (286), 22, 461);
             Add_Action (Table.States (286), 39, 122);
@@ -3566,8 +3668,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (286), 320, 144);
             Add_Goto (Table.States (286), 321, 145);
             Add_Goto (Table.States (286), 330, 146);
-            Table.States (286).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (287).Productions := WisiToken.To_Vector ((1 => (286, 
1)));
+            Table.States (286).Kernel := To_Vector (((284, 43, 1, True), (285, 
43, 2, True)));
+            Table.States (286).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (286).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (287), 3, 121);
             Add_Action (Table.States (287), 39, 122);
             Add_Action (Table.States (287), 40, 123);
@@ -3594,11 +3697,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (287), 320, 144);
             Add_Goto (Table.States (287), 321, 145);
             Add_Goto (Table.States (287), 330, 146);
-            Table.States (287).Minimal_Complete_Action := (Shift, 103, 129);
-         end Subr_5;
-         procedure Subr_6
-         is begin
-            Table.States (288).Productions := WisiToken.To_Vector ((1 => (287, 
1)));
+            Table.States (287).Kernel := To_Vector ((0 => (286, 75, 1, True)));
+            Table.States (287).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (287).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (288), 3, 121);
             Add_Action (Table.States (288), 39, 122);
             Add_Action (Table.States (288), 40, 123);
@@ -3625,30 +3726,30 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (288), 320, 144);
             Add_Goto (Table.States (288), 321, 145);
             Add_Goto (Table.States (288), 330, 146);
-            Table.States (288).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (289).Productions := WisiToken.To_Vector ((1 => (287, 
0)));
+            Table.States (288).Kernel := To_Vector ((0 => (287, 33, 1, 
False)));
+            Table.States (288).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (289), 33, 468);
             Add_Error (Table.States (289));
-            Table.States (289).Minimal_Complete_Action := (Shift, 33, 468);
-            Table.States (290).Productions := WisiToken.To_Vector ((1 => (288, 
0)));
+            Table.States (289).Kernel := To_Vector ((0 => (287, 40, 2, 
False)));
+            Table.States (289).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 468)));
             Add_Action (Table.States (290), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 0), 1, null, null);
-            Table.States (290).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (291).Productions := WisiToken.To_Vector ((1 => (288, 
4)));
+            Table.States (290).Kernel := To_Vector ((0 => (288, 86, 0, 
False)));
+            Table.States (290).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (291), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 4), 1, null, null);
-            Table.States (291).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (292).Productions := WisiToken.To_Vector ((1 => (288, 
5)));
+            Table.States (291).Kernel := To_Vector ((0 => (288, 88, 0, 
False)));
+            Table.States (291).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (292), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 5), 1, null, null);
-            Table.States (292).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (293).Productions := WisiToken.To_Vector ((1 => (288, 
2)));
+            Table.States (292).Kernel := To_Vector ((0 => (288, 89, 0, 
False)));
+            Table.States (292).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (293), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 2), 1, null, null);
-            Table.States (293).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (294).Productions := WisiToken.To_Vector ((1 => (288, 
3)));
+            Table.States (293).Kernel := To_Vector ((0 => (288, 91, 0, 
False)));
+            Table.States (293).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (294), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 3), 1, null, null);
-            Table.States (294).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (295).Productions := WisiToken.To_Vector ((1 => (288, 
1)));
+            Table.States (294).Kernel := To_Vector ((0 => (288, 92, 0, 
False)));
+            Table.States (294).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (295), (3, 39, 40, 41, 76, 94, 95, 103, 
104, 105, 106), (288, 1), 1, null, null);
-            Table.States (295).Minimal_Complete_Action := (Reduce, 288, 1);
-            Table.States (296).Productions := WisiToken.To_Vector ((1 => (287, 
2)));
+            Table.States (295).Kernel := To_Vector ((0 => (288, 98, 0, 
False)));
+            Table.States (295).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 288, 1)));
             Add_Action (Table.States (296), 3, 121);
             Add_Action (Table.States (296), 39, 122);
             Add_Action (Table.States (296), 40, 123);
@@ -3672,20 +3773,20 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (296), 320, 144);
             Add_Goto (Table.States (296), 321, 145);
             Add_Goto (Table.States (296), 330, 146);
-            Table.States (296).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (297).Productions := WisiToken.To_Vector ((1 => (237, 
2)));
+            Table.States (296).Kernel := To_Vector ((0 => (287, 288, 1, 
False)));
+            Table.States (296).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (297), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (237, 2), 1, null, null);
-            Table.States (297).Minimal_Complete_Action := (Reduce, 237, 1);
-            Table.States (298).Productions := WisiToken.To_Vector ((1 => (237, 
3)));
+            Table.States (297).Kernel := To_Vector ((0 => (237, 38, 0, 
False)));
+            Table.States (297).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 237, 1)));
             Add_Action (Table.States (298), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (237, 3), 1, null, null);
-            Table.States (298).Minimal_Complete_Action := (Reduce, 237, 1);
-            Table.States (299).Productions := WisiToken.To_Vector ((1 => (237, 
1)));
+            Table.States (298).Kernel := To_Vector ((0 => (237, 55, 0, 
False)));
+            Table.States (298).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 237, 1)));
             Add_Action (Table.States (299), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (237, 1), 1, null, null);
-            Table.States (299).Minimal_Complete_Action := (Reduce, 237, 1);
-            Table.States (300).Productions := WisiToken.To_Vector ((1 => (237, 
0)));
+            Table.States (299).Kernel := To_Vector ((0 => (237, 97, 0, 
False)));
+            Table.States (299).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 237, 1)));
             Add_Action (Table.States (300), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (237, 0), 1, null, null);
-            Table.States (300).Minimal_Complete_Action := (Reduce, 237, 1);
-            Table.States (301).Productions := WisiToken.To_Vector ((1 => (320, 
0)));
+            Table.States (300).Kernel := To_Vector ((0 => (237, 99, 0, 
False)));
+            Table.States (300).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 237, 1)));
             Add_Action (Table.States (301), 3, 121);
             Add_Action (Table.States (301), 39, 122);
             Add_Action (Table.States (301), 40, 123);
@@ -3703,17 +3804,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (301), 258, 135);
             Add_Goto (Table.States (301), 272, 92);
             Add_Goto (Table.States (301), 293, 97);
-            Table.States (301).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (302).Productions := WisiToken.To_Vector ((1 => (130, 
2)));
+            Table.States (301).Kernel := To_Vector ((0 => (320, 237, 1, 
True)));
+            Table.States (301).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (301).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (302), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (130, 2), 1, null, null);
-            Table.States (302).Minimal_Complete_Action := (Reduce, 130, 1);
-            Table.States (303).Productions := WisiToken.To_Vector ((1 => (130, 
1)));
+            Table.States (302).Kernel := To_Vector ((0 => (130, 78, 0, 
False)));
+            Table.States (302).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 130, 1)));
             Add_Action (Table.States (303), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (130, 1), 1, null, null);
-            Table.States (303).Minimal_Complete_Action := (Reduce, 130, 1);
-            Table.States (304).Productions := WisiToken.To_Vector ((1 => (130, 
0)));
+            Table.States (303).Kernel := To_Vector ((0 => (130, 94, 0, 
False)));
+            Table.States (303).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 130, 1)));
             Add_Action (Table.States (304), (3, 39, 40, 41, 76, 103, 104, 105, 
106), (130, 0), 1, null, null);
-            Table.States (304).Minimal_Complete_Action := (Reduce, 130, 1);
-            Table.States (305).Productions := WisiToken.To_Vector ((1 => (321, 
0)));
+            Table.States (304).Kernel := To_Vector ((0 => (130, 95, 0, 
False)));
+            Table.States (304).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 130, 1)));
             Add_Action (Table.States (305), 3, 121);
             Add_Action (Table.States (305), 39, 122);
             Add_Action (Table.States (305), 40, 123);
@@ -3732,8 +3834,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (305), 272, 92);
             Add_Goto (Table.States (305), 293, 97);
             Add_Goto (Table.States (305), 320, 471);
-            Table.States (305).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (306).Productions := WisiToken.To_Vector (((301, 0), 
(321, 0)));
+            Table.States (305).Kernel := To_Vector ((0 => (321, 130, 1, 
True)));
+            Table.States (305).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (305).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (306), 10, Reduce, (301, 0), 2, null, 
null);
             Add_Action (Table.States (306), 20, Reduce, (301, 0), 2, null, 
null);
             Add_Action (Table.States (306), 21, Reduce, (301, 0), 2, null, 
null);
@@ -3767,17 +3870,17 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (306), 98, Reduce, (301, 0), 2, null, 
null);
             Add_Error (Table.States (306));
             Add_Goto (Table.States (306), 130, 305);
-            Table.States (306).Minimal_Complete_Action := (Reduce, 301, 2);
-            Table.States (307).Productions := WisiToken.To_Vector ((1 => (161, 
0)));
+            Table.States (306).Kernel := To_Vector (((301, 321, 0, False), 
(321, 321, 2, True)));
+            Table.States (306).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 301, 2)));
             Add_Action (Table.States (307), 96, 472);
             Add_Error (Table.States (307));
-            Table.States (307).Minimal_Complete_Action := (Shift, 96, 472);
-            Table.States (308).Productions := WisiToken.To_Vector ((1 => (161, 
1)));
+            Table.States (307).Kernel := To_Vector ((0 => (161, 192, 1, 
False)));
+            Table.States (307).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 472)));
             Add_Action (Table.States (308), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (161, 1), 3, delay_statement_1'Access, null);
-            Table.States (308).Minimal_Complete_Action := (Reduce, 161, 3);
-            Table.States (309).Productions := WisiToken.To_Vector ((1 => (190, 
0)));
+            Table.States (308).Kernel := To_Vector ((0 => (161, 96, 0, 
False)));
+            Table.States (308).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 161, 3)));
             Add_Action (Table.States (309), 3, 121);
             Add_Action (Table.States (309), 39, 122);
             Add_Action (Table.States (309), 40, 123);
@@ -3812,13 +3915,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (309), 320, 144);
             Add_Goto (Table.States (309), 321, 145);
             Add_Goto (Table.States (309), 330, 146);
-            Table.States (309).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (310).Productions := WisiToken.To_Vector ((1 => (190, 
1)));
+            Table.States (309).Kernel := To_Vector ((0 => (190, 72, 1, 
False)));
+            Table.States (309).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (310), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (190, 1), 3, exit_statement_1'Access, null);
-            Table.States (310).Minimal_Complete_Action := (Reduce, 190, 3);
-            Table.States (311).Productions := WisiToken.To_Vector (((230, 2), 
(230, 5)));
+            Table.States (310).Kernel := To_Vector ((0 => (190, 96, 0, 
False)));
+            Table.States (310).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 190, 3)));
             Add_Action (Table.States (311), 3, 121);
             Add_Action (Table.States (311), 39, 122);
             Add_Action (Table.States (311), 40, 474);
@@ -3846,8 +3949,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (311), 320, 144);
             Add_Goto (Table.States (311), 321, 145);
             Add_Goto (Table.States (311), 330, 146);
-            Table.States (311).Minimal_Complete_Action := (Shift, 40, 474);
-            Table.States (312).Productions := WisiToken.To_Vector (((230, 3), 
(230, 4)));
+            Table.States (311).Kernel := To_Vector (((230, 33, 2, False), 
(230, 33, 1, False)));
+            Table.States (311).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (312), 59, 481);
             Add_Action (Table.States (312), 104, 119);
             Add_Action (Table.States (312), 105, 33);
@@ -3857,8 +3960,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (312), 239, 482);
             Add_Goto (Table.States (312), 272, 92);
             Add_Goto (Table.States (312), 293, 97);
-            Table.States (312).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (313).Productions := WisiToken.To_Vector (((230, 0), 
(230, 1)));
+            Table.States (312).Kernel := To_Vector (((230, 42, 2, False), 
(230, 42, 1, False)));
+            Table.States (312).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (313), 40, 483);
             Add_Action (Table.States (313), 104, 119);
             Add_Action (Table.States (313), 105, 33);
@@ -3869,8 +3972,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (313), 272, 92);
             Add_Goto (Table.States (313), 293, 97);
             Add_Goto (Table.States (313), 314, 485);
-            Table.States (313).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (314).Productions := WisiToken.To_Vector ((1 => (121, 
0)));
+            Table.States (313).Kernel := To_Vector (((230, 81, 4, False), 
(230, 81, 3, False)));
+            Table.States (313).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (314), 3, 121);
             Add_Action (Table.States (314), 39, 122);
             Add_Action (Table.States (314), 40, 123);
@@ -3905,18 +4008,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (314), 320, 144);
             Add_Goto (Table.States (314), 321, 145);
             Add_Goto (Table.States (314), 330, 146);
-            Table.States (314).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (315).Productions := WisiToken.To_Vector ((1 => (127, 
0)));
+            Table.States (314).Kernel := To_Vector ((0 => (121, 71, 1, 
False)));
+            Table.States (314).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (315), 12, 487);
             Add_Error (Table.States (315));
-            Table.States (315).Minimal_Complete_Action := (Shift, 12, 487);
-            Table.States (316).Productions := WisiToken.To_Vector (((182, 0), 
(281, 0)));
+            Table.States (315).Kernel := To_Vector ((0 => (127, 71, 2, 
False)));
+            Table.States (315).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 12, 487)));
             Add_Action (Table.States (316), 54, 488);
             Add_Action (Table.States (316), 76, 126);
             Add_Error (Table.States (316));
             Add_Goto (Table.States (316), 117, 489);
-            Table.States (316).Minimal_Complete_Action := (Shift, 76, 126);
-            Table.States (317).Productions := WisiToken.To_Vector (((291, 0), 
(291, 1)));
+            Table.States (316).Kernel := To_Vector (((182, 71, 3, False), 
(281, 71, 12, False)));
+            Table.States (316).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 76, 126)));
             Add_Action (Table.States (317), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (317), 21, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (317), 35, Reduce, (241, 1), 0, null, 
null);
@@ -3932,8 +4035,8 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (317));
             Add_Goto (Table.States (317), 114, 490);
             Add_Goto (Table.States (317), 241, 491);
-            Table.States (317).Minimal_Complete_Action := (Reduce, 241, 0);
-            Table.States (318).Productions := WisiToken.To_Vector (((115, 0), 
(115, 1), (199, 0), (239, 0)));
+            Table.States (317).Kernel := To_Vector (((291, 58, 0, False), 
(291, 58, 2, True)));
+            Table.States (317).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 0)));
             Add_Action (Table.States (318), 3, 121);
             Add_Action (Table.States (318), 15, 258);
             Add_Action (Table.States (318), 28, 259);
@@ -3944,7 +4047,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (318), 44, 263);
             Add_Action (Table.States (318), 52, 125);
             Add_Action (Table.States (318), 76, 126);
-            Add_Action (Table.States (318), 77, Reduce, (124, 5), 0, null, 
null, (254, 4), 0, null, null);
+            Add_Action (Table.States (318), 77, Reduce, (124, 5), 0, null, 
null);
+            Add_Conflict (Table.States (318), 77, (254, 4), 0, null, null);
             Add_Action (Table.States (318), 79, Reduce, (166, 2), 0, null, 
null);
             Add_Action (Table.States (318), 83, Reduce, (124, 5), 0, null, 
null);
             Add_Action (Table.States (318), 87, Reduce, (166, 2), 0, null, 
null);
@@ -3988,21 +4092,24 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (318), 320, 144);
             Add_Goto (Table.States (318), 321, 145);
             Add_Goto (Table.States (318), 330, 146);
-            Table.States (318).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (319).Productions := WisiToken.To_Vector ((1 => (252, 
0)));
+            Table.States (318).Kernel := To_Vector (((115, 76, 1, False), 
(115, 76, 3, False), (199, 76, 1, False),
+            (239, 76, 4, True)));
+            Table.States (318).Minimal_Complete_Actions := To_Vector 
(((Reduce, 125, 0), (Reduce, 255, 0)));
+            Table.States (318).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (319), 58, 317);
             Add_Error (Table.States (319));
             Add_Goto (Table.States (319), 291, 496);
-            Table.States (319).Minimal_Complete_Action := (Shift, 58, 317);
-            Table.States (320).Productions := WisiToken.To_Vector ((1 => (207, 
0)));
+            Table.States (319).Kernel := To_Vector ((0 => (252, 199, 1, 
True)));
+            Table.States (319).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 58, 317)));
+            Table.States (319).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (320), (35, 56, 74, 96), (207, 0), 3, 
function_specification_0'Access,
             function_specification_0_check'Access);
-            Table.States (320).Minimal_Complete_Action := (Reduce, 207, 3);
-            Table.States (321).Productions := WisiToken.To_Vector ((1 => (252, 
1)));
+            Table.States (320).Kernel := To_Vector ((0 => (207, 252, 0, 
False)));
+            Table.States (320).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 207, 3)));
             Add_Action (Table.States (321), (21, 35, 56, 74, 77, 82, 96), 
(252, 1), 1, null, null);
-            Table.States (321).Minimal_Complete_Action := (Reduce, 252, 1);
-            Table.States (322).Productions := WisiToken.To_Vector (((128, 0), 
(215, 2), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (321).Kernel := To_Vector ((0 => (252, 291, 0, 
True)));
+            Table.States (321).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 252, 1)));
+            Table.States (321).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (322), 56, 497);
             Add_Action (Table.States (322), 76, 235);
             Add_Action (Table.States (322), 84, 237);
@@ -4011,9 +4118,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (322));
             Add_Goto (Table.States (322), 115, 241);
             Add_Goto (Table.States (322), 322, 242);
-            Table.States (322).Minimal_Complete_Action := (Shift, 56, 497);
-            Table.States (323).Productions := WisiToken.To_Vector (((128, 0), 
(215, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (322).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 3, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (322).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 497)));
             Add_Action (Table.States (323), 56, 498);
             Add_Action (Table.States (323), 76, 235);
             Add_Action (Table.States (323), 84, 237);
@@ -4022,9 +4130,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (323));
             Add_Goto (Table.States (323), 115, 241);
             Add_Goto (Table.States (323), 322, 242);
-            Table.States (323).Minimal_Complete_Action := (Shift, 56, 498);
-            Table.States (324).Productions := WisiToken.To_Vector (((128, 0), 
(215, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (323).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 3, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (323).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 498)));
             Add_Action (Table.States (324), 56, 499);
             Add_Action (Table.States (324), 76, 235);
             Add_Action (Table.States (324), 84, 237);
@@ -4033,16 +4142,19 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (324));
             Add_Goto (Table.States (324), 115, 241);
             Add_Goto (Table.States (324), 322, 242);
-            Table.States (324).Minimal_Complete_Action := (Shift, 56, 499);
-            Table.States (325).Productions := WisiToken.To_Vector (((201, 0), 
(201, 1), (201, 2)));
+            Table.States (324).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 3, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (324).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 499)));
             Add_Action (Table.States (325), 35, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (325), 74, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (325), 76, 377);
             Add_Action (Table.States (325), 96, Reduce, (169, 2), 0, null, 
null);
             Add_Error (Table.States (325));
             Add_Goto (Table.States (325), 169, 500);
-            Table.States (325).Minimal_Complete_Action := (Reduce, 169, 0);
-            Table.States (326).Productions := WisiToken.To_Vector ((1 => (204, 
0)));
+            Table.States (325).Kernel := To_Vector (((201, 104, 3, False), 
(201, 104, 3, False), (201, 104, 1,
+            False)));
+            Table.States (325).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 0)));
             Add_Action (Table.States (326), 104, 119);
             Add_Action (Table.States (326), 105, 33);
             Add_Action (Table.States (326), 106, 34);
@@ -4051,18 +4163,20 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (326), 239, 501);
             Add_Goto (Table.States (326), 272, 92);
             Add_Goto (Table.States (326), 293, 97);
-            Table.States (326).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (327).Productions := WisiToken.To_Vector (((200, 0), 
(200, 1), (200, 2), (200, 3)));
+            Table.States (326).Kernel := To_Vector ((0 => (204, 47, 5, 
False)));
+            Table.States (326).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (327), 35, 502);
             Add_Action (Table.States (327), 74, 337);
             Add_Action (Table.States (327), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (327));
             Add_Goto (Table.States (327), 122, 503);
-            Table.States (327).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (328).Productions := WisiToken.To_Vector ((1 => (211, 
0)));
+            Table.States (327).Kernel := To_Vector (((200, 312, 4, False), 
(200, 312, 3, False), (200, 312, 3, False),
+            (200, 312, 1, False)));
+            Table.States (327).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (328), (29, 47, 48, 50, 69, 71, 74, 104), 
(211, 0), 2, null, null);
-            Table.States (328).Minimal_Complete_Action := (Reduce, 211, 2);
-            Table.States (329).Productions := WisiToken.To_Vector (((198, 0), 
(198, 1), (198, 2), (198, 3)));
+            Table.States (328).Kernel := To_Vector ((0 => (211, 212, 0, 
True)));
+            Table.States (328).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 211, 2)));
+            Table.States (328).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (329), 7, Reduce, (236, 3), 0, null, 
null);
             Add_Action (Table.States (329), 33, 504);
             Add_Action (Table.States (329), 40, Reduce, (236, 3), 0, null, 
null);
@@ -4075,13 +4189,14 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (329), 106, Reduce, (236, 3), 0, null, 
null);
             Add_Error (Table.States (329));
             Add_Goto (Table.States (329), 236, 506);
-            Table.States (329).Minimal_Complete_Action := (Reduce, 236, 0);
-            Table.States (330).Productions := WisiToken.To_Vector ((1 => (303, 
3)));
+            Table.States (329).Kernel := To_Vector (((198, 81, 3, False), 
(198, 81, 4, False), (198, 81, 2, False),
+            (198, 81, 3, False)));
+            Table.States (329).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 236, 0)));
             Add_Action (Table.States (330), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (303, 3), 3, simple_statement_3'Access, null);
-            Table.States (330).Minimal_Complete_Action := (Reduce, 303, 3);
-            Table.States (331).Productions := WisiToken.To_Vector (((222, 0), 
(222, 1), (222, 2), (222, 3)));
+            Table.States (330).Kernel := To_Vector ((0 => (303, 96, 0, 
False)));
+            Table.States (330).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 303, 3)));
             Add_Action (Table.States (331), 4, 1);
             Add_Action (Table.States (331), 5, 2);
             Add_Action (Table.States (331), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4139,8 +4254,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (331), 303, 101);
             Add_Goto (Table.States (331), 306, 363);
             Add_Goto (Table.States (331), 323, 114);
-            Table.States (331).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (332).Productions := WisiToken.To_Vector ((1 => (332, 
0)));
+            Table.States (331).Kernel := To_Vector (((222, 68, 6, False), 
(222, 68, 4, False), (222, 68, 5, False),
+            (222, 68, 3, False)));
+            Table.States (331).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (332), 104, 119);
             Add_Action (Table.States (332), 105, 33);
             Add_Action (Table.States (332), 106, 34);
@@ -4150,15 +4266,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (332), 239, 219);
             Add_Goto (Table.States (332), 272, 92);
             Add_Goto (Table.States (332), 293, 97);
-            Table.States (332).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (333).Productions := WisiToken.To_Vector (((238, 0), 
(332, 1)));
+            Table.States (332).Kernel := To_Vector ((0 => (332, 74, 2, 
False)));
+            Table.States (332).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (333), 83, 381);
             Add_Action (Table.States (333), 96, 509);
             Add_Error (Table.States (333));
-            Table.States (333).Minimal_Complete_Action := (Shift, 96, 509);
-            Table.States (334).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (247, 0), (247, 1),
-            (248, 0), (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
-            Add_Action (Table.States (334), 35, 510, (122, 1), 0, null, null);
+            Table.States (333).Kernel := To_Vector (((238, 238, 2, True), 
(332, 238, 1, False)));
+            Table.States (333).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 509)));
+            Add_Action (Table.States (334), 35, 510);
+            Add_Conflict (Table.States (334), 35, (122, 1), 0, null, null);
             Add_Action (Table.States (334), 74, 337);
             Add_Action (Table.States (334), 76, 235);
             Add_Action (Table.States (334), 84, 237);
@@ -4168,12 +4284,17 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (334), 115, 241);
             Add_Goto (Table.States (334), 122, 511);
             Add_Goto (Table.States (334), 322, 242);
-            Table.States (334).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (335).Productions := WisiToken.To_Vector ((1 => (213, 
0)));
+            Table.States (334).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (247, 239, 4, False), (247, 239, 3, False), (248, 239, 3, False), 
(272, 239, 3, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (334).Minimal_Complete_Actions := To_Vector 
(((Reduce, 122, 0), (Shift, 35, 510)));
             Add_Action (Table.States (335), 39, 512);
             Add_Error (Table.States (335));
-            Table.States (335).Minimal_Complete_Action := (Shift, 39, 512);
-            Table.States (336).Productions := WisiToken.To_Vector ((1 => (250, 
0)));
+            Table.States (335).Kernel := To_Vector ((0 => (213, 35, 3, 
False)));
+            Table.States (335).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 512)));
+         end Subr_6;
+         procedure Subr_7
+         is begin
             Add_Action (Table.States (336), 104, 119);
             Add_Action (Table.States (336), 105, 33);
             Add_Action (Table.States (336), 106, 34);
@@ -4182,8 +4303,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (336), 239, 513);
             Add_Goto (Table.States (336), 272, 92);
             Add_Goto (Table.States (336), 293, 97);
-            Table.States (336).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (337).Productions := WisiToken.To_Vector ((1 => (122, 
0)));
+            Table.States (336).Kernel := To_Vector ((0 => (250, 56, 2, 
False)));
+            Table.States (336).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (337), 3, 121);
             Add_Action (Table.States (337), 35, Reduce, (124, 5), 0, null, 
null);
             Add_Action (Table.States (337), 39, 122);
@@ -4227,12 +4348,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (337), 320, 144);
             Add_Goto (Table.States (337), 321, 145);
             Add_Goto (Table.States (337), 330, 146);
-            Table.States (337).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (338).Productions := WisiToken.To_Vector (((251, 0), 
(251, 1)));
+            Table.States (337).Kernel := To_Vector ((0 => (122, 74, 0, 
False)));
+            Table.States (337).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
             Add_Action (Table.States (338), 35, 515);
             Add_Error (Table.States (338));
-            Table.States (338).Minimal_Complete_Action := (Shift, 35, 515);
-            Table.States (339).Productions := WisiToken.To_Vector (((257, 0), 
(257, 1)));
+            Table.States (338).Kernel := To_Vector (((251, 122, 3, False), 
(251, 122, 2, False)));
+            Table.States (338).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 515)));
             Add_Action (Table.States (339), 3, 121);
             Add_Action (Table.States (339), 15, 258);
             Add_Action (Table.States (339), 28, 259);
@@ -4282,30 +4403,27 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (339), 320, 144);
             Add_Goto (Table.States (339), 321, 145);
             Add_Goto (Table.States (339), 330, 146);
-            Table.States (339).Minimal_Complete_Action := (Reduce, 125, 0);
-         end Subr_6;
-         procedure Subr_7
-         is begin
-            Table.States (340).Productions := WisiToken.To_Vector ((1 => (257, 
2)));
+            Table.States (339).Kernel := To_Vector (((257, 76, 2, False), 
(257, 76, 4, False)));
+            Table.States (339).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
             Add_Action (Table.States (340), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (257, 2), 3, pragma_g_2'Access, null);
-            Table.States (340).Minimal_Complete_Action := (Reduce, 257, 3);
-            Table.States (341).Productions := WisiToken.To_Vector (((163, 0), 
(239, 5)));
-            Add_Action (Table.States (341), 71, Reduce, (163, 0), 1, null, 
null, (239, 5), 1, name_5'Access,
-            name_5_check'Access);
+            Table.States (340).Kernel := To_Vector ((0 => (257, 96, 0, 
False)));
+            Table.States (340).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 257, 3)));
+            Add_Action (Table.States (341), 71, Reduce, (163, 0), 1, null, 
null);
+            Add_Conflict (Table.States (341), 71, (239, 5), 1, name_5'Access, 
name_5_check'Access);
             Add_Action (Table.States (341), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (341), 84, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (341), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (341), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (341));
-            Table.States (341).Minimal_Complete_Action := (Reduce, 163, 1);
-            Table.States (342).Productions := WisiToken.To_Vector (((238, 0), 
(332, 2)));
+            Table.States (341).Kernel := To_Vector (((163, 104, 0, False), 
(239, 104, 0, False)));
+            Table.States (341).Minimal_Complete_Actions := To_Vector 
(((Reduce, 163, 1), (Reduce, 239, 1)));
             Add_Action (Table.States (342), 83, 381);
             Add_Action (Table.States (342), 96, 518);
             Add_Error (Table.States (342));
-            Table.States (342).Minimal_Complete_Action := (Shift, 96, 518);
-            Table.States (343).Productions := WisiToken.To_Vector (((245, 0), 
(245, 1), (245, 2)));
+            Table.States (342).Kernel := To_Vector (((238, 238, 2, True), 
(332, 238, 1, False)));
+            Table.States (342).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 518)));
             Add_Action (Table.States (343), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (343), 26, 385);
             Add_Action (Table.States (343), 40, 386);
@@ -4315,32 +4433,33 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (343));
             Add_Goto (Table.States (343), 114, 387);
             Add_Goto (Table.States (343), 241, 388);
-            Table.States (343).Minimal_Complete_Action := (Reduce, 241, 0);
-            Table.States (344).Productions := WisiToken.To_Vector ((1 => (253, 
0)));
+            Table.States (343).Kernel := To_Vector (((245, 81, 4, False), 
(245, 81, 5, False), (245, 81, 4, False)));
+            Table.States (343).Minimal_Complete_Actions := To_Vector 
(((Reduce, 241, 0), (Shift, 26, 385)));
             Add_Action (Table.States (344), (21, 35, 56, 72, 74, 77, 82, 96), 
(253, 0), 1, null, null);
-            Table.States (344).Minimal_Complete_Action := (Reduce, 253, 1);
-            Table.States (345).Productions := WisiToken.To_Vector ((1 => (262, 
0)));
+            Table.States (344).Kernel := To_Vector ((0 => (253, 199, 0, 
False)));
+            Table.States (344).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 1)));
             Add_Action (Table.States (345), (35, 56, 74, 96), (262, 0), 3, 
procedure_specification_0'Access,
             procedure_specification_0_check'Access);
-            Table.States (345).Minimal_Complete_Action := (Reduce, 262, 3);
-            Table.States (346).Productions := WisiToken.To_Vector (((264, 0), 
(265, 0)));
-            Add_Action (Table.States (346), 35, 519, (122, 1), 0, null, null);
+            Table.States (345).Kernel := To_Vector ((0 => (262, 253, 0, 
False)));
+            Table.States (345).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 262, 3)));
+            Add_Action (Table.States (346), 35, 519);
+            Add_Conflict (Table.States (346), 35, (122, 1), 0, null, null);
             Add_Action (Table.States (346), 74, 337);
             Add_Error (Table.States (346));
             Add_Goto (Table.States (346), 122, 520);
-            Table.States (346).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (347).Productions := WisiToken.To_Vector (((271, 0), 
(271, 1)));
+            Table.States (346).Kernel := To_Vector (((264, 104, 3, False), 
(265, 104, 3, False)));
+            Table.States (346).Minimal_Complete_Actions := To_Vector 
(((Reduce, 122, 0), (Shift, 35, 519)));
             Add_Action (Table.States (347), 35, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (347), 74, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (347), 76, 377);
             Add_Error (Table.States (347));
             Add_Goto (Table.States (347), 169, 521);
-            Table.States (347).Minimal_Complete_Action := (Reduce, 169, 0);
-            Table.States (348).Productions := WisiToken.To_Vector (((304, 0), 
(304, 1)));
+            Table.States (347).Kernel := To_Vector (((271, 104, 6, False), 
(271, 104, 3, False)));
+            Table.States (347).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 0)));
             Add_Action (Table.States (348), 35, 522);
             Add_Error (Table.States (348));
-            Table.States (348).Minimal_Complete_Action := (Shift, 35, 522);
-            Table.States (349).Productions := WisiToken.To_Vector ((1 => (276, 
0)));
+            Table.States (348).Kernel := To_Vector (((304, 122, 6, False), 
(304, 122, 3, False)));
+            Table.States (348).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 522)));
             Add_Action (Table.States (349), 3, 121);
             Add_Action (Table.States (349), 39, 122);
             Add_Action (Table.States (349), 40, 123);
@@ -4375,22 +4494,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (349), 320, 144);
             Add_Goto (Table.States (349), 321, 145);
             Add_Goto (Table.States (349), 330, 146);
-            Table.States (349).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (350).Productions := WisiToken.To_Vector ((1 => (276, 
1)));
+            Table.States (349).Kernel := To_Vector ((0 => (276, 74, 1, 
False)));
+            Table.States (349).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (350), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (276, 1), 3, raise_statement_1'Access, null);
-            Table.States (350).Minimal_Complete_Action := (Reduce, 276, 3);
-            Table.States (351).Productions := WisiToken.To_Vector ((1 => (290, 
0)));
+            Table.States (350).Kernel := To_Vector ((0 => (276, 96, 0, 
False)));
+            Table.States (350).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 276, 3)));
             Add_Action (Table.States (351), 5, 524);
             Add_Error (Table.States (351));
-            Table.States (351).Minimal_Complete_Action := (Shift, 5, 524);
-            Table.States (352).Productions := WisiToken.To_Vector ((1 => (290, 
1)));
+            Table.States (351).Kernel := To_Vector ((0 => (290, 74, 2, 
False)));
+            Table.States (351).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 5, 524)));
             Add_Action (Table.States (352), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (290, 1), 3, requeue_statement_1'Access, null);
-            Table.States (352).Minimal_Complete_Action := (Reduce, 290, 3);
-            Table.States (353).Productions := WisiToken.To_Vector (((194, 0), 
(194, 1)));
+            Table.States (352).Kernel := To_Vector ((0 => (290, 96, 0, 
False)));
+            Table.States (352).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 290, 3)));
             Add_Action (Table.States (353), 7, Reduce, (118, 1), 0, null, 
null);
             Add_Action (Table.States (353), 8, 401);
             Add_Action (Table.States (353), 16, Reduce, (118, 1), 0, null, 
null);
@@ -4403,18 +4522,18 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (353), 106, Reduce, (118, 1), 0, null, 
null);
             Add_Error (Table.States (353));
             Add_Goto (Table.States (353), 118, 525);
-            Table.States (353).Minimal_Complete_Action := (Reduce, 118, 0);
-            Table.States (354).Productions := WisiToken.To_Vector ((1 => (302, 
0)));
+            Table.States (353).Kernel := To_Vector (((194, 81, 2, False), 
(194, 81, 1, False)));
+            Table.States (353).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 118, 0)));
             Add_Action (Table.States (354), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (302, 0), 3, simple_return_statement_0'Access, null);
-            Table.States (354).Minimal_Complete_Action := (Reduce, 302, 3);
-            Table.States (355).Productions := WisiToken.To_Vector ((1 => (196, 
1)));
+            Table.States (354).Kernel := To_Vector ((0 => (302, 96, 0, 
False)));
+            Table.States (354).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 302, 3)));
             Add_Action (Table.States (355), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (196, 1), 3, extended_return_statement_1'Access, null);
-            Table.States (355).Minimal_Complete_Action := (Reduce, 196, 3);
-            Table.States (356).Productions := WisiToken.To_Vector ((1 => (196, 
0)));
+            Table.States (355).Kernel := To_Vector ((0 => (196, 96, 0, 
False)));
+            Table.States (355).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 196, 3)));
             Add_Action (Table.States (356), 4, 1);
             Add_Action (Table.States (356), 5, 2);
             Add_Action (Table.States (356), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4472,9 +4591,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (356), 303, 101);
             Add_Goto (Table.States (356), 306, 363);
             Add_Goto (Table.States (356), 323, 114);
-            Table.States (356).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (357).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (315, 0)));
+            Table.States (356).Kernel := To_Vector ((0 => (196, 21, 3, 
False)));
+            Table.States (356).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (357), 76, 235);
             Add_Action (Table.States (357), 77, 527);
             Add_Action (Table.States (357), 84, 237);
@@ -4483,15 +4601,18 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (357));
             Add_Goto (Table.States (357), 115, 241);
             Add_Goto (Table.States (357), 322, 242);
-            Table.States (357).Minimal_Complete_Action := (Shift, 77, 527);
-            Table.States (358).Productions := WisiToken.To_Vector ((1 => (295, 
4)));
+            Table.States (357).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (315, 239, 7, False)));
+            Table.States (357).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 527)));
             Add_Action (Table.States (358), (22, 24, 43), (295, 4), 2, 
select_alternative_4'Access, null);
-            Table.States (358).Minimal_Complete_Action := (Reduce, 295, 2);
-            Table.States (359).Productions := WisiToken.To_Vector (((295, 0), 
(295, 1), (295, 2)));
+            Table.States (358).Kernel := To_Vector ((0 => (295, 96, 0, 
False)));
+            Table.States (358).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 2)));
             Add_Action (Table.States (359), 87, 528);
             Add_Error (Table.States (359));
-            Table.States (359).Minimal_Complete_Action := (Shift, 87, 528);
-            Table.States (360).Productions := WisiToken.To_Vector (((131, 0), 
(239, 5)));
+            Table.States (359).Kernel := To_Vector (((295, 192, 4, False), 
(295, 192, 3, False), (295, 192, 3,
+            False)));
+            Table.States (359).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 528)));
             Add_Action (Table.States (360), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (360), 81, 529);
             Add_Action (Table.States (360), 82, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
@@ -4500,8 +4621,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (360), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (360), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (360));
-            Table.States (360).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (361).Productions := WisiToken.To_Vector (((299, 0), 
(300, 0)));
+            Table.States (360).Kernel := To_Vector (((131, 104, 1, False), 
(239, 104, 0, False)));
+            Table.States (360).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (361), 4, 1);
             Add_Action (Table.States (361), 5, 2);
             Add_Action (Table.States (361), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4561,22 +4682,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (361), 303, 101);
             Add_Goto (Table.States (361), 306, 530);
             Add_Goto (Table.States (361), 323, 114);
-            Table.States (361).Minimal_Complete_Action := (Reduce, 300, 1);
-            Table.States (362).Productions := WisiToken.To_Vector ((1 => (295, 
3)));
+            Table.States (361).Kernel := To_Vector (((299, 299, 2, True), 
(300, 299, 0, False)));
+            Table.States (361).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 1)));
             Add_Action (Table.States (362), (22, 24, 43), (295, 3), 2, null, 
null);
-            Table.States (362).Minimal_Complete_Action := (Reduce, 295, 2);
-            Table.States (363).Productions := WisiToken.To_Vector ((1 => (299, 
1)));
+            Table.States (362).Kernel := To_Vector ((0 => (295, 300, 0, 
False)));
+            Table.States (362).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 2)));
             Add_Action (Table.States (363), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
26, 27, 28, 31, 32, 37, 41, 43, 48, 52,
             57, 58, 61, 68, 72, 73, 93, 104, 105, 106), (299, 1), 1, null, 
null);
-            Table.States (363).Minimal_Complete_Action := (Reduce, 299, 1);
-            Table.States (364).Productions := WisiToken.To_Vector (((160, 0), 
(324, 2)));
+            Table.States (363).Kernel := To_Vector ((0 => (299, 306, 0, 
False)));
+            Table.States (363).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 299, 1)));
             Add_Action (Table.States (364), 22, Reduce, (160, 0), 2, null, 
null);
             Add_Action (Table.States (364), 24, Reduce, (160, 0), 2, null, 
null);
             Add_Action (Table.States (364), 43, Reduce, (160, 0), 2, null, 
null);
             Add_Action (Table.States (364), 68, Reduce, (324, 2), 2, null, 
null);
             Add_Error (Table.States (364));
-            Table.States (364).Minimal_Complete_Action := (Reduce, 160, 2);
-            Table.States (365).Productions := WisiToken.To_Vector ((1 => (152, 
0)));
+            Table.States (364).Kernel := To_Vector (((160, 300, 0, False), 
(324, 300, 0, False)));
+            Table.States (364).Minimal_Complete_Actions := To_Vector 
(((Reduce, 160, 2), (Reduce, 324, 2)));
             Add_Action (Table.States (365), 4, 1);
             Add_Action (Table.States (365), 5, 2);
             Add_Action (Table.States (365), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4632,26 +4753,26 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (365), 303, 101);
             Add_Goto (Table.States (365), 306, 363);
             Add_Goto (Table.States (365), 323, 114);
-            Table.States (365).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (366).Productions := WisiToken.To_Vector ((1 => (323, 
0)));
+            Table.States (365).Kernel := To_Vector ((0 => (152, 22, 3, 
False)));
+            Table.States (365).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (366), 18, 4);
             Add_Error (Table.States (366));
             Add_Goto (Table.States (366), 160, 532);
             Add_Goto (Table.States (366), 161, 533);
-            Table.States (366).Minimal_Complete_Action := (Shift, 18, 4);
-            Table.States (367).Productions := WisiToken.To_Vector (((178, 1), 
(324, 1)));
+            Table.States (366).Kernel := To_Vector ((0 => (323, 43, 5, 
False)));
+            Table.States (366).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 18, 4)));
             Add_Action (Table.States (367), 22, Reduce, (178, 1), 2, null, 
null);
             Add_Action (Table.States (367), 43, Reduce, (178, 1), 2, null, 
null);
             Add_Action (Table.States (367), 68, Reduce, (324, 1), 2, null, 
null);
             Add_Error (Table.States (367));
-            Table.States (367).Minimal_Complete_Action := (Reduce, 178, 2);
-            Table.States (368).Productions := WisiToken.To_Vector (((178, 0), 
(324, 0)));
+            Table.States (367).Kernel := To_Vector (((178, 300, 0, False), 
(324, 300, 0, False)));
+            Table.States (367).Minimal_Complete_Actions := To_Vector 
(((Reduce, 178, 2), (Reduce, 324, 2)));
             Add_Action (Table.States (368), 22, Reduce, (178, 0), 2, null, 
null);
             Add_Action (Table.States (368), 43, Reduce, (178, 0), 2, null, 
null);
             Add_Action (Table.States (368), 68, Reduce, (324, 0), 2, null, 
null);
             Add_Error (Table.States (368));
-            Table.States (368).Minimal_Complete_Action := (Reduce, 178, 2);
-            Table.States (369).Productions := WisiToken.To_Vector ((1 => (296, 
0)));
+            Table.States (368).Kernel := To_Vector (((178, 300, 0, False), 
(324, 300, 0, False)));
+            Table.States (368).Minimal_Complete_Actions := To_Vector 
(((Reduce, 178, 2), (Reduce, 324, 2)));
             Add_Action (Table.States (369), 4, 1);
             Add_Action (Table.States (369), 18, 4);
             Add_Action (Table.States (369), 67, 199);
@@ -4661,8 +4782,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (369), 160, 202);
             Add_Goto (Table.States (369), 161, 533);
             Add_Goto (Table.States (369), 295, 534);
-            Table.States (369).Minimal_Complete_Action := (Shift, 67, 199);
-            Table.States (370).Productions := WisiToken.To_Vector ((1 => (294, 
0)));
+            Table.States (369).Kernel := To_Vector ((0 => (296, 43, 2, True)));
+            Table.States (369).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 67, 199)));
+            Table.States (369).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (370), 4, 1);
             Add_Action (Table.States (370), 5, 2);
             Add_Action (Table.States (370), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4718,16 +4840,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (370), 303, 101);
             Add_Goto (Table.States (370), 306, 363);
             Add_Goto (Table.States (370), 323, 114);
-            Table.States (370).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (371).Productions := WisiToken.To_Vector ((1 => (294, 
1)));
+            Table.States (370).Kernel := To_Vector ((0 => (294, 22, 3, 
False)));
+            Table.States (370).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (371), 61, 536);
             Add_Error (Table.States (371));
-            Table.States (371).Minimal_Complete_Action := (Shift, 61, 536);
-            Table.States (372).Productions := WisiToken.To_Vector ((1 => (126, 
0)));
+            Table.States (371).Kernel := To_Vector ((0 => (294, 24, 2, 
False)));
+            Table.States (371).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 61, 536)));
             Add_Action (Table.States (372), 5, 537);
             Add_Error (Table.States (372));
-            Table.States (372).Minimal_Complete_Action := (Shift, 5, 537);
-            Table.States (373).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (372).Kernel := To_Vector ((0 => (126, 68, 4, 
False)));
+            Table.States (372).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 5, 537)));
             Add_Action (Table.States (373), 40, 483);
             Add_Action (Table.States (373), 104, 119);
             Add_Action (Table.States (373), 105, 33);
@@ -4738,27 +4860,30 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (373), 272, 92);
             Add_Goto (Table.States (373), 293, 97);
             Add_Goto (Table.States (373), 314, 538);
-            Table.States (373).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (374).Productions := WisiToken.To_Vector (((316, 0), 
(317, 0)));
-            Add_Action (Table.States (374), 35, 539, (122, 1), 0, null, null);
+            Table.States (373).Kernel := To_Vector ((0 => (313, 35, 2, 
False)));
+            Table.States (373).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Add_Action (Table.States (374), 35, 539);
+            Add_Conflict (Table.States (374), 35, (122, 1), 0, null, null);
             Add_Action (Table.States (374), 74, 337);
             Add_Error (Table.States (374));
             Add_Goto (Table.States (374), 122, 540);
-            Table.States (374).Minimal_Complete_Action := (Shift, 35, 539);
-            Table.States (375).Productions := WisiToken.To_Vector (((319, 0), 
(319, 1), (319, 2)));
+            Table.States (374).Kernel := To_Vector (((316, 104, 4, False), 
(317, 104, 3, False)));
+            Table.States (374).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 539)));
             Add_Action (Table.States (375), 35, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (375), 74, Reduce, (169, 2), 0, null, 
null);
             Add_Action (Table.States (375), 76, 377);
             Add_Action (Table.States (375), 96, Reduce, (169, 2), 0, null, 
null);
             Add_Error (Table.States (375));
             Add_Goto (Table.States (375), 169, 541);
-            Table.States (375).Minimal_Complete_Action := (Reduce, 169, 0);
-            Table.States (376).Productions := WisiToken.To_Vector (((305, 0), 
(305, 1), (305, 2)));
+            Table.States (375).Kernel := To_Vector (((319, 104, 6, False), 
(319, 104, 3, False), (319, 104, 1,
+            False)));
+            Table.States (375).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 0)));
             Add_Action (Table.States (376), 35, 542);
             Add_Action (Table.States (376), 96, 543);
             Add_Error (Table.States (376));
-            Table.States (376).Minimal_Complete_Action := (Shift, 96, 543);
-            Table.States (377).Productions := WisiToken.To_Vector (((169, 0), 
(169, 1)));
+            Table.States (376).Kernel := To_Vector (((305, 122, 6, False), 
(305, 122, 3, False), (305, 122, 1,
+            False)));
+            Table.States (376).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 543)));
             Add_Action (Table.States (377), 77, Reduce, (170, 4), 0, null, 
null);
             Add_Action (Table.States (377), 80, 544);
             Add_Action (Table.States (377), 96, Reduce, (170, 4), 0, null, 
null);
@@ -4767,13 +4892,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (377), 170, 545);
             Add_Goto (Table.States (377), 171, 546);
             Add_Goto (Table.States (377), 219, 547);
-            Table.States (377).Minimal_Complete_Action := (Reduce, 171, 0);
-            Table.States (378).Productions := WisiToken.To_Vector (((206, 0), 
(223, 0), (223, 1), (259, 0), (260, 0)));
+            Table.States (377).Kernel := To_Vector (((169, 76, 2, False), 
(169, 76, 1, False)));
+            Table.States (377).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 171, 0)));
             Add_Action (Table.States (378), 35, 548);
             Add_Action (Table.States (378), 96, 549);
             Add_Error (Table.States (378));
-            Table.States (378).Minimal_Complete_Action := (Shift, 96, 549);
-            Table.States (379).Productions := WisiToken.To_Vector ((1 => (331, 
0)));
+            Table.States (378).Kernel := To_Vector (((206, 169, 3, False), 
(223, 169, 3, False), (223, 169, 1, False),
+            (259, 169, 6, False), (260, 169, 3, False)));
+            Table.States (378).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 549)));
             Add_Action (Table.States (379), 104, 119);
             Add_Action (Table.States (379), 105, 33);
             Add_Action (Table.States (379), 106, 34);
@@ -4783,13 +4909,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (379), 239, 219);
             Add_Goto (Table.States (379), 272, 92);
             Add_Goto (Table.States (379), 293, 97);
-            Table.States (379).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (380).Productions := WisiToken.To_Vector (((238, 0), 
(331, 1)));
+            Table.States (379).Kernel := To_Vector ((0 => (331, 69, 2, 
False)));
+            Table.States (379).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (380), 83, 381);
             Add_Action (Table.States (380), 96, 551);
             Add_Error (Table.States (380));
-            Table.States (380).Minimal_Complete_Action := (Shift, 96, 551);
-            Table.States (381).Productions := WisiToken.To_Vector ((1 => (238, 
0)));
+            Table.States (380).Kernel := To_Vector (((238, 238, 2, True), 
(331, 238, 1, False)));
+            Table.States (380).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 551)));
             Add_Action (Table.States (381), 104, 119);
             Add_Action (Table.States (381), 105, 33);
             Add_Action (Table.States (381), 106, 34);
@@ -4798,35 +4924,36 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (381), 239, 552);
             Add_Goto (Table.States (381), 272, 92);
             Add_Goto (Table.States (381), 293, 97);
-            Table.States (381).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (382).Productions := WisiToken.To_Vector ((1 => (331, 
2)));
+            Table.States (381).Kernel := To_Vector ((0 => (238, 83, 1, True)));
+            Table.States (381).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (381).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (382), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (331, 2), 3,
             use_clause_2'Access, null);
-            Table.States (382).Minimal_Complete_Action := (Reduce, 331, 3);
-            Table.States (383).Productions := WisiToken.To_Vector ((1 => (332, 
3)));
+            Table.States (382).Kernel := To_Vector ((0 => (331, 96, 0, 
False)));
+            Table.States (382).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 331, 3)));
             Add_Action (Table.States (383), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (332, 3), 3,
             with_clause_3'Access, null);
-            Table.States (383).Minimal_Complete_Action := (Reduce, 332, 3);
-            Table.States (384).Productions := WisiToken.To_Vector ((1 => (217, 
0)));
+            Table.States (383).Kernel := To_Vector ((0 => (332, 96, 0, 
False)));
+            Table.States (383).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 332, 3)));
             Add_Action (Table.States (384), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (217, 0), 3, goto_label_0'Access, null);
-            Table.States (384).Minimal_Complete_Action := (Reduce, 217, 3);
-            Table.States (385).Productions := WisiToken.To_Vector ((1 => (245, 
2)));
+            Table.States (384).Kernel := To_Vector ((0 => (217, 90, 0, 
False)));
+            Table.States (384).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 217, 3)));
             Add_Action (Table.States (385), 56, 553);
             Add_Error (Table.States (385));
-            Table.States (385).Minimal_Complete_Action := (Shift, 56, 553);
-            Table.States (386).Productions := WisiToken.To_Vector ((1 => (241, 
0)));
+            Table.States (385).Kernel := To_Vector ((0 => (245, 26, 3, 
False)));
+            Table.States (385).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 553)));
             Add_Action (Table.States (386), 41, 554);
             Add_Error (Table.States (386));
-            Table.States (386).Minimal_Complete_Action := (Shift, 41, 554);
-            Table.States (387).Productions := WisiToken.To_Vector ((1 => (245, 
1)));
+            Table.States (386).Kernel := To_Vector ((0 => (241, 40, 1, 
False)));
+            Table.States (386).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 554)));
             Add_Action (Table.States (387), 56, 555);
             Add_Error (Table.States (387));
-            Table.States (387).Minimal_Complete_Action := (Shift, 56, 555);
-            Table.States (388).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1), (114, 2), (245, 0)));
+            Table.States (387).Kernel := To_Vector ((0 => (245, 114, 3, 
False)));
+            Table.States (387).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 555)));
             Add_Action (Table.States (388), 7, 556);
             Add_Action (Table.States (388), 104, 119);
             Add_Action (Table.States (388), 105, 33);
@@ -4836,21 +4963,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (388), 239, 557);
             Add_Goto (Table.States (388), 272, 92);
             Add_Goto (Table.States (388), 293, 97);
-            Table.States (388).Minimal_Complete_Action := (Shift, 7, 556);
-            Table.States (389).Productions := WisiToken.To_Vector ((1 => (133, 
1)));
+            Table.States (388).Kernel := To_Vector (((114, 241, 2, False), 
(114, 241, 3, True), (114, 241, 2, False),
+            (245, 241, 4, False)));
+            Table.States (388).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 7, 556)));
             Add_Action (Table.States (389), 24, 558);
             Add_Error (Table.States (389));
-            Table.States (389).Minimal_Complete_Action := (Shift, 24, 558);
-            Table.States (390).Productions := WisiToken.To_Vector (((218, 0), 
(218, 1)));
+            Table.States (389).Kernel := To_Vector ((0 => (133, 218, 2, 
False)));
+            Table.States (389).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 558)));
             Add_Action (Table.States (390), 24, Reduce, (218, 1), 1, null, 
null);
             Add_Action (Table.States (390), 26, 559);
             Add_Error (Table.States (390));
-            Table.States (390).Minimal_Complete_Action := (Reduce, 218, 1);
-            Table.States (391).Productions := WisiToken.To_Vector ((1 => (158, 
2)));
+            Table.States (390).Kernel := To_Vector (((218, 300, 1, False), 
(218, 300, 0, False)));
+            Table.States (390).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 1)));
             Add_Action (Table.States (391), (13, 24, 25, 28, 29, 30, 40, 46, 
47, 48, 49, 50, 51, 63, 66, 69, 71, 104),
             (158, 2), 1, null, null);
-            Table.States (391).Minimal_Complete_Action := (Reduce, 158, 1);
-            Table.States (392).Productions := WisiToken.To_Vector (((158, 0), 
(158, 1), (159, 0)));
+            Table.States (391).Kernel := To_Vector ((0 => (158, 157, 0, 
False)));
+            Table.States (391).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 158, 1)));
             Add_Action (Table.States (392), 13, Reduce, (159, 0), 1, null, 
null);
             Add_Action (Table.States (392), 24, Reduce, (159, 0), 1, null, 
null);
             Add_Action (Table.States (392), 25, Reduce, (246, 2), 0, null, 
null);
@@ -4921,27 +5049,30 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (392), 319, 113);
             Add_Goto (Table.States (392), 325, 115);
             Add_Goto (Table.States (392), 331, 116);
-            Table.States (392).Minimal_Complete_Action := (Reduce, 159, 1);
-            Table.States (393).Productions := WisiToken.To_Vector ((1 => (133, 
0)));
+            Table.States (392).Kernel := To_Vector (((158, 158, 3, True), 
(158, 158, 3, True), (159, 158, 0, False)));
+            Table.States (392).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 1)));
+         end Subr_7;
+         procedure Subr_8
+         is begin
             Add_Action (Table.States (393), 13, 562);
             Add_Error (Table.States (393));
-            Table.States (393).Minimal_Complete_Action := (Shift, 13, 562);
-            Table.States (394).Productions := WisiToken.To_Vector ((1 => (158, 
3)));
+            Table.States (393).Kernel := To_Vector ((0 => (133, 159, 3, 
False)));
+            Table.States (393).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 562)));
             Add_Action (Table.States (394), (13, 24, 25, 28, 29, 30, 40, 46, 
47, 48, 49, 50, 51, 63, 66, 69, 71, 104),
             (158, 3), 1, null, null);
-            Table.States (394).Minimal_Complete_Action := (Reduce, 158, 1);
-            Table.States (395).Productions := WisiToken.To_Vector (((230, 0), 
(230, 1), (230, 2), (230, 3), (230, 4),
-            (230, 5)));
+            Table.States (394).Kernel := To_Vector ((0 => (158, 257, 0, 
False)));
+            Table.States (394).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 158, 1)));
             Add_Action (Table.States (395), 33, 311);
             Add_Action (Table.States (395), 42, 312);
             Add_Action (Table.States (395), 81, 313);
             Add_Error (Table.States (395));
-            Table.States (395).Minimal_Complete_Action := (Shift, 42, 312);
-            Table.States (396).Productions := WisiToken.To_Vector ((1 => (232, 
1)));
+            Table.States (395).Kernel := To_Vector (((230, 104, 5, False), 
(230, 104, 4, False), (230, 104, 3, False),
+            (230, 104, 3, False), (230, 104, 2, False), (230, 104, 2, False)));
+            Table.States (395).Minimal_Complete_Actions := To_Vector (((Shift, 
42, 312), (Shift, 33, 311)));
             Add_Action (Table.States (396), 24, 563);
             Add_Error (Table.States (396));
-            Table.States (396).Minimal_Complete_Action := (Shift, 24, 563);
-            Table.States (397).Productions := WisiToken.To_Vector ((1 => (232, 
0)));
+            Table.States (396).Kernel := To_Vector ((0 => (232, 300, 3, 
False)));
+            Table.States (396).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 563)));
             Add_Action (Table.States (397), 4, 1);
             Add_Action (Table.States (397), 5, 2);
             Add_Action (Table.States (397), 13, Reduce, (132, 1), 0, null, 
null);
@@ -4997,12 +5128,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (397), 303, 101);
             Add_Goto (Table.States (397), 306, 363);
             Add_Goto (Table.States (397), 323, 114);
-            Table.States (397).Minimal_Complete_Action := (Reduce, 300, 0);
-         end Subr_7;
-         procedure Subr_8
-         is begin
-            Table.States (398).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (251, 0), (251, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (397).Kernel := To_Vector ((0 => (232, 37, 3, 
False)));
+            Table.States (397).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (398), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (398), 74, 337);
             Add_Action (Table.States (398), 76, 235);
@@ -5013,30 +5140,31 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (398), 115, 241);
             Add_Goto (Table.States (398), 122, 338);
             Add_Goto (Table.States (398), 322, 242);
-            Table.States (398).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (399).Productions := WisiToken.To_Vector ((1 => (214, 
0)));
+            Table.States (398).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (251, 239, 3, False), (251, 239, 2, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (398).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (399), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (214, 0), 3,
             generic_package_declaration_0'Access, null);
-            Table.States (399).Minimal_Complete_Action := (Reduce, 214, 3);
-            Table.States (400).Productions := WisiToken.To_Vector ((1 => (216, 
0)));
+            Table.States (399).Kernel := To_Vector ((0 => (214, 96, 0, 
False)));
+            Table.States (399).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 214, 3)));
             Add_Action (Table.States (400), 96, 565);
             Add_Error (Table.States (400));
-            Table.States (400).Minimal_Complete_Action := (Shift, 96, 565);
-            Table.States (401).Productions := WisiToken.To_Vector ((1 => (118, 
0)));
+            Table.States (400).Kernel := To_Vector ((0 => (216, 122, 1, 
False)));
+            Table.States (400).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 565)));
             Add_Action (Table.States (401), (7, 11, 16, 21, 33, 40, 45, 74, 
77, 82, 96, 104, 105, 106), (118, 0), 1,
             null, null);
-            Table.States (401).Minimal_Complete_Action := (Reduce, 118, 1);
-            Table.States (402).Productions := WisiToken.To_Vector ((1 => (157, 
9)));
+            Table.States (401).Kernel := To_Vector ((0 => (118, 8, 0, False)));
+            Table.States (401).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 118, 1)));
             Add_Action (Table.States (402), 82, 566);
             Add_Error (Table.States (402));
-            Table.States (402).Minimal_Complete_Action := (Shift, 82, 566);
-            Table.States (403).Productions := WisiToken.To_Vector ((1 => (186, 
0)));
+            Table.States (402).Kernel := To_Vector ((0 => (157, 16, 2, 
False)));
+            Table.States (402).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 82, 566)));
             Add_Action (Table.States (403), 96, 567);
             Add_Error (Table.States (403));
-            Table.States (403).Minimal_Complete_Action := (Shift, 96, 567);
-            Table.States (404).Productions := WisiToken.To_Vector (((244, 0), 
(244, 1), (244, 2), (244, 3), (244, 4),
-            (244, 5)));
+            Table.States (403).Kernel := To_Vector ((0 => (186, 26, 1, 
False)));
+            Table.States (403).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 567)));
             Add_Action (Table.States (404), 7, Reduce, (154, 1), 0, null, 
null);
             Add_Action (Table.States (404), 11, Reduce, (154, 1), 0, null, 
null);
             Add_Action (Table.States (404), 16, 568);
@@ -5049,20 +5177,22 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (404), 106, Reduce, (154, 1), 0, null, 
null);
             Add_Error (Table.States (404));
             Add_Goto (Table.States (404), 154, 569);
-            Table.States (404).Minimal_Complete_Action := (Reduce, 154, 0);
-            Table.States (405).Productions := WisiToken.To_Vector ((1 => (219, 
0)));
+            Table.States (404).Kernel := To_Vector (((244, 118, 3, False), 
(244, 118, 4, False), (244, 118, 10, False),
+            (244, 118, 2, False), (244, 118, 3, False), (244, 118, 9, False)));
+            Table.States (404).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 154, 0)));
             Add_Action (Table.States (405), (81, 83), (219, 0), 3, 
identifier_list_0'Access, null);
-            Table.States (405).Minimal_Complete_Action := (Reduce, 219, 3);
-            Table.States (406).Productions := WisiToken.To_Vector (((115, 0), 
(125, 0)));
+            Table.States (405).Kernel := To_Vector ((0 => (219, 104, 0, 
True)));
+            Table.States (405).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 219, 3)));
+            Table.States (405).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (406), 77, 570);
             Add_Action (Table.States (406), 83, 443);
             Add_Error (Table.States (406));
-            Table.States (406).Minimal_Complete_Action := (Shift, 77, 570);
-            Table.States (407).Productions := WisiToken.To_Vector ((1 => (115, 
1)));
+            Table.States (406).Kernel := To_Vector (((115, 125, 1, False), 
(125, 125, 1, True)));
+            Table.States (406).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 570)));
             Add_Action (Table.States (407), 77, 571);
             Add_Error (Table.States (407));
-            Table.States (407).Minimal_Complete_Action := (Shift, 77, 571);
-            Table.States (408).Productions := WisiToken.To_Vector (((124, 4), 
(165, 0)));
+            Table.States (407).Kernel := To_Vector ((0 => (115, 153, 1, 
False)));
+            Table.States (407).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 571)));
             Add_Action (Table.States (408), 35, Reduce, (124, 4), 1, 
association_opt_4'Access, null);
             Add_Action (Table.States (408), 77, Reduce, (124, 4), 1, 
association_opt_4'Access, null);
             Add_Action (Table.States (408), 79, Reduce, (165, 0), 1, null, 
null);
@@ -5070,80 +5200,86 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (408), 87, Reduce, (165, 0), 1, null, 
null);
             Add_Action (Table.States (408), 96, Reduce, (124, 4), 1, 
association_opt_4'Access, null);
             Add_Error (Table.States (408));
-            Table.States (408).Minimal_Complete_Action := (Reduce, 124, 1);
-            Table.States (409).Productions := WisiToken.To_Vector (((165, 2), 
(278, 1)));
+            Table.States (408).Kernel := To_Vector (((124, 191, 0, False), 
(165, 191, 0, False)));
+            Table.States (408).Minimal_Complete_Actions := To_Vector 
(((Reduce, 124, 1), (Reduce, 165, 1)));
             Add_Action (Table.States (409), 77, Reduce, (278, 1), 1, null, 
null);
             Add_Action (Table.States (409), 79, Reduce, (165, 2), 1, null, 
null);
             Add_Action (Table.States (409), 83, Reduce, (278, 1), 1, null, 
null);
             Add_Action (Table.States (409), 87, Reduce, (165, 2), 1, null, 
null);
             Add_Error (Table.States (409));
-            Table.States (409).Minimal_Complete_Action := (Reduce, 165, 1);
-            Table.States (410).Productions := WisiToken.To_Vector (((239, 0), 
(278, 0)));
+            Table.States (409).Kernel := To_Vector (((165, 277, 0, False), 
(278, 277, 0, False)));
+            Table.States (409).Minimal_Complete_Actions := To_Vector 
(((Reduce, 165, 1), (Reduce, 278, 1)));
             Add_Action (Table.States (410), 77, 572);
             Add_Action (Table.States (410), 83, 573);
             Add_Error (Table.States (410));
-            Table.States (410).Minimal_Complete_Action := (Shift, 77, 572);
-            Table.States (411).Productions := WisiToken.To_Vector ((1 => (123, 
0)));
+            Table.States (410).Kernel := To_Vector (((239, 278, 1, True), 
(278, 278, 4, True)));
+            Table.States (410).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 572)));
+            Table.States (410).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (411), 96, 574);
             Add_Error (Table.States (411));
-            Table.States (411).Minimal_Complete_Action := (Shift, 96, 574);
-            Table.States (412).Productions := WisiToken.To_Vector ((1 => (293, 
3)));
+            Table.States (411).Kernel := To_Vector ((0 => (123, 192, 1, 
False)));
+            Table.States (411).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 574)));
             Add_Action (Table.States (412), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (293, 3), 3,
             selected_component_3'Access, null);
-            Table.States (412).Minimal_Complete_Action := (Reduce, 293, 3);
-            Table.States (413).Productions := WisiToken.To_Vector ((1 => (293, 
0)));
+            Table.States (412).Kernel := To_Vector ((0 => (293, 9, 0, True)));
+            Table.States (412).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 293, 3)));
+            Table.States (412).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (413), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (293, 0), 3,
             selected_component_0'Access, selected_component_0_check'Access);
-            Table.States (413).Minimal_Complete_Action := (Reduce, 293, 3);
-            Table.States (414).Productions := WisiToken.To_Vector ((1 => (293, 
2)));
+            Table.States (413).Kernel := To_Vector ((0 => (293, 104, 0, 
True)));
+            Table.States (413).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 293, 3)));
+            Table.States (413).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (414), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (293, 2), 3,
             selected_component_2'Access, selected_component_2_check'Access);
-            Table.States (414).Minimal_Complete_Action := (Reduce, 293, 3);
-            Table.States (415).Productions := WisiToken.To_Vector ((1 => (293, 
1)));
+            Table.States (414).Kernel := To_Vector ((0 => (293, 105, 0, 
True)));
+            Table.States (414).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 293, 3)));
+            Table.States (414).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (415), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (293, 1), 3,
             selected_component_1'Access, null);
-            Table.States (415).Minimal_Complete_Action := (Reduce, 293, 3);
-            Table.States (416).Productions := WisiToken.To_Vector ((1 => (129, 
1)));
+            Table.States (415).Kernel := To_Vector ((0 => (293, 106, 0, 
True)));
+            Table.States (415).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 293, 3)));
+            Table.States (415).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (416), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (129, 1), 1, null, null);
-            Table.States (416).Minimal_Complete_Action := (Reduce, 129, 1);
-            Table.States (417).Productions := WisiToken.To_Vector ((1 => (129, 
2)));
+            Table.States (416).Kernel := To_Vector ((0 => (129, 7, 0, False)));
+            Table.States (416).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 129, 1)));
             Add_Action (Table.States (417), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (129, 2), 1, null, null);
-            Table.States (417).Minimal_Complete_Action := (Reduce, 129, 1);
-            Table.States (418).Productions := WisiToken.To_Vector ((1 => (129, 
3)));
+            Table.States (417).Kernel := To_Vector ((0 => (129, 19, 0, 
False)));
+            Table.States (417).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 129, 1)));
             Add_Action (Table.States (418), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (129, 3), 1, null, null);
-            Table.States (418).Minimal_Complete_Action := (Reduce, 129, 1);
-            Table.States (419).Productions := WisiToken.To_Vector ((1 => (129, 
4)));
+            Table.States (418).Kernel := To_Vector ((0 => (129, 20, 0, 
False)));
+            Table.States (418).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 129, 1)));
             Add_Action (Table.States (419), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (129, 4), 1, null, null);
-            Table.States (419).Minimal_Complete_Action := (Reduce, 129, 1);
-            Table.States (420).Productions := WisiToken.To_Vector ((1 => (272, 
0)));
+            Table.States (419).Kernel := To_Vector ((0 => (129, 38, 0, 
False)));
+            Table.States (419).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 129, 1)));
             Add_Action (Table.States (420), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (272, 0), 3,
             qualified_expression_0'Access, null);
-            Table.States (420).Minimal_Complete_Action := (Reduce, 272, 3);
-            Table.States (421).Productions := WisiToken.To_Vector ((1 => (128, 
0)));
+            Table.States (420).Kernel := To_Vector ((0 => (272, 117, 0, 
True)));
+            Table.States (420).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 272, 3)));
+            Table.States (420).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (421), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (128, 0), 3, null, null);
-            Table.States (421).Minimal_Complete_Action := (Reduce, 128, 3);
-            Table.States (422).Productions := WisiToken.To_Vector (((128, 0), 
(129, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (421).Kernel := To_Vector ((0 => (128, 129, 0, 
True)));
+            Table.States (421).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 128, 3)));
+            Table.States (421).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (422), 4, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 5, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 10, Reduce, (129, 0), 1, null, 
null);
@@ -5180,13 +5316,15 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (422), 73, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 74, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 75, Reduce, (129, 0), 1, null, 
null);
-            Add_Action (Table.States (422), 76, 235, (129, 0), 1, null, null);
+            Add_Action (Table.States (422), 76, 235);
+            Add_Conflict (Table.States (422), 76, (129, 0), 1, null, null);
             Add_Action (Table.States (422), 77, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 78, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 79, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 82, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 83, Reduce, (129, 0), 1, null, 
null);
-            Add_Action (Table.States (422), 84, 237, (129, 0), 1, null, null);
+            Add_Action (Table.States (422), 84, 237);
+            Add_Conflict (Table.States (422), 84, (129, 0), 1, null, null);
             Add_Action (Table.States (422), 85, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 86, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 87, Reduce, (129, 0), 1, null, 
null);
@@ -5202,25 +5340,29 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (422), 98, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 99, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 100, Reduce, (129, 0), 1, null, 
null);
-            Add_Action (Table.States (422), 101, 239, (129, 0), 1, null, null);
-            Add_Action (Table.States (422), 102, 240, (129, 0), 1, null, null);
+            Add_Action (Table.States (422), 101, 239);
+            Add_Conflict (Table.States (422), 101, (129, 0), 1, null, null);
+            Add_Action (Table.States (422), 102, 240);
+            Add_Conflict (Table.States (422), 102, (129, 0), 1, null, null);
             Add_Action (Table.States (422), 104, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 105, Reduce, (129, 0), 1, null, 
null);
             Add_Action (Table.States (422), 106, Reduce, (129, 0), 1, null, 
null);
             Add_Error (Table.States (422));
             Add_Goto (Table.States (422), 115, 241);
             Add_Goto (Table.States (422), 322, 242);
-            Table.States (422).Minimal_Complete_Action := (Reduce, 129, 1);
-            Table.States (423).Productions := WisiToken.To_Vector (((179, 0), 
(179, 1)));
+            Table.States (422).Kernel := To_Vector (((128, 239, 2, True), 
(129, 239, 0, True), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (422).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 129, 1)));
+            Table.States (422).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (423), 74, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (423), 76, 575);
             Add_Action (Table.States (423), 96, Reduce, (253, 1), 0, null, 
null);
             Add_Error (Table.States (423));
             Add_Goto (Table.States (423), 199, 344);
             Add_Goto (Table.States (423), 253, 576);
-            Table.States (423).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (424).Productions := WisiToken.To_Vector (((128, 0), 
(207, 0), (213, 2), (239, 0), (239, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (423).Kernel := To_Vector (((179, 104, 4, False), 
(179, 104, 1, False)));
+            Table.States (423).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (424), 35, 577);
             Add_Action (Table.States (424), 58, 317);
             Add_Action (Table.States (424), 76, 318);
@@ -5233,10 +5375,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (424), 252, 320);
             Add_Goto (Table.States (424), 291, 321);
             Add_Goto (Table.States (424), 322, 242);
-            Table.States (424).Minimal_Complete_Action := (Shift, 58, 317);
-            Table.States (425).Productions := WisiToken.To_Vector (((128, 0), 
(213, 1), (239, 0), (239, 1), (262, 0),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
-            Add_Action (Table.States (425), 35, 578, (253, 1), 0, null, null);
+            Table.States (424).Kernel := To_Vector (((128, 239, 2, True), 
(207, 239, 1, False), (213, 239, 4, False),
+            (239, 239, 5, True), (239, 239, 2, True), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (424).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 58, 317)));
+            Add_Action (Table.States (425), 35, 578);
+            Add_Conflict (Table.States (425), 35, (253, 1), 0, null, null);
             Add_Action (Table.States (425), 56, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (425), 74, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (425), 76, 318);
@@ -5249,22 +5393,24 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (425), 199, 344);
             Add_Goto (Table.States (425), 253, 345);
             Add_Goto (Table.States (425), 322, 242);
-            Table.States (425).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (426).Productions := WisiToken.To_Vector ((1 => (193, 
0)));
+            Table.States (425).Kernel := To_Vector (((128, 239, 2, True), 
(213, 239, 4, False), (239, 239, 5, True),
+            (239, 239, 2, True), (262, 239, 0, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (425).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (426), 76, 579);
             Add_Error (Table.States (426));
             Add_Goto (Table.States (426), 256, 580);
-            Table.States (426).Minimal_Complete_Action := (Shift, 76, 579);
-            Table.States (427).Productions := WisiToken.To_Vector ((1 => (243, 
0)));
+            Table.States (426).Kernel := To_Vector ((0 => (193, 35, 3, 
False)));
+            Table.States (426).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 76, 579)));
             Add_Action (Table.States (427), 41, 581);
             Add_Error (Table.States (427));
-            Table.States (427).Minimal_Complete_Action := (Shift, 41, 581);
-            Table.States (428).Productions := WisiToken.To_Vector (((112, 0), 
(308, 0)));
+            Table.States (427).Kernel := To_Vector ((0 => (243, 35, 2, 
False)));
+            Table.States (427).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 581)));
             Add_Action (Table.States (428), 6, 582);
             Add_Action (Table.States (428), 60, 583);
             Add_Error (Table.States (428));
-            Table.States (428).Minimal_Complete_Action := (Shift, 6, 582);
-            Table.States (429).Productions := WisiToken.To_Vector ((1 => (311, 
0)));
+            Table.States (428).Kernel := To_Vector (((112, 35, 2, False), 
(308, 35, 2, False)));
+            Table.States (428).Minimal_Complete_Actions := To_Vector (((Shift, 
6, 582), (Shift, 60, 583)));
             Add_Action (Table.States (429), 104, 119);
             Add_Action (Table.States (429), 105, 33);
             Add_Action (Table.States (429), 106, 34);
@@ -5273,13 +5419,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (429), 239, 584);
             Add_Goto (Table.States (429), 272, 92);
             Add_Goto (Table.States (429), 293, 97);
-            Table.States (429).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (430).Productions := WisiToken.To_Vector (((307, 0), 
(309, 0)));
+            Table.States (429).Kernel := To_Vector ((0 => (311, 56, 2, 
False)));
+            Table.States (429).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (430), 35, 585);
             Add_Action (Table.States (430), 96, 586);
             Add_Error (Table.States (430));
-            Table.States (430).Minimal_Complete_Action := (Shift, 96, 586);
-            Table.States (431).Productions := WisiToken.To_Vector ((1 => (199, 
0)));
+            Table.States (430).Kernel := To_Vector (((307, 122, 4, False), 
(309, 122, 1, False)));
+            Table.States (430).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 586)));
             Add_Action (Table.States (431), 77, Reduce, (254, 4), 0, null, 
null);
             Add_Action (Table.States (431), 96, Reduce, (254, 4), 0, null, 
null);
             Add_Action (Table.States (431), 104, 164);
@@ -5287,13 +5433,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (431), 219, 493);
             Add_Goto (Table.States (431), 254, 494);
             Add_Goto (Table.States (431), 255, 495);
-            Table.States (431).Minimal_Complete_Action := (Reduce, 255, 0);
-            Table.States (432).Productions := WisiToken.To_Vector (((113, 0), 
(113, 1)));
+            Table.States (431).Kernel := To_Vector ((0 => (199, 76, 1, 
False)));
+            Table.States (431).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 255, 0)));
             Add_Action (Table.States (432), 21, 587);
             Add_Action (Table.States (432), 96, 588);
             Add_Error (Table.States (432));
-            Table.States (432).Minimal_Complete_Action := (Shift, 96, 588);
-            Table.States (433).Productions := WisiToken.To_Vector ((1 => (275, 
0)));
+            Table.States (432).Kernel := To_Vector (((113, 253, 3, False), 
(113, 253, 1, False)));
+            Table.States (432).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 588)));
             Add_Action (Table.States (433), 3, 121);
             Add_Action (Table.States (433), 10, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (433), 20, Reduce, (192, 1), 0, null, 
null);
@@ -5344,27 +5490,29 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (433), 320, 144);
             Add_Goto (Table.States (433), 321, 145);
             Add_Goto (Table.States (433), 330, 146);
-            Table.States (433).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (434).Productions := WisiToken.To_Vector ((1 => (136, 
0)));
+            Table.States (433).Kernel := To_Vector ((0 => (275, 74, 0, True)));
+            Table.States (433).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
+            Table.States (433).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (434), 35, 590);
             Add_Error (Table.States (434));
-            Table.States (434).Minimal_Complete_Action := (Shift, 35, 590);
-            Table.States (435).Productions := WisiToken.To_Vector ((1 => (274, 
0)));
+            Table.States (434).Kernel := To_Vector ((0 => (136, 192, 3, 
False)));
+            Table.States (434).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 590)));
             Add_Action (Table.States (435), (1 =>  104), (274, 0), 1, null, 
null);
-            Table.States (435).Minimal_Complete_Action := (Reduce, 274, 1);
-            Table.States (436).Productions := WisiToken.To_Vector ((1 => (274, 
1)));
+            Table.States (435).Kernel := To_Vector ((0 => (274, 9, 0, False)));
+            Table.States (435).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 274, 1)));
             Add_Action (Table.States (436), (1 =>  104), (274, 1), 1, null, 
null);
-            Table.States (436).Minimal_Complete_Action := (Reduce, 274, 1);
-            Table.States (437).Productions := WisiToken.To_Vector ((1 => (273, 
0)));
+            Table.States (436).Kernel := To_Vector ((0 => (274, 62, 0, 
False)));
+            Table.States (436).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 274, 1)));
             Add_Action (Table.States (437), 104, 395);
             Add_Error (Table.States (437));
             Add_Goto (Table.States (437), 230, 591);
-            Table.States (437).Minimal_Complete_Action := (Shift, 104, 395);
-            Table.States (438).Productions := WisiToken.To_Vector (((221, 0), 
(221, 1), (221, 2), (221, 3)));
+            Table.States (437).Kernel := To_Vector ((0 => (273, 274, 4, 
False)));
+            Table.States (437).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 395)));
             Add_Action (Table.States (438), 68, 592);
             Add_Error (Table.States (438));
-            Table.States (438).Minimal_Complete_Action := (Shift, 68, 592);
-            Table.States (439).Productions := WisiToken.To_Vector (((165, 1), 
(258, 1)));
+            Table.States (438).Kernel := To_Vector (((221, 192, 4, False), 
(221, 192, 2, False), (221, 192, 3, False),
+            (221, 192, 1, False)));
+            Table.States (438).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 592)));
             Add_Action (Table.States (439), 10, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (439), 33, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (439), 35, Reduce, (258, 1), 1, null, 
null);
@@ -5399,12 +5547,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (439), 239, 593);
             Add_Goto (Table.States (439), 272, 92);
             Add_Goto (Table.States (439), 293, 97);
-            Table.States (439).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (440).Productions := WisiToken.To_Vector ((1 => (117, 
2)));
+            Table.States (439).Kernel := To_Vector (((165, 41, 1, False), 
(258, 41, 0, False)));
+            Table.States (439).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (440), 77, 594);
             Add_Error (Table.States (440));
-            Table.States (440).Minimal_Complete_Action := (Shift, 77, 594);
-            Table.States (441).Productions := WisiToken.To_Vector (((124, 0), 
(124, 1)));
+            Table.States (440).Kernel := To_Vector ((0 => (117, 54, 1, 
False)));
+            Table.States (440).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 594)));
             Add_Action (Table.States (441), 3, 121);
             Add_Action (Table.States (441), 35, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (441), 39, 122);
@@ -5443,14 +5591,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (441), 320, 144);
             Add_Goto (Table.States (441), 321, 145);
             Add_Goto (Table.States (441), 330, 146);
-            Table.States (441).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (442).Productions := WisiToken.To_Vector ((1 => (117, 
4)));
+            Table.States (441).Kernel := To_Vector (((124, 87, 0, False), 
(124, 87, 1, False)));
+            Table.States (441).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (442), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (117, 4), 3, aggregate_4'Access,
             null);
-            Table.States (442).Minimal_Complete_Action := (Reduce, 117, 3);
-            Table.States (443).Productions := WisiToken.To_Vector ((1 => (125, 
0)));
+            Table.States (442).Kernel := To_Vector ((0 => (117, 77, 0, 
False)));
+            Table.States (442).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 117, 3)));
             Add_Action (Table.States (443), 3, 121);
             Add_Action (Table.States (443), 35, Reduce, (124, 5), 0, null, 
null);
             Add_Action (Table.States (443), 39, 122);
@@ -5494,14 +5642,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (443), 320, 144);
             Add_Goto (Table.States (443), 321, 145);
             Add_Goto (Table.States (443), 330, 146);
-            Table.States (443).Minimal_Complete_Action := (Reduce, 124, 0);
-            Table.States (444).Productions := WisiToken.To_Vector ((1 => (117, 
3)));
+            Table.States (443).Kernel := To_Vector ((0 => (125, 83, 0, True)));
+            Table.States (443).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 124, 0)));
+            Table.States (443).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (444), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (117, 3), 3, aggregate_3'Access,
             null);
-            Table.States (444).Minimal_Complete_Action := (Reduce, 117, 3);
-            Table.States (445).Productions := WisiToken.To_Vector ((1 => (166, 
0)));
+            Table.States (444).Kernel := To_Vector ((0 => (117, 77, 0, 
False)));
+            Table.States (444).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 117, 3)));
             Add_Action (Table.States (445), 3, 121);
             Add_Action (Table.States (445), 39, 122);
             Add_Action (Table.States (445), 40, 261);
@@ -5537,8 +5686,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (445), 320, 144);
             Add_Goto (Table.States (445), 321, 145);
             Add_Goto (Table.States (445), 330, 146);
-            Table.States (445).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (446).Productions := WisiToken.To_Vector (((124, 2), 
(124, 3)));
+            Table.States (445).Kernel := To_Vector ((0 => (166, 79, 1, True)));
+            Table.States (445).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (445).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (446), 3, 121);
             Add_Action (Table.States (446), 35, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (446), 39, 122);
@@ -5577,8 +5727,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (446), 320, 144);
             Add_Goto (Table.States (446), 321, 145);
             Add_Goto (Table.States (446), 330, 146);
-            Table.States (446).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (447).Productions := WisiToken.To_Vector (((117, 0), 
(117, 1)));
+            Table.States (446).Kernel := To_Vector (((124, 87, 0, False), 
(124, 87, 1, False)));
+            Table.States (446).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
+         end Subr_8;
+         procedure Subr_9
+         is begin
             Add_Action (Table.States (447), 3, 121);
             Add_Action (Table.States (447), 39, 122);
             Add_Action (Table.States (447), 40, 261);
@@ -5621,8 +5774,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (447), 320, 144);
             Add_Goto (Table.States (447), 321, 145);
             Add_Goto (Table.States (447), 330, 146);
-            Table.States (447).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (448).Productions := WisiToken.To_Vector (((128, 0), 
(272, 0), (277, 0), (277, 1)));
+            Table.States (447).Kernel := To_Vector (((117, 74, 3, False), 
(117, 74, 1, False)));
+            Table.States (447).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
             Add_Action (Table.States (448), 7, 416);
             Add_Action (Table.States (448), 19, 417);
             Add_Action (Table.States (448), 20, 418);
@@ -5639,8 +5792,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (448), 239, 422);
             Add_Goto (Table.States (448), 272, 92);
             Add_Goto (Table.States (448), 293, 97);
-            Table.States (448).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (449).Productions := WisiToken.To_Vector ((1 => (277, 
2)));
+            Table.States (448).Kernel := To_Vector (((128, 322, 1, True), 
(272, 322, 2, True), (277, 322, 3, False),
+            (277, 322, 1, False)));
+            Table.States (448).Minimal_Complete_Actions := To_Vector (((Shift, 
104, 119), (Shift, 53, 604)));
+            Table.States (448).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (449), 3, 121);
             Add_Action (Table.States (449), 39, 122);
             Add_Action (Table.States (449), 40, 123);
@@ -5664,11 +5819,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (449), 320, 144);
             Add_Goto (Table.States (449), 321, 145);
             Add_Goto (Table.States (449), 330, 146);
-            Table.States (449).Minimal_Complete_Action := (Shift, 103, 129);
-         end Subr_8;
-         procedure Subr_9
-         is begin
-            Table.States (450).Productions := WisiToken.To_Vector ((1 => (140, 
0)));
+            Table.States (449).Kernel := To_Vector ((0 => (277, 85, 1, 
False)));
+            Table.States (449).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (450), 3, 121);
             Add_Action (Table.States (450), 39, 122);
             Add_Action (Table.States (450), 40, 261);
@@ -5707,25 +5859,26 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (450), 320, 144);
             Add_Goto (Table.States (450), 321, 145);
             Add_Goto (Table.States (450), 330, 146);
-            Table.States (450).Minimal_Complete_Action := (Reduce, 166, 0);
-            Table.States (451).Productions := WisiToken.To_Vector ((1 => (141, 
1)));
+            Table.States (450).Kernel := To_Vector ((0 => (140, 72, 1, 
False)));
+            Table.States (450).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 166, 0)));
             Add_Action (Table.States (451), (24, 72), (141, 1), 1, null, null);
-            Table.States (451).Minimal_Complete_Action := (Reduce, 141, 1);
-            Table.States (452).Productions := WisiToken.To_Vector (((139, 0), 
(141, 0)));
+            Table.States (451).Kernel := To_Vector ((0 => (141, 140, 0, 
False)));
+            Table.States (451).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 141, 1)));
             Add_Action (Table.States (452), 24, 607);
             Add_Action (Table.States (452), 72, 450);
             Add_Error (Table.States (452));
             Add_Goto (Table.States (452), 140, 608);
-            Table.States (452).Minimal_Complete_Action := (Shift, 24, 607);
-            Table.States (453).Productions := WisiToken.To_Vector ((1 => (197, 
0)));
+            Table.States (452).Kernel := To_Vector (((139, 141, 3, False), 
(141, 141, 2, True)));
+            Table.States (452).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 607)));
             Add_Action (Table.States (453), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99), (197, 0), 3, null, null);
-            Table.States (453).Minimal_Complete_Action := (Reduce, 197, 3);
-            Table.States (454).Productions := WisiToken.To_Vector ((1 => (282, 
0)));
+            Table.States (453).Kernel := To_Vector ((0 => (197, 258, 0, 
False)));
+            Table.States (453).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 197, 3)));
             Add_Action (Table.States (454), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (282,
             0), 3, null, null);
-            Table.States (454).Minimal_Complete_Action := (Reduce, 282, 3);
-            Table.States (455).Productions := WisiToken.To_Vector ((1 => (283, 
0)));
+            Table.States (454).Kernel := To_Vector ((0 => (282, 287, 0, 
True)));
+            Table.States (454).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 282, 3)));
+            Table.States (454).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (455), 3, 121);
             Add_Action (Table.States (455), 39, 122);
             Add_Action (Table.States (455), 40, 123);
@@ -5752,12 +5905,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (455), 320, 144);
             Add_Goto (Table.States (455), 321, 145);
             Add_Goto (Table.States (455), 330, 146);
-            Table.States (455).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (456).Productions := WisiToken.To_Vector ((1 => (284, 
0)));
+            Table.States (455).Kernel := To_Vector ((0 => (283, 68, 1, True)));
+            Table.States (455).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (455).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (456), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (284,
             0), 3, null, null);
-            Table.States (456).Minimal_Complete_Action := (Reduce, 284, 3);
-            Table.States (457).Productions := WisiToken.To_Vector ((1 => (285, 
0)));
+            Table.States (456).Kernel := To_Vector ((0 => (284, 287, 0, 
True)));
+            Table.States (456).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 284, 3)));
+            Table.States (456).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (457), 3, 121);
             Add_Action (Table.States (457), 39, 122);
             Add_Action (Table.States (457), 40, 123);
@@ -5784,12 +5939,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (457), 320, 144);
             Add_Goto (Table.States (457), 321, 145);
             Add_Goto (Table.States (457), 330, 146);
-            Table.States (457).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (458).Productions := WisiToken.To_Vector ((1 => (286, 
0)));
+            Table.States (457).Kernel := To_Vector ((0 => (285, 22, 1, True)));
+            Table.States (457).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (457).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (458), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (286,
             0), 3, null, null);
-            Table.States (458).Minimal_Complete_Action := (Reduce, 286, 3);
-            Table.States (459).Productions := WisiToken.To_Vector ((1 => (283, 
1)));
+            Table.States (458).Kernel := To_Vector ((0 => (286, 287, 0, 
True)));
+            Table.States (458).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 286, 3)));
+            Table.States (458).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (459), 3, 121);
             Add_Action (Table.States (459), 39, 122);
             Add_Action (Table.States (459), 40, 123);
@@ -5816,12 +5973,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (459), 320, 144);
             Add_Goto (Table.States (459), 321, 145);
             Add_Goto (Table.States (459), 330, 146);
-            Table.States (459).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (460).Productions := WisiToken.To_Vector ((1 => (282, 
1)));
+            Table.States (459).Kernel := To_Vector ((0 => (283, 68, 1, True)));
+            Table.States (459).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (459).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (460), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (282,
             1), 3, null, null);
-            Table.States (460).Minimal_Complete_Action := (Reduce, 282, 3);
-            Table.States (461).Productions := WisiToken.To_Vector ((1 => (285, 
1)));
+            Table.States (460).Kernel := To_Vector ((0 => (282, 287, 0, 
True)));
+            Table.States (460).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 282, 3)));
+            Table.States (460).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (461), 3, 121);
             Add_Action (Table.States (461), 39, 122);
             Add_Action (Table.States (461), 40, 123);
@@ -5848,16 +6007,19 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (461), 320, 144);
             Add_Goto (Table.States (461), 321, 145);
             Add_Goto (Table.States (461), 330, 146);
-            Table.States (461).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (462).Productions := WisiToken.To_Vector ((1 => (284, 
1)));
+            Table.States (461).Kernel := To_Vector ((0 => (285, 22, 1, True)));
+            Table.States (461).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (461).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (462), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (284,
             1), 3, null, null);
-            Table.States (462).Minimal_Complete_Action := (Reduce, 284, 3);
-            Table.States (463).Productions := WisiToken.To_Vector ((1 => (286, 
1)));
+            Table.States (462).Kernel := To_Vector ((0 => (284, 287, 0, 
True)));
+            Table.States (462).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 284, 3)));
+            Table.States (462).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (463), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (286,
             1), 3, null, null);
-            Table.States (463).Minimal_Complete_Action := (Reduce, 286, 3);
-            Table.States (464).Productions := WisiToken.To_Vector (((233, 0), 
(287, 1)));
+            Table.States (463).Kernel := To_Vector ((0 => (286, 287, 0, 
True)));
+            Table.States (463).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 286, 3)));
+            Table.States (463).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (464), 10, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 20, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 21, Reduce, (287, 1), 3, null, 
null);
@@ -5871,21 +6033,22 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (464), 74, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 75, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 77, Reduce, (287, 1), 3, null, 
null);
-            Add_Action (Table.States (464), 79, 613, (287, 1), 3, null, null);
+            Add_Action (Table.States (464), 79, 613);
+            Add_Conflict (Table.States (464), 79, (287, 1), 3, null, null);
             Add_Action (Table.States (464), 83, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 87, Reduce, (287, 1), 3, null, 
null);
             Add_Action (Table.States (464), 96, Reduce, (287, 1), 3, null, 
null);
             Add_Error (Table.States (464));
-            Table.States (464).Minimal_Complete_Action := (Reduce, 287, 3);
-            Table.States (465).Productions := WisiToken.To_Vector ((1 => (233, 
1)));
+            Table.States (464).Kernel := To_Vector (((233, 233, 2, True), 
(287, 233, 0, False)));
+            Table.States (464).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 3)));
             Add_Action (Table.States (465), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (233,
             1), 1, null, null);
-            Table.States (465).Minimal_Complete_Action := (Reduce, 233, 1);
-            Table.States (466).Productions := WisiToken.To_Vector ((1 => (234, 
1)));
+            Table.States (465).Kernel := To_Vector ((0 => (233, 234, 0, 
False)));
+            Table.States (465).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 233, 1)));
             Add_Action (Table.States (466), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (234,
             1), 1, null, null);
-            Table.States (466).Minimal_Complete_Action := (Reduce, 234, 1);
-            Table.States (467).Productions := WisiToken.To_Vector (((234, 0), 
(277, 2)));
+            Table.States (466).Kernel := To_Vector ((0 => (234, 277, 0, 
False)));
+            Table.States (466).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 234, 1)));
             Add_Action (Table.States (467), 10, Reduce, (234, 0), 1, null, 
null);
             Add_Action (Table.States (467), 20, Reduce, (234, 0), 1, null, 
null);
             Add_Action (Table.States (467), 21, Reduce, (234, 0), 1, null, 
null);
@@ -5905,8 +6068,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (467), 87, Reduce, (234, 0), 1, null, 
null);
             Add_Action (Table.States (467), 96, Reduce, (234, 0), 1, null, 
null);
             Add_Error (Table.States (467));
-            Table.States (467).Minimal_Complete_Action := (Reduce, 234, 1);
-            Table.States (468).Productions := WisiToken.To_Vector ((1 => (287, 
0)));
+            Table.States (467).Kernel := To_Vector (((234, 301, 0, False), 
(277, 301, 2, False)));
+            Table.States (467).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 234, 1)));
             Add_Action (Table.States (468), 3, 121);
             Add_Action (Table.States (468), 39, 122);
             Add_Action (Table.States (468), 40, 123);
@@ -5933,16 +6096,17 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (468), 320, 144);
             Add_Goto (Table.States (468), 321, 145);
             Add_Goto (Table.States (468), 330, 146);
-            Table.States (468).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (469).Productions := WisiToken.To_Vector ((1 => (287, 
2)));
+            Table.States (468).Kernel := To_Vector ((0 => (287, 33, 1, 
False)));
+            Table.States (468).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (469), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (287,
             2), 3, null, null);
-            Table.States (469).Minimal_Complete_Action := (Reduce, 287, 3);
-            Table.States (470).Productions := WisiToken.To_Vector ((1 => (320, 
0)));
+            Table.States (469).Kernel := To_Vector ((0 => (287, 301, 0, 
False)));
+            Table.States (469).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 3)));
             Add_Action (Table.States (470), (10, 20, 21, 22, 23, 33, 35, 37, 
38, 40, 42, 43, 53, 55, 68, 74, 75, 77,
             78, 79, 82, 83, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 
99), (320, 0), 3, null, null);
-            Table.States (470).Minimal_Complete_Action := (Reduce, 320, 3);
-            Table.States (471).Productions := WisiToken.To_Vector (((320, 0), 
(321, 0)));
+            Table.States (470).Kernel := To_Vector ((0 => (320, 197, 0, 
True)));
+            Table.States (470).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 320, 3)));
+            Table.States (470).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (471), 10, Reduce, (321, 0), 3, null, 
null);
             Add_Action (Table.States (471), 20, Reduce, (321, 0), 3, null, 
null);
             Add_Action (Table.States (471), 21, Reduce, (321, 0), 3, null, 
null);
@@ -5980,17 +6144,18 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (471), 99, 300);
             Add_Error (Table.States (471));
             Add_Goto (Table.States (471), 237, 301);
-            Table.States (471).Minimal_Complete_Action := (Reduce, 321, 3);
-            Table.States (472).Productions := WisiToken.To_Vector ((1 => (161, 
0)));
+            Table.States (471).Kernel := To_Vector (((320, 320, 2, True), 
(321, 320, 0, True)));
+            Table.States (471).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 321, 3)));
+            Table.States (471).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (472), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (161, 0), 4, delay_statement_0'Access, null);
-            Table.States (472).Minimal_Complete_Action := (Reduce, 161, 4);
-            Table.States (473).Productions := WisiToken.To_Vector ((1 => (190, 
0)));
+            Table.States (472).Kernel := To_Vector ((0 => (161, 96, 0, 
False)));
+            Table.States (472).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 161, 4)));
             Add_Action (Table.States (473), 96, 615);
             Add_Error (Table.States (473));
-            Table.States (473).Minimal_Complete_Action := (Shift, 96, 615);
-            Table.States (474).Productions := WisiToken.To_Vector (((197, 3), 
(314, 0), (314, 1)));
+            Table.States (473).Kernel := To_Vector ((0 => (190, 192, 1, 
False)));
+            Table.States (473).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 615)));
             Add_Action (Table.States (474), 39, 122);
             Add_Action (Table.States (474), 41, 616);
             Add_Action (Table.States (474), 76, 126);
@@ -6005,8 +6170,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (474), 258, 256);
             Add_Goto (Table.States (474), 272, 92);
             Add_Goto (Table.States (474), 293, 97);
-            Table.States (474).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (475).Productions := WisiToken.To_Vector ((1 => (230, 
2)));
+            Table.States (474).Kernel := To_Vector (((197, 40, 1, False), 
(314, 40, 6, False), (314, 40, 2, False)));
+            Table.States (474).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (475), 3, 121);
             Add_Action (Table.States (475), 39, 122);
             Add_Action (Table.States (475), 40, 474);
@@ -6033,12 +6198,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (475), 320, 144);
             Add_Goto (Table.States (475), 321, 145);
             Add_Goto (Table.States (475), 330, 146);
-            Table.States (475).Minimal_Complete_Action := (Shift, 40, 474);
-            Table.States (476).Productions := WisiToken.To_Vector ((1 => (230, 
5)));
+            Table.States (475).Kernel := To_Vector ((0 => (230, 59, 1, 
False)));
+            Table.States (475).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (476), (37, 87), (230, 5), 3, 
iterator_specification_5'Access, null);
-            Table.States (476).Minimal_Complete_Action := (Reduce, 230, 3);
-            Table.States (477).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (258, 3), (272, 0),
-            (277, 0), (277, 1), (293, 0), (293, 1), (293, 2), (293, 3), (314, 
2), (314, 3)));
+            Table.States (476).Kernel := To_Vector ((0 => (230, 167, 0, 
False)));
+            Table.States (476).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 3)));
             Add_Action (Table.States (477), 10, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 33, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 37, Reduce, (314, 3), 1, 
subtype_indication_3'Access, null);
@@ -6049,17 +6213,17 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (477), 55, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 75, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 76, 619);
-            Add_Action (Table.States (477), 77, Reduce, (258, 3), 1, null, 
null, (314, 3), 1,
-            subtype_indication_3'Access, null);
+            Add_Action (Table.States (477), 77, Reduce, (258, 3), 1, null, 
null);
+            Add_Conflict (Table.States (477), 77, (314, 3), 1, 
subtype_indication_3'Access, null);
             Add_Action (Table.States (477), 78, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 79, Reduce, (258, 3), 1, null, 
null);
-            Add_Action (Table.States (477), 83, Reduce, (258, 3), 1, null, 
null, (314, 3), 1,
-            subtype_indication_3'Access, null);
+            Add_Action (Table.States (477), 83, Reduce, (258, 3), 1, null, 
null);
+            Add_Conflict (Table.States (477), 83, (314, 3), 1, 
subtype_indication_3'Access, null);
             Add_Action (Table.States (477), 84, 237);
             Add_Action (Table.States (477), 85, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 86, Reduce, (258, 3), 1, null, 
null);
-            Add_Action (Table.States (477), 87, Reduce, (258, 3), 1, null, 
null, (314, 3), 1,
-            subtype_indication_3'Access, null);
+            Add_Action (Table.States (477), 87, Reduce, (258, 3), 1, null, 
null);
+            Add_Conflict (Table.States (477), 87, (314, 3), 1, 
subtype_indication_3'Access, null);
             Add_Action (Table.States (477), 88, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 89, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (477), 91, Reduce, (258, 3), 1, null, 
null);
@@ -6077,18 +6241,20 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (477), 155, 620);
             Add_Goto (Table.States (477), 224, 621);
             Add_Goto (Table.States (477), 322, 448);
-            Table.States (477).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (478).Productions := WisiToken.To_Vector ((1 => (167, 
1)));
+            Table.States (477).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (258, 239, 0, False), (272, 239, 3, True), (277, 239, 4, False), 
(277, 239, 2, False), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True), (293, 239, 2, True), 
(314, 239, 4, False), (314, 239, 0, False)));
+            Table.States (477).Minimal_Complete_Actions := To_Vector 
(((Reduce, 258, 1), (Reduce, 314, 1)));
             Add_Action (Table.States (478), (37, 77, 83, 87), (167, 1), 1, 
null, null);
-            Table.States (478).Minimal_Complete_Action := (Reduce, 167, 1);
-            Table.States (479).Productions := WisiToken.To_Vector ((1 => (277, 
2)));
+            Table.States (478).Kernel := To_Vector ((0 => (167, 277, 0, 
False)));
+            Table.States (478).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 167, 1)));
             Add_Action (Table.States (479), 85, 449);
             Add_Error (Table.States (479));
-            Table.States (479).Minimal_Complete_Action := (Shift, 85, 449);
-            Table.States (480).Productions := WisiToken.To_Vector ((1 => (167, 
0)));
+            Table.States (479).Kernel := To_Vector ((0 => (277, 301, 2, 
False)));
+            Table.States (479).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 85, 449)));
             Add_Action (Table.States (480), (37, 77, 83, 87), (167, 0), 1, 
null, null);
-            Table.States (480).Minimal_Complete_Action := (Reduce, 167, 1);
-            Table.States (481).Productions := WisiToken.To_Vector ((1 => (230, 
3)));
+            Table.States (480).Kernel := To_Vector ((0 => (167, 314, 0, 
False)));
+            Table.States (480).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 167, 1)));
             Add_Action (Table.States (481), 104, 119);
             Add_Action (Table.States (481), 105, 33);
             Add_Action (Table.States (481), 106, 34);
@@ -6097,9 +6263,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (481), 239, 622);
             Add_Goto (Table.States (481), 272, 92);
             Add_Goto (Table.States (481), 293, 97);
-            Table.States (481).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (482).Productions := WisiToken.To_Vector (((128, 0), 
(230, 4), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (481).Kernel := To_Vector ((0 => (230, 59, 1, 
False)));
+            Table.States (481).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (482), 37, Reduce, (230, 4), 3, null, 
null);
             Add_Action (Table.States (482), 76, 235);
             Add_Action (Table.States (482), 84, 237);
@@ -6109,13 +6274,14 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (482));
             Add_Goto (Table.States (482), 115, 241);
             Add_Goto (Table.States (482), 322, 242);
-            Table.States (482).Minimal_Complete_Action := (Reduce, 230, 3);
-            Table.States (483).Productions := WisiToken.To_Vector (((314, 0), 
(314, 1)));
+            Table.States (482).Kernel := To_Vector (((128, 239, 2, True), 
(230, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (482).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 3)));
             Add_Action (Table.States (483), 41, 623);
             Add_Error (Table.States (483));
-            Table.States (483).Minimal_Complete_Action := (Shift, 41, 623);
-            Table.States (484).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (314, 2), (314, 3)));
+            Table.States (483).Kernel := To_Vector (((314, 40, 6, False), 
(314, 40, 2, False)));
+            Table.States (483).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 623)));
             Add_Action (Table.States (484), 10, Reduce, (314, 3), 1, 
subtype_indication_3'Access, null);
             Add_Action (Table.States (484), 21, Reduce, (314, 3), 1, 
subtype_indication_3'Access, null);
             Add_Action (Table.States (484), 42, Reduce, (314, 3), 1, 
subtype_indication_3'Access, null);
@@ -6132,16 +6298,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (484), 155, 620);
             Add_Goto (Table.States (484), 224, 621);
             Add_Goto (Table.States (484), 322, 242);
-            Table.States (484).Minimal_Complete_Action := (Reduce, 314, 1);
-            Table.States (485).Productions := WisiToken.To_Vector (((230, 0), 
(230, 1)));
+            Table.States (484).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (314, 239, 4, False), (314, 239, 0, False)));
+            Table.States (484).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 314, 1)));
             Add_Action (Table.States (485), 42, 624);
             Add_Error (Table.States (485));
-            Table.States (485).Minimal_Complete_Action := (Shift, 42, 624);
-            Table.States (486).Productions := WisiToken.To_Vector ((1 => (121, 
0)));
+            Table.States (485).Kernel := To_Vector (((230, 314, 3, False), 
(230, 314, 2, False)));
+            Table.States (485).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 42, 624)));
             Add_Action (Table.States (486), 96, 625);
             Add_Error (Table.States (486));
-            Table.States (486).Minimal_Complete_Action := (Shift, 96, 625);
-            Table.States (487).Productions := WisiToken.To_Vector ((1 => (127, 
0)));
+            Table.States (486).Kernel := To_Vector ((0 => (121, 192, 1, 
False)));
+            Table.States (486).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 625)));
             Add_Action (Table.States (487), 3, 121);
             Add_Action (Table.States (487), 39, 122);
             Add_Action (Table.States (487), 40, 123);
@@ -6176,21 +6344,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (487), 320, 144);
             Add_Goto (Table.States (487), 321, 145);
             Add_Goto (Table.States (487), 330, 146);
-            Table.States (487).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (488).Productions := WisiToken.To_Vector ((1 => (281, 
0)));
+            Table.States (487).Kernel := To_Vector ((0 => (127, 12, 1, 
False)));
+            Table.States (487).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (488), 12, 627);
             Add_Action (Table.States (488), 104, Reduce, (235, 1), 0, null, 
null);
             Add_Error (Table.States (488));
             Add_Goto (Table.States (488), 235, 628);
-            Table.States (488).Minimal_Complete_Action := (Reduce, 235, 0);
-            Table.States (489).Productions := WisiToken.To_Vector ((1 => (182, 
0)));
+            Table.States (488).Kernel := To_Vector ((0 => (281, 54, 11, 
False)));
+            Table.States (488).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 235, 0)));
             Add_Action (Table.States (489), 96, 629);
             Add_Error (Table.States (489));
-            Table.States (489).Minimal_Complete_Action := (Shift, 96, 629);
-            Table.States (490).Productions := WisiToken.To_Vector ((1 => (291, 
1)));
+            Table.States (489).Kernel := To_Vector ((0 => (182, 117, 1, 
False)));
+            Table.States (489).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 629)));
             Add_Action (Table.States (490), (21, 35, 56, 74, 77, 82, 96), 
(291, 1), 2, result_profile_1'Access, null);
-            Table.States (490).Minimal_Complete_Action := (Reduce, 291, 2);
-            Table.States (491).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1), (114, 2), (291, 0)));
+            Table.States (490).Kernel := To_Vector ((0 => (291, 114, 0, 
True)));
+            Table.States (490).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 291, 2)));
+            Table.States (490).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (491), 7, 556);
             Add_Action (Table.States (491), 21, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (491), 35, Reduce, (240, 1), 0, null, 
null);
@@ -6208,8 +6377,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (491), 240, 631);
             Add_Goto (Table.States (491), 272, 92);
             Add_Goto (Table.States (491), 293, 97);
-            Table.States (491).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (492).Productions := WisiToken.To_Vector (((219, 1), 
(239, 5)));
+            Table.States (491).Kernel := To_Vector (((114, 241, 2, False), 
(114, 241, 3, True), (114, 241, 2, False),
+            (291, 241, 0, False)));
+            Table.States (491).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (492), 10, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 33, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 38, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
@@ -6222,9 +6392,9 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (492), 77, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 78, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 79, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
-            Add_Action (Table.States (492), 81, Reduce, (219, 1), 1, null, 
null);
-            Add_Action (Table.States (492), 83, Reduce, (219, 1), 1, null, 
null, (239, 5), 1, name_5'Access,
-            name_5_check'Access);
+            Add_Action (Table.States (492), 81, Reduce, (219, 1), 1, 
identifier_list_1'Access, null);
+            Add_Action (Table.States (492), 83, Reduce, (219, 1), 1, 
identifier_list_1'Access, null);
+            Add_Conflict (Table.States (492), 83, (239, 5), 1, name_5'Access, 
name_5_check'Access);
             Add_Action (Table.States (492), 84, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 85, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 86, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
@@ -6242,25 +6412,30 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (492), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (492), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (492));
-            Table.States (492).Minimal_Complete_Action := (Reduce, 219, 1);
-            Table.States (493).Productions := WisiToken.To_Vector (((219, 0), 
(254, 0), (254, 1), (254, 2), (254, 3)));
+            Table.States (492).Kernel := To_Vector (((219, 104, 0, False), 
(239, 104, 0, False)));
+            Table.States (492).Minimal_Complete_Actions := To_Vector 
(((Reduce, 219, 1), (Reduce, 239, 1)));
+         end Subr_9;
+         procedure Subr_10
+         is begin
             Add_Action (Table.States (493), 81, 632);
             Add_Action (Table.States (493), 83, 234);
             Add_Error (Table.States (493));
-            Table.States (493).Minimal_Complete_Action := (Shift, 81, 632);
-            Table.States (494).Productions := WisiToken.To_Vector ((1 => (255, 
1)));
+            Table.States (493).Kernel := To_Vector (((219, 219, 2, True), 
(254, 219, 3, False), (254, 219, 2, False),
+            (254, 219, 4, False), (254, 219, 3, False)));
+            Table.States (493).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 81, 632)));
             Add_Action (Table.States (494), (77, 96), (255, 1), 1, null, null);
-            Table.States (494).Minimal_Complete_Action := (Reduce, 255, 1);
-            Table.States (495).Productions := WisiToken.To_Vector (((199, 0), 
(255, 0)));
+            Table.States (494).Kernel := To_Vector ((0 => (255, 254, 0, 
False)));
+            Table.States (494).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 255, 1)));
             Add_Action (Table.States (495), 77, 633);
             Add_Action (Table.States (495), 96, 634);
             Add_Error (Table.States (495));
-            Table.States (495).Minimal_Complete_Action := (Shift, 77, 633);
-            Table.States (496).Productions := WisiToken.To_Vector ((1 => (252, 
0)));
+            Table.States (495).Kernel := To_Vector (((199, 255, 1, False), 
(255, 255, 1, True)));
+            Table.States (495).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 633)));
             Add_Action (Table.States (496), (21, 35, 56, 74, 77, 82, 96), 
(252, 0), 2,
             parameter_and_result_profile_0'Access, null);
-            Table.States (496).Minimal_Complete_Action := (Reduce, 252, 2);
-            Table.States (497).Productions := WisiToken.To_Vector ((1 => (215, 
2)));
+            Table.States (496).Kernel := To_Vector ((0 => (252, 291, 0, 
True)));
+            Table.States (496).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 252, 2)));
+            Table.States (496).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (497), 104, 119);
             Add_Action (Table.States (497), 105, 33);
             Add_Action (Table.States (497), 106, 34);
@@ -6269,8 +6444,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (497), 239, 635);
             Add_Goto (Table.States (497), 272, 92);
             Add_Goto (Table.States (497), 293, 97);
-            Table.States (497).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (498).Productions := WisiToken.To_Vector ((1 => (215, 
0)));
+            Table.States (497).Kernel := To_Vector ((0 => (215, 56, 2, 
False)));
+            Table.States (497).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (498), 104, 119);
             Add_Action (Table.States (498), 105, 33);
             Add_Action (Table.States (498), 106, 34);
@@ -6279,8 +6454,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (498), 239, 636);
             Add_Goto (Table.States (498), 272, 92);
             Add_Goto (Table.States (498), 293, 97);
-            Table.States (498).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (499).Productions := WisiToken.To_Vector ((1 => (215, 
1)));
+            Table.States (498).Kernel := To_Vector ((0 => (215, 56, 2, 
False)));
+            Table.States (498).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (499), 104, 119);
             Add_Action (Table.States (499), 105, 33);
             Add_Action (Table.States (499), 106, 34);
@@ -6289,16 +6464,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (499), 239, 637);
             Add_Goto (Table.States (499), 272, 92);
             Add_Goto (Table.States (499), 293, 97);
-            Table.States (499).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (500).Productions := WisiToken.To_Vector (((201, 0), 
(201, 1), (201, 2)));
+            Table.States (499).Kernel := To_Vector ((0 => (215, 56, 2, 
False)));
+            Table.States (499).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (500), 35, 638);
             Add_Action (Table.States (500), 74, 337);
             Add_Action (Table.States (500), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (500));
             Add_Goto (Table.States (500), 122, 639);
-            Table.States (500).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (501).Productions := WisiToken.To_Vector (((128, 0), 
(204, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (500).Kernel := To_Vector (((201, 169, 3, False), 
(201, 169, 3, False), (201, 169, 1,
+            False)));
+            Table.States (500).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (501), 35, 640);
             Add_Action (Table.States (501), 76, 235);
             Add_Action (Table.States (501), 84, 237);
@@ -6307,8 +6482,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (501));
             Add_Goto (Table.States (501), 115, 241);
             Add_Goto (Table.States (501), 322, 242);
-            Table.States (501).Minimal_Complete_Action := (Shift, 35, 640);
-            Table.States (502).Productions := WisiToken.To_Vector (((200, 0), 
(200, 1), (200, 2)));
+            Table.States (501).Kernel := To_Vector (((128, 239, 2, True), 
(204, 239, 4, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (501).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 640)));
             Add_Action (Table.States (502), 6, 641);
             Add_Action (Table.States (502), 41, 642);
             Add_Action (Table.States (502), 80, 643);
@@ -6321,15 +6498,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (502), 272, 92);
             Add_Goto (Table.States (502), 293, 97);
             Add_Goto (Table.States (502), 310, 645);
-            Table.States (502).Minimal_Complete_Action := (Shift, 104, 119);
-         end Subr_9;
-         procedure Subr_10
-         is begin
-            Table.States (503).Productions := WisiToken.To_Vector ((1 => (200, 
3)));
+            Table.States (502).Kernel := To_Vector (((200, 35, 3, False), 
(200, 35, 2, False), (200, 35, 2, False)));
+            Table.States (502).Minimal_Complete_Actions := To_Vector (((Shift, 
104, 119), (Shift, 6, 641)));
             Add_Action (Table.States (503), 96, 646);
             Add_Error (Table.States (503));
-            Table.States (503).Minimal_Complete_Action := (Shift, 96, 646);
-            Table.States (504).Productions := WisiToken.To_Vector (((236, 0), 
(236, 1)));
+            Table.States (503).Kernel := To_Vector ((0 => (200, 122, 1, 
False)));
+            Table.States (503).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 646)));
             Add_Action (Table.States (504), 7, Reduce, (236, 0), 1, null, 
null);
             Add_Action (Table.States (504), 40, Reduce, (236, 0), 1, null, 
null);
             Add_Action (Table.States (504), 45, 647);
@@ -6340,11 +6514,11 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (504), 105, Reduce, (236, 0), 1, null, 
null);
             Add_Action (Table.States (504), 106, Reduce, (236, 0), 1, null, 
null);
             Add_Error (Table.States (504));
-            Table.States (504).Minimal_Complete_Action := (Reduce, 236, 1);
-            Table.States (505).Productions := WisiToken.To_Vector ((1 => (236, 
2)));
+            Table.States (504).Kernel := To_Vector (((236, 33, 0, False), 
(236, 33, 1, False)));
+            Table.States (504).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 236, 1)));
             Add_Action (Table.States (505), (7, 40, 74, 82, 96, 104, 105, 
106), (236, 2), 1, null, null);
-            Table.States (505).Minimal_Complete_Action := (Reduce, 236, 1);
-            Table.States (506).Productions := WisiToken.To_Vector (((198, 0), 
(198, 1), (198, 2), (198, 3)));
+            Table.States (505).Kernel := To_Vector ((0 => (236, 45, 0, 
False)));
+            Table.States (505).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 236, 1)));
             Add_Action (Table.States (506), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (506), 40, 386);
             Add_Action (Table.States (506), 104, Reduce, (241, 1), 0, null, 
null);
@@ -6353,34 +6527,36 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (506));
             Add_Goto (Table.States (506), 114, 648);
             Add_Goto (Table.States (506), 241, 649);
-            Table.States (506).Minimal_Complete_Action := (Reduce, 241, 0);
-            Table.States (507).Productions := WisiToken.To_Vector (((222, 0), 
(222, 1), (222, 2), (222, 3)));
+            Table.States (506).Kernel := To_Vector (((198, 236, 3, False), 
(198, 236, 4, False), (198, 236, 2, False),
+            (198, 236, 3, False)));
+            Table.States (506).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 0)));
             Add_Action (Table.States (507), 22, 650);
             Add_Action (Table.States (507), 23, 651);
             Add_Action (Table.States (507), 24, 652);
             Add_Error (Table.States (507));
             Add_Goto (Table.States (507), 174, 653);
             Add_Goto (Table.States (507), 175, 654);
-            Table.States (507).Minimal_Complete_Action := (Shift, 24, 652);
-            Table.States (508).Productions := WisiToken.To_Vector (((238, 0), 
(332, 0)));
+            Table.States (507).Kernel := To_Vector (((222, 300, 6, False), 
(222, 300, 4, False), (222, 300, 5, False),
+            (222, 300, 3, False)));
+            Table.States (507).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 652)));
             Add_Action (Table.States (508), 83, 381);
             Add_Action (Table.States (508), 96, 655);
             Add_Error (Table.States (508));
-            Table.States (508).Minimal_Complete_Action := (Shift, 96, 655);
-            Table.States (509).Productions := WisiToken.To_Vector ((1 => (332, 
1)));
+            Table.States (508).Kernel := To_Vector (((238, 238, 2, True), 
(332, 238, 1, False)));
+            Table.States (508).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 655)));
             Add_Action (Table.States (509), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (332, 1), 4,
             with_clause_1'Access, null);
-            Table.States (509).Minimal_Complete_Action := (Reduce, 332, 4);
-            Table.States (510).Productions := WisiToken.To_Vector ((1 => (248, 
0)));
+            Table.States (509).Kernel := To_Vector ((0 => (332, 96, 0, 
False)));
+            Table.States (509).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 332, 4)));
             Add_Action (Table.States (510), 60, 656);
             Add_Error (Table.States (510));
-            Table.States (510).Minimal_Complete_Action := (Shift, 60, 656);
-            Table.States (511).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1)));
+            Table.States (510).Kernel := To_Vector ((0 => (248, 35, 2, 
False)));
+            Table.States (510).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 60, 656)));
             Add_Action (Table.States (511), 35, 657);
             Add_Error (Table.States (511));
-            Table.States (511).Minimal_Complete_Action := (Shift, 35, 657);
-            Table.States (512).Productions := WisiToken.To_Vector ((1 => (213, 
0)));
+            Table.States (511).Kernel := To_Vector (((247, 122, 4, False), 
(247, 122, 3, False)));
+            Table.States (511).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 657)));
             Add_Action (Table.States (512), 104, 119);
             Add_Action (Table.States (512), 105, 33);
             Add_Action (Table.States (512), 106, 34);
@@ -6389,9 +6565,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (512), 239, 658);
             Add_Goto (Table.States (512), 272, 92);
             Add_Goto (Table.States (512), 293, 97);
-            Table.States (512).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (513).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (250, 0), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (512).Kernel := To_Vector ((0 => (213, 39, 2, 
False)));
+            Table.States (512).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (513), 74, 337);
             Add_Action (Table.States (513), 76, 235);
             Add_Action (Table.States (513), 84, 237);
@@ -6402,14 +6577,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (513), 115, 241);
             Add_Goto (Table.States (513), 122, 659);
             Add_Goto (Table.States (513), 322, 242);
-            Table.States (513).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (514).Productions := WisiToken.To_Vector (((122, 0), 
(125, 0)));
+            Table.States (513).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (250, 239, 1, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (513).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (514), 35, Reduce, (122, 0), 2, 
aspect_specification_opt_0'Access, null);
             Add_Action (Table.States (514), 83, 443);
             Add_Action (Table.States (514), 96, Reduce, (122, 0), 2, 
aspect_specification_opt_0'Access, null);
             Add_Error (Table.States (514));
-            Table.States (514).Minimal_Complete_Action := (Reduce, 122, 2);
-            Table.States (515).Productions := WisiToken.To_Vector (((251, 0), 
(251, 1)));
+            Table.States (514).Kernel := To_Vector (((122, 125, 0, False), 
(125, 125, 1, True)));
+            Table.States (514).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 2)));
             Add_Action (Table.States (515), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (515), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (515), 28, 183);
@@ -6481,36 +6658,36 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (515), 319, 113);
             Add_Goto (Table.States (515), 325, 115);
             Add_Goto (Table.States (515), 331, 116);
-            Table.States (515).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (516).Productions := WisiToken.To_Vector (((125, 0), 
(257, 0)));
+            Table.States (515).Kernel := To_Vector (((251, 35, 2, False), 
(251, 35, 1, False)));
+            Table.States (515).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (516), 77, 661);
             Add_Action (Table.States (516), 83, 443);
             Add_Error (Table.States (516));
-            Table.States (516).Minimal_Complete_Action := (Shift, 77, 661);
-            Table.States (517).Productions := WisiToken.To_Vector ((1 => (257, 
1)));
+            Table.States (516).Kernel := To_Vector (((125, 125, 1, True), 
(257, 125, 2, False)));
+            Table.States (516).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 661)));
             Add_Action (Table.States (517), 77, 662);
             Add_Error (Table.States (517));
-            Table.States (517).Minimal_Complete_Action := (Shift, 77, 662);
-            Table.States (518).Productions := WisiToken.To_Vector ((1 => (332, 
2)));
+            Table.States (517).Kernel := To_Vector ((0 => (257, 153, 2, 
False)));
+            Table.States (517).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 662)));
             Add_Action (Table.States (518), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (332, 2), 4,
             with_clause_2'Access, null);
-            Table.States (518).Minimal_Complete_Action := (Reduce, 332, 4);
-            Table.States (519).Productions := WisiToken.To_Vector ((1 => (265, 
0)));
+            Table.States (518).Kernel := To_Vector ((0 => (332, 96, 0, 
False)));
+            Table.States (518).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 332, 4)));
             Add_Action (Table.States (519), 60, 663);
             Add_Error (Table.States (519));
-            Table.States (519).Minimal_Complete_Action := (Shift, 60, 663);
-            Table.States (520).Productions := WisiToken.To_Vector ((1 => (264, 
0)));
+            Table.States (519).Kernel := To_Vector ((0 => (265, 35, 2, 
False)));
+            Table.States (519).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 60, 663)));
             Add_Action (Table.States (520), 35, 664);
             Add_Error (Table.States (520));
-            Table.States (520).Minimal_Complete_Action := (Shift, 35, 664);
-            Table.States (521).Productions := WisiToken.To_Vector (((271, 0), 
(271, 1)));
+            Table.States (520).Kernel := To_Vector ((0 => (264, 122, 3, 
False)));
+            Table.States (520).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 664)));
             Add_Action (Table.States (521), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (521), 74, 337);
             Add_Error (Table.States (521));
             Add_Goto (Table.States (521), 122, 665);
-            Table.States (521).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (522).Productions := WisiToken.To_Vector (((304, 0), 
(304, 1)));
+            Table.States (521).Kernel := To_Vector (((271, 169, 6, False), 
(271, 169, 3, False)));
+            Table.States (521).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (522), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (522), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (522), 28, 183);
@@ -6584,16 +6761,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (522), 319, 113);
             Add_Goto (Table.States (522), 325, 115);
             Add_Goto (Table.States (522), 331, 116);
-            Table.States (522).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (523).Productions := WisiToken.To_Vector ((1 => (276, 
0)));
+            Table.States (522).Kernel := To_Vector (((304, 35, 5, False), 
(304, 35, 2, False)));
+            Table.States (522).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (523), 96, 669);
             Add_Error (Table.States (523));
-            Table.States (523).Minimal_Complete_Action := (Shift, 96, 669);
-            Table.States (524).Productions := WisiToken.To_Vector ((1 => (290, 
0)));
+            Table.States (523).Kernel := To_Vector ((0 => (276, 192, 1, 
False)));
+            Table.States (523).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 669)));
             Add_Action (Table.States (524), 96, 670);
             Add_Error (Table.States (524));
-            Table.States (524).Minimal_Complete_Action := (Shift, 96, 670);
-            Table.States (525).Productions := WisiToken.To_Vector (((194, 0), 
(194, 1)));
+            Table.States (524).Kernel := To_Vector ((0 => (290, 5, 1, False)));
+            Table.States (524).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 670)));
             Add_Action (Table.States (525), 7, Reduce, (154, 1), 0, null, 
null);
             Add_Action (Table.States (525), 16, 568);
             Add_Action (Table.States (525), 21, Reduce, (154, 1), 0, null, 
null);
@@ -6605,12 +6782,12 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (525), 106, Reduce, (154, 1), 0, null, 
null);
             Add_Error (Table.States (525));
             Add_Goto (Table.States (525), 154, 671);
-            Table.States (525).Minimal_Complete_Action := (Reduce, 154, 0);
-            Table.States (526).Productions := WisiToken.To_Vector ((1 => (196, 
0)));
+            Table.States (525).Kernel := To_Vector (((194, 118, 2, False), 
(194, 118, 1, False)));
+            Table.States (525).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 154, 0)));
             Add_Action (Table.States (526), 24, 672);
             Add_Error (Table.States (526));
-            Table.States (526).Minimal_Complete_Action := (Shift, 24, 672);
-            Table.States (527).Productions := WisiToken.To_Vector ((1 => (315, 
0)));
+            Table.States (526).Kernel := To_Vector ((0 => (196, 218, 3, 
False)));
+            Table.States (526).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 672)));
             Add_Action (Table.States (527), 29, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (527), 40, 12);
             Add_Action (Table.States (527), 46, 14);
@@ -6627,8 +6804,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (527), 264, 89);
             Add_Goto (Table.States (527), 307, 105);
             Add_Goto (Table.States (527), 316, 111);
-            Table.States (527).Minimal_Complete_Action := (Reduce, 246, 0);
-            Table.States (528).Productions := WisiToken.To_Vector (((295, 0), 
(295, 1), (295, 2)));
+            Table.States (527).Kernel := To_Vector ((0 => (315, 77, 6, 
False)));
+            Table.States (527).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 246, 0)));
             Add_Action (Table.States (528), 4, 1);
             Add_Action (Table.States (528), 18, 4);
             Add_Action (Table.States (528), 67, 678);
@@ -6636,24 +6813,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (528), 113, 679);
             Add_Goto (Table.States (528), 160, 680);
             Add_Goto (Table.States (528), 161, 533);
-            Table.States (528).Minimal_Complete_Action := (Shift, 67, 678);
-            Table.States (529).Productions := WisiToken.To_Vector ((1 => (131, 
0)));
+            Table.States (528).Kernel := To_Vector (((295, 87, 3, False), 
(295, 87, 2, False), (295, 87, 2, False)));
+            Table.States (528).Minimal_Complete_Actions := To_Vector (((Shift, 
67, 678), (Shift, 18, 4)));
             Add_Action (Table.States (529), (13, 17, 28, 37, 73), (131, 0), 2, 
block_label_0'Access,
             block_label_0_check'Access);
-            Table.States (529).Minimal_Complete_Action := (Reduce, 131, 2);
-            Table.States (530).Productions := WisiToken.To_Vector ((1 => (299, 
0)));
+            Table.States (529).Kernel := To_Vector ((0 => (131, 81, 0, 
False)));
+            Table.States (529).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 131, 2)));
             Add_Action (Table.States (530), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
26, 27, 28, 31, 32, 37, 41, 43, 48, 52,
             57, 58, 61, 68, 72, 73, 93, 104, 105, 106), (299, 0), 2, null, 
null);
-            Table.States (530).Minimal_Complete_Action := (Reduce, 299, 2);
-            Table.States (531).Productions := WisiToken.To_Vector ((1 => (152, 
0)));
+            Table.States (530).Kernel := To_Vector ((0 => (299, 306, 0, 
True)));
+            Table.States (530).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 299, 2)));
+            Table.States (530).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (531), 24, 681);
             Add_Error (Table.States (531));
-            Table.States (531).Minimal_Complete_Action := (Shift, 24, 681);
-            Table.States (532).Productions := WisiToken.To_Vector ((1 => (323, 
0)));
+            Table.States (531).Kernel := To_Vector ((0 => (152, 300, 3, 
False)));
+            Table.States (531).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 681)));
             Add_Action (Table.States (532), 24, 682);
             Add_Error (Table.States (532));
-            Table.States (532).Minimal_Complete_Action := (Shift, 24, 682);
-            Table.States (533).Productions := WisiToken.To_Vector ((1 => (160, 
0)));
+            Table.States (532).Kernel := To_Vector ((0 => (323, 160, 3, 
False)));
+            Table.States (532).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 682)));
             Add_Action (Table.States (533), 4, 1);
             Add_Action (Table.States (533), 5, 2);
             Add_Action (Table.States (533), 13, Reduce, (132, 1), 0, null, 
null);
@@ -6711,19 +6889,20 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (533), 303, 101);
             Add_Goto (Table.States (533), 306, 363);
             Add_Goto (Table.States (533), 323, 114);
-            Table.States (533).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (534).Productions := WisiToken.To_Vector ((1 => (296, 
0)));
+            Table.States (533).Kernel := To_Vector ((0 => (160, 161, 0, 
False)));
+            Table.States (533).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (534), (22, 24, 43), (296, 0), 3, 
select_alternative_list_0'Access, null);
-            Table.States (534).Minimal_Complete_Action := (Reduce, 296, 3);
-            Table.States (535).Productions := WisiToken.To_Vector ((1 => (294, 
0)));
+            Table.States (534).Kernel := To_Vector ((0 => (296, 295, 0, 
True)));
+            Table.States (534).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 296, 3)));
+            Table.States (534).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (535), 24, 684);
             Add_Error (Table.States (535));
-            Table.States (535).Minimal_Complete_Action := (Shift, 24, 684);
-            Table.States (536).Productions := WisiToken.To_Vector ((1 => (294, 
1)));
+            Table.States (535).Kernel := To_Vector ((0 => (294, 300, 3, 
False)));
+            Table.States (535).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 684)));
             Add_Action (Table.States (536), 96, 685);
             Add_Error (Table.States (536));
-            Table.States (536).Minimal_Complete_Action := (Shift, 96, 685);
-            Table.States (537).Productions := WisiToken.To_Vector ((1 => (126, 
0)));
+            Table.States (536).Kernel := To_Vector ((0 => (294, 61, 1, 
False)));
+            Table.States (536).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 685)));
             Add_Action (Table.States (537), 4, 1);
             Add_Action (Table.States (537), 5, 2);
             Add_Action (Table.States (537), 13, Reduce, (132, 1), 0, null, 
null);
@@ -6779,29 +6958,30 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (537), 303, 101);
             Add_Goto (Table.States (537), 306, 363);
             Add_Goto (Table.States (537), 323, 114);
-            Table.States (537).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (538).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (537).Kernel := To_Vector ((0 => (126, 5, 3, False)));
+            Table.States (537).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (538), 74, 337);
             Add_Action (Table.States (538), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (538));
             Add_Goto (Table.States (538), 122, 687);
-            Table.States (538).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (539).Productions := WisiToken.To_Vector ((1 => (317, 
0)));
+            Table.States (538).Kernel := To_Vector ((0 => (313, 314, 1, 
False)));
+            Table.States (538).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (539), 60, 688);
             Add_Error (Table.States (539));
-            Table.States (539).Minimal_Complete_Action := (Shift, 60, 688);
-            Table.States (540).Productions := WisiToken.To_Vector ((1 => (316, 
0)));
+            Table.States (539).Kernel := To_Vector ((0 => (317, 35, 2, 
False)));
+            Table.States (539).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 60, 688)));
             Add_Action (Table.States (540), 35, 689);
             Add_Error (Table.States (540));
-            Table.States (540).Minimal_Complete_Action := (Shift, 35, 689);
-            Table.States (541).Productions := WisiToken.To_Vector (((319, 0), 
(319, 1), (319, 2)));
+            Table.States (540).Kernel := To_Vector ((0 => (316, 122, 4, 
False)));
+            Table.States (540).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 689)));
             Add_Action (Table.States (541), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (541), 74, 337);
             Add_Action (Table.States (541), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (541));
             Add_Goto (Table.States (541), 122, 690);
-            Table.States (541).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (542).Productions := WisiToken.To_Vector (((305, 0), 
(305, 1)));
+            Table.States (541).Kernel := To_Vector (((319, 169, 6, False), 
(319, 169, 3, False), (319, 169, 1,
+            False)));
+            Table.States (541).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (542), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (542), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (542), 28, 183);
@@ -6875,30 +7055,31 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (542), 319, 113);
             Add_Goto (Table.States (542), 325, 115);
             Add_Goto (Table.States (542), 331, 116);
-            Table.States (542).Minimal_Complete_Action := (Reduce, 318, 0);
-            Table.States (543).Productions := WisiToken.To_Vector ((1 => (305, 
2)));
+            Table.States (542).Kernel := To_Vector (((305, 35, 5, False), 
(305, 35, 2, False)));
+            Table.States (542).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 0)));
             Add_Action (Table.States (543), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (305, 2), 4,
             single_task_declaration_2'Access, null);
-            Table.States (543).Minimal_Complete_Action := (Reduce, 305, 4);
-            Table.States (544).Productions := WisiToken.To_Vector ((1 => (169, 
0)));
+            Table.States (543).Kernel := To_Vector ((0 => (305, 96, 0, 
False)));
+            Table.States (543).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 305, 4)));
             Add_Action (Table.States (544), 77, 694);
             Add_Error (Table.States (544));
-            Table.States (544).Minimal_Complete_Action := (Shift, 77, 694);
-            Table.States (545).Productions := WisiToken.To_Vector ((1 => (171, 
1)));
+            Table.States (544).Kernel := To_Vector ((0 => (169, 80, 1, 
False)));
+            Table.States (544).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 694)));
             Add_Action (Table.States (545), (77, 96), (171, 1), 1, null, null);
-            Table.States (545).Minimal_Complete_Action := (Reduce, 171, 1);
-            Table.States (546).Productions := WisiToken.To_Vector (((169, 1), 
(171, 0)));
+            Table.States (545).Kernel := To_Vector ((0 => (171, 170, 0, 
False)));
+            Table.States (545).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 171, 1)));
             Add_Action (Table.States (546), 77, 695);
             Add_Action (Table.States (546), 96, 696);
             Add_Error (Table.States (546));
-            Table.States (546).Minimal_Complete_Action := (Shift, 77, 695);
-            Table.States (547).Productions := WisiToken.To_Vector (((170, 0), 
(170, 1), (170, 2), (170, 3), (219, 0)));
+            Table.States (546).Kernel := To_Vector (((169, 171, 1, False), 
(171, 171, 1, True)));
+            Table.States (546).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 695)));
             Add_Action (Table.States (547), 81, 697);
             Add_Action (Table.States (547), 83, 234);
             Add_Error (Table.States (547));
-            Table.States (547).Minimal_Complete_Action := (Shift, 81, 697);
-            Table.States (548).Productions := WisiToken.To_Vector (((206, 0), 
(223, 0), (259, 0), (260, 0)));
+            Table.States (547).Kernel := To_Vector (((170, 219, 3, False), 
(170, 219, 4, False), (170, 219, 2, False),
+            (170, 219, 3, False), (219, 219, 2, True)));
+            Table.States (547).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 81, 697)));
             Add_Action (Table.States (548), 6, 698);
             Add_Action (Table.States (548), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (548), 11, 699);
@@ -6907,7 +7088,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (548), 34, 702);
             Add_Action (Table.States (548), 36, 703);
             Add_Action (Table.States (548), 38, 704);
-            Add_Action (Table.States (548), 39, Reduce, (109, 5), 0, null, 
null, (110, 3), 0, null, null);
+            Add_Action (Table.States (548), 39, Reduce, (109, 5), 0, null, 
null);
+            Add_Conflict (Table.States (548), 39, (110, 3), 0, null, null);
             Add_Action (Table.States (548), 40, 386);
             Add_Action (Table.States (548), 41, Reduce, (111, 5), 0, null, 
null);
             Add_Action (Table.States (548), 49, Reduce, (111, 5), 0, null, 
null);
@@ -6929,24 +7111,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (548), 228, 720);
             Add_Goto (Table.States (548), 241, 721);
             Add_Goto (Table.States (548), 326, 722);
-            Table.States (548).Minimal_Complete_Action := (Shift, 38, 704);
-            Table.States (549).Productions := WisiToken.To_Vector ((1 => (223, 
1)));
+            Table.States (548).Kernel := To_Vector (((206, 35, 2, False), 
(223, 35, 2, False), (259, 35, 5, False),
+            (260, 35, 2, False)));
+            Table.States (548).Minimal_Complete_Actions := To_Vector (((Shift, 
38, 704), (Shift, 65, 710), (Reduce,
+            111, 0)));
             Add_Action (Table.States (549), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (223, 1), 4,
             incomplete_type_declaration_1'Access, null);
-            Table.States (549).Minimal_Complete_Action := (Reduce, 223, 4);
-            Table.States (550).Productions := WisiToken.To_Vector (((238, 0), 
(331, 0)));
+            Table.States (549).Kernel := To_Vector ((0 => (223, 96, 0, 
False)));
+            Table.States (549).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 223, 4)));
             Add_Action (Table.States (550), 83, 381);
             Add_Action (Table.States (550), 96, 723);
             Add_Error (Table.States (550));
-            Table.States (550).Minimal_Complete_Action := (Shift, 96, 723);
-            Table.States (551).Productions := WisiToken.To_Vector ((1 => (331, 
1)));
+            Table.States (550).Kernel := To_Vector (((238, 238, 2, True), 
(331, 238, 1, False)));
+            Table.States (550).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 723)));
             Add_Action (Table.States (551), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (331, 1), 4,
             use_clause_1'Access, null);
-            Table.States (551).Minimal_Complete_Action := (Reduce, 331, 4);
-            Table.States (552).Productions := WisiToken.To_Vector (((128, 0), 
(238, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (551).Kernel := To_Vector ((0 => (331, 96, 0, 
False)));
+            Table.States (551).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 331, 4)));
+         end Subr_10;
+         procedure Subr_11
+         is begin
             Add_Action (Table.States (552), 76, 235);
             Add_Action (Table.States (552), 83, Reduce, (238, 0), 3, null, 
null);
             Add_Action (Table.States (552), 84, 237);
@@ -6956,8 +7142,11 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (552));
             Add_Goto (Table.States (552), 115, 241);
             Add_Goto (Table.States (552), 322, 242);
-            Table.States (552).Minimal_Complete_Action := (Reduce, 238, 3);
-            Table.States (553).Productions := WisiToken.To_Vector ((1 => (245, 
2)));
+            Table.States (552).Kernel := To_Vector (((128, 239, 2, True), 
(238, 239, 0, True), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (552).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 238, 3)));
+            Table.States (552).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (553), 104, 119);
             Add_Action (Table.States (553), 105, 33);
             Add_Action (Table.States (553), 106, 34);
@@ -6966,11 +7155,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (553), 239, 724);
             Add_Goto (Table.States (553), 272, 92);
             Add_Goto (Table.States (553), 293, 97);
-            Table.States (553).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (554).Productions := WisiToken.To_Vector ((1 => (241, 
0)));
+            Table.States (553).Kernel := To_Vector ((0 => (245, 56, 2, 
False)));
+            Table.States (553).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (554), (7, 21, 35, 56, 74, 77, 82, 96, 
104, 105, 106), (241, 0), 2, null, null);
-            Table.States (554).Minimal_Complete_Action := (Reduce, 241, 2);
-            Table.States (555).Productions := WisiToken.To_Vector ((1 => (245, 
1)));
+            Table.States (554).Kernel := To_Vector ((0 => (241, 41, 0, 
False)));
+            Table.States (554).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 2)));
             Add_Action (Table.States (555), 104, 119);
             Add_Action (Table.States (555), 105, 33);
             Add_Action (Table.States (555), 106, 34);
@@ -6979,8 +7168,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (555), 239, 725);
             Add_Goto (Table.States (555), 272, 92);
             Add_Goto (Table.States (555), 293, 97);
-            Table.States (555).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (556).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1), (114, 2)));
+            Table.States (555).Kernel := To_Vector ((0 => (245, 56, 2, 
False)));
+            Table.States (555).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (556), 9, 726);
             Add_Action (Table.States (556), 16, 727);
             Add_Action (Table.States (556), 29, Reduce, (270, 1), 0, null, 
null);
@@ -6992,9 +7181,9 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (556));
             Add_Goto (Table.States (556), 208, 729);
             Add_Goto (Table.States (556), 270, 730);
-            Table.States (556).Minimal_Complete_Action := (Reduce, 270, 0);
-            Table.States (557).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (245, 0), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (556).Kernel := To_Vector (((114, 7, 1, False), (114, 
7, 2, True), (114, 7, 1, False)));
+            Table.States (556).Minimal_Complete_Actions := To_Vector 
(((Reduce, 270, 0), (Reduce, 208, 0)));
+            Table.States (556).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (557), 56, 731);
             Add_Action (Table.States (557), 76, 235);
             Add_Action (Table.States (557), 84, 237);
@@ -7003,14 +7192,16 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (557));
             Add_Goto (Table.States (557), 115, 241);
             Add_Goto (Table.States (557), 322, 242);
-            Table.States (557).Minimal_Complete_Action := (Shift, 56, 731);
-            Table.States (558).Productions := WisiToken.To_Vector ((1 => (133, 
1)));
+            Table.States (557).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (245, 239, 3, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (557).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 56, 731)));
             Add_Action (Table.States (558), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (558), 104, 149);
             Add_Error (Table.States (558));
             Add_Goto (Table.States (558), 220, 732);
-            Table.States (558).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (559).Productions := WisiToken.To_Vector ((1 => (218, 
0)));
+            Table.States (558).Kernel := To_Vector ((0 => (133, 24, 1, 
False)));
+            Table.States (558).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (559), 24, Reduce, (189, 1), 0, null, 
null);
             Add_Action (Table.States (559), 48, 16);
             Add_Action (Table.States (559), 72, 733);
@@ -7019,16 +7210,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (559), 188, 735);
             Add_Goto (Table.States (559), 189, 736);
             Add_Goto (Table.States (559), 257, 737);
-            Table.States (559).Minimal_Complete_Action := (Reduce, 189, 0);
-            Table.States (560).Productions := WisiToken.To_Vector ((1 => (158, 
0)));
+            Table.States (559).Kernel := To_Vector ((0 => (218, 26, 0, 
False)));
+            Table.States (559).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 189, 0)));
             Add_Action (Table.States (560), (13, 24, 25, 28, 29, 30, 40, 46, 
47, 48, 49, 50, 51, 63, 66, 69, 71, 104),
             (158, 0), 2, null, null);
-            Table.States (560).Minimal_Complete_Action := (Reduce, 158, 2);
-            Table.States (561).Productions := WisiToken.To_Vector ((1 => (158, 
1)));
+            Table.States (560).Kernel := To_Vector ((0 => (158, 157, 0, 
True)));
+            Table.States (560).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 158, 2)));
+            Table.States (560).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (561), (13, 24, 25, 28, 29, 30, 40, 46, 
47, 48, 49, 50, 51, 63, 66, 69, 71, 104),
             (158, 1), 2, null, null);
-            Table.States (561).Minimal_Complete_Action := (Reduce, 158, 2);
-            Table.States (562).Productions := WisiToken.To_Vector ((1 => (133, 
0)));
+            Table.States (561).Kernel := To_Vector ((0 => (158, 257, 0, 
True)));
+            Table.States (561).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 158, 2)));
+            Table.States (561).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (562), 4, 1);
             Add_Action (Table.States (562), 5, 2);
             Add_Action (Table.States (562), 13, Reduce, (132, 1), 0, null, 
null);
@@ -7086,24 +7279,21 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (562), 303, 101);
             Add_Goto (Table.States (562), 306, 363);
             Add_Goto (Table.States (562), 323, 114);
-            Table.States (562).Minimal_Complete_Action := (Reduce, 218, 0);
-         end Subr_10;
-         procedure Subr_11
-         is begin
-            Table.States (563).Productions := WisiToken.To_Vector ((1 => (232, 
1)));
+            Table.States (562).Kernel := To_Vector ((0 => (133, 13, 2, 
False)));
+            Table.States (562).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (563), 37, 739);
             Add_Error (Table.States (563));
-            Table.States (563).Minimal_Complete_Action := (Shift, 37, 739);
-            Table.States (564).Productions := WisiToken.To_Vector ((1 => (232, 
0)));
+            Table.States (563).Kernel := To_Vector ((0 => (232, 24, 2, 
False)));
+            Table.States (563).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 739)));
             Add_Action (Table.States (564), 24, 740);
             Add_Error (Table.States (564));
-            Table.States (564).Minimal_Complete_Action := (Shift, 24, 740);
-            Table.States (565).Productions := WisiToken.To_Vector ((1 => (216, 
0)));
+            Table.States (564).Kernel := To_Vector ((0 => (232, 300, 3, 
False)));
+            Table.States (564).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 740)));
             Add_Action (Table.States (565), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (216, 0), 4,
             generic_subprogram_declaration_0'Access, null);
-            Table.States (565).Minimal_Complete_Action := (Reduce, 216, 4);
-            Table.States (566).Productions := WisiToken.To_Vector ((1 => (157, 
9)));
+            Table.States (565).Kernel := To_Vector ((0 => (216, 96, 0, 
False)));
+            Table.States (565).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 216, 4)));
             Add_Action (Table.States (566), 3, 121);
             Add_Action (Table.States (566), 39, 122);
             Add_Action (Table.States (566), 40, 123);
@@ -7138,17 +7328,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (566), 320, 144);
             Add_Goto (Table.States (566), 321, 145);
             Add_Goto (Table.States (566), 330, 146);
-            Table.States (566).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (567).Productions := WisiToken.To_Vector ((1 => (186, 
0)));
+            Table.States (566).Kernel := To_Vector ((0 => (157, 82, 1, 
False)));
+            Table.States (566).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (567), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (186, 0), 4,
             exception_declaration_0'Access, null);
-            Table.States (567).Minimal_Complete_Action := (Reduce, 186, 4);
-            Table.States (568).Productions := WisiToken.To_Vector ((1 => (154, 
0)));
+            Table.States (567).Kernel := To_Vector ((0 => (186, 96, 0, 
False)));
+            Table.States (567).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 186, 4)));
             Add_Action (Table.States (568), (7, 11, 21, 40, 74, 82, 96, 104, 
105, 106), (154, 0), 1, null, null);
-            Table.States (568).Minimal_Complete_Action := (Reduce, 154, 1);
-            Table.States (569).Productions := WisiToken.To_Vector (((244, 0), 
(244, 1), (244, 2), (244, 3), (244, 4),
-            (244, 5)));
+            Table.States (568).Kernel := To_Vector ((0 => (154, 16, 0, 
False)));
+            Table.States (568).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 154, 1)));
             Add_Action (Table.States (569), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (569), 11, 699);
             Add_Action (Table.States (569), 40, 742);
@@ -7164,26 +7353,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (569), 272, 92);
             Add_Goto (Table.States (569), 293, 97);
             Add_Goto (Table.States (569), 314, 745);
-            Table.States (569).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (570).Productions := WisiToken.To_Vector ((1 => (115, 
0)));
+            Table.States (569).Kernel := To_Vector (((244, 154, 3, False), 
(244, 154, 4, False), (244, 154, 10, False),
+            (244, 154, 2, False), (244, 154, 3, False), (244, 154, 9, False)));
+            Table.States (569).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (570), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (115, 0), 3,
             actual_parameter_part_0'Access, null);
-            Table.States (570).Minimal_Complete_Action := (Reduce, 115, 3);
-            Table.States (571).Productions := WisiToken.To_Vector ((1 => (115, 
1)));
+            Table.States (570).Kernel := To_Vector ((0 => (115, 77, 0, 
False)));
+            Table.States (570).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 115, 3)));
             Add_Action (Table.States (571), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (115, 1), 3,
             actual_parameter_part_1'Access, null);
-            Table.States (571).Minimal_Complete_Action := (Reduce, 115, 3);
-            Table.States (572).Productions := WisiToken.To_Vector ((1 => (239, 
0)));
+            Table.States (571).Kernel := To_Vector ((0 => (115, 77, 0, 
False)));
+            Table.States (571).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 115, 3)));
             Add_Action (Table.States (572), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (239, 0), 4, name_0'Access,
             null);
-            Table.States (572).Minimal_Complete_Action := (Reduce, 239, 4);
-            Table.States (573).Productions := WisiToken.To_Vector ((1 => (278, 
0)));
+            Table.States (572).Kernel := To_Vector ((0 => (239, 77, 0, True)));
+            Table.States (572).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 4)));
+            Table.States (572).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (573), 3, 121);
             Add_Action (Table.States (573), 39, 122);
             Add_Action (Table.States (573), 40, 123);
@@ -7208,13 +7399,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (573), 320, 144);
             Add_Goto (Table.States (573), 321, 145);
             Add_Goto (Table.States (573), 330, 146);
-            Table.States (573).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (574).Productions := WisiToken.To_Vector ((1 => (123, 
0)));
+            Table.States (573).Kernel := To_Vector ((0 => (278, 83, 3, True)));
+            Table.States (573).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (573).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (574), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (123, 0), 4, assignment_statement_0'Access, null);
-            Table.States (574).Minimal_Complete_Action := (Reduce, 123, 4);
-            Table.States (575).Productions := WisiToken.To_Vector (((179, 0), 
(199, 0)));
+            Table.States (574).Kernel := To_Vector ((0 => (123, 96, 0, 
False)));
+            Table.States (574).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 123, 4)));
             Add_Action (Table.States (575), 3, 121);
             Add_Action (Table.States (575), 39, 122);
             Add_Action (Table.States (575), 40, 474);
@@ -7246,22 +7438,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (575), 320, 144);
             Add_Goto (Table.States (575), 321, 145);
             Add_Goto (Table.States (575), 330, 146);
-            Table.States (575).Minimal_Complete_Action := (Reduce, 255, 0);
-            Table.States (576).Productions := WisiToken.To_Vector ((1 => (179, 
1)));
+            Table.States (575).Kernel := To_Vector (((179, 76, 3, False), 
(199, 76, 1, False)));
+            Table.States (575).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 255, 0)));
             Add_Action (Table.States (576), 74, 337);
             Add_Action (Table.States (576), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (576));
             Add_Goto (Table.States (576), 122, 748);
-            Table.States (576).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (577).Productions := WisiToken.To_Vector ((1 => (213, 
2)));
+            Table.States (576).Kernel := To_Vector ((0 => (179, 253, 1, 
False)));
+            Table.States (576).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (577), 39, 749);
             Add_Error (Table.States (577));
-            Table.States (577).Minimal_Complete_Action := (Shift, 39, 749);
-            Table.States (578).Productions := WisiToken.To_Vector ((1 => (213, 
1)));
+            Table.States (577).Kernel := To_Vector ((0 => (213, 35, 3, 
False)));
+            Table.States (577).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 749)));
             Add_Action (Table.States (578), 39, 750);
             Add_Error (Table.States (578));
-            Table.States (578).Minimal_Complete_Action := (Shift, 39, 750);
-            Table.States (579).Productions := WisiToken.To_Vector (((256, 0), 
(256, 1), (256, 2)));
+            Table.States (578).Kernel := To_Vector ((0 => (213, 35, 3, 
False)));
+            Table.States (578).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 750)));
             Add_Action (Table.States (579), 3, 121);
             Add_Action (Table.States (579), 15, 258);
             Add_Action (Table.States (579), 28, 259);
@@ -7272,7 +7464,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (579), 44, 263);
             Add_Action (Table.States (579), 52, 125);
             Add_Action (Table.States (579), 76, 126);
-            Add_Action (Table.States (579), 77, Reduce, (124, 5), 0, null, 
null, (192, 1), 0, null, null);
+            Add_Action (Table.States (579), 77, Reduce, (124, 5), 0, null, 
null);
+            Add_Conflict (Table.States (579), 77, (192, 1), 0, null, null);
             Add_Action (Table.States (579), 79, Reduce, (166, 2), 0, null, 
null);
             Add_Action (Table.States (579), 83, Reduce, (124, 5), 0, null, 
null);
             Add_Action (Table.States (579), 87, Reduce, (166, 2), 0, null, 
null);
@@ -7312,33 +7505,32 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (579), 320, 144);
             Add_Goto (Table.States (579), 321, 145);
             Add_Goto (Table.States (579), 330, 146);
-            Table.States (579).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (580).Productions := WisiToken.To_Vector ((1 => (193, 
0)));
+            Table.States (579).Kernel := To_Vector (((256, 76, 1, False), 
(256, 76, 1, False), (256, 76, 3, False)));
+            Table.States (579).Minimal_Complete_Actions := To_Vector 
(((Reduce, 192, 0), (Reduce, 125, 0)));
             Add_Action (Table.States (580), 74, 337);
             Add_Action (Table.States (580), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (580));
             Add_Goto (Table.States (580), 122, 754);
-            Table.States (580).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (581).Productions := WisiToken.To_Vector ((1 => (243, 
0)));
+            Table.States (580).Kernel := To_Vector ((0 => (193, 256, 1, 
False)));
+            Table.States (580).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (581), 74, 337);
             Add_Action (Table.States (581), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (581));
             Add_Goto (Table.States (581), 122, 755);
-            Table.States (581).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (582).Productions := WisiToken.To_Vector ((1 => (112, 
0)));
+            Table.States (581).Kernel := To_Vector ((0 => (243, 41, 1, 
False)));
+            Table.States (581).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (582), 74, 337);
             Add_Action (Table.States (582), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (582));
             Add_Goto (Table.States (582), 122, 756);
-            Table.States (582).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (583).Productions := WisiToken.To_Vector ((1 => (308, 
0)));
+            Table.States (582).Kernel := To_Vector ((0 => (112, 6, 1, False)));
+            Table.States (582).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (583), 74, 337);
             Add_Action (Table.States (583), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (583));
             Add_Goto (Table.States (583), 122, 757);
-            Table.States (583).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (584).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (311, 0)));
+            Table.States (583).Kernel := To_Vector ((0 => (308, 60, 1, 
False)));
+            Table.States (583).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (584), 74, 337);
             Add_Action (Table.States (584), 76, 235);
             Add_Action (Table.States (584), 84, 237);
@@ -7349,8 +7541,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (584), 115, 241);
             Add_Goto (Table.States (584), 122, 758);
             Add_Goto (Table.States (584), 322, 242);
-            Table.States (584).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (585).Productions := WisiToken.To_Vector ((1 => (307, 
0)));
+            Table.States (584).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (311, 239, 1, False)));
+            Table.States (584).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (585), 13, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (585), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (585), 28, 183);
@@ -7421,13 +7615,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (585), 319, 113);
             Add_Goto (Table.States (585), 325, 115);
             Add_Goto (Table.States (585), 331, 116);
-            Table.States (585).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (586).Productions := WisiToken.To_Vector ((1 => (309, 
0)));
+            Table.States (585).Kernel := To_Vector ((0 => (307, 35, 3, 
False)));
+            Table.States (585).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (586), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (309, 0), 4,
             subprogram_declaration_0'Access, null);
-            Table.States (586).Minimal_Complete_Action := (Reduce, 309, 4);
-            Table.States (587).Productions := WisiToken.To_Vector ((1 => (113, 
0)));
+            Table.States (586).Kernel := To_Vector ((0 => (309, 96, 0, 
False)));
+            Table.States (586).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 309, 4)));
             Add_Action (Table.States (587), 4, 1);
             Add_Action (Table.States (587), 5, 2);
             Add_Action (Table.States (587), 13, Reduce, (132, 1), 0, null, 
null);
@@ -7485,27 +7679,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (587), 303, 101);
             Add_Goto (Table.States (587), 306, 363);
             Add_Goto (Table.States (587), 323, 114);
-            Table.States (587).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (588).Productions := WisiToken.To_Vector ((1 => (113, 
1)));
+            Table.States (587).Kernel := To_Vector ((0 => (113, 21, 2, 
False)));
+            Table.States (587).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (588), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (113, 1), 5, accept_statement_1'Access, null);
-            Table.States (588).Minimal_Complete_Action := (Reduce, 113, 5);
-            Table.States (589).Productions := WisiToken.To_Vector ((1 => (275, 
0)));
+            Table.States (588).Kernel := To_Vector ((0 => (113, 96, 0, 
False)));
+            Table.States (588).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 113, 5)));
             Add_Action (Table.States (589), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (275,
             0), 4, raise_expression_0'Access, null);
-            Table.States (589).Minimal_Complete_Action := (Reduce, 275, 4);
-            Table.States (590).Productions := WisiToken.To_Vector ((1 => (136, 
0)));
+            Table.States (589).Kernel := To_Vector ((0 => (275, 192, 0, 
True)));
+            Table.States (589).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 275, 4)));
+            Table.States (589).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (590), 72, 761);
             Add_Error (Table.States (590));
             Add_Goto (Table.States (590), 137, 762);
             Add_Goto (Table.States (590), 138, 763);
-            Table.States (590).Minimal_Complete_Action := (Shift, 72, 761);
-            Table.States (591).Productions := WisiToken.To_Vector ((1 => (273, 
0)));
+            Table.States (590).Kernel := To_Vector ((0 => (136, 35, 2, 
False)));
+            Table.States (590).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 72, 761)));
             Add_Action (Table.States (591), 87, 764);
             Add_Error (Table.States (591));
-            Table.States (591).Minimal_Complete_Action := (Shift, 87, 764);
-            Table.States (592).Productions := WisiToken.To_Vector (((221, 0), 
(221, 1), (221, 2), (221, 3)));
+            Table.States (591).Kernel := To_Vector ((0 => (273, 230, 1, 
False)));
+            Table.States (591).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 764)));
             Add_Action (Table.States (592), 3, 121);
             Add_Action (Table.States (592), 22, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (592), 23, Reduce, (192, 1), 0, null, 
null);
@@ -7542,9 +7737,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (592), 320, 144);
             Add_Goto (Table.States (592), 321, 145);
             Add_Goto (Table.States (592), 330, 146);
-            Table.States (592).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (593).Productions := WisiToken.To_Vector (((128, 0), 
(165, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (592).Kernel := To_Vector (((221, 68, 3, False), 
(221, 68, 1, False), (221, 68, 2, False),
+            (221, 68, 0, False)));
+            Table.States (592).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (593), 76, 235);
             Add_Action (Table.States (593), 79, Reduce, (165, 1), 3, null, 
null);
             Add_Action (Table.States (593), 84, 237);
@@ -7554,34 +7749,38 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (593));
             Add_Goto (Table.States (593), 115, 241);
             Add_Goto (Table.States (593), 322, 242);
-            Table.States (593).Minimal_Complete_Action := (Reduce, 165, 3);
-            Table.States (594).Productions := WisiToken.To_Vector ((1 => (117, 
2)));
+            Table.States (593).Kernel := To_Vector (((128, 239, 2, True), 
(165, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (593).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 165, 3)));
             Add_Action (Table.States (594), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (117, 2), 4, null, null);
-            Table.States (594).Minimal_Complete_Action := (Reduce, 117, 4);
-            Table.States (595).Productions := WisiToken.To_Vector ((1 => (124, 
1)));
+            Table.States (594).Kernel := To_Vector ((0 => (117, 77, 0, 
False)));
+            Table.States (594).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 117, 4)));
             Add_Action (Table.States (595), (35, 77, 83, 96), (124, 1), 3, 
null, null);
-            Table.States (595).Minimal_Complete_Action := (Reduce, 124, 3);
-            Table.States (596).Productions := WisiToken.To_Vector ((1 => (124, 
0)));
+            Table.States (595).Kernel := To_Vector ((0 => (124, 80, 0, 
False)));
+            Table.States (595).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 124, 3)));
             Add_Action (Table.States (596), (35, 77, 83, 96), (124, 0), 3, 
association_opt_0'Access, null);
-            Table.States (596).Minimal_Complete_Action := (Reduce, 124, 3);
-            Table.States (597).Productions := WisiToken.To_Vector ((1 => (125, 
0)));
+            Table.States (596).Kernel := To_Vector ((0 => (124, 192, 0, 
False)));
+            Table.States (596).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 124, 3)));
             Add_Action (Table.States (597), (35, 77, 83, 96), (125, 0), 3, 
null, null);
-            Table.States (597).Minimal_Complete_Action := (Reduce, 125, 3);
-            Table.States (598).Productions := WisiToken.To_Vector ((1 => (166, 
0)));
+            Table.States (597).Kernel := To_Vector ((0 => (125, 124, 0, 
True)));
+            Table.States (597).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 3)));
+            Table.States (597).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (598), (79, 87), (166, 0), 3, null, null);
-            Table.States (598).Minimal_Complete_Action := (Reduce, 166, 3);
-            Table.States (599).Productions := WisiToken.To_Vector ((1 => (165, 
0)));
+            Table.States (598).Kernel := To_Vector ((0 => (166, 165, 0, 
True)));
+            Table.States (598).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 166, 3)));
+            Table.States (598).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (599), (79, 87), (165, 0), 1, null, null);
-            Table.States (599).Minimal_Complete_Action := (Reduce, 165, 1);
-            Table.States (600).Productions := WisiToken.To_Vector ((1 => (124, 
3)));
+            Table.States (599).Kernel := To_Vector ((0 => (165, 191, 0, 
False)));
+            Table.States (599).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 165, 1)));
             Add_Action (Table.States (600), (35, 77, 83, 96), (124, 3), 3, 
association_opt_3'Access, null);
-            Table.States (600).Minimal_Complete_Action := (Reduce, 124, 3);
-            Table.States (601).Productions := WisiToken.To_Vector ((1 => (124, 
2)));
+            Table.States (600).Kernel := To_Vector ((0 => (124, 80, 0, 
False)));
+            Table.States (600).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 124, 3)));
             Add_Action (Table.States (601), (35, 77, 83, 96), (124, 2), 3, 
association_opt_2'Access, null);
-            Table.States (601).Minimal_Complete_Action := (Reduce, 124, 3);
-            Table.States (602).Productions := WisiToken.To_Vector (((117, 0), 
(258, 1)));
+            Table.States (601).Kernel := To_Vector ((0 => (124, 192, 0, 
False)));
+            Table.States (601).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 124, 3)));
             Add_Action (Table.States (602), 10, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (602), 33, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (602), 38, Reduce, (258, 1), 1, null, 
null);
@@ -7608,13 +7807,13 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (602), 99, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (602), 100, Reduce, (258, 1), 1, null, 
null);
             Add_Error (Table.States (602));
-            Table.States (602).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (603).Productions := WisiToken.To_Vector (((117, 1), 
(125, 0)));
+            Table.States (602).Kernel := To_Vector (((117, 41, 2, False), 
(258, 41, 0, False)));
+            Table.States (602).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (603), 77, 767);
             Add_Action (Table.States (603), 83, 443);
             Add_Error (Table.States (603));
-            Table.States (603).Minimal_Complete_Action := (Shift, 77, 767);
-            Table.States (604).Productions := WisiToken.To_Vector (((277, 0), 
(277, 1)));
+            Table.States (603).Kernel := To_Vector (((117, 125, 1, False), 
(125, 125, 1, True)));
+            Table.States (603).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 767)));
             Add_Action (Table.States (604), 10, Reduce, (277, 1), 3, null, 
null);
             Add_Action (Table.States (604), 20, Reduce, (277, 1), 3, null, 
null);
             Add_Action (Table.States (604), 21, Reduce, (277, 1), 3, null, 
null);
@@ -7636,40 +7835,48 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (604), 87, Reduce, (277, 1), 3, null, 
null);
             Add_Action (Table.States (604), 96, Reduce, (277, 1), 3, null, 
null);
             Add_Error (Table.States (604));
-            Table.States (604).Minimal_Complete_Action := (Reduce, 277, 3);
-            Table.States (605).Productions := WisiToken.To_Vector ((1 => (277, 
2)));
+            Table.States (604).Kernel := To_Vector (((277, 53, 2, False), 
(277, 53, 0, False)));
+            Table.States (604).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 277, 3)));
+         end Subr_11;
+         procedure Subr_12
+         is begin
             Add_Action (Table.States (605), (10, 20, 21, 22, 23, 35, 37, 42, 
43, 53, 68, 74, 75, 77, 79, 82, 83, 87,
             96), (277, 2), 3, null, null);
-            Table.States (605).Minimal_Complete_Action := (Reduce, 277, 3);
-            Table.States (606).Productions := WisiToken.To_Vector (((140, 0), 
(166, 0)));
+            Table.States (605).Kernel := To_Vector ((0 => (277, 301, 0, 
False)));
+            Table.States (605).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 277, 3)));
             Add_Action (Table.States (606), 79, 445);
             Add_Action (Table.States (606), 87, 769);
             Add_Error (Table.States (606));
-            Table.States (606).Minimal_Complete_Action := (Shift, 87, 769);
-            Table.States (607).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (606).Kernel := To_Vector (((140, 166, 1, False), 
(166, 166, 2, True)));
+            Table.States (606).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 769)));
             Add_Action (Table.States (607), 15, 770);
             Add_Error (Table.States (607));
-            Table.States (607).Minimal_Complete_Action := (Shift, 15, 770);
-            Table.States (608).Productions := WisiToken.To_Vector ((1 => (141, 
0)));
+            Table.States (607).Kernel := To_Vector ((0 => (139, 24, 2, 
False)));
+            Table.States (607).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 15, 770)));
             Add_Action (Table.States (608), (24, 72), (141, 0), 2, null, null);
-            Table.States (608).Minimal_Complete_Action := (Reduce, 141, 2);
-            Table.States (609).Productions := WisiToken.To_Vector ((1 => (283, 
0)));
+            Table.States (608).Kernel := To_Vector ((0 => (141, 140, 0, 
True)));
+            Table.States (608).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 141, 2)));
+            Table.States (608).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (609), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (283,
             0), 4, null, null);
-            Table.States (609).Minimal_Complete_Action := (Reduce, 283, 4);
-            Table.States (610).Productions := WisiToken.To_Vector ((1 => (285, 
0)));
+            Table.States (609).Kernel := To_Vector ((0 => (283, 287, 0, 
True)));
+            Table.States (609).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 283, 4)));
+            Table.States (609).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (610), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (285,
             0), 4, null, null);
-            Table.States (610).Minimal_Complete_Action := (Reduce, 285, 4);
-            Table.States (611).Productions := WisiToken.To_Vector ((1 => (283, 
1)));
+            Table.States (610).Kernel := To_Vector ((0 => (285, 287, 0, 
True)));
+            Table.States (610).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 285, 4)));
+            Table.States (610).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (611), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (283,
             1), 4, null, null);
-            Table.States (611).Minimal_Complete_Action := (Reduce, 283, 4);
-            Table.States (612).Productions := WisiToken.To_Vector ((1 => (285, 
1)));
+            Table.States (611).Kernel := To_Vector ((0 => (283, 287, 0, 
True)));
+            Table.States (611).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 283, 4)));
+            Table.States (611).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (612), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (285,
             1), 4, null, null);
-            Table.States (612).Minimal_Complete_Action := (Reduce, 285, 4);
-            Table.States (613).Productions := WisiToken.To_Vector ((1 => (233, 
0)));
+            Table.States (612).Kernel := To_Vector ((0 => (285, 287, 0, 
True)));
+            Table.States (612).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 285, 4)));
+            Table.States (612).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (613), 3, 121);
             Add_Action (Table.States (613), 39, 122);
             Add_Action (Table.States (613), 40, 123);
@@ -7695,8 +7902,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (613), 320, 144);
             Add_Goto (Table.States (613), 321, 145);
             Add_Goto (Table.States (613), 330, 146);
-            Table.States (613).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (614).Productions := WisiToken.To_Vector (((233, 0), 
(287, 0)));
+            Table.States (613).Kernel := To_Vector ((0 => (233, 79, 1, True)));
+            Table.States (613).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
+            Table.States (613).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (614), 10, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 20, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 21, Reduce, (287, 0), 4, null, 
null);
@@ -7710,18 +7918,19 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (614), 74, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 75, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 77, Reduce, (287, 0), 4, null, 
null);
-            Add_Action (Table.States (614), 79, 613, (287, 0), 4, null, null);
+            Add_Action (Table.States (614), 79, 613);
+            Add_Conflict (Table.States (614), 79, (287, 0), 4, null, null);
             Add_Action (Table.States (614), 83, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 87, Reduce, (287, 0), 4, null, 
null);
             Add_Action (Table.States (614), 96, Reduce, (287, 0), 4, null, 
null);
             Add_Error (Table.States (614));
-            Table.States (614).Minimal_Complete_Action := (Reduce, 287, 4);
-            Table.States (615).Productions := WisiToken.To_Vector ((1 => (190, 
0)));
+            Table.States (614).Kernel := To_Vector (((233, 233, 2, True), 
(287, 233, 0, False)));
+            Table.States (614).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 287, 4)));
             Add_Action (Table.States (615), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (190, 0), 5, exit_statement_0'Access, null);
-            Table.States (615).Minimal_Complete_Action := (Reduce, 190, 5);
-            Table.States (616).Productions := WisiToken.To_Vector (((258, 1), 
(314, 0), (314, 1)));
+            Table.States (615).Kernel := To_Vector ((0 => (190, 96, 0, 
False)));
+            Table.States (615).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 190, 5)));
             Add_Action (Table.States (616), 38, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (616), 55, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (616), 78, Reduce, (258, 1), 1, null, 
null);
@@ -7738,11 +7947,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (616), 239, 772);
             Add_Goto (Table.States (616), 272, 92);
             Add_Goto (Table.States (616), 293, 97);
-            Table.States (616).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (617).Productions := WisiToken.To_Vector ((1 => (230, 
2)));
+            Table.States (616).Kernel := To_Vector (((258, 41, 0, False), 
(314, 41, 5, False), (314, 41, 1, False)));
+            Table.States (616).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (617), (37, 87), (230, 2), 4, 
iterator_specification_2'Access, null);
-            Table.States (617).Minimal_Complete_Action := (Reduce, 230, 4);
-            Table.States (618).Productions := WisiToken.To_Vector ((1 => (155, 
0)));
+            Table.States (617).Kernel := To_Vector ((0 => (230, 167, 0, 
False)));
+            Table.States (617).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 4)));
             Add_Action (Table.States (618), 3, 121);
             Add_Action (Table.States (618), 39, 122);
             Add_Action (Table.States (618), 40, 123);
@@ -7767,8 +7976,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (618), 320, 144);
             Add_Goto (Table.States (618), 321, 145);
             Add_Goto (Table.States (618), 330, 146);
-            Table.States (618).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (619).Productions := WisiToken.To_Vector (((115, 0), 
(115, 1), (224, 0), (239, 0)));
+            Table.States (618).Kernel := To_Vector ((0 => (155, 53, 3, 
False)));
+            Table.States (618).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (619), 3, 121);
             Add_Action (Table.States (619), 15, 258);
             Add_Action (Table.States (619), 28, 259);
@@ -7822,19 +8031,17 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (619), 320, 144);
             Add_Goto (Table.States (619), 321, 145);
             Add_Goto (Table.States (619), 330, 146);
-            Table.States (619).Minimal_Complete_Action := (Reduce, 125, 0);
-         end Subr_11;
-         procedure Subr_12
-         is begin
-            Table.States (620).Productions := WisiToken.To_Vector ((1 => (314, 
2)));
+            Table.States (619).Kernel := To_Vector (((115, 76, 1, False), 
(115, 76, 3, False), (224, 76, 4, False),
+            (239, 76, 4, True)));
+            Table.States (619).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
+            Table.States (619).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (620), (10, 21, 37, 42, 74, 77, 82, 83, 
87, 96), (314, 2), 2,
             subtype_indication_2'Access, null);
-            Table.States (620).Minimal_Complete_Action := (Reduce, 314, 2);
-            Table.States (621).Productions := WisiToken.To_Vector ((1 => (155, 
1)));
+            Table.States (620).Kernel := To_Vector ((0 => (314, 155, 0, 
False)));
+            Table.States (620).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 314, 2)));
             Add_Action (Table.States (621), (10, 21, 37, 42, 74, 77, 82, 83, 
87, 96), (155, 1), 1, null, null);
-            Table.States (621).Minimal_Complete_Action := (Reduce, 155, 1);
-            Table.States (622).Productions := WisiToken.To_Vector (((128, 0), 
(230, 3), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (621).Kernel := To_Vector ((0 => (155, 224, 0, 
False)));
+            Table.States (621).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 155, 1)));
             Add_Action (Table.States (622), 37, Reduce, (230, 3), 4, null, 
null);
             Add_Action (Table.States (622), 76, 235);
             Add_Action (Table.States (622), 84, 237);
@@ -7844,8 +8051,10 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (622));
             Add_Goto (Table.States (622), 115, 241);
             Add_Goto (Table.States (622), 322, 242);
-            Table.States (622).Minimal_Complete_Action := (Reduce, 230, 4);
-            Table.States (623).Productions := WisiToken.To_Vector (((314, 0), 
(314, 1)));
+            Table.States (622).Kernel := To_Vector (((128, 239, 2, True), 
(230, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (622).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 4)));
             Add_Action (Table.States (623), 104, 119);
             Add_Action (Table.States (623), 105, 33);
             Add_Action (Table.States (623), 106, 34);
@@ -7854,8 +8063,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (623), 239, 772);
             Add_Goto (Table.States (623), 272, 92);
             Add_Goto (Table.States (623), 293, 97);
-            Table.States (623).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (624).Productions := WisiToken.To_Vector (((230, 0), 
(230, 1)));
+            Table.States (623).Kernel := To_Vector (((314, 41, 5, False), 
(314, 41, 1, False)));
+            Table.States (623).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (624), 59, 778);
             Add_Action (Table.States (624), 104, 119);
             Add_Action (Table.States (624), 105, 33);
@@ -7865,33 +8074,32 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (624), 239, 779);
             Add_Goto (Table.States (624), 272, 92);
             Add_Goto (Table.States (624), 293, 97);
-            Table.States (624).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (625).Productions := WisiToken.To_Vector ((1 => (121, 
0)));
+            Table.States (624).Kernel := To_Vector (((230, 42, 2, False), 
(230, 42, 1, False)));
+            Table.States (624).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (625), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (121, 0), 5,
             aspect_clause_0'Access, null);
-            Table.States (625).Minimal_Complete_Action := (Reduce, 121, 5);
-            Table.States (626).Productions := WisiToken.To_Vector ((1 => (127, 
0)));
+            Table.States (625).Kernel := To_Vector ((0 => (121, 96, 0, 
False)));
+            Table.States (625).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 121, 5)));
             Add_Action (Table.States (626), 96, 780);
             Add_Error (Table.States (626));
-            Table.States (626).Minimal_Complete_Action := (Shift, 96, 780);
-            Table.States (627).Productions := WisiToken.To_Vector ((1 => (235, 
0)));
+            Table.States (626).Kernel := To_Vector ((0 => (127, 192, 1, 
False)));
+            Table.States (626).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 780)));
             Add_Action (Table.States (627), 38, 781);
             Add_Error (Table.States (627));
-            Table.States (627).Minimal_Complete_Action := (Shift, 38, 781);
-            Table.States (628).Productions := WisiToken.To_Vector ((1 => (281, 
0)));
+            Table.States (627).Kernel := To_Vector ((0 => (235, 12, 2, 
False)));
+            Table.States (627).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 781)));
             Add_Action (Table.States (628), 104, 782);
             Add_Error (Table.States (628));
             Add_Goto (Table.States (628), 144, 783);
             Add_Goto (Table.States (628), 145, 784);
-            Table.States (628).Minimal_Complete_Action := (Shift, 104, 782);
-            Table.States (629).Productions := WisiToken.To_Vector ((1 => (182, 
0)));
+            Table.States (628).Kernel := To_Vector ((0 => (281, 235, 11, 
False)));
+            Table.States (628).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 782)));
             Add_Action (Table.States (629), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (182, 0), 5,
             enumeration_representation_clause_0'Access, null);
-            Table.States (629).Minimal_Complete_Action := (Reduce, 182, 5);
-            Table.States (630).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (240, 0), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (629).Kernel := To_Vector ((0 => (182, 96, 0, 
False)));
+            Table.States (629).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 182, 5)));
             Add_Action (Table.States (630), 21, Reduce, (240, 0), 1, null, 
name_opt_0_check'Access);
             Add_Action (Table.States (630), 35, Reduce, (240, 0), 1, null, 
name_opt_0_check'Access);
             Add_Action (Table.States (630), 56, Reduce, (240, 0), 1, null, 
name_opt_0_check'Access);
@@ -7906,11 +8114,13 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (630));
             Add_Goto (Table.States (630), 115, 241);
             Add_Goto (Table.States (630), 322, 242);
-            Table.States (630).Minimal_Complete_Action := (Reduce, 240, 1);
-            Table.States (631).Productions := WisiToken.To_Vector ((1 => (291, 
0)));
+            Table.States (630).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (240, 239, 0, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (630).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 1)));
             Add_Action (Table.States (631), (21, 35, 56, 74, 77, 82, 96), 
(291, 0), 3, result_profile_0'Access, null);
-            Table.States (631).Minimal_Complete_Action := (Reduce, 291, 3);
-            Table.States (632).Productions := WisiToken.To_Vector (((254, 0), 
(254, 1), (254, 2), (254, 3)));
+            Table.States (631).Kernel := To_Vector ((0 => (291, 240, 0, 
False)));
+            Table.States (631).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 291, 3)));
             Add_Action (Table.States (632), 7, Reduce, (118, 1), 0, null, 
null);
             Add_Action (Table.States (632), 8, 401);
             Add_Action (Table.States (632), 33, Reduce, (118, 1), 0, null, 
null);
@@ -7924,21 +8134,22 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (632), 106, Reduce, (118, 1), 0, null, 
null);
             Add_Error (Table.States (632));
             Add_Goto (Table.States (632), 118, 785);
-            Table.States (632).Minimal_Complete_Action := (Reduce, 118, 0);
-            Table.States (633).Productions := WisiToken.To_Vector ((1 => (199, 
0)));
+            Table.States (632).Kernel := To_Vector (((254, 81, 2, False), 
(254, 81, 1, False), (254, 81, 3, False),
+            (254, 81, 2, False)));
+            Table.States (632).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 118, 0)));
             Add_Action (Table.States (633), (21, 35, 56, 58, 72, 74, 77, 82, 
96), (199, 0), 3, formal_part_0'Access,
             null);
-            Table.States (633).Minimal_Complete_Action := (Reduce, 199, 3);
-            Table.States (634).Productions := WisiToken.To_Vector ((1 => (255, 
0)));
+            Table.States (633).Kernel := To_Vector ((0 => (199, 77, 0, 
False)));
+            Table.States (633).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 199, 3)));
             Add_Action (Table.States (634), 77, Reduce, (254, 4), 0, null, 
null);
             Add_Action (Table.States (634), 96, Reduce, (254, 4), 0, null, 
null);
             Add_Action (Table.States (634), 104, 164);
             Add_Error (Table.States (634));
             Add_Goto (Table.States (634), 219, 493);
             Add_Goto (Table.States (634), 254, 786);
-            Table.States (634).Minimal_Complete_Action := (Reduce, 254, 0);
-            Table.States (635).Productions := WisiToken.To_Vector (((128, 0), 
(215, 2), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (634).Kernel := To_Vector ((0 => (255, 96, 0, True)));
+            Table.States (634).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 254, 0)));
+            Table.States (634).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (635), 74, 337);
             Add_Action (Table.States (635), 76, 235);
             Add_Action (Table.States (635), 84, 237);
@@ -7949,9 +8160,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (635), 115, 241);
             Add_Goto (Table.States (635), 122, 787);
             Add_Goto (Table.States (635), 322, 242);
-            Table.States (635).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (636).Productions := WisiToken.To_Vector (((128, 0), 
(215, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (635).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (635).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (636), 74, 337);
             Add_Action (Table.States (636), 76, 235);
             Add_Action (Table.States (636), 84, 237);
@@ -7962,9 +8174,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (636), 115, 241);
             Add_Goto (Table.States (636), 122, 788);
             Add_Goto (Table.States (636), 322, 242);
-            Table.States (636).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (637).Productions := WisiToken.To_Vector (((128, 0), 
(215, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (636).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (636).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (637), 74, 337);
             Add_Action (Table.States (637), 76, 235);
             Add_Action (Table.States (637), 84, 237);
@@ -7975,8 +8188,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (637), 115, 241);
             Add_Goto (Table.States (637), 122, 789);
             Add_Goto (Table.States (637), 322, 242);
-            Table.States (637).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (638).Productions := WisiToken.To_Vector (((201, 0), 
(201, 1)));
+            Table.States (637).Kernel := To_Vector (((128, 239, 2, True), 
(215, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (637).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (638), 6, 790);
             Add_Action (Table.States (638), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (638), 11, 699);
@@ -8003,16 +8218,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (638), 203, 803);
             Add_Goto (Table.States (638), 228, 804);
             Add_Goto (Table.States (638), 241, 721);
-            Table.States (638).Minimal_Complete_Action := (Reduce, 111, 0);
-            Table.States (639).Productions := WisiToken.To_Vector ((1 => (201, 
2)));
+            Table.States (638).Kernel := To_Vector (((201, 35, 2, False), 
(201, 35, 2, False)));
+            Table.States (638).Minimal_Complete_Actions := To_Vector 
(((Reduce, 111, 0), (Shift, 65, 796)));
             Add_Action (Table.States (639), 96, 805);
             Add_Error (Table.States (639));
-            Table.States (639).Minimal_Complete_Action := (Shift, 96, 805);
-            Table.States (640).Productions := WisiToken.To_Vector ((1 => (204, 
0)));
+            Table.States (639).Kernel := To_Vector ((0 => (201, 122, 1, 
False)));
+            Table.States (639).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 805)));
             Add_Action (Table.States (640), 39, 806);
             Add_Error (Table.States (640));
-            Table.States (640).Minimal_Complete_Action := (Shift, 39, 806);
-            Table.States (641).Productions := WisiToken.To_Vector (((200, 0), 
(200, 2)));
+            Table.States (640).Kernel := To_Vector ((0 => (204, 35, 3, 
False)));
+            Table.States (640).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 806)));
             Add_Action (Table.States (641), 41, 642);
             Add_Action (Table.States (641), 74, 337);
             Add_Action (Table.States (641), 80, 643);
@@ -8027,15 +8242,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (641), 272, 92);
             Add_Goto (Table.States (641), 293, 97);
             Add_Goto (Table.States (641), 310, 808);
-            Table.States (641).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (642).Productions := WisiToken.To_Vector ((1 => (310, 
2)));
+            Table.States (641).Kernel := To_Vector (((200, 6, 2, False), (200, 
6, 1, False)));
+            Table.States (641).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (642), (74, 96), (310, 2), 1, null, null);
-            Table.States (642).Minimal_Complete_Action := (Reduce, 310, 1);
-            Table.States (643).Productions := WisiToken.To_Vector ((1 => (310, 
1)));
+            Table.States (642).Kernel := To_Vector ((0 => (310, 41, 0, 
False)));
+            Table.States (642).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 310, 1)));
             Add_Action (Table.States (643), (74, 96), (310, 1), 1, null, null);
-            Table.States (643).Minimal_Complete_Action := (Reduce, 310, 1);
-            Table.States (644).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (310, 0)));
+            Table.States (643).Kernel := To_Vector ((0 => (310, 80, 0, 
False)));
+            Table.States (643).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 310, 1)));
             Add_Action (Table.States (644), 74, Reduce, (310, 0), 1, 
subprogram_default_0'Access, null);
             Add_Action (Table.States (644), 76, 235);
             Add_Action (Table.States (644), 84, 237);
@@ -8045,28 +8259,30 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (644));
             Add_Goto (Table.States (644), 115, 241);
             Add_Goto (Table.States (644), 322, 242);
-            Table.States (644).Minimal_Complete_Action := (Reduce, 310, 1);
-            Table.States (645).Productions := WisiToken.To_Vector ((1 => (200, 
1)));
+            Table.States (644).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (310, 239, 0, False)));
+            Table.States (644).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 310, 1)));
             Add_Action (Table.States (645), 74, 337);
             Add_Action (Table.States (645), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (645));
             Add_Goto (Table.States (645), 122, 809);
-            Table.States (645).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (646).Productions := WisiToken.To_Vector ((1 => (200, 
3)));
+            Table.States (645).Kernel := To_Vector ((0 => (200, 310, 1, 
False)));
+            Table.States (645).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (646), (29, 47, 48, 50, 69, 71, 74, 104), 
(200, 3), 4,
             formal_subprogram_declaration_3'Access, null);
-            Table.States (646).Minimal_Complete_Action := (Reduce, 200, 4);
-            Table.States (647).Productions := WisiToken.To_Vector ((1 => (236, 
1)));
+            Table.States (646).Kernel := To_Vector ((0 => (200, 96, 0, 
False)));
+            Table.States (646).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 200, 4)));
             Add_Action (Table.States (647), (7, 40, 74, 82, 96, 104, 105, 
106), (236, 1), 2, null, null);
-            Table.States (647).Minimal_Complete_Action := (Reduce, 236, 2);
-            Table.States (648).Productions := WisiToken.To_Vector (((198, 1), 
(198, 3)));
+            Table.States (647).Kernel := To_Vector ((0 => (236, 45, 0, 
False)));
+            Table.States (647).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 236, 2)));
             Add_Action (Table.States (648), 74, 337);
             Add_Action (Table.States (648), 82, 810);
             Add_Action (Table.States (648), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (648));
             Add_Goto (Table.States (648), 122, 811);
-            Table.States (648).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (649).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1), (114, 2), (198, 0), (198, 2)));
+            Table.States (648).Kernel := To_Vector (((198, 114, 2, False), 
(198, 114, 1, False)));
+            Table.States (648).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (649), 7, 556);
             Add_Action (Table.States (649), 104, 119);
             Add_Action (Table.States (649), 105, 33);
@@ -8076,8 +8292,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (649), 239, 812);
             Add_Goto (Table.States (649), 272, 92);
             Add_Goto (Table.States (649), 293, 97);
-            Table.States (649).Minimal_Complete_Action := (Shift, 7, 556);
-            Table.States (650).Productions := WisiToken.To_Vector ((1 => (222, 
1)));
+            Table.States (649).Kernel := To_Vector (((114, 241, 2, False), 
(114, 241, 3, True), (114, 241, 2, False),
+            (198, 241, 3, False), (198, 241, 2, False)));
+            Table.States (649).Minimal_Complete_Actions := To_Vector (((Shift, 
7, 556), (Shift, 104, 119)));
             Add_Action (Table.States (650), 4, 1);
             Add_Action (Table.States (650), 5, 2);
             Add_Action (Table.States (650), 13, Reduce, (132, 1), 0, null, 
null);
@@ -8133,8 +8350,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (650), 303, 101);
             Add_Goto (Table.States (650), 306, 363);
             Add_Goto (Table.States (650), 323, 114);
-            Table.States (650).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (651).Productions := WisiToken.To_Vector ((1 => (174, 
0)));
+            Table.States (650).Kernel := To_Vector ((0 => (222, 22, 3, 
False)));
+            Table.States (650).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (651), 3, 121);
             Add_Action (Table.States (651), 39, 122);
             Add_Action (Table.States (651), 40, 123);
@@ -8169,33 +8386,33 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (651), 320, 144);
             Add_Goto (Table.States (651), 321, 145);
             Add_Goto (Table.States (651), 330, 146);
-            Table.States (651).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (652).Productions := WisiToken.To_Vector ((1 => (222, 
3)));
+            Table.States (651).Kernel := To_Vector ((0 => (174, 23, 1, 
False)));
+            Table.States (651).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (652), 32, 815);
             Add_Error (Table.States (652));
-            Table.States (652).Minimal_Complete_Action := (Shift, 32, 815);
-            Table.States (653).Productions := WisiToken.To_Vector ((1 => (175, 
1)));
+            Table.States (652).Kernel := To_Vector ((0 => (222, 24, 2, 
False)));
+            Table.States (652).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 32, 815)));
             Add_Action (Table.States (653), (22, 23, 24), (175, 1), 1, null, 
null);
-            Table.States (653).Minimal_Complete_Action := (Reduce, 175, 1);
-            Table.States (654).Productions := WisiToken.To_Vector (((175, 0), 
(222, 0), (222, 2)));
+            Table.States (653).Kernel := To_Vector ((0 => (175, 174, 0, 
False)));
+            Table.States (653).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 175, 1)));
             Add_Action (Table.States (654), 22, 816);
             Add_Action (Table.States (654), 23, 651);
             Add_Action (Table.States (654), 24, 817);
             Add_Error (Table.States (654));
             Add_Goto (Table.States (654), 174, 818);
-            Table.States (654).Minimal_Complete_Action := (Shift, 24, 817);
-            Table.States (655).Productions := WisiToken.To_Vector ((1 => (332, 
0)));
+            Table.States (654).Kernel := To_Vector (((175, 175, 2, True), 
(222, 175, 4, False), (222, 175, 3, False)));
+            Table.States (654).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 817)));
             Add_Action (Table.States (655), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (332, 0), 5,
             with_clause_0'Access, null);
-            Table.States (655).Minimal_Complete_Action := (Reduce, 332, 5);
-            Table.States (656).Productions := WisiToken.To_Vector ((1 => (248, 
0)));
+            Table.States (655).Kernel := To_Vector ((0 => (332, 96, 0, 
False)));
+            Table.States (655).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 332, 5)));
             Add_Action (Table.States (656), 74, 337);
             Add_Action (Table.States (656), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (656));
             Add_Goto (Table.States (656), 122, 819);
-            Table.States (656).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (657).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1)));
+            Table.States (656).Kernel := To_Vector ((0 => (248, 60, 1, 
False)));
+            Table.States (656).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (657), 13, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (657), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (657), 25, Reduce, (246, 2), 0, null, 
null);
@@ -8267,9 +8484,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (657), 319, 113);
             Add_Goto (Table.States (657), 325, 115);
             Add_Goto (Table.States (657), 331, 116);
-            Table.States (657).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (658).Productions := WisiToken.To_Vector (((128, 0), 
(213, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (657).Kernel := To_Vector (((247, 35, 3, False), 
(247, 35, 2, False)));
+            Table.States (657).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (658), 74, 337);
             Add_Action (Table.States (658), 76, 235);
             Add_Action (Table.States (658), 84, 237);
@@ -8280,31 +8496,33 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (658), 115, 241);
             Add_Goto (Table.States (658), 122, 821);
             Add_Goto (Table.States (658), 322, 242);
-            Table.States (658).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (659).Productions := WisiToken.To_Vector ((1 => (250, 
0)));
+            Table.States (658).Kernel := To_Vector (((128, 239, 2, True), 
(213, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (658).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (659), 96, 822);
             Add_Error (Table.States (659));
-            Table.States (659).Minimal_Complete_Action := (Shift, 96, 822);
-            Table.States (660).Productions := WisiToken.To_Vector (((251, 0), 
(251, 1)));
+            Table.States (659).Kernel := To_Vector ((0 => (250, 122, 1, 
False)));
+            Table.States (659).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 822)));
             Add_Action (Table.States (660), 24, 823);
             Add_Action (Table.States (660), 49, 824);
             Add_Error (Table.States (660));
-            Table.States (660).Minimal_Complete_Action := (Shift, 24, 823);
-            Table.States (661).Productions := WisiToken.To_Vector ((1 => (257, 
0)));
+            Table.States (660).Kernel := To_Vector (((251, 159, 2, False), 
(251, 159, 1, False)));
+            Table.States (660).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 823)));
             Add_Action (Table.States (661), 96, 825);
             Add_Error (Table.States (661));
-            Table.States (661).Minimal_Complete_Action := (Shift, 96, 825);
-            Table.States (662).Productions := WisiToken.To_Vector ((1 => (257, 
1)));
+            Table.States (661).Kernel := To_Vector ((0 => (257, 77, 1, 
False)));
+            Table.States (661).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 825)));
             Add_Action (Table.States (662), 96, 826);
             Add_Error (Table.States (662));
-            Table.States (662).Minimal_Complete_Action := (Shift, 96, 826);
-            Table.States (663).Productions := WisiToken.To_Vector ((1 => (265, 
0)));
+            Table.States (662).Kernel := To_Vector ((0 => (257, 77, 1, 
False)));
+            Table.States (662).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 826)));
             Add_Action (Table.States (663), 74, 337);
             Add_Action (Table.States (663), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (663));
             Add_Goto (Table.States (663), 122, 827);
-            Table.States (663).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (664).Productions := WisiToken.To_Vector ((1 => (264, 
0)));
+            Table.States (663).Kernel := To_Vector ((0 => (265, 60, 1, 
False)));
+            Table.States (663).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (664), 24, Reduce, (269, 1), 0, null, 
null);
             Add_Action (Table.States (664), 25, 828);
             Add_Action (Table.States (664), 28, 183);
@@ -8328,12 +8546,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (664), 281, 94);
             Add_Goto (Table.States (664), 307, 837);
             Add_Goto (Table.States (664), 309, 838);
-            Table.States (664).Minimal_Complete_Action := (Reduce, 269, 0);
-            Table.States (665).Productions := WisiToken.To_Vector (((271, 0), 
(271, 1)));
+            Table.States (664).Kernel := To_Vector ((0 => (264, 35, 2, 
False)));
+            Table.States (664).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 269, 0)));
+         end Subr_12;
+         procedure Subr_13
+         is begin
             Add_Action (Table.States (665), 35, 839);
             Add_Error (Table.States (665));
-            Table.States (665).Minimal_Complete_Action := (Shift, 35, 839);
-            Table.States (666).Productions := WisiToken.To_Vector ((1 => (304, 
0)));
+            Table.States (665).Kernel := To_Vector (((271, 122, 6, False), 
(271, 122, 3, False)));
+            Table.States (665).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 839)));
             Add_Action (Table.States (666), 104, 119);
             Add_Action (Table.States (666), 105, 33);
             Add_Action (Table.States (666), 106, 34);
@@ -8343,27 +8564,27 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (666), 239, 841);
             Add_Goto (Table.States (666), 272, 92);
             Add_Goto (Table.States (666), 293, 97);
-            Table.States (666).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (667).Productions := WisiToken.To_Vector (((266, 0), 
(266, 1)));
+            Table.States (666).Kernel := To_Vector ((0 => (304, 39, 4, 
False)));
+            Table.States (666).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (667), 24, 842);
             Add_Action (Table.States (667), 49, 843);
             Add_Error (Table.States (667));
-            Table.States (667).Minimal_Complete_Action := (Shift, 24, 842);
-            Table.States (668).Productions := WisiToken.To_Vector ((1 => (304, 
1)));
+            Table.States (667).Kernel := To_Vector (((266, 159, 2, False), 
(266, 159, 1, False)));
+            Table.States (667).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 842)));
             Add_Action (Table.States (668), 96, 844);
             Add_Error (Table.States (668));
-            Table.States (668).Minimal_Complete_Action := (Shift, 96, 844);
-            Table.States (669).Productions := WisiToken.To_Vector ((1 => (276, 
0)));
+            Table.States (668).Kernel := To_Vector ((0 => (304, 266, 1, 
False)));
+            Table.States (668).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 844)));
             Add_Action (Table.States (669), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (276, 0), 5, raise_statement_0'Access, null);
-            Table.States (669).Minimal_Complete_Action := (Reduce, 276, 5);
-            Table.States (670).Productions := WisiToken.To_Vector ((1 => (290, 
0)));
+            Table.States (669).Kernel := To_Vector ((0 => (276, 96, 0, 
False)));
+            Table.States (669).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 276, 5)));
             Add_Action (Table.States (670), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (290, 0), 5, requeue_statement_0'Access, null);
-            Table.States (670).Minimal_Complete_Action := (Reduce, 290, 5);
-            Table.States (671).Productions := WisiToken.To_Vector (((194, 0), 
(194, 1)));
+            Table.States (670).Kernel := To_Vector ((0 => (290, 96, 0, 
False)));
+            Table.States (670).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 290, 5)));
             Add_Action (Table.States (671), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (671), 40, 742);
             Add_Action (Table.States (671), 104, 119);
@@ -8378,41 +8599,41 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (671), 292, 846);
             Add_Goto (Table.States (671), 293, 97);
             Add_Goto (Table.States (671), 314, 847);
-            Table.States (671).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (672).Productions := WisiToken.To_Vector ((1 => (196, 
0)));
+            Table.States (671).Kernel := To_Vector (((194, 154, 2, False), 
(194, 154, 1, False)));
+            Table.States (671).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (672), 58, 848);
             Add_Error (Table.States (672));
-            Table.States (672).Minimal_Complete_Action := (Shift, 58, 848);
-            Table.States (673).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1)));
+            Table.States (672).Kernel := To_Vector ((0 => (196, 24, 2, 
False)));
+            Table.States (672).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 58, 848)));
             Add_Action (Table.States (673), 14, 849);
             Add_Error (Table.States (673));
-            Table.States (673).Minimal_Complete_Action := (Shift, 14, 849);
-            Table.States (674).Productions := WisiToken.To_Vector ((1 => (264, 
0)));
+            Table.States (673).Kernel := To_Vector (((247, 47, 6, False), 
(247, 47, 5, False)));
+            Table.States (673).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 849)));
             Add_Action (Table.States (674), 14, 850);
             Add_Error (Table.States (674));
-            Table.States (674).Minimal_Complete_Action := (Shift, 14, 850);
-            Table.States (675).Productions := WisiToken.To_Vector ((1 => (316, 
0)));
+            Table.States (674).Kernel := To_Vector ((0 => (264, 51, 5, 
False)));
+            Table.States (674).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 850)));
             Add_Action (Table.States (675), 14, 851);
             Add_Error (Table.States (675));
-            Table.States (675).Minimal_Complete_Action := (Shift, 14, 851);
-            Table.States (676).Productions := WisiToken.To_Vector ((1 => (307, 
0)));
+            Table.States (675).Kernel := To_Vector ((0 => (316, 66, 6, 
False)));
+            Table.States (675).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 851)));
             Add_Action (Table.States (676), 29, 7);
             Add_Action (Table.States (676), 50, 18);
             Add_Error (Table.States (676));
             Add_Goto (Table.States (676), 207, 61);
             Add_Goto (Table.States (676), 262, 87);
             Add_Goto (Table.States (676), 312, 852);
-            Table.States (676).Minimal_Complete_Action := (Shift, 50, 18);
-            Table.States (677).Productions := WisiToken.To_Vector ((1 => (315, 
0)));
+            Table.States (676).Kernel := To_Vector ((0 => (307, 246, 6, 
False)));
+            Table.States (676).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 50, 18)));
             Add_Action (Table.States (677), (4, 5, 13, 15, 17, 18, 25, 27, 28, 
29, 30, 31, 32, 36, 37, 40, 41, 46, 47,
             48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 93, 
104, 105, 106, 107), (315, 0), 5,
             subunit_0'Access, null);
-            Table.States (677).Minimal_Complete_Action := (Reduce, 315, 5);
-            Table.States (678).Productions := WisiToken.To_Vector ((1 => (295, 
1)));
+            Table.States (677).Kernel := To_Vector ((0 => (315, 263, 0, 
False)));
+            Table.States (677).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 315, 5)));
             Add_Action (Table.States (678), 96, 853);
             Add_Error (Table.States (678));
-            Table.States (678).Minimal_Complete_Action := (Shift, 96, 853);
-            Table.States (679).Productions := WisiToken.To_Vector ((1 => (295, 
0)));
+            Table.States (678).Kernel := To_Vector ((0 => (295, 67, 1, 
False)));
+            Table.States (678).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 853)));
             Add_Action (Table.States (679), 4, 1);
             Add_Action (Table.States (679), 5, 2);
             Add_Action (Table.States (679), 13, Reduce, (132, 1), 0, null, 
null);
@@ -8470,45 +8691,45 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (679), 303, 101);
             Add_Goto (Table.States (679), 306, 363);
             Add_Goto (Table.States (679), 323, 114);
-            Table.States (679).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (680).Productions := WisiToken.To_Vector ((1 => (295, 
2)));
+            Table.States (679).Kernel := To_Vector ((0 => (295, 113, 0, 
False)));
+            Table.States (679).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (680), (22, 24, 43), (295, 2), 4, 
select_alternative_2'Access, null);
-            Table.States (680).Minimal_Complete_Action := (Reduce, 295, 4);
-            Table.States (681).Productions := WisiToken.To_Vector ((1 => (152, 
0)));
+            Table.States (680).Kernel := To_Vector ((0 => (295, 160, 0, 
False)));
+            Table.States (680).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 4)));
             Add_Action (Table.States (681), 61, 855);
             Add_Error (Table.States (681));
-            Table.States (681).Minimal_Complete_Action := (Shift, 61, 855);
-            Table.States (682).Productions := WisiToken.To_Vector ((1 => (323, 
0)));
+            Table.States (681).Kernel := To_Vector ((0 => (152, 24, 2, 
False)));
+            Table.States (681).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 61, 855)));
             Add_Action (Table.States (682), 61, 856);
             Add_Error (Table.States (682));
-            Table.States (682).Minimal_Complete_Action := (Shift, 61, 856);
-            Table.States (683).Productions := WisiToken.To_Vector ((1 => (160, 
0)));
+            Table.States (682).Kernel := To_Vector ((0 => (323, 24, 2, 
False)));
+            Table.States (682).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 61, 856)));
             Add_Action (Table.States (683), (22, 24, 43), (160, 0), 2, null, 
null);
-            Table.States (683).Minimal_Complete_Action := (Reduce, 160, 2);
-            Table.States (684).Productions := WisiToken.To_Vector ((1 => (294, 
0)));
+            Table.States (683).Kernel := To_Vector ((0 => (160, 300, 0, 
False)));
+            Table.States (683).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 160, 2)));
             Add_Action (Table.States (684), 61, 857);
             Add_Error (Table.States (684));
-            Table.States (684).Minimal_Complete_Action := (Shift, 61, 857);
-            Table.States (685).Productions := WisiToken.To_Vector ((1 => (294, 
1)));
+            Table.States (684).Kernel := To_Vector ((0 => (294, 24, 2, 
False)));
+            Table.States (684).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 61, 857)));
             Add_Action (Table.States (685), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (294, 1), 5, selective_accept_1'Access, null);
-            Table.States (685).Minimal_Complete_Action := (Reduce, 294, 5);
-            Table.States (686).Productions := WisiToken.To_Vector ((1 => (126, 
0)));
+            Table.States (685).Kernel := To_Vector ((0 => (294, 96, 0, 
False)));
+            Table.States (685).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 294, 5)));
             Add_Action (Table.States (686), 24, 858);
             Add_Error (Table.States (686));
-            Table.States (686).Minimal_Complete_Action := (Shift, 24, 858);
-            Table.States (687).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (686).Kernel := To_Vector ((0 => (126, 300, 3, 
False)));
+            Table.States (686).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 858)));
             Add_Action (Table.States (687), 96, 859);
             Add_Error (Table.States (687));
-            Table.States (687).Minimal_Complete_Action := (Shift, 96, 859);
-            Table.States (688).Productions := WisiToken.To_Vector ((1 => (317, 
0)));
+            Table.States (687).Kernel := To_Vector ((0 => (313, 122, 1, 
False)));
+            Table.States (687).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 859)));
             Add_Action (Table.States (688), 74, 337);
             Add_Action (Table.States (688), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (688));
             Add_Goto (Table.States (688), 122, 860);
-            Table.States (688).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (689).Productions := WisiToken.To_Vector ((1 => (316, 
0)));
+            Table.States (688).Kernel := To_Vector ((0 => (317, 60, 1, 
False)));
+            Table.States (688).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (689), 13, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (689), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (689), 28, 183);
@@ -8579,16 +8800,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (689), 319, 113);
             Add_Goto (Table.States (689), 325, 115);
             Add_Goto (Table.States (689), 331, 116);
-            Table.States (689).Minimal_Complete_Action := (Reduce, 159, 0);
-         end Subr_12;
-         procedure Subr_13
-         is begin
-            Table.States (690).Productions := WisiToken.To_Vector (((319, 0), 
(319, 1), (319, 2)));
+            Table.States (689).Kernel := To_Vector ((0 => (316, 35, 3, 
False)));
+            Table.States (689).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (690), 35, 862);
             Add_Action (Table.States (690), 96, 863);
             Add_Error (Table.States (690));
-            Table.States (690).Minimal_Complete_Action := (Shift, 96, 863);
-            Table.States (691).Productions := WisiToken.To_Vector ((1 => (305, 
0)));
+            Table.States (690).Kernel := To_Vector (((319, 122, 6, False), 
(319, 122, 3, False), (319, 122, 1,
+            False)));
+            Table.States (690).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 863)));
             Add_Action (Table.States (691), 104, 119);
             Add_Action (Table.States (691), 105, 33);
             Add_Action (Table.States (691), 106, 34);
@@ -8598,31 +8817,32 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (691), 239, 841);
             Add_Goto (Table.States (691), 272, 92);
             Add_Goto (Table.States (691), 293, 97);
-            Table.States (691).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (692).Productions := WisiToken.To_Vector (((318, 0), 
(318, 1)));
+            Table.States (691).Kernel := To_Vector ((0 => (305, 39, 4, 
False)));
+            Table.States (691).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (692), 24, Reduce, (318, 1), 1, 
task_definition_1'Access, null);
             Add_Action (Table.States (692), 49, 865);
             Add_Error (Table.States (692));
-            Table.States (692).Minimal_Complete_Action := (Reduce, 318, 1);
-            Table.States (693).Productions := WisiToken.To_Vector ((1 => (305, 
1)));
+            Table.States (692).Kernel := To_Vector (((318, 159, 1, False), 
(318, 159, 0, False)));
+            Table.States (692).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 1)));
             Add_Action (Table.States (693), 24, 866);
             Add_Error (Table.States (693));
-            Table.States (693).Minimal_Complete_Action := (Shift, 24, 866);
-            Table.States (694).Productions := WisiToken.To_Vector ((1 => (169, 
0)));
+            Table.States (693).Kernel := To_Vector ((0 => (305, 318, 2, 
False)));
+            Table.States (693).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 866)));
             Add_Action (Table.States (694), (35, 74, 96), (169, 0), 3, null, 
null);
-            Table.States (694).Minimal_Complete_Action := (Reduce, 169, 3);
-            Table.States (695).Productions := WisiToken.To_Vector ((1 => (169, 
1)));
+            Table.States (694).Kernel := To_Vector ((0 => (169, 77, 0, 
False)));
+            Table.States (694).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 3)));
             Add_Action (Table.States (695), (35, 74, 96), (169, 1), 3, 
discriminant_part_opt_1'Access, null);
-            Table.States (695).Minimal_Complete_Action := (Reduce, 169, 3);
-            Table.States (696).Productions := WisiToken.To_Vector ((1 => (171, 
0)));
+            Table.States (695).Kernel := To_Vector ((0 => (169, 77, 0, 
False)));
+            Table.States (695).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 169, 3)));
             Add_Action (Table.States (696), 77, Reduce, (170, 4), 0, null, 
null);
             Add_Action (Table.States (696), 96, Reduce, (170, 4), 0, null, 
null);
             Add_Action (Table.States (696), 104, 164);
             Add_Error (Table.States (696));
             Add_Goto (Table.States (696), 170, 867);
             Add_Goto (Table.States (696), 219, 547);
-            Table.States (696).Minimal_Complete_Action := (Reduce, 170, 0);
-            Table.States (697).Productions := WisiToken.To_Vector (((170, 0), 
(170, 1), (170, 2), (170, 3)));
+            Table.States (696).Kernel := To_Vector ((0 => (171, 96, 0, True)));
+            Table.States (696).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 170, 0)));
+            Table.States (696).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (697), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (697), 40, 868);
             Add_Action (Table.States (697), 104, 869);
@@ -8636,20 +8856,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (697), 242, 872);
             Add_Goto (Table.States (697), 272, 92);
             Add_Goto (Table.States (697), 293, 873);
-            Table.States (697).Minimal_Complete_Action := (Shift, 104, 869);
-            Table.States (698).Productions := WisiToken.To_Vector (((109, 0), 
(109, 1), (109, 2), (110, 0), (110, 2),
-            (111, 0), (111, 1)));
+            Table.States (697).Kernel := To_Vector (((170, 81, 2, False), 
(170, 81, 3, False), (170, 81, 1, False),
+            (170, 81, 2, False)));
+            Table.States (697).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 869)));
             Add_Action (Table.States (698), 36, 874);
-            Add_Action (Table.States (698), 39, Reduce, (109, 2), 1, null, 
null, (110, 2), 1, null, null);
+            Add_Action (Table.States (698), 39, Reduce, (109, 2), 1, null, 
null);
+            Add_Conflict (Table.States (698), 39, (110, 2), 1, null, null);
             Add_Action (Table.States (698), 64, 875);
             Add_Action (Table.States (698), 65, 876);
             Add_Error (Table.States (698));
-            Table.States (698).Minimal_Complete_Action := (Reduce, 109, 1);
-            Table.States (699).Productions := WisiToken.To_Vector (((120, 0), 
(120, 1)));
+            Table.States (698).Kernel := To_Vector (((109, 6, 1, False), (109, 
6, 1, False), (109, 6, 0, False), (110,
+            6, 1, False), (110, 6, 0, False), (111, 6, 2, False), (111, 6, 1, 
False)));
+            Table.States (698).Minimal_Complete_Actions := To_Vector 
(((Reduce, 109, 1), (Reduce, 110, 1)));
             Add_Action (Table.States (699), 76, 877);
             Add_Error (Table.States (699));
-            Table.States (699).Minimal_Complete_Action := (Shift, 76, 877);
-            Table.States (700).Productions := WisiToken.To_Vector (((326, 4), 
(326, 5)));
+            Table.States (699).Kernel := To_Vector (((120, 11, 7, False), 
(120, 11, 7, False)));
+            Table.States (699).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 76, 877)));
             Add_Action (Table.States (700), 3, 121);
             Add_Action (Table.States (700), 20, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (700), 39, 122);
@@ -8687,8 +8909,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (700), 320, 144);
             Add_Goto (Table.States (700), 321, 145);
             Add_Goto (Table.States (700), 330, 146);
-            Table.States (700).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (701).Productions := WisiToken.To_Vector ((1 => (326, 
3)));
+            Table.States (700).Kernel := To_Vector (((326, 19, 1, False), 
(326, 19, 0, False)));
+            Table.States (700).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (701), 3, 121);
             Add_Action (Table.States (701), 39, 122);
             Add_Action (Table.States (701), 40, 123);
@@ -8725,19 +8947,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (701), 320, 144);
             Add_Goto (Table.States (701), 321, 145);
             Add_Goto (Table.States (701), 330, 146);
-            Table.States (701).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (702).Productions := WisiToken.To_Vector ((1 => (228, 
8)));
+            Table.States (701).Kernel := To_Vector ((0 => (326, 20, 0, 
False)));
+            Table.States (701).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (702), (74, 96), (228, 8), 1, null, null);
-            Table.States (702).Minimal_Complete_Action := (Reduce, 228, 1);
-            Table.States (703).Productions := WisiToken.To_Vector (((109, 3), 
(110, 1), (111, 4), (228, 0), (228, 4)));
+            Table.States (702).Kernel := To_Vector ((0 => (228, 34, 0, 
False)));
+            Table.States (702).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 1)));
             Add_Action (Table.States (703), 34, 880);
-            Add_Action (Table.States (703), 39, Reduce, (109, 3), 1, null, 
null, (110, 1), 1, null, null);
+            Add_Action (Table.States (703), 39, Reduce, (109, 3), 1, null, 
null);
+            Add_Conflict (Table.States (703), 39, (110, 1), 1, null, null);
             Add_Action (Table.States (703), 41, Reduce, (111, 4), 1, null, 
null);
             Add_Action (Table.States (703), 49, Reduce, (111, 4), 1, null, 
null);
             Add_Action (Table.States (703), 54, Reduce, (111, 4), 1, null, 
null);
             Add_Error (Table.States (703));
-            Table.States (703).Minimal_Complete_Action := (Reduce, 109, 1);
-            Table.States (704).Productions := WisiToken.To_Vector ((1 => (326, 
2)));
+            Table.States (703).Kernel := To_Vector (((109, 36, 0, False), 
(110, 36, 0, False), (111, 36, 0, False),
+            (228, 36, 3, False), (228, 36, 1, False)));
+            Table.States (703).Minimal_Complete_Actions := To_Vector 
(((Reduce, 109, 1), (Reduce, 110, 1), (Reduce,
+            111, 1)));
             Add_Action (Table.States (704), 3, 121);
             Add_Action (Table.States (704), 39, 122);
             Add_Action (Table.States (704), 40, 123);
@@ -8773,16 +8998,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (704), 320, 144);
             Add_Goto (Table.States (704), 321, 145);
             Add_Goto (Table.States (704), 330, 146);
-            Table.States (704).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (705).Productions := WisiToken.To_Vector ((1 => (280, 
1)));
+            Table.States (704).Kernel := To_Vector ((0 => (326, 38, 0, 
False)));
+            Table.States (704).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (705), 54, 882);
             Add_Error (Table.States (705));
-            Table.States (705).Minimal_Complete_Action := (Shift, 54, 882);
-            Table.States (706).Productions := WisiToken.To_Vector (((228, 2), 
(228, 6)));
+            Table.States (705).Kernel := To_Vector ((0 => (280, 41, 1, 
False)));
+            Table.States (705).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 54, 882)));
             Add_Action (Table.States (706), 34, 883);
             Add_Error (Table.States (706));
-            Table.States (706).Minimal_Complete_Action := (Shift, 34, 883);
-            Table.States (707).Productions := WisiToken.To_Vector ((1 => (326, 
1)));
+            Table.States (706).Kernel := To_Vector (((228, 51, 3, False), 
(228, 51, 1, False)));
+            Table.States (706).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 883)));
             Add_Action (Table.States (707), 3, 121);
             Add_Action (Table.States (707), 39, 122);
             Add_Action (Table.States (707), 40, 123);
@@ -8806,8 +9031,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (707), 320, 144);
             Add_Goto (Table.States (707), 321, 145);
             Add_Goto (Table.States (707), 330, 146);
-            Table.States (707).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (708).Productions := WisiToken.To_Vector ((1 => (280, 
0)));
+            Table.States (707).Kernel := To_Vector ((0 => (326, 53, 3, 
False)));
+            Table.States (707).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (708), 15, 885);
             Add_Action (Table.States (708), 24, Reduce, (150, 1), 0, null, 
null);
             Add_Action (Table.States (708), 28, 183);
@@ -8824,78 +9049,77 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (708), 219, 892);
             Add_Goto (Table.States (708), 281, 94);
             Add_Goto (Table.States (708), 327, 893);
-            Table.States (708).Minimal_Complete_Action := (Reduce, 150, 0);
-            Table.States (709).Productions := WisiToken.To_Vector (((109, 4), 
(228, 3), (228, 7)));
+            Table.States (708).Kernel := To_Vector ((0 => (280, 54, 2, 
False)));
+            Table.States (708).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 150, 0)));
             Add_Action (Table.States (709), 34, 894);
             Add_Action (Table.States (709), 39, Reduce, (109, 4), 1, null, 
null);
             Add_Error (Table.States (709));
-            Table.States (709).Minimal_Complete_Action := (Reduce, 109, 1);
-            Table.States (710).Productions := WisiToken.To_Vector (((111, 2), 
(111, 3), (223, 0)));
+            Table.States (709).Kernel := To_Vector (((109, 64, 0, False), 
(228, 64, 3, False), (228, 64, 1, False)));
+            Table.States (709).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 109, 1)));
             Add_Action (Table.States (710), 36, 895);
             Add_Action (Table.States (710), 41, Reduce, (111, 3), 1, null, 
null);
             Add_Action (Table.States (710), 49, Reduce, (111, 3), 1, null, 
null);
             Add_Action (Table.States (710), 54, Reduce, (111, 3), 1, null, 
null);
             Add_Action (Table.States (710), 96, 896);
             Add_Error (Table.States (710));
-            Table.States (710).Minimal_Complete_Action := (Reduce, 111, 1);
-            Table.States (711).Productions := WisiToken.To_Vector (((228, 1), 
(228, 5)));
+            Table.States (710).Kernel := To_Vector (((111, 65, 1, False), 
(111, 65, 0, False), (223, 65, 1, False)));
+            Table.States (710).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 111, 1)));
             Add_Action (Table.States (711), 34, 897);
             Add_Error (Table.States (711));
-            Table.States (711).Minimal_Complete_Action := (Shift, 34, 897);
-            Table.States (712).Productions := WisiToken.To_Vector ((1 => (183, 
0)));
+            Table.States (711).Kernel := To_Vector (((228, 66, 3, False), 
(228, 66, 1, False)));
+            Table.States (711).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 897)));
             Add_Action (Table.States (712), 104, 898);
             Add_Action (Table.States (712), 106, 899);
             Add_Error (Table.States (712));
             Add_Goto (Table.States (712), 180, 900);
             Add_Goto (Table.States (712), 181, 901);
-            Table.States (712).Minimal_Complete_Action := (Shift, 104, 898);
-            Table.States (713).Productions := WisiToken.To_Vector ((1 => (259, 
0)));
+            Table.States (712).Kernel := To_Vector ((0 => (183, 76, 2, 
False)));
+            Table.States (712).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 898)));
             Add_Action (Table.States (713), 39, 902);
             Add_Error (Table.States (713));
-            Table.States (713).Minimal_Complete_Action := (Shift, 39, 902);
-            Table.States (714).Productions := WisiToken.To_Vector (((162, 0), 
(162, 1)));
+            Table.States (713).Kernel := To_Vector ((0 => (259, 109, 5, 
False)));
+            Table.States (713).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 902)));
             Add_Action (Table.States (714), 39, 903);
             Add_Error (Table.States (714));
-            Table.States (714).Minimal_Complete_Action := (Shift, 39, 903);
-            Table.States (715).Productions := WisiToken.To_Vector (((260, 0), 
(326, 7)));
+            Table.States (714).Kernel := To_Vector (((162, 110, 5, False), 
(162, 110, 2, False)));
+            Table.States (714).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 903)));
             Add_Action (Table.States (715), 41, 705);
             Add_Action (Table.States (715), 49, 904);
             Add_Action (Table.States (715), 54, 708);
             Add_Error (Table.States (715));
             Add_Goto (Table.States (715), 280, 905);
-            Table.States (715).Minimal_Complete_Action := (Shift, 41, 705);
-            Table.States (716).Productions := WisiToken.To_Vector ((1 => (326, 
8)));
+            Table.States (715).Kernel := To_Vector (((260, 111, 2, False), 
(326, 111, 2, False)));
+            Table.States (715).Minimal_Complete_Actions := To_Vector (((Shift, 
49, 904), (Shift, 41, 705)));
             Add_Action (Table.States (716), (74, 96), (326, 8), 1, null, null);
-            Table.States (716).Minimal_Complete_Action := (Reduce, 326, 1);
-            Table.States (717).Productions := WisiToken.To_Vector ((1 => (326, 
6)));
+            Table.States (716).Kernel := To_Vector ((0 => (326, 114, 0, 
False)));
+            Table.States (716).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 1)));
             Add_Action (Table.States (717), (74, 96), (326, 6), 1, null, null);
-            Table.States (717).Minimal_Complete_Action := (Reduce, 326, 1);
-            Table.States (718).Productions := WisiToken.To_Vector ((1 => (326, 
9)));
+            Table.States (717).Kernel := To_Vector ((0 => (326, 120, 0, 
False)));
+            Table.States (717).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 1)));
             Add_Action (Table.States (718), (74, 96), (326, 9), 1, null, null);
-            Table.States (718).Minimal_Complete_Action := (Reduce, 326, 1);
-            Table.States (719).Productions := WisiToken.To_Vector ((1 => (326, 
0)));
+            Table.States (718).Kernel := To_Vector ((0 => (326, 162, 0, 
False)));
+            Table.States (718).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 1)));
             Add_Action (Table.States (719), (74, 96), (326, 0), 1, null, null);
-            Table.States (719).Minimal_Complete_Action := (Reduce, 326, 1);
-            Table.States (720).Productions := WisiToken.To_Vector ((1 => (326, 
10)));
+            Table.States (719).Kernel := To_Vector ((0 => (326, 183, 0, 
False)));
+            Table.States (719).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 1)));
             Add_Action (Table.States (720), (74, 96), (326, 10), 1, null, 
null);
-            Table.States (720).Minimal_Complete_Action := (Reduce, 326, 1);
-            Table.States (721).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1), (114, 2)));
+            Table.States (720).Kernel := To_Vector ((0 => (326, 228, 0, 
False)));
+            Table.States (720).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 1)));
             Add_Action (Table.States (721), 7, 556);
             Add_Error (Table.States (721));
-            Table.States (721).Minimal_Complete_Action := (Shift, 7, 556);
-            Table.States (722).Productions := WisiToken.To_Vector ((1 => (206, 
0)));
+            Table.States (721).Kernel := To_Vector (((114, 241, 2, False), 
(114, 241, 3, True), (114, 241, 2, False)));
+            Table.States (721).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 7, 556)));
             Add_Action (Table.States (722), 74, 337);
             Add_Action (Table.States (722), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (722));
             Add_Goto (Table.States (722), 122, 906);
-            Table.States (722).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (723).Productions := WisiToken.To_Vector ((1 => (331, 
0)));
+            Table.States (722).Kernel := To_Vector ((0 => (206, 326, 1, 
False)));
+            Table.States (722).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (723), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (331, 0), 5,
             use_clause_0'Access, null);
-            Table.States (723).Minimal_Complete_Action := (Reduce, 331, 5);
-            Table.States (724).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (245, 2), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (723).Kernel := To_Vector ((0 => (331, 96, 0, 
False)));
+            Table.States (723).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 331, 5)));
             Add_Action (Table.States (724), 74, 337);
             Add_Action (Table.States (724), 76, 235);
             Add_Action (Table.States (724), 84, 237);
@@ -8906,9 +9130,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (724), 115, 241);
             Add_Goto (Table.States (724), 122, 907);
             Add_Goto (Table.States (724), 322, 242);
-            Table.States (724).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (725).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (245, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (724).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (245, 239, 1, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (724).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (725), 74, 337);
             Add_Action (Table.States (725), 76, 235);
             Add_Action (Table.States (725), 84, 237);
@@ -8919,17 +9144,19 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (725), 115, 241);
             Add_Goto (Table.States (725), 122, 908);
             Add_Goto (Table.States (725), 322, 242);
-            Table.States (725).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (726).Productions := WisiToken.To_Vector ((1 => (208, 
0)));
+            Table.States (725).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (245, 239, 1, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (725).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (726), (104, 105, 106), (208, 0), 1, 
null, null);
-            Table.States (726).Minimal_Complete_Action := (Reduce, 208, 1);
-            Table.States (727).Productions := WisiToken.To_Vector ((1 => (208, 
1)));
+            Table.States (726).Kernel := To_Vector ((0 => (208, 9, 0, False)));
+            Table.States (726).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 208, 1)));
             Add_Action (Table.States (727), (104, 105, 106), (208, 1), 1, 
null, null);
-            Table.States (727).Minimal_Complete_Action := (Reduce, 208, 1);
-            Table.States (728).Productions := WisiToken.To_Vector ((1 => (270, 
0)));
+            Table.States (727).Kernel := To_Vector ((0 => (208, 16, 0, 
False)));
+            Table.States (727).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 208, 1)));
             Add_Action (Table.States (728), (29, 50), (270, 0), 1, null, null);
-            Table.States (728).Minimal_Complete_Action := (Reduce, 270, 1);
-            Table.States (729).Productions := WisiToken.To_Vector ((1 => (114, 
2)));
+            Table.States (728).Kernel := To_Vector ((0 => (270, 51, 0, 
False)));
+            Table.States (728).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 270, 1)));
             Add_Action (Table.States (729), 104, 119);
             Add_Action (Table.States (729), 105, 33);
             Add_Action (Table.States (729), 106, 34);
@@ -8938,13 +9165,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (729), 239, 909);
             Add_Goto (Table.States (729), 272, 92);
             Add_Goto (Table.States (729), 293, 97);
-            Table.States (729).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (730).Productions := WisiToken.To_Vector (((114, 0), 
(114, 1)));
+            Table.States (729).Kernel := To_Vector ((0 => (114, 208, 1, 
False)));
+            Table.States (729).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (730), 29, 910);
             Add_Action (Table.States (730), 50, 911);
             Add_Error (Table.States (730));
-            Table.States (730).Minimal_Complete_Action := (Shift, 50, 911);
-            Table.States (731).Productions := WisiToken.To_Vector ((1 => (245, 
0)));
+            Table.States (730).Kernel := To_Vector (((114, 270, 1, False), 
(114, 270, 2, True)));
+            Table.States (730).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 50, 911)));
+            Table.States (730).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (731), 104, 119);
             Add_Action (Table.States (731), 105, 33);
             Add_Action (Table.States (731), 106, 34);
@@ -8953,12 +9181,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (731), 239, 912);
             Add_Goto (Table.States (731), 272, 92);
             Add_Goto (Table.States (731), 293, 97);
-            Table.States (731).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (732).Productions := WisiToken.To_Vector ((1 => (133, 
1)));
+            Table.States (731).Kernel := To_Vector ((0 => (245, 56, 2, 
False)));
+            Table.States (731).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (732), 96, 913);
             Add_Error (Table.States (732));
-            Table.States (732).Minimal_Complete_Action := (Shift, 96, 913);
-            Table.States (733).Productions := WisiToken.To_Vector (((187, 0), 
(187, 1)));
+            Table.States (732).Kernel := To_Vector ((0 => (133, 220, 1, 
False)));
+            Table.States (732).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 913)));
             Add_Action (Table.States (733), 44, 914);
             Add_Action (Table.States (733), 104, 915);
             Add_Action (Table.States (733), 105, 33);
@@ -8970,77 +9198,81 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (733), 239, 918);
             Add_Goto (Table.States (733), 272, 92);
             Add_Goto (Table.States (733), 293, 97);
-            Table.States (733).Minimal_Complete_Action := (Shift, 104, 915);
-            Table.States (734).Productions := WisiToken.To_Vector ((1 => (188, 
1)));
+            Table.States (733).Kernel := To_Vector (((187, 72, 4, False), 
(187, 72, 2, False)));
+            Table.States (733).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 915)));
             Add_Action (Table.States (734), (24, 72), (188, 1), 1, null, null);
-            Table.States (734).Minimal_Complete_Action := (Reduce, 188, 1);
-            Table.States (735).Productions := WisiToken.To_Vector (((188, 0), 
(189, 0)));
+            Table.States (734).Kernel := To_Vector ((0 => (188, 187, 0, 
False)));
+            Table.States (734).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 188, 1)));
             Add_Action (Table.States (735), 24, Reduce, (189, 0), 1, null, 
null);
             Add_Action (Table.States (735), 72, 733);
             Add_Error (Table.States (735));
             Add_Goto (Table.States (735), 187, 919);
-            Table.States (735).Minimal_Complete_Action := (Reduce, 189, 1);
-            Table.States (736).Productions := WisiToken.To_Vector ((1 => (218, 
0)));
+            Table.States (735).Kernel := To_Vector (((188, 188, 3, True), 
(189, 188, 0, False)));
+            Table.States (735).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 189, 1)));
             Add_Action (Table.States (736), (1 =>  24), (218, 0), 3, 
handled_sequence_of_statements_0'Access, null);
-            Table.States (736).Minimal_Complete_Action := (Reduce, 218, 3);
-            Table.States (737).Productions := WisiToken.To_Vector ((1 => (188, 
2)));
+            Table.States (736).Kernel := To_Vector ((0 => (218, 189, 0, 
False)));
+            Table.States (736).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 3)));
             Add_Action (Table.States (737), (24, 72), (188, 2), 1, null, null);
-            Table.States (737).Minimal_Complete_Action := (Reduce, 188, 1);
-            Table.States (738).Productions := WisiToken.To_Vector ((1 => (133, 
0)));
+            Table.States (737).Kernel := To_Vector ((0 => (188, 257, 0, 
False)));
+            Table.States (737).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 188, 1)));
             Add_Action (Table.States (738), 24, 920);
             Add_Error (Table.States (738));
-            Table.States (738).Minimal_Complete_Action := (Shift, 24, 920);
-            Table.States (739).Productions := WisiToken.To_Vector ((1 => (232, 
1)));
+            Table.States (738).Kernel := To_Vector ((0 => (133, 218, 2, 
False)));
+            Table.States (738).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 920)));
             Add_Action (Table.States (739), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (739), 104, 149);
             Add_Error (Table.States (739));
             Add_Goto (Table.States (739), 220, 921);
-            Table.States (739).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (740).Productions := WisiToken.To_Vector ((1 => (232, 
0)));
+            Table.States (739).Kernel := To_Vector ((0 => (232, 37, 1, 
False)));
+            Table.States (739).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (740), 37, 922);
             Add_Error (Table.States (740));
-            Table.States (740).Minimal_Complete_Action := (Shift, 37, 922);
-            Table.States (741).Productions := WisiToken.To_Vector ((1 => (157, 
9)));
+            Table.States (740).Kernel := To_Vector ((0 => (232, 24, 2, 
False)));
+            Table.States (740).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 922)));
             Add_Action (Table.States (741), 96, 923);
             Add_Error (Table.States (741));
-            Table.States (741).Minimal_Complete_Action := (Shift, 96, 923);
-            Table.States (742).Productions := WisiToken.To_Vector (((241, 0), 
(314, 0), (314, 1)));
+            Table.States (741).Kernel := To_Vector ((0 => (157, 192, 1, 
False)));
+            Table.States (741).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 923)));
             Add_Action (Table.States (742), 41, 924);
             Add_Error (Table.States (742));
-            Table.States (742).Minimal_Complete_Action := (Shift, 41, 924);
-            Table.States (743).Productions := WisiToken.To_Vector (((244, 1), 
(244, 4)));
+            Table.States (742).Kernel := To_Vector (((241, 40, 1, False), 
(314, 40, 6, False), (314, 40, 2, False)));
+            Table.States (742).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 924)));
             Add_Action (Table.States (743), 74, 337);
             Add_Action (Table.States (743), 82, 925);
             Add_Action (Table.States (743), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (743));
             Add_Goto (Table.States (743), 122, 926);
-            Table.States (743).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (744).Productions := WisiToken.To_Vector (((244, 2), 
(244, 5)));
+            Table.States (743).Kernel := To_Vector (((244, 114, 2, False), 
(244, 114, 1, False)));
+            Table.States (743).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (744), 74, 337);
             Add_Action (Table.States (744), 82, 927);
             Add_Action (Table.States (744), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (744));
             Add_Goto (Table.States (744), 122, 928);
-            Table.States (744).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (745).Productions := WisiToken.To_Vector (((244, 0), 
(244, 3)));
+            Table.States (744).Kernel := To_Vector (((244, 120, 2, False), 
(244, 120, 1, False)));
+            Table.States (744).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (745), 74, 337);
             Add_Action (Table.States (745), 82, 929);
             Add_Action (Table.States (745), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (745));
             Add_Goto (Table.States (745), 122, 930);
-            Table.States (745).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (746).Productions := WisiToken.To_Vector ((1 => (278, 
0)));
+            Table.States (745).Kernel := To_Vector (((244, 314, 2, False), 
(244, 314, 1, False)));
+            Table.States (745).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
+         end Subr_13;
+         procedure Subr_14
+         is begin
             Add_Action (Table.States (746), (77, 83), (278, 0), 3, null, null);
-            Table.States (746).Minimal_Complete_Action := (Reduce, 278, 3);
-            Table.States (747).Productions := WisiToken.To_Vector ((1 => (179, 
0)));
+            Table.States (746).Kernel := To_Vector ((0 => (278, 277, 0, 
True)));
+            Table.States (746).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 278, 3)));
+            Table.States (746).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (747), 77, 931);
             Add_Error (Table.States (747));
-            Table.States (747).Minimal_Complete_Action := (Shift, 77, 931);
-            Table.States (748).Productions := WisiToken.To_Vector ((1 => (179, 
1)));
+            Table.States (747).Kernel := To_Vector ((0 => (179, 167, 2, 
False)));
+            Table.States (747).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 931)));
             Add_Action (Table.States (748), 96, 932);
             Add_Error (Table.States (748));
-            Table.States (748).Minimal_Complete_Action := (Shift, 96, 932);
-            Table.States (749).Productions := WisiToken.To_Vector ((1 => (213, 
2)));
+            Table.States (748).Kernel := To_Vector ((0 => (179, 122, 1, 
False)));
+            Table.States (748).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 932)));
             Add_Action (Table.States (749), 104, 119);
             Add_Action (Table.States (749), 105, 33);
             Add_Action (Table.States (749), 106, 34);
@@ -9049,8 +9281,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (749), 239, 933);
             Add_Goto (Table.States (749), 272, 92);
             Add_Goto (Table.States (749), 293, 97);
-            Table.States (749).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (750).Productions := WisiToken.To_Vector ((1 => (213, 
1)));
+            Table.States (749).Kernel := To_Vector ((0 => (213, 39, 2, 
False)));
+            Table.States (749).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (750), 104, 119);
             Add_Action (Table.States (750), 105, 33);
             Add_Action (Table.States (750), 106, 34);
@@ -9059,49 +9291,49 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (750), 239, 934);
             Add_Goto (Table.States (750), 272, 92);
             Add_Goto (Table.States (750), 293, 97);
-            Table.States (750).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (751).Productions := WisiToken.To_Vector (((125, 0), 
(256, 1)));
+            Table.States (750).Kernel := To_Vector ((0 => (213, 39, 2, 
False)));
+            Table.States (750).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (751), 77, 935);
             Add_Action (Table.States (751), 83, 443);
             Add_Error (Table.States (751));
-            Table.States (751).Minimal_Complete_Action := (Shift, 77, 935);
-            Table.States (752).Productions := WisiToken.To_Vector ((1 => (256, 
2)));
+            Table.States (751).Kernel := To_Vector (((125, 125, 1, True), 
(256, 125, 1, False)));
+            Table.States (751).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 935)));
             Add_Action (Table.States (752), 77, 936);
             Add_Error (Table.States (752));
-            Table.States (752).Minimal_Complete_Action := (Shift, 77, 936);
-            Table.States (753).Productions := WisiToken.To_Vector ((1 => (256, 
0)));
+            Table.States (752).Kernel := To_Vector ((0 => (256, 153, 1, 
False)));
+            Table.States (752).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 936)));
             Add_Action (Table.States (753), 77, 937);
             Add_Error (Table.States (753));
-            Table.States (753).Minimal_Complete_Action := (Shift, 77, 937);
-            Table.States (754).Productions := WisiToken.To_Vector ((1 => (193, 
0)));
+            Table.States (753).Kernel := To_Vector ((0 => (256, 192, 1, 
False)));
+            Table.States (753).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 937)));
             Add_Action (Table.States (754), 96, 938);
             Add_Error (Table.States (754));
-            Table.States (754).Minimal_Complete_Action := (Shift, 96, 938);
-            Table.States (755).Productions := WisiToken.To_Vector ((1 => (243, 
0)));
+            Table.States (754).Kernel := To_Vector ((0 => (193, 122, 1, 
False)));
+            Table.States (754).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 938)));
             Add_Action (Table.States (755), 96, 939);
             Add_Error (Table.States (755));
-            Table.States (755).Minimal_Complete_Action := (Shift, 96, 939);
-            Table.States (756).Productions := WisiToken.To_Vector ((1 => (112, 
0)));
+            Table.States (755).Kernel := To_Vector ((0 => (243, 122, 1, 
False)));
+            Table.States (755).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 939)));
             Add_Action (Table.States (756), 96, 940);
             Add_Error (Table.States (756));
-            Table.States (756).Minimal_Complete_Action := (Shift, 96, 940);
-            Table.States (757).Productions := WisiToken.To_Vector ((1 => (308, 
0)));
+            Table.States (756).Kernel := To_Vector ((0 => (112, 122, 1, 
False)));
+            Table.States (756).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 940)));
             Add_Action (Table.States (757), 96, 941);
             Add_Error (Table.States (757));
-            Table.States (757).Minimal_Complete_Action := (Shift, 96, 941);
-            Table.States (758).Productions := WisiToken.To_Vector ((1 => (311, 
0)));
+            Table.States (757).Kernel := To_Vector ((0 => (308, 122, 1, 
False)));
+            Table.States (757).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 941)));
             Add_Action (Table.States (758), 96, 942);
             Add_Error (Table.States (758));
-            Table.States (758).Minimal_Complete_Action := (Shift, 96, 942);
-            Table.States (759).Productions := WisiToken.To_Vector ((1 => (307, 
0)));
+            Table.States (758).Kernel := To_Vector ((0 => (311, 122, 1, 
False)));
+            Table.States (758).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 942)));
             Add_Action (Table.States (759), 13, 943);
             Add_Error (Table.States (759));
-            Table.States (759).Minimal_Complete_Action := (Shift, 13, 943);
-            Table.States (760).Productions := WisiToken.To_Vector ((1 => (113, 
0)));
+            Table.States (759).Kernel := To_Vector ((0 => (307, 159, 3, 
False)));
+            Table.States (759).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 943)));
             Add_Action (Table.States (760), 24, 944);
             Add_Error (Table.States (760));
-            Table.States (760).Minimal_Complete_Action := (Shift, 24, 944);
-            Table.States (761).Productions := WisiToken.To_Vector ((1 => (137, 
0)));
+            Table.States (760).Kernel := To_Vector ((0 => (113, 218, 2, 
False)));
+            Table.States (760).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 944)));
             Add_Action (Table.States (761), 3, 121);
             Add_Action (Table.States (761), 39, 122);
             Add_Action (Table.States (761), 40, 261);
@@ -9140,16 +9372,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (761), 320, 144);
             Add_Goto (Table.States (761), 321, 145);
             Add_Goto (Table.States (761), 330, 146);
-            Table.States (761).Minimal_Complete_Action := (Reduce, 166, 0);
-            Table.States (762).Productions := WisiToken.To_Vector ((1 => (138, 
1)));
+            Table.States (761).Kernel := To_Vector ((0 => (137, 72, 1, 
False)));
+            Table.States (761).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 166, 0)));
             Add_Action (Table.States (762), (77, 83), (138, 1), 1, null, null);
-            Table.States (762).Minimal_Complete_Action := (Reduce, 138, 1);
-            Table.States (763).Productions := WisiToken.To_Vector (((136, 0), 
(138, 0)));
+            Table.States (762).Kernel := To_Vector ((0 => (138, 137, 0, 
False)));
+            Table.States (762).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 138, 1)));
             Add_Action (Table.States (763), 77, Reduce, (136, 0), 4, 
case_expression_0'Access, null);
             Add_Action (Table.States (763), 83, 946);
             Add_Error (Table.States (763));
-            Table.States (763).Minimal_Complete_Action := (Reduce, 136, 4);
-            Table.States (764).Productions := WisiToken.To_Vector ((1 => (273, 
0)));
+            Table.States (763).Kernel := To_Vector (((136, 138, 0, False), 
(138, 138, 3, True)));
+            Table.States (763).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 136, 4)));
             Add_Action (Table.States (764), 3, 121);
             Add_Action (Table.States (764), 39, 122);
             Add_Action (Table.States (764), 40, 123);
@@ -9184,26 +9416,27 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (764), 320, 144);
             Add_Goto (Table.States (764), 321, 145);
             Add_Goto (Table.States (764), 330, 146);
-            Table.States (764).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (765).Productions := WisiToken.To_Vector (((221, 0), 
(221, 1), (221, 2), (221, 3)));
+            Table.States (764).Kernel := To_Vector ((0 => (273, 87, 0, 
False)));
+            Table.States (764).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (765), 22, 948);
             Add_Action (Table.States (765), 23, 949);
             Add_Action (Table.States (765), 77, Reduce, (221, 3), 4, 
if_expression_3'Access, null);
             Add_Error (Table.States (765));
             Add_Goto (Table.States (765), 172, 950);
             Add_Goto (Table.States (765), 173, 951);
-            Table.States (765).Minimal_Complete_Action := (Reduce, 221, 4);
-            Table.States (766).Productions := WisiToken.To_Vector ((1 => (117, 
0)));
+            Table.States (765).Kernel := To_Vector (((221, 192, 3, False), 
(221, 192, 1, False), (221, 192, 2, False),
+            (221, 192, 0, False)));
+            Table.States (765).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 221, 4)));
             Add_Action (Table.States (766), 77, 952);
             Add_Error (Table.States (766));
-            Table.States (766).Minimal_Complete_Action := (Shift, 77, 952);
-            Table.States (767).Productions := WisiToken.To_Vector ((1 => (117, 
1)));
+            Table.States (766).Kernel := To_Vector ((0 => (117, 54, 1, 
False)));
+            Table.States (766).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 952)));
             Add_Action (Table.States (767), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (117, 1), 5, aggregate_1'Access,
             null);
-            Table.States (767).Minimal_Complete_Action := (Reduce, 117, 5);
-            Table.States (768).Productions := WisiToken.To_Vector ((1 => (277, 
0)));
+            Table.States (767).Kernel := To_Vector ((0 => (117, 77, 0, 
False)));
+            Table.States (767).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 117, 5)));
             Add_Action (Table.States (768), 3, 121);
             Add_Action (Table.States (768), 39, 122);
             Add_Action (Table.States (768), 40, 123);
@@ -9238,8 +9471,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (768), 320, 144);
             Add_Goto (Table.States (768), 321, 145);
             Add_Goto (Table.States (768), 330, 146);
-            Table.States (768).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (769).Productions := WisiToken.To_Vector ((1 => (140, 
0)));
+            Table.States (768).Kernel := To_Vector ((0 => (277, 76, 1, 
False)));
+            Table.States (768).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (769), 4, 1);
             Add_Action (Table.States (769), 5, 2);
             Add_Action (Table.States (769), 13, Reduce, (132, 1), 0, null, 
null);
@@ -9296,20 +9529,17 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (769), 303, 101);
             Add_Goto (Table.States (769), 306, 363);
             Add_Goto (Table.States (769), 323, 114);
-            Table.States (769).Minimal_Complete_Action := (Reduce, 300, 0);
-         end Subr_13;
-         procedure Subr_14
-         is begin
-            Table.States (770).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (769).Kernel := To_Vector ((0 => (140, 87, 0, 
False)));
+            Table.States (769).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (770), 96, 955);
             Add_Error (Table.States (770));
-            Table.States (770).Minimal_Complete_Action := (Shift, 96, 955);
-            Table.States (771).Productions := WisiToken.To_Vector ((1 => (233, 
0)));
+            Table.States (770).Kernel := To_Vector ((0 => (139, 15, 1, 
False)));
+            Table.States (770).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 955)));
             Add_Action (Table.States (771), (10, 20, 21, 22, 23, 35, 37, 43, 
53, 68, 74, 75, 77, 79, 83, 87, 96), (233,
             0), 3, null, null);
-            Table.States (771).Minimal_Complete_Action := (Reduce, 233, 3);
-            Table.States (772).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3), (314, 0), (314, 1)));
+            Table.States (771).Kernel := To_Vector ((0 => (233, 234, 0, 
True)));
+            Table.States (771).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 233, 3)));
+            Table.States (771).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (772), 10, Reduce, (314, 1), 3, 
subtype_indication_1'Access, null);
             Add_Action (Table.States (772), 21, Reduce, (314, 1), 3, 
subtype_indication_1'Access, null);
             Add_Action (Table.States (772), 37, Reduce, (314, 1), 3, 
subtype_indication_1'Access, null);
@@ -9330,11 +9560,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (772), 155, 956);
             Add_Goto (Table.States (772), 224, 621);
             Add_Goto (Table.States (772), 322, 242);
-            Table.States (772).Minimal_Complete_Action := (Reduce, 314, 3);
-            Table.States (773).Productions := WisiToken.To_Vector ((1 => (155, 
0)));
+            Table.States (772).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (314, 239, 4, False), (314, 239, 0, False)));
+            Table.States (772).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 314, 3)));
             Add_Action (Table.States (773), (10, 21, 37, 42, 74, 77, 82, 83, 
87, 96), (155, 0), 2, null, null);
-            Table.States (773).Minimal_Complete_Action := (Reduce, 155, 2);
-            Table.States (774).Productions := WisiToken.To_Vector (((165, 1), 
(197, 3), (314, 0), (314, 1)));
+            Table.States (773).Kernel := To_Vector ((0 => (155, 277, 0, 
False)));
+            Table.States (773).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 155, 2)));
             Add_Action (Table.States (774), 39, 122);
             Add_Action (Table.States (774), 41, 957);
             Add_Action (Table.States (774), 76, 126);
@@ -9349,23 +9581,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (774), 258, 256);
             Add_Goto (Table.States (774), 272, 92);
             Add_Goto (Table.States (774), 293, 97);
-            Table.States (774).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (775).Productions := WisiToken.To_Vector ((1 => (168, 
1)));
+            Table.States (774).Kernel := To_Vector (((165, 40, 2, False), 
(197, 40, 1, False), (314, 40, 6, False),
+            (314, 40, 2, False)));
+            Table.States (774).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (775), (77, 83), (168, 1), 1, null, null);
-            Table.States (775).Minimal_Complete_Action := (Reduce, 168, 1);
-            Table.States (776).Productions := WisiToken.To_Vector (((168, 0), 
(224, 0)));
+            Table.States (775).Kernel := To_Vector ((0 => (168, 167, 0, 
False)));
+            Table.States (775).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 168, 1)));
             Add_Action (Table.States (776), 77, 958);
             Add_Action (Table.States (776), 83, 959);
             Add_Error (Table.States (776));
-            Table.States (776).Minimal_Complete_Action := (Shift, 77, 958);
-            Table.States (777).Productions := WisiToken.To_Vector (((165, 2), 
(167, 1), (278, 1)));
-            Add_Action (Table.States (777), 77, Reduce, (167, 1), 1, null, 
null, (278, 1), 1, null, null);
+            Table.States (776).Kernel := To_Vector (((168, 168, 2, True), 
(224, 168, 1, False)));
+            Table.States (776).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 958)));
+            Add_Action (Table.States (777), 77, Reduce, (167, 1), 1, null, 
null);
+            Add_Conflict (Table.States (777), 77, (278, 1), 1, null, null);
             Add_Action (Table.States (777), 79, Reduce, (165, 2), 1, null, 
null);
-            Add_Action (Table.States (777), 83, Reduce, (167, 1), 1, null, 
null, (278, 1), 1, null, null);
+            Add_Action (Table.States (777), 83, Reduce, (167, 1), 1, null, 
null);
+            Add_Conflict (Table.States (777), 83, (278, 1), 1, null, null);
             Add_Action (Table.States (777), 87, Reduce, (165, 2), 1, null, 
null);
             Add_Error (Table.States (777));
-            Table.States (777).Minimal_Complete_Action := (Reduce, 165, 1);
-            Table.States (778).Productions := WisiToken.To_Vector ((1 => (230, 
0)));
+            Table.States (777).Kernel := To_Vector (((165, 277, 0, False), 
(167, 277, 0, False), (278, 277, 0,
+            False)));
+            Table.States (777).Minimal_Complete_Actions := To_Vector 
(((Reduce, 165, 1), (Reduce, 167, 1), (Reduce,
+            278, 1)));
             Add_Action (Table.States (778), 104, 119);
             Add_Action (Table.States (778), 105, 33);
             Add_Action (Table.States (778), 106, 34);
@@ -9374,9 +9611,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (778), 239, 960);
             Add_Goto (Table.States (778), 272, 92);
             Add_Goto (Table.States (778), 293, 97);
-            Table.States (778).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (779).Productions := WisiToken.To_Vector (((128, 0), 
(230, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (778).Kernel := To_Vector ((0 => (230, 59, 1, 
False)));
+            Table.States (778).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (779), 37, Reduce, (230, 1), 5, null, 
null);
             Add_Action (Table.States (779), 76, 235);
             Add_Action (Table.States (779), 84, 237);
@@ -9386,13 +9622,15 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (779));
             Add_Goto (Table.States (779), 115, 241);
             Add_Goto (Table.States (779), 322, 242);
-            Table.States (779).Minimal_Complete_Action := (Reduce, 230, 5);
-            Table.States (780).Productions := WisiToken.To_Vector ((1 => (127, 
0)));
+            Table.States (779).Kernel := To_Vector (((128, 239, 2, True), 
(230, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (779).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 5)));
             Add_Action (Table.States (780), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (127, 0), 6,
             at_clause_0'Access, null);
-            Table.States (780).Minimal_Complete_Action := (Reduce, 127, 6);
-            Table.States (781).Productions := WisiToken.To_Vector ((1 => (235, 
0)));
+            Table.States (780).Kernel := To_Vector ((0 => (127, 96, 0, 
False)));
+            Table.States (780).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 127, 6)));
             Add_Action (Table.States (781), 3, 121);
             Add_Action (Table.States (781), 39, 122);
             Add_Action (Table.States (781), 40, 123);
@@ -9427,24 +9665,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (781), 320, 144);
             Add_Goto (Table.States (781), 321, 145);
             Add_Goto (Table.States (781), 330, 146);
-            Table.States (781).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (782).Productions := WisiToken.To_Vector ((1 => (144, 
0)));
+            Table.States (781).Kernel := To_Vector ((0 => (235, 38, 1, 
False)));
+            Table.States (781).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (782), 12, 962);
             Add_Error (Table.States (782));
-            Table.States (782).Minimal_Complete_Action := (Shift, 12, 962);
-            Table.States (783).Productions := WisiToken.To_Vector ((1 => (145, 
1)));
+            Table.States (782).Kernel := To_Vector ((0 => (144, 104, 7, 
False)));
+            Table.States (782).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 12, 962)));
             Add_Action (Table.States (783), (24, 104), (145, 1), 1, null, 
null);
-            Table.States (783).Minimal_Complete_Action := (Reduce, 145, 1);
-            Table.States (784).Productions := WisiToken.To_Vector (((145, 0), 
(281, 0)));
+            Table.States (783).Kernel := To_Vector ((0 => (145, 144, 0, 
False)));
+            Table.States (783).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 145, 1)));
             Add_Action (Table.States (784), 24, 963);
             Add_Action (Table.States (784), 104, 782);
             Add_Error (Table.States (784));
             Add_Goto (Table.States (784), 144, 964);
-            Table.States (784).Minimal_Complete_Action := (Shift, 24, 963);
-            Table.States (785).Productions := WisiToken.To_Vector (((254, 0), 
(254, 1), (254, 2), (254, 3)));
+            Table.States (784).Kernel := To_Vector (((145, 145, 8, True), 
(281, 145, 3, False)));
+            Table.States (784).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 963)));
             Add_Action (Table.States (785), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (785), 33, 504);
-            Add_Action (Table.States (785), 40, 386, (236, 3), 0, null, null);
+            Add_Action (Table.States (785), 40, 386);
+            Add_Conflict (Table.States (785), 40, (236, 3), 0, null, null);
             Add_Action (Table.States (785), 45, 505);
             Add_Action (Table.States (785), 104, Reduce, (236, 3), 0, null, 
null);
             Add_Action (Table.States (785), 105, Reduce, (236, 3), 0, null, 
null);
@@ -9453,94 +9692,98 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (785), 114, 965);
             Add_Goto (Table.States (785), 236, 966);
             Add_Goto (Table.States (785), 241, 721);
-            Table.States (785).Minimal_Complete_Action := (Reduce, 236, 0);
-            Table.States (786).Productions := WisiToken.To_Vector ((1 => (255, 
0)));
+            Table.States (785).Kernel := To_Vector (((254, 118, 2, False), 
(254, 118, 1, False), (254, 118, 3, False),
+            (254, 118, 2, False)));
+            Table.States (785).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 236, 0)));
             Add_Action (Table.States (786), (77, 96), (255, 0), 3, 
parameter_specification_list_0'Access, null);
-            Table.States (786).Minimal_Complete_Action := (Reduce, 255, 3);
-            Table.States (787).Productions := WisiToken.To_Vector ((1 => (215, 
2)));
+            Table.States (786).Kernel := To_Vector ((0 => (255, 254, 0, 
True)));
+            Table.States (786).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 255, 3)));
+            Table.States (786).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (787), 96, 967);
             Add_Error (Table.States (787));
-            Table.States (787).Minimal_Complete_Action := (Shift, 96, 967);
-            Table.States (788).Productions := WisiToken.To_Vector ((1 => (215, 
0)));
+            Table.States (787).Kernel := To_Vector ((0 => (215, 122, 1, 
False)));
+            Table.States (787).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 967)));
             Add_Action (Table.States (788), 96, 968);
             Add_Error (Table.States (788));
-            Table.States (788).Minimal_Complete_Action := (Shift, 96, 968);
-            Table.States (789).Productions := WisiToken.To_Vector ((1 => (215, 
1)));
+            Table.States (788).Kernel := To_Vector ((0 => (215, 122, 1, 
False)));
+            Table.States (788).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 968)));
             Add_Action (Table.States (789), 96, 969);
             Add_Error (Table.States (789));
-            Table.States (789).Minimal_Complete_Action := (Shift, 96, 969);
-            Table.States (790).Productions := WisiToken.To_Vector (((109, 0), 
(109, 1), (109, 2), (111, 0), (111, 1)));
+            Table.States (789).Kernel := To_Vector ((0 => (215, 122, 1, 
False)));
+            Table.States (789).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 969)));
             Add_Action (Table.States (790), 36, 970);
             Add_Action (Table.States (790), 39, Reduce, (109, 2), 1, null, 
null);
             Add_Action (Table.States (790), 64, 875);
             Add_Action (Table.States (790), 65, 876);
             Add_Error (Table.States (790));
-            Table.States (790).Minimal_Complete_Action := (Reduce, 109, 1);
-            Table.States (791).Productions := WisiToken.To_Vector (((202, 6), 
(202, 7)));
+            Table.States (790).Kernel := To_Vector (((109, 6, 1, False), (109, 
6, 1, False), (109, 6, 0, False), (111,
+            6, 2, False), (111, 6, 1, False)));
+            Table.States (790).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 109, 1)));
             Add_Action (Table.States (791), 80, 971);
             Add_Error (Table.States (791));
-            Table.States (791).Minimal_Complete_Action := (Shift, 80, 971);
-            Table.States (792).Productions := WisiToken.To_Vector ((1 => (202, 
5)));
+            Table.States (791).Kernel := To_Vector (((202, 19, 3, False), 
(202, 19, 1, False)));
+            Table.States (791).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 971)));
             Add_Action (Table.States (792), 80, 972);
             Add_Error (Table.States (792));
-            Table.States (792).Minimal_Complete_Action := (Shift, 80, 972);
-            Table.States (793).Productions := WisiToken.To_Vector (((109, 3), 
(111, 4), (228, 0), (228, 4)));
+            Table.States (792).Kernel := To_Vector ((0 => (202, 20, 1, 
False)));
+            Table.States (792).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 972)));
             Add_Action (Table.States (793), 34, 880);
             Add_Action (Table.States (793), 39, Reduce, (109, 3), 1, null, 
null);
             Add_Action (Table.States (793), 49, Reduce, (111, 4), 1, null, 
null);
             Add_Error (Table.States (793));
-            Table.States (793).Minimal_Complete_Action := (Reduce, 109, 1);
-            Table.States (794).Productions := WisiToken.To_Vector ((1 => (202, 
4)));
+            Table.States (793).Kernel := To_Vector (((109, 36, 0, False), 
(111, 36, 0, False), (228, 36, 3, False),
+            (228, 36, 1, False)));
+            Table.States (793).Minimal_Complete_Actions := To_Vector 
(((Reduce, 109, 1), (Reduce, 111, 1)));
             Add_Action (Table.States (794), 80, 973);
             Add_Error (Table.States (794));
-            Table.States (794).Minimal_Complete_Action := (Shift, 80, 973);
-            Table.States (795).Productions := WisiToken.To_Vector ((1 => (202, 
3)));
+            Table.States (794).Kernel := To_Vector ((0 => (202, 38, 1, 
False)));
+            Table.States (794).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 973)));
             Add_Action (Table.States (795), 80, 974);
             Add_Error (Table.States (795));
-            Table.States (795).Minimal_Complete_Action := (Shift, 80, 974);
-            Table.States (796).Productions := WisiToken.To_Vector (((111, 2), 
(111, 3), (201, 1)));
+            Table.States (795).Kernel := To_Vector ((0 => (202, 53, 1, 
False)));
+            Table.States (795).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 974)));
             Add_Action (Table.States (796), 36, 895);
             Add_Action (Table.States (796), 49, Reduce, (111, 3), 1, null, 
null);
             Add_Action (Table.States (796), 74, 337);
             Add_Action (Table.States (796), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (796));
             Add_Goto (Table.States (796), 122, 975);
-            Table.States (796).Minimal_Complete_Action := (Reduce, 111, 1);
-            Table.States (797).Productions := WisiToken.To_Vector ((1 => (202, 
2)));
+            Table.States (796).Kernel := To_Vector (((111, 65, 1, False), 
(111, 65, 0, False), (201, 65, 1, False)));
+            Table.States (796).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 111, 1)));
             Add_Action (Table.States (797), 80, 976);
             Add_Error (Table.States (797));
-            Table.States (797).Minimal_Complete_Action := (Shift, 80, 976);
-            Table.States (798).Productions := WisiToken.To_Vector (((203, 0), 
(203, 1)));
+            Table.States (797).Kernel := To_Vector ((0 => (202, 76, 2, 
False)));
+            Table.States (797).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 976)));
             Add_Action (Table.States (798), 39, 977);
             Add_Error (Table.States (798));
-            Table.States (798).Minimal_Complete_Action := (Shift, 39, 977);
-            Table.States (799).Productions := WisiToken.To_Vector ((1 => (202, 
0)));
+            Table.States (798).Kernel := To_Vector (((203, 109, 4, False), 
(203, 109, 2, False)));
+            Table.States (798).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 39, 977)));
             Add_Action (Table.States (799), 49, 978);
             Add_Error (Table.States (799));
-            Table.States (799).Minimal_Complete_Action := (Shift, 49, 978);
-            Table.States (800).Productions := WisiToken.To_Vector ((1 => (202, 
9)));
+            Table.States (799).Kernel := To_Vector ((0 => (202, 111, 1, 
False)));
+            Table.States (799).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 49, 978)));
             Add_Action (Table.States (800), (74, 96), (202, 9), 1, null, null);
-            Table.States (800).Minimal_Complete_Action := (Reduce, 202, 1);
-            Table.States (801).Productions := WisiToken.To_Vector ((1 => (202, 
8)));
+            Table.States (800).Kernel := To_Vector ((0 => (202, 114, 0, 
False)));
+            Table.States (800).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 1)));
             Add_Action (Table.States (801), (74, 96), (202, 8), 1, null, null);
-            Table.States (801).Minimal_Complete_Action := (Reduce, 202, 1);
-            Table.States (802).Productions := WisiToken.To_Vector ((1 => (201, 
0)));
+            Table.States (801).Kernel := To_Vector ((0 => (202, 120, 0, 
False)));
+            Table.States (801).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 1)));
             Add_Action (Table.States (802), 74, 337);
             Add_Action (Table.States (802), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (802));
             Add_Goto (Table.States (802), 122, 979);
-            Table.States (802).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (803).Productions := WisiToken.To_Vector ((1 => (202, 
1)));
+            Table.States (802).Kernel := To_Vector ((0 => (201, 202, 1, 
False)));
+            Table.States (802).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (803), (74, 96), (202, 1), 1, null, null);
-            Table.States (803).Minimal_Complete_Action := (Reduce, 202, 1);
-            Table.States (804).Productions := WisiToken.To_Vector ((1 => (202, 
10)));
+            Table.States (803).Kernel := To_Vector ((0 => (202, 203, 0, 
False)));
+            Table.States (803).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 1)));
             Add_Action (Table.States (804), (74, 96), (202, 10), 1, null, 
null);
-            Table.States (804).Minimal_Complete_Action := (Reduce, 202, 1);
-            Table.States (805).Productions := WisiToken.To_Vector ((1 => (201, 
2)));
+            Table.States (804).Kernel := To_Vector ((0 => (202, 228, 0, 
False)));
+            Table.States (804).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 1)));
             Add_Action (Table.States (805), (29, 47, 48, 50, 69, 71, 74, 104), 
(201, 2), 5,
             formal_type_declaration_2'Access, null);
-            Table.States (805).Minimal_Complete_Action := (Reduce, 201, 5);
-            Table.States (806).Productions := WisiToken.To_Vector ((1 => (204, 
0)));
+            Table.States (805).Kernel := To_Vector ((0 => (201, 96, 0, 
False)));
+            Table.States (805).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 201, 5)));
             Add_Action (Table.States (806), 104, 119);
             Add_Action (Table.States (806), 105, 33);
             Add_Action (Table.States (806), 106, 34);
@@ -9549,22 +9792,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (806), 239, 980);
             Add_Goto (Table.States (806), 272, 92);
             Add_Goto (Table.States (806), 293, 97);
-            Table.States (806).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (807).Productions := WisiToken.To_Vector ((1 => (200, 
2)));
+            Table.States (806).Kernel := To_Vector ((0 => (204, 39, 2, 
False)));
+            Table.States (806).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (807), 96, 981);
             Add_Error (Table.States (807));
-            Table.States (807).Minimal_Complete_Action := (Shift, 96, 981);
-            Table.States (808).Productions := WisiToken.To_Vector ((1 => (200, 
0)));
+            Table.States (807).Kernel := To_Vector ((0 => (200, 122, 1, 
False)));
+            Table.States (807).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 981)));
             Add_Action (Table.States (808), 74, 337);
             Add_Action (Table.States (808), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (808));
             Add_Goto (Table.States (808), 122, 982);
-            Table.States (808).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (809).Productions := WisiToken.To_Vector ((1 => (200, 
1)));
+            Table.States (808).Kernel := To_Vector ((0 => (200, 310, 1, 
False)));
+            Table.States (808).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (809), 96, 983);
             Add_Error (Table.States (809));
-            Table.States (809).Minimal_Complete_Action := (Shift, 96, 983);
-            Table.States (810).Productions := WisiToken.To_Vector ((1 => (198, 
1)));
+            Table.States (809).Kernel := To_Vector ((0 => (200, 122, 1, 
False)));
+            Table.States (809).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 983)));
             Add_Action (Table.States (810), 3, 121);
             Add_Action (Table.States (810), 39, 122);
             Add_Action (Table.States (810), 40, 123);
@@ -9600,13 +9843,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (810), 320, 144);
             Add_Goto (Table.States (810), 321, 145);
             Add_Goto (Table.States (810), 330, 146);
-            Table.States (810).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (811).Productions := WisiToken.To_Vector ((1 => (198, 
3)));
+            Table.States (810).Kernel := To_Vector ((0 => (198, 82, 1, 
False)));
+            Table.States (810).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (811), 96, 985);
             Add_Error (Table.States (811));
-            Table.States (811).Minimal_Complete_Action := (Shift, 96, 985);
-            Table.States (812).Productions := WisiToken.To_Vector (((128, 0), 
(198, 0), (198, 2), (239, 0), (239, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (811).Kernel := To_Vector ((0 => (198, 122, 1, 
False)));
+            Table.States (811).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 985)));
             Add_Action (Table.States (812), 74, 337);
             Add_Action (Table.States (812), 76, 235);
             Add_Action (Table.States (812), 82, 986);
@@ -9618,20 +9860,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (812), 115, 241);
             Add_Goto (Table.States (812), 122, 987);
             Add_Goto (Table.States (812), 322, 242);
-            Table.States (812).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (813).Productions := WisiToken.To_Vector ((1 => (222, 
1)));
+            Table.States (812).Kernel := To_Vector (((128, 239, 2, True), 
(198, 239, 2, False), (198, 239, 1, False),
+            (239, 239, 5, True), (239, 239, 2, True), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (812).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (813), 24, 988);
             Add_Error (Table.States (813));
-            Table.States (813).Minimal_Complete_Action := (Shift, 24, 988);
-            Table.States (814).Productions := WisiToken.To_Vector ((1 => (174, 
0)));
+            Table.States (813).Kernel := To_Vector ((0 => (222, 300, 3, 
False)));
+            Table.States (813).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 988)));
             Add_Action (Table.States (814), 68, 989);
             Add_Error (Table.States (814));
-            Table.States (814).Minimal_Complete_Action := (Shift, 68, 989);
-            Table.States (815).Productions := WisiToken.To_Vector ((1 => (222, 
3)));
+            Table.States (814).Kernel := To_Vector ((0 => (174, 192, 1, 
False)));
+            Table.States (814).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 989)));
             Add_Action (Table.States (815), 96, 990);
             Add_Error (Table.States (815));
-            Table.States (815).Minimal_Complete_Action := (Shift, 96, 990);
-            Table.States (816).Productions := WisiToken.To_Vector ((1 => (222, 
0)));
+            Table.States (815).Kernel := To_Vector ((0 => (222, 32, 1, 
False)));
+            Table.States (815).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 990)));
             Add_Action (Table.States (816), 4, 1);
             Add_Action (Table.States (816), 5, 2);
             Add_Action (Table.States (816), 13, Reduce, (132, 1), 0, null, 
null);
@@ -9687,33 +9931,37 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (816), 303, 101);
             Add_Goto (Table.States (816), 306, 363);
             Add_Goto (Table.States (816), 323, 114);
-            Table.States (816).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (817).Productions := WisiToken.To_Vector ((1 => (222, 
2)));
+            Table.States (816).Kernel := To_Vector ((0 => (222, 22, 3, 
False)));
+            Table.States (816).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (817), 32, 992);
             Add_Error (Table.States (817));
-            Table.States (817).Minimal_Complete_Action := (Shift, 32, 992);
-            Table.States (818).Productions := WisiToken.To_Vector ((1 => (175, 
0)));
+            Table.States (817).Kernel := To_Vector ((0 => (222, 24, 2, 
False)));
+            Table.States (817).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 32, 992)));
             Add_Action (Table.States (818), (22, 23, 24), (175, 0), 2, null, 
null);
-            Table.States (818).Minimal_Complete_Action := (Reduce, 175, 2);
-            Table.States (819).Productions := WisiToken.To_Vector ((1 => (248, 
0)));
+            Table.States (818).Kernel := To_Vector ((0 => (175, 174, 0, 
True)));
+            Table.States (818).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 175, 2)));
+            Table.States (818).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (819), 96, 993);
             Add_Error (Table.States (819));
-            Table.States (819).Minimal_Complete_Action := (Shift, 96, 993);
-            Table.States (820).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1)));
+            Table.States (819).Kernel := To_Vector ((0 => (248, 122, 1, 
False)));
+            Table.States (819).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 993)));
             Add_Action (Table.States (820), 13, 994);
             Add_Action (Table.States (820), 24, 995);
             Add_Error (Table.States (820));
-            Table.States (820).Minimal_Complete_Action := (Shift, 24, 995);
-            Table.States (821).Productions := WisiToken.To_Vector ((1 => (213, 
0)));
+            Table.States (820).Kernel := To_Vector (((247, 159, 3, False), 
(247, 159, 2, False)));
+            Table.States (820).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 995)));
+         end Subr_14;
+         procedure Subr_15
+         is begin
             Add_Action (Table.States (821), 96, 996);
             Add_Error (Table.States (821));
-            Table.States (821).Minimal_Complete_Action := (Shift, 96, 996);
-            Table.States (822).Productions := WisiToken.To_Vector ((1 => (250, 
0)));
+            Table.States (821).Kernel := To_Vector ((0 => (213, 122, 1, 
False)));
+            Table.States (821).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 996)));
             Add_Action (Table.States (822), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (250, 0), 6,
             package_renaming_declaration_0'Access, null);
-            Table.States (822).Minimal_Complete_Action := (Reduce, 250, 6);
-            Table.States (823).Productions := WisiToken.To_Vector ((1 => (251, 
1)));
+            Table.States (822).Kernel := To_Vector ((0 => (250, 96, 0, 
False)));
+            Table.States (822).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 250, 6)));
             Add_Action (Table.States (823), 96, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (823), 104, 119);
             Add_Action (Table.States (823), 105, 33);
@@ -9724,8 +9972,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (823), 240, 997);
             Add_Goto (Table.States (823), 272, 92);
             Add_Goto (Table.States (823), 293, 97);
-            Table.States (823).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (824).Productions := WisiToken.To_Vector ((1 => (251, 
0)));
+            Table.States (823).Kernel := To_Vector ((0 => (251, 24, 0, 
False)));
+            Table.States (823).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (824), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (824), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (824), 28, 183);
@@ -9796,49 +10044,50 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (824), 319, 113);
             Add_Goto (Table.States (824), 325, 115);
             Add_Goto (Table.States (824), 331, 116);
-            Table.States (824).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (825).Productions := WisiToken.To_Vector ((1 => (257, 
0)));
+            Table.States (824).Kernel := To_Vector ((0 => (251, 49, 1, 
False)));
+            Table.States (824).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (825), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (257, 0), 6, pragma_g_0'Access, null);
-            Table.States (825).Minimal_Complete_Action := (Reduce, 257, 6);
-            Table.States (826).Productions := WisiToken.To_Vector ((1 => (257, 
1)));
+            Table.States (825).Kernel := To_Vector ((0 => (257, 96, 0, 
False)));
+            Table.States (825).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 257, 6)));
             Add_Action (Table.States (826), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (257, 1), 6, pragma_g_1'Access, null);
-            Table.States (826).Minimal_Complete_Action := (Reduce, 257, 6);
-            Table.States (827).Productions := WisiToken.To_Vector ((1 => (265, 
0)));
+            Table.States (826).Kernel := To_Vector ((0 => (257, 96, 0, 
False)));
+            Table.States (826).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 257, 6)));
             Add_Action (Table.States (827), 96, 999);
             Add_Error (Table.States (827));
-            Table.States (827).Minimal_Complete_Action := (Shift, 96, 999);
-            Table.States (828).Productions := WisiToken.To_Vector ((1 => (176, 
0)));
+            Table.States (827).Kernel := To_Vector ((0 => (265, 122, 1, 
False)));
+            Table.States (827).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 999)));
             Add_Action (Table.States (828), 104, 1000);
             Add_Error (Table.States (828));
-            Table.States (828).Minimal_Complete_Action := (Shift, 104, 1000);
-            Table.States (829).Productions := WisiToken.To_Vector ((1 => (267, 
5)));
+            Table.States (828).Kernel := To_Vector ((0 => (176, 25, 6, 
False)));
+            Table.States (828).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 1000)));
             Add_Action (Table.States (829), (24, 25, 28, 29, 40, 46, 50), 
(267, 5), 1, null, null);
-            Table.States (829).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (830).Productions := WisiToken.To_Vector ((1 => (267, 
2)));
+            Table.States (829).Kernel := To_Vector ((0 => (267, 121, 0, 
False)));
+            Table.States (829).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (830), (24, 25, 28, 29, 40, 46, 50), 
(267, 2), 1, null, null);
-            Table.States (830).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (831).Productions := WisiToken.To_Vector ((1 => (267, 
3)));
+            Table.States (830).Kernel := To_Vector ((0 => (267, 176, 0, 
False)));
+            Table.States (830).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (831), (24, 25, 28, 29, 40, 46, 50), 
(267, 3), 1, null, null);
-            Table.States (831).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (832).Productions := WisiToken.To_Vector ((1 => (267, 
4)));
+            Table.States (831).Kernel := To_Vector ((0 => (267, 193, 0, 
False)));
+            Table.States (831).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (832), (24, 25, 28, 29, 40, 46, 50), 
(267, 4), 1, null, null);
-            Table.States (832).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (833).Productions := WisiToken.To_Vector (((193, 0), 
(243, 0), (307, 0), (309, 0)));
+            Table.States (832).Kernel := To_Vector ((0 => (267, 243, 0, 
False)));
+            Table.States (832).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (833), 29, 7);
             Add_Action (Table.States (833), 50, 18);
             Add_Error (Table.States (833));
             Add_Goto (Table.States (833), 207, 246);
             Add_Goto (Table.States (833), 262, 247);
             Add_Goto (Table.States (833), 312, 1001);
-            Table.States (833).Minimal_Complete_Action := (Shift, 50, 18);
-            Table.States (834).Productions := WisiToken.To_Vector ((1 => (268, 
1)));
+            Table.States (833).Kernel := To_Vector (((193, 246, 7, False), 
(243, 246, 5, False), (307, 246, 6, False),
+            (309, 246, 3, False)));
+            Table.States (833).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 50, 18)));
             Add_Action (Table.States (834), (24, 25, 28, 29, 40, 46, 50), 
(268, 1), 1, null, null);
-            Table.States (834).Minimal_Complete_Action := (Reduce, 268, 1);
-            Table.States (835).Productions := WisiToken.To_Vector (((268, 0), 
(269, 0)));
+            Table.States (834).Kernel := To_Vector ((0 => (268, 267, 0, 
False)));
+            Table.States (834).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 268, 1)));
             Add_Action (Table.States (835), 24, Reduce, (269, 0), 1, null, 
null);
             Add_Action (Table.States (835), 25, 828);
             Add_Action (Table.States (835), 28, 183);
@@ -9860,18 +10109,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (835), 281, 94);
             Add_Goto (Table.States (835), 307, 837);
             Add_Goto (Table.States (835), 309, 838);
-            Table.States (835).Minimal_Complete_Action := (Reduce, 269, 1);
-            Table.States (836).Productions := WisiToken.To_Vector ((1 => (264, 
0)));
+            Table.States (835).Kernel := To_Vector (((268, 268, 3, True), 
(269, 268, 0, False)));
+            Table.States (835).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 269, 1)));
             Add_Action (Table.States (836), 24, 1003);
             Add_Error (Table.States (836));
-            Table.States (836).Minimal_Complete_Action := (Shift, 24, 1003);
-            Table.States (837).Productions := WisiToken.To_Vector ((1 => (267, 
1)));
+            Table.States (836).Kernel := To_Vector ((0 => (264, 269, 2, 
False)));
+            Table.States (836).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1003)));
             Add_Action (Table.States (837), (24, 25, 28, 29, 40, 46, 50), 
(267, 1), 1, null, null);
-            Table.States (837).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (838).Productions := WisiToken.To_Vector ((1 => (267, 
0)));
+            Table.States (837).Kernel := To_Vector ((0 => (267, 307, 0, 
False)));
+            Table.States (837).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (838), (24, 25, 28, 29, 40, 46, 50), 
(267, 0), 1, null, null);
-            Table.States (838).Minimal_Complete_Action := (Reduce, 267, 1);
-            Table.States (839).Productions := WisiToken.To_Vector (((271, 0), 
(271, 1)));
+            Table.States (838).Kernel := To_Vector ((0 => (267, 309, 0, 
False)));
+            Table.States (838).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 267, 1)));
             Add_Action (Table.States (839), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (839), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (839), 28, 183);
@@ -9945,14 +10194,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (839), 319, 113);
             Add_Goto (Table.States (839), 325, 115);
             Add_Goto (Table.States (839), 331, 116);
-            Table.States (839).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (840).Productions := WisiToken.To_Vector (((227, 0), 
(304, 0)));
+            Table.States (839).Kernel := To_Vector (((271, 35, 5, False), 
(271, 35, 2, False)));
+            Table.States (839).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (840), 10, 1006);
             Add_Action (Table.States (840), 74, 1007);
             Add_Error (Table.States (840));
-            Table.States (840).Minimal_Complete_Action := (Shift, 74, 1007);
-            Table.States (841).Productions := WisiToken.To_Vector (((128, 0), 
(227, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (840).Kernel := To_Vector (((227, 227, 2, True), 
(304, 227, 3, False)));
+            Table.States (840).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1007)));
             Add_Action (Table.States (841), 10, Reduce, (227, 1), 1, 
interface_list_1'Access, null);
             Add_Action (Table.States (841), 74, Reduce, (227, 1), 1, 
interface_list_1'Access, null);
             Add_Action (Table.States (841), 76, 235);
@@ -9963,14 +10211,16 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (841));
             Add_Goto (Table.States (841), 115, 241);
             Add_Goto (Table.States (841), 322, 242);
-            Table.States (841).Minimal_Complete_Action := (Reduce, 227, 1);
-            Table.States (842).Productions := WisiToken.To_Vector ((1 => (266, 
1)));
+            Table.States (841).Kernel := To_Vector (((128, 239, 2, True), 
(227, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (841).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 227, 1)));
             Add_Action (Table.States (842), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (842), 104, 149);
             Add_Error (Table.States (842));
             Add_Goto (Table.States (842), 220, 1008);
-            Table.States (842).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (843).Productions := WisiToken.To_Vector ((1 => (266, 
0)));
+            Table.States (842).Kernel := To_Vector ((0 => (266, 24, 0, 
False)));
+            Table.States (842).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (843), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (843), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (843), 28, 183);
@@ -10041,34 +10291,31 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (843), 319, 113);
             Add_Goto (Table.States (843), 325, 115);
             Add_Goto (Table.States (843), 331, 116);
-            Table.States (843).Minimal_Complete_Action := (Reduce, 159, 0);
-         end Subr_14;
-         procedure Subr_15
-         is begin
-            Table.States (844).Productions := WisiToken.To_Vector ((1 => (304, 
1)));
+            Table.States (843).Kernel := To_Vector ((0 => (266, 49, 1, 
False)));
+            Table.States (843).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (844), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (304, 1), 6,
             single_protected_declaration_1'Access, 
single_protected_declaration_1_check'Access);
-            Table.States (844).Minimal_Complete_Action := (Reduce, 304, 6);
-            Table.States (845).Productions := WisiToken.To_Vector ((1 => (292, 
1)));
+            Table.States (844).Kernel := To_Vector ((0 => (304, 96, 0, 
False)));
+            Table.States (844).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 304, 6)));
             Add_Action (Table.States (845), (21, 82, 96), (292, 1), 1, null, 
null);
-            Table.States (845).Minimal_Complete_Action := (Reduce, 292, 1);
-            Table.States (846).Productions := WisiToken.To_Vector (((194, 0), 
(194, 1)));
+            Table.States (845).Kernel := To_Vector ((0 => (292, 114, 0, 
False)));
+            Table.States (845).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 292, 1)));
             Add_Action (Table.States (846), 21, Reduce, (194, 1), 5, 
extended_return_object_declaration_1'Access,
             null);
             Add_Action (Table.States (846), 82, 1010);
             Add_Action (Table.States (846), 96, Reduce, (194, 1), 5, 
extended_return_object_declaration_1'Access,
             null);
             Add_Error (Table.States (846));
-            Table.States (846).Minimal_Complete_Action := (Reduce, 194, 5);
-            Table.States (847).Productions := WisiToken.To_Vector ((1 => (292, 
0)));
+            Table.States (846).Kernel := To_Vector (((194, 292, 1, False), 
(194, 292, 0, False)));
+            Table.States (846).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 194, 5)));
             Add_Action (Table.States (847), (21, 82, 96), (292, 0), 1, null, 
null);
-            Table.States (847).Minimal_Complete_Action := (Reduce, 292, 1);
-            Table.States (848).Productions := WisiToken.To_Vector ((1 => (196, 
0)));
+            Table.States (847).Kernel := To_Vector ((0 => (292, 314, 0, 
False)));
+            Table.States (847).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 292, 1)));
             Add_Action (Table.States (848), 96, 1011);
             Add_Error (Table.States (848));
-            Table.States (848).Minimal_Complete_Action := (Shift, 96, 1011);
-            Table.States (849).Productions := WisiToken.To_Vector (((247, 0), 
(247, 1)));
+            Table.States (848).Kernel := To_Vector ((0 => (196, 58, 1, 
False)));
+            Table.States (848).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1011)));
             Add_Action (Table.States (849), 104, 119);
             Add_Action (Table.States (849), 105, 33);
             Add_Action (Table.States (849), 106, 34);
@@ -10077,57 +10324,57 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (849), 239, 1012);
             Add_Goto (Table.States (849), 272, 92);
             Add_Goto (Table.States (849), 293, 97);
-            Table.States (849).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (850).Productions := WisiToken.To_Vector ((1 => (264, 
0)));
+            Table.States (849).Kernel := To_Vector (((247, 14, 5, False), 
(247, 14, 4, False)));
+            Table.States (849).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (850), 104, 1013);
             Add_Error (Table.States (850));
-            Table.States (850).Minimal_Complete_Action := (Shift, 104, 1013);
-            Table.States (851).Productions := WisiToken.To_Vector ((1 => (316, 
0)));
+            Table.States (850).Kernel := To_Vector ((0 => (264, 14, 4, 
False)));
+            Table.States (850).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 1013)));
             Add_Action (Table.States (851), 104, 1014);
             Add_Error (Table.States (851));
-            Table.States (851).Minimal_Complete_Action := (Shift, 104, 1014);
-            Table.States (852).Productions := WisiToken.To_Vector ((1 => (307, 
0)));
+            Table.States (851).Kernel := To_Vector ((0 => (316, 14, 5, 
False)));
+            Table.States (851).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 1014)));
             Add_Action (Table.States (852), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (852), 74, 337);
             Add_Error (Table.States (852));
             Add_Goto (Table.States (852), 122, 1015);
-            Table.States (852).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (853).Productions := WisiToken.To_Vector ((1 => (295, 
1)));
+            Table.States (852).Kernel := To_Vector ((0 => (307, 312, 4, 
False)));
+            Table.States (852).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (853), (22, 24, 43), (295, 1), 5, 
select_alternative_1'Access, null);
-            Table.States (853).Minimal_Complete_Action := (Reduce, 295, 5);
-            Table.States (854).Productions := WisiToken.To_Vector ((1 => (295, 
0)));
+            Table.States (853).Kernel := To_Vector ((0 => (295, 96, 0, 
False)));
+            Table.States (853).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 5)));
             Add_Action (Table.States (854), (22, 24, 43), (295, 0), 5, 
select_alternative_0'Access, null);
-            Table.States (854).Minimal_Complete_Action := (Reduce, 295, 5);
-            Table.States (855).Productions := WisiToken.To_Vector ((1 => (152, 
0)));
+            Table.States (854).Kernel := To_Vector ((0 => (295, 300, 0, 
False)));
+            Table.States (854).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 295, 5)));
             Add_Action (Table.States (855), 96, 1016);
             Add_Error (Table.States (855));
-            Table.States (855).Minimal_Complete_Action := (Shift, 96, 1016);
-            Table.States (856).Productions := WisiToken.To_Vector ((1 => (323, 
0)));
+            Table.States (855).Kernel := To_Vector ((0 => (152, 61, 1, 
False)));
+            Table.States (855).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1016)));
             Add_Action (Table.States (856), 96, 1017);
             Add_Error (Table.States (856));
-            Table.States (856).Minimal_Complete_Action := (Shift, 96, 1017);
-            Table.States (857).Productions := WisiToken.To_Vector ((1 => (294, 
0)));
+            Table.States (856).Kernel := To_Vector ((0 => (323, 61, 1, 
False)));
+            Table.States (856).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1017)));
             Add_Action (Table.States (857), 96, 1018);
             Add_Error (Table.States (857));
-            Table.States (857).Minimal_Complete_Action := (Shift, 96, 1018);
-            Table.States (858).Productions := WisiToken.To_Vector ((1 => (126, 
0)));
+            Table.States (857).Kernel := To_Vector ((0 => (294, 61, 1, 
False)));
+            Table.States (857).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1018)));
             Add_Action (Table.States (858), 61, 1019);
             Add_Error (Table.States (858));
-            Table.States (858).Minimal_Complete_Action := (Shift, 61, 1019);
-            Table.States (859).Productions := WisiToken.To_Vector ((1 => (313, 
0)));
+            Table.States (858).Kernel := To_Vector ((0 => (126, 24, 2, 
False)));
+            Table.States (858).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 61, 1019)));
             Add_Action (Table.States (859), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (313, 0), 6,
             subtype_declaration_0'Access, null);
-            Table.States (859).Minimal_Complete_Action := (Reduce, 313, 6);
-            Table.States (860).Productions := WisiToken.To_Vector ((1 => (317, 
0)));
+            Table.States (859).Kernel := To_Vector ((0 => (313, 96, 0, 
False)));
+            Table.States (859).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 313, 6)));
             Add_Action (Table.States (860), 96, 1020);
             Add_Error (Table.States (860));
-            Table.States (860).Minimal_Complete_Action := (Shift, 96, 1020);
-            Table.States (861).Productions := WisiToken.To_Vector ((1 => (316, 
0)));
+            Table.States (860).Kernel := To_Vector ((0 => (317, 122, 1, 
False)));
+            Table.States (860).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1020)));
             Add_Action (Table.States (861), 13, 1021);
             Add_Error (Table.States (861));
-            Table.States (861).Minimal_Complete_Action := (Shift, 13, 1021);
-            Table.States (862).Productions := WisiToken.To_Vector (((319, 0), 
(319, 1)));
+            Table.States (861).Kernel := To_Vector ((0 => (316, 159, 3, 
False)));
+            Table.States (861).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 1021)));
             Add_Action (Table.States (862), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (862), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (862), 28, 183);
@@ -10201,18 +10448,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (862), 319, 113);
             Add_Goto (Table.States (862), 325, 115);
             Add_Goto (Table.States (862), 331, 116);
-            Table.States (862).Minimal_Complete_Action := (Reduce, 318, 0);
-            Table.States (863).Productions := WisiToken.To_Vector ((1 => (319, 
2)));
+            Table.States (862).Kernel := To_Vector (((319, 35, 5, False), 
(319, 35, 2, False)));
+            Table.States (862).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 0)));
             Add_Action (Table.States (863), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (319, 2), 6,
             task_type_declaration_2'Access, null);
-            Table.States (863).Minimal_Complete_Action := (Reduce, 319, 6);
-            Table.States (864).Productions := WisiToken.To_Vector (((227, 0), 
(305, 0)));
+            Table.States (863).Kernel := To_Vector ((0 => (319, 96, 0, 
False)));
+            Table.States (863).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 319, 6)));
             Add_Action (Table.States (864), 10, 1006);
             Add_Action (Table.States (864), 74, 1024);
             Add_Error (Table.States (864));
-            Table.States (864).Minimal_Complete_Action := (Shift, 74, 1024);
-            Table.States (865).Productions := WisiToken.To_Vector ((1 => (318, 
0)));
+            Table.States (864).Kernel := To_Vector (((227, 227, 2, True), 
(305, 227, 3, False)));
+            Table.States (864).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1024)));
             Add_Action (Table.States (865), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (865), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (865), 28, 183);
@@ -10283,21 +10530,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (865), 319, 113);
             Add_Goto (Table.States (865), 325, 115);
             Add_Goto (Table.States (865), 331, 116);
-            Table.States (865).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (866).Productions := WisiToken.To_Vector ((1 => (305, 
1)));
+            Table.States (865).Kernel := To_Vector ((0 => (318, 49, 0, 
False)));
+            Table.States (865).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (866), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (866), 104, 149);
             Add_Error (Table.States (866));
             Add_Goto (Table.States (866), 220, 1026);
-            Table.States (866).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (867).Productions := WisiToken.To_Vector ((1 => (171, 
0)));
+            Table.States (866).Kernel := To_Vector ((0 => (305, 24, 1, 
False)));
+            Table.States (866).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (867), (77, 96), (171, 0), 3, null, null);
-            Table.States (867).Minimal_Complete_Action := (Reduce, 171, 3);
-            Table.States (868).Productions := WisiToken.To_Vector (((241, 0), 
(242, 2), (242, 3)));
+            Table.States (867).Kernel := To_Vector ((0 => (171, 170, 0, 
True)));
+            Table.States (867).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 171, 3)));
+            Table.States (867).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (868), 41, 1027);
             Add_Error (Table.States (868));
-            Table.States (868).Minimal_Complete_Action := (Shift, 41, 1027);
-            Table.States (869).Productions := WisiToken.To_Vector (((239, 5), 
(242, 0)));
+            Table.States (868).Kernel := To_Vector (((241, 40, 1, False), 
(242, 40, 2, False), (242, 40, 4, False)));
+            Table.States (868).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 1027)));
             Add_Action (Table.States (869), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (869), 77, Reduce, (242, 0), 1, 
null_exclusion_opt_name_type_0'Access, null);
             Add_Action (Table.States (869), 82, Reduce, (242, 0), 1, 
null_exclusion_opt_name_type_0'Access, null);
@@ -10306,15 +10554,14 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (869), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (869), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (869));
-            Table.States (869).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (870).Productions := WisiToken.To_Vector (((170, 1), 
(170, 3)));
+            Table.States (869).Kernel := To_Vector (((239, 104, 0, False), 
(242, 104, 0, False)));
+            Table.States (869).Minimal_Complete_Actions := To_Vector 
(((Reduce, 239, 1), (Reduce, 242, 1)));
             Add_Action (Table.States (870), 77, Reduce, (170, 3), 3, null, 
null);
             Add_Action (Table.States (870), 82, 1028);
             Add_Action (Table.States (870), 96, Reduce, (170, 3), 3, null, 
null);
             Add_Error (Table.States (870));
-            Table.States (870).Minimal_Complete_Action := (Reduce, 170, 3);
-            Table.States (871).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (272, 0), (293, 0),
-            (293, 1), (293, 2), (293, 3)));
+            Table.States (870).Kernel := To_Vector (((170, 114, 1, False), 
(170, 114, 0, False)));
+            Table.States (870).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 170, 3)));
             Add_Action (Table.States (871), 76, 235);
             Add_Action (Table.States (871), 84, 237);
             Add_Action (Table.States (871), 101, 239);
@@ -10322,13 +10569,17 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (871));
             Add_Goto (Table.States (871), 115, 241);
             Add_Goto (Table.States (871), 322, 242);
-            Table.States (872).Productions := WisiToken.To_Vector (((170, 0), 
(170, 2)));
+            Table.States (871).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (272, 239, 3, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (871).Minimal_Complete_Actions := To_Vector (((Shift, 
101, 239), (Shift, 76, 235), (Shift, 84,
+            237)));
+            Table.States (871).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (872), 77, Reduce, (170, 2), 3, null, 
null);
             Add_Action (Table.States (872), 82, 1029);
             Add_Action (Table.States (872), 96, Reduce, (170, 2), 3, null, 
null);
             Add_Error (Table.States (872));
-            Table.States (872).Minimal_Complete_Action := (Reduce, 170, 3);
-            Table.States (873).Productions := WisiToken.To_Vector (((239, 2), 
(242, 1)));
+            Table.States (872).Kernel := To_Vector (((170, 242, 1, False), 
(170, 242, 0, False)));
+            Table.States (872).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 170, 3)));
             Add_Action (Table.States (873), 76, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Action (Table.States (873), 77, Reduce, (242, 1), 1, 
null_exclusion_opt_name_type_1'Access, null);
             Add_Action (Table.States (873), 82, Reduce, (242, 1), 1, 
null_exclusion_opt_name_type_1'Access, null);
@@ -10337,22 +10588,24 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (873), 101, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Action (Table.States (873), 102, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Error (Table.States (873));
-            Table.States (873).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (874).Productions := WisiToken.To_Vector (((109, 0), 
(110, 0)));
-            Add_Action (Table.States (874), 39, Reduce, (109, 0), 2, null, 
null, (110, 0), 2, null, null);
+            Table.States (873).Kernel := To_Vector (((239, 293, 0, True), 
(242, 293, 0, False)));
+            Table.States (873).Minimal_Complete_Actions := To_Vector 
(((Reduce, 239, 1), (Reduce, 242, 1)));
+            Table.States (873).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (874), 39, Reduce, (109, 0), 2, null, 
null);
+            Add_Conflict (Table.States (874), 39, (110, 0), 2, null, null);
             Add_Error (Table.States (874));
-            Table.States (874).Minimal_Complete_Action := (Reduce, 109, 2);
-            Table.States (875).Productions := WisiToken.To_Vector ((1 => (109, 
1)));
+            Table.States (874).Kernel := To_Vector (((109, 36, 0, False), 
(110, 36, 0, False)));
+            Table.States (874).Minimal_Complete_Actions := To_Vector 
(((Reduce, 109, 2), (Reduce, 110, 2)));
             Add_Action (Table.States (875), (1 =>  39), (109, 1), 2, null, 
null);
-            Table.States (875).Minimal_Complete_Action := (Reduce, 109, 2);
-            Table.States (876).Productions := WisiToken.To_Vector (((111, 0), 
(111, 1)));
+            Table.States (875).Kernel := To_Vector ((0 => (109, 64, 0, 
False)));
+            Table.States (875).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 109, 2)));
             Add_Action (Table.States (876), 36, 1030);
             Add_Action (Table.States (876), 41, Reduce, (111, 1), 2, null, 
null);
             Add_Action (Table.States (876), 49, Reduce, (111, 1), 2, null, 
null);
             Add_Action (Table.States (876), 54, Reduce, (111, 1), 2, null, 
null);
             Add_Error (Table.States (876));
-            Table.States (876).Minimal_Complete_Action := (Reduce, 111, 2);
-            Table.States (877).Productions := WisiToken.To_Vector (((120, 0), 
(120, 1)));
+            Table.States (876).Kernel := To_Vector (((111, 65, 1, False), 
(111, 65, 0, False)));
+            Table.States (876).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 111, 2)));
             Add_Action (Table.States (877), 3, 121);
             Add_Action (Table.States (877), 39, 122);
             Add_Action (Table.States (877), 40, 474);
@@ -10382,66 +10635,69 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (877), 320, 144);
             Add_Goto (Table.States (877), 321, 145);
             Add_Goto (Table.States (877), 330, 146);
-            Table.States (877).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (878).Productions := WisiToken.To_Vector (((326, 4), 
(326, 5)));
+            Table.States (877).Kernel := To_Vector (((120, 76, 6, False), 
(120, 76, 6, False)));
+            Table.States (877).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (878), 20, 1035);
             Add_Action (Table.States (878), 53, 1036);
             Add_Action (Table.States (878), 74, Reduce, (279, 1), 0, null, 
null);
             Add_Action (Table.States (878), 96, Reduce, (279, 1), 0, null, 
null);
             Add_Error (Table.States (878));
             Add_Goto (Table.States (878), 279, 1037);
-            Table.States (878).Minimal_Complete_Action := (Reduce, 279, 0);
-            Table.States (879).Productions := WisiToken.To_Vector ((1 => (326, 
3)));
+            Table.States (878).Kernel := To_Vector (((326, 192, 1, False), 
(326, 192, 0, False)));
+            Table.States (878).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 279, 0)));
             Add_Action (Table.States (879), 53, 1036);
             Add_Action (Table.States (879), 74, Reduce, (279, 1), 0, null, 
null);
             Add_Action (Table.States (879), 96, Reduce, (279, 1), 0, null, 
null);
             Add_Error (Table.States (879));
             Add_Goto (Table.States (879), 279, 1038);
-            Table.States (879).Minimal_Complete_Action := (Reduce, 279, 0);
-            Table.States (880).Productions := WisiToken.To_Vector (((228, 0), 
(228, 4)));
+            Table.States (879).Kernel := To_Vector ((0 => (326, 192, 0, 
False)));
+            Table.States (879).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 279, 0)));
             Add_Action (Table.States (880), 10, 1039);
             Add_Action (Table.States (880), 74, Reduce, (228, 4), 2, null, 
null);
             Add_Action (Table.States (880), 96, Reduce, (228, 4), 2, null, 
null);
             Add_Error (Table.States (880));
-            Table.States (880).Minimal_Complete_Action := (Reduce, 228, 2);
-            Table.States (881).Productions := WisiToken.To_Vector ((1 => (326, 
2)));
+            Table.States (880).Kernel := To_Vector (((228, 34, 2, False), 
(228, 34, 0, False)));
+            Table.States (880).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 2)));
             Add_Action (Table.States (881), (74, 96), (326, 2), 2, null, null);
-            Table.States (881).Minimal_Complete_Action := (Reduce, 326, 2);
-            Table.States (882).Productions := WisiToken.To_Vector ((1 => (280, 
1)));
+            Table.States (881).Kernel := To_Vector ((0 => (326, 192, 0, 
False)));
+            Table.States (881).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 2)));
             Add_Action (Table.States (882), (74, 96), (280, 1), 2, null, null);
-            Table.States (882).Minimal_Complete_Action := (Reduce, 280, 2);
-            Table.States (883).Productions := WisiToken.To_Vector (((228, 2), 
(228, 6)));
+            Table.States (882).Kernel := To_Vector ((0 => (280, 54, 0, 
False)));
+            Table.States (882).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 280, 2)));
             Add_Action (Table.States (883), 10, 1040);
             Add_Action (Table.States (883), 74, Reduce, (228, 6), 2, null, 
null);
             Add_Action (Table.States (883), 96, Reduce, (228, 6), 2, null, 
null);
             Add_Error (Table.States (883));
-            Table.States (883).Minimal_Complete_Action := (Reduce, 228, 2);
-            Table.States (884).Productions := WisiToken.To_Vector ((1 => (326, 
1)));
+            Table.States (883).Kernel := To_Vector (((228, 34, 2, False), 
(228, 34, 0, False)));
+            Table.States (883).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 2)));
             Add_Action (Table.States (884), 85, 1041);
             Add_Error (Table.States (884));
-            Table.States (884).Minimal_Complete_Action := (Shift, 85, 1041);
-            Table.States (885).Productions := WisiToken.To_Vector ((1 => (327, 
0)));
+            Table.States (884).Kernel := To_Vector ((0 => (326, 301, 2, 
False)));
+            Table.States (884).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 85, 1041)));
             Add_Action (Table.States (885), 35, Reduce, (164, 1), 0, null, 
null);
             Add_Action (Table.States (885), 104, 1042);
             Add_Action (Table.States (885), 105, 1043);
             Add_Error (Table.States (885));
             Add_Goto (Table.States (885), 163, 1044);
             Add_Goto (Table.States (885), 164, 1045);
-            Table.States (885).Minimal_Complete_Action := (Reduce, 164, 0);
-            Table.States (886).Productions := WisiToken.To_Vector ((1 => (149, 
4)));
+            Table.States (885).Kernel := To_Vector ((0 => (327, 15, 6, 
False)));
+            Table.States (885).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 164, 0)));
             Add_Action (Table.States (886), 96, 1046);
             Add_Error (Table.States (886));
-            Table.States (886).Minimal_Complete_Action := (Shift, 96, 1046);
-            Table.States (887).Productions := WisiToken.To_Vector ((1 => (148, 
1)));
+            Table.States (886).Kernel := To_Vector ((0 => (149, 41, 1, 
False)));
+            Table.States (886).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1046)));
             Add_Action (Table.States (887), (15, 24, 28, 72, 104), (148, 1), 
1, null, null);
-            Table.States (887).Minimal_Complete_Action := (Reduce, 148, 1);
-            Table.States (888).Productions := WisiToken.To_Vector ((1 => (148, 
0)));
+            Table.States (887).Kernel := To_Vector ((0 => (148, 121, 0, 
False)));
+            Table.States (887).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 148, 1)));
             Add_Action (Table.States (888), (15, 24, 28, 72, 104), (148, 0), 
1, null, null);
-            Table.States (888).Minimal_Complete_Action := (Reduce, 148, 1);
-            Table.States (889).Productions := WisiToken.To_Vector ((1 => (149, 
2)));
+            Table.States (888).Kernel := To_Vector ((0 => (148, 146, 0, 
False)));
+            Table.States (888).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 148, 1)));
+         end Subr_15;
+         procedure Subr_16
+         is begin
             Add_Action (Table.States (889), (15, 24, 28, 72, 104), (149, 2), 
1, null, null);
-            Table.States (889).Minimal_Complete_Action := (Reduce, 149, 1);
-            Table.States (890).Productions := WisiToken.To_Vector (((149, 0), 
(149, 1), (150, 0)));
+            Table.States (889).Kernel := To_Vector ((0 => (149, 148, 0, 
False)));
+            Table.States (889).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 149, 1)));
             Add_Action (Table.States (890), 15, 885);
             Add_Action (Table.States (890), 24, Reduce, (150, 0), 1, null, 
null);
             Add_Action (Table.States (890), 28, 183);
@@ -10456,54 +10712,54 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (890), 219, 892);
             Add_Goto (Table.States (890), 281, 94);
             Add_Goto (Table.States (890), 327, 1048);
-            Table.States (890).Minimal_Complete_Action := (Reduce, 150, 1);
-            Table.States (891).Productions := WisiToken.To_Vector ((1 => (280, 
0)));
+            Table.States (890).Kernel := To_Vector (((149, 149, 4, True), 
(149, 149, 7, True), (150, 149, 0, False)));
+            Table.States (890).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 150, 1)));
             Add_Action (Table.States (891), 24, 1049);
             Add_Error (Table.States (891));
-            Table.States (891).Minimal_Complete_Action := (Shift, 24, 1049);
-            Table.States (892).Productions := WisiToken.To_Vector (((146, 0), 
(146, 1), (219, 0)));
+            Table.States (891).Kernel := To_Vector ((0 => (280, 150, 2, 
False)));
+            Table.States (891).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1049)));
             Add_Action (Table.States (892), 81, 1050);
             Add_Action (Table.States (892), 83, 234);
             Add_Error (Table.States (892));
-            Table.States (892).Minimal_Complete_Action := (Shift, 81, 1050);
-            Table.States (893).Productions := WisiToken.To_Vector ((1 => (149, 
3)));
+            Table.States (892).Kernel := To_Vector (((146, 219, 4, False), 
(146, 219, 3, False), (219, 219, 2, True)));
+            Table.States (892).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 81, 1050)));
             Add_Action (Table.States (893), (15, 24, 28, 72, 104), (149, 3), 
1, null, null);
-            Table.States (893).Minimal_Complete_Action := (Reduce, 149, 1);
-            Table.States (894).Productions := WisiToken.To_Vector (((228, 3), 
(228, 7)));
+            Table.States (893).Kernel := To_Vector ((0 => (149, 327, 0, 
False)));
+            Table.States (893).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 149, 1)));
             Add_Action (Table.States (894), 10, 1051);
             Add_Action (Table.States (894), 74, Reduce, (228, 7), 2, null, 
null);
             Add_Action (Table.States (894), 96, Reduce, (228, 7), 2, null, 
null);
             Add_Error (Table.States (894));
-            Table.States (894).Minimal_Complete_Action := (Reduce, 228, 2);
-            Table.States (895).Productions := WisiToken.To_Vector ((1 => (111, 
2)));
+            Table.States (894).Kernel := To_Vector (((228, 34, 2, False), 
(228, 34, 0, False)));
+            Table.States (894).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 2)));
             Add_Action (Table.States (895), (41, 49, 54), (111, 2), 2, null, 
null);
-            Table.States (895).Minimal_Complete_Action := (Reduce, 111, 2);
-            Table.States (896).Productions := WisiToken.To_Vector ((1 => (223, 
0)));
+            Table.States (895).Kernel := To_Vector ((0 => (111, 36, 0, 
False)));
+            Table.States (895).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 111, 2)));
             Add_Action (Table.States (896), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (223, 0), 6,
             incomplete_type_declaration_0'Access, null);
-            Table.States (896).Minimal_Complete_Action := (Reduce, 223, 6);
-            Table.States (897).Productions := WisiToken.To_Vector (((228, 1), 
(228, 5)));
+            Table.States (896).Kernel := To_Vector ((0 => (223, 96, 0, 
False)));
+            Table.States (896).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 223, 6)));
             Add_Action (Table.States (897), 10, 1052);
             Add_Action (Table.States (897), 74, Reduce, (228, 5), 2, null, 
null);
             Add_Action (Table.States (897), 96, Reduce, (228, 5), 2, null, 
null);
             Add_Error (Table.States (897));
-            Table.States (897).Minimal_Complete_Action := (Reduce, 228, 2);
-            Table.States (898).Productions := WisiToken.To_Vector ((1 => (180, 
0)));
+            Table.States (897).Kernel := To_Vector (((228, 34, 2, False), 
(228, 34, 0, False)));
+            Table.States (897).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 2)));
             Add_Action (Table.States (898), (77, 83), (180, 0), 1, null, null);
-            Table.States (898).Minimal_Complete_Action := (Reduce, 180, 1);
-            Table.States (899).Productions := WisiToken.To_Vector ((1 => (180, 
1)));
+            Table.States (898).Kernel := To_Vector ((0 => (180, 104, 0, 
False)));
+            Table.States (898).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 180, 1)));
             Add_Action (Table.States (899), (77, 83), (180, 1), 1, null, null);
-            Table.States (899).Minimal_Complete_Action := (Reduce, 180, 1);
-            Table.States (900).Productions := WisiToken.To_Vector ((1 => (181, 
1)));
+            Table.States (899).Kernel := To_Vector ((0 => (180, 106, 0, 
False)));
+            Table.States (899).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 180, 1)));
             Add_Action (Table.States (900), (77, 83), (181, 1), 1, null, null);
-            Table.States (900).Minimal_Complete_Action := (Reduce, 181, 1);
-            Table.States (901).Productions := WisiToken.To_Vector (((181, 0), 
(183, 0)));
+            Table.States (900).Kernel := To_Vector ((0 => (181, 180, 0, 
False)));
+            Table.States (900).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 181, 1)));
             Add_Action (Table.States (901), 77, 1053);
             Add_Action (Table.States (901), 83, 1054);
             Add_Error (Table.States (901));
-            Table.States (901).Minimal_Complete_Action := (Shift, 77, 1053);
-            Table.States (902).Productions := WisiToken.To_Vector ((1 => (259, 
0)));
+            Table.States (901).Kernel := To_Vector (((181, 181, 2, True), 
(183, 181, 1, False)));
+            Table.States (901).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1053)));
             Add_Action (Table.States (902), 40, 483);
             Add_Action (Table.States (902), 104, 119);
             Add_Action (Table.States (902), 105, 33);
@@ -10514,8 +10770,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (902), 272, 92);
             Add_Goto (Table.States (902), 293, 97);
             Add_Goto (Table.States (902), 314, 1055);
-            Table.States (902).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (903).Productions := WisiToken.To_Vector (((162, 0), 
(162, 1)));
+            Table.States (902).Kernel := To_Vector ((0 => (259, 39, 4, 
False)));
+            Table.States (902).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (903), 104, 119);
             Add_Action (Table.States (903), 105, 33);
             Add_Action (Table.States (903), 106, 34);
@@ -10524,30 +10780,29 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (903), 239, 1056);
             Add_Goto (Table.States (903), 272, 92);
             Add_Goto (Table.States (903), 293, 97);
-            Table.States (903).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (904).Productions := WisiToken.To_Vector ((1 => (260, 
0)));
+            Table.States (903).Kernel := To_Vector (((162, 39, 4, False), 
(162, 39, 1, False)));
+            Table.States (903).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (904), 74, 337);
             Add_Action (Table.States (904), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (904));
             Add_Goto (Table.States (904), 122, 1057);
-            Table.States (904).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (905).Productions := WisiToken.To_Vector ((1 => (326, 
7)));
+            Table.States (904).Kernel := To_Vector ((0 => (260, 49, 1, 
False)));
+            Table.States (904).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (905), (74, 96), (326, 7), 2, null, null);
-            Table.States (905).Minimal_Complete_Action := (Reduce, 326, 2);
-            Table.States (906).Productions := WisiToken.To_Vector ((1 => (206, 
0)));
+            Table.States (905).Kernel := To_Vector ((0 => (326, 280, 0, 
False)));
+            Table.States (905).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 2)));
             Add_Action (Table.States (906), 96, 1058);
             Add_Error (Table.States (906));
-            Table.States (906).Minimal_Complete_Action := (Shift, 96, 1058);
-            Table.States (907).Productions := WisiToken.To_Vector ((1 => (245, 
2)));
+            Table.States (906).Kernel := To_Vector ((0 => (206, 122, 1, 
False)));
+            Table.States (906).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1058)));
             Add_Action (Table.States (907), 96, 1059);
             Add_Error (Table.States (907));
-            Table.States (907).Minimal_Complete_Action := (Shift, 96, 1059);
-            Table.States (908).Productions := WisiToken.To_Vector ((1 => (245, 
1)));
+            Table.States (907).Kernel := To_Vector ((0 => (245, 122, 1, 
False)));
+            Table.States (907).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1059)));
             Add_Action (Table.States (908), 96, 1060);
             Add_Error (Table.States (908));
-            Table.States (908).Minimal_Complete_Action := (Shift, 96, 1060);
-            Table.States (909).Productions := WisiToken.To_Vector (((114, 2), 
(128, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (908).Kernel := To_Vector ((0 => (245, 122, 1, 
False)));
+            Table.States (908).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1060)));
             Add_Action (Table.States (909), 21, Reduce, (114, 2), 4, 
access_definition_2'Access, null);
             Add_Action (Table.States (909), 35, Reduce, (114, 2), 4, 
access_definition_2'Access, null);
             Add_Action (Table.States (909), 56, Reduce, (114, 2), 4, 
access_definition_2'Access, null);
@@ -10562,16 +10817,19 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (909));
             Add_Goto (Table.States (909), 115, 241);
             Add_Goto (Table.States (909), 322, 242);
-            Table.States (909).Minimal_Complete_Action := (Reduce, 114, 4);
-            Table.States (910).Productions := WisiToken.To_Vector ((1 => (114, 
1)));
+            Table.States (909).Kernel := To_Vector (((114, 239, 0, False), 
(128, 239, 2, True), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (909).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 114, 4)));
             Add_Action (Table.States (910), 58, 317);
             Add_Action (Table.States (910), 76, 431);
             Add_Error (Table.States (910));
             Add_Goto (Table.States (910), 199, 319);
             Add_Goto (Table.States (910), 252, 1061);
             Add_Goto (Table.States (910), 291, 321);
-            Table.States (910).Minimal_Complete_Action := (Shift, 58, 317);
-            Table.States (911).Productions := WisiToken.To_Vector ((1 => (114, 
0)));
+            Table.States (910).Kernel := To_Vector ((0 => (114, 29, 1, True)));
+            Table.States (910).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 58, 317)));
+            Table.States (910).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (911), 21, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (911), 35, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (911), 56, Reduce, (253, 1), 0, null, 
null);
@@ -10583,9 +10841,8 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (911));
             Add_Goto (Table.States (911), 199, 344);
             Add_Goto (Table.States (911), 253, 1062);
-            Table.States (911).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (912).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (245, 0), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (911).Kernel := To_Vector ((0 => (114, 50, 0, 
False)));
+            Table.States (911).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (912), 74, 337);
             Add_Action (Table.States (912), 76, 235);
             Add_Action (Table.States (912), 84, 237);
@@ -10596,16 +10853,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (912), 115, 241);
             Add_Goto (Table.States (912), 122, 1063);
             Add_Goto (Table.States (912), 322, 242);
-            Table.States (912).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (913).Productions := WisiToken.To_Vector ((1 => (133, 
1)));
+            Table.States (912).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (245, 239, 1, False), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (912).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (913), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (133, 1), 6, block_statement_1'Access, 
block_statement_1_check'Access);
-            Table.States (913).Minimal_Complete_Action := (Reduce, 133, 6);
-            Table.States (914).Productions := WisiToken.To_Vector ((1 => (184, 
1)));
+            Table.States (913).Kernel := To_Vector ((0 => (133, 96, 0, 
False)));
+            Table.States (913).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 133, 6)));
             Add_Action (Table.States (914), (79, 87), (184, 1), 1, null, null);
-            Table.States (914).Minimal_Complete_Action := (Reduce, 184, 1);
-            Table.States (915).Productions := WisiToken.To_Vector (((187, 0), 
(239, 5)));
+            Table.States (914).Kernel := To_Vector ((0 => (184, 44, 0, 
False)));
+            Table.States (914).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 184, 1)));
             Add_Action (Table.States (915), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (915), 79, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (915), 81, 1064);
@@ -10614,17 +10873,16 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (915), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (915), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (915));
-            Table.States (915).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (916).Productions := WisiToken.To_Vector ((1 => (185, 
1)));
+            Table.States (915).Kernel := To_Vector (((187, 104, 3, False), 
(239, 104, 0, False)));
+            Table.States (915).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 239, 1)));
             Add_Action (Table.States (916), (79, 87), (185, 1), 1, null, null);
-            Table.States (916).Minimal_Complete_Action := (Reduce, 185, 1);
-            Table.States (917).Productions := WisiToken.To_Vector (((185, 0), 
(187, 1)));
+            Table.States (916).Kernel := To_Vector ((0 => (185, 184, 0, 
False)));
+            Table.States (916).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 185, 1)));
             Add_Action (Table.States (917), 79, 1065);
             Add_Action (Table.States (917), 87, 1066);
             Add_Error (Table.States (917));
-            Table.States (917).Minimal_Complete_Action := (Shift, 87, 1066);
-            Table.States (918).Productions := WisiToken.To_Vector (((128, 0), 
(184, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (917).Kernel := To_Vector (((185, 185, 2, True), 
(187, 185, 1, False)));
+            Table.States (917).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 1066)));
             Add_Action (Table.States (918), 76, 235);
             Add_Action (Table.States (918), 79, Reduce, (184, 0), 1, null, 
null);
             Add_Action (Table.States (918), 84, 237);
@@ -10634,32 +10892,35 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (918));
             Add_Goto (Table.States (918), 115, 241);
             Add_Goto (Table.States (918), 322, 242);
-            Table.States (918).Minimal_Complete_Action := (Reduce, 184, 1);
-            Table.States (919).Productions := WisiToken.To_Vector ((1 => (188, 
0)));
+            Table.States (918).Kernel := To_Vector (((128, 239, 2, True), 
(184, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (918).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 184, 1)));
             Add_Action (Table.States (919), (24, 72), (188, 0), 2, null, null);
-            Table.States (919).Minimal_Complete_Action := (Reduce, 188, 2);
-            Table.States (920).Productions := WisiToken.To_Vector ((1 => (133, 
0)));
+            Table.States (919).Kernel := To_Vector ((0 => (188, 187, 0, 
True)));
+            Table.States (919).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 188, 2)));
+            Table.States (919).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (920), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (920), 104, 149);
             Add_Error (Table.States (920));
             Add_Goto (Table.States (920), 220, 1067);
-            Table.States (920).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (921).Productions := WisiToken.To_Vector ((1 => (232, 
1)));
+            Table.States (920).Kernel := To_Vector ((0 => (133, 24, 1, 
False)));
+            Table.States (920).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (921), 96, 1068);
             Add_Error (Table.States (921));
-            Table.States (921).Minimal_Complete_Action := (Shift, 96, 1068);
-            Table.States (922).Productions := WisiToken.To_Vector ((1 => (232, 
0)));
+            Table.States (921).Kernel := To_Vector ((0 => (232, 220, 1, 
False)));
+            Table.States (921).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1068)));
             Add_Action (Table.States (922), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (922), 104, 149);
             Add_Error (Table.States (922));
             Add_Goto (Table.States (922), 220, 1069);
-            Table.States (922).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (923).Productions := WisiToken.To_Vector ((1 => (157, 
9)));
+            Table.States (922).Kernel := To_Vector ((0 => (232, 37, 1, 
False)));
+            Table.States (922).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (923), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (157, 9), 6,
             declaration_9'Access, null);
-            Table.States (923).Minimal_Complete_Action := (Reduce, 157, 6);
-            Table.States (924).Productions := WisiToken.To_Vector (((241, 0), 
(314, 0), (314, 1)));
+            Table.States (923).Kernel := To_Vector ((0 => (157, 96, 0, 
False)));
+            Table.States (923).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 157, 6)));
             Add_Action (Table.States (924), 7, Reduce, (241, 0), 2, null, 
null);
             Add_Action (Table.States (924), 104, 119);
             Add_Action (Table.States (924), 105, 33);
@@ -10669,8 +10930,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (924), 239, 772);
             Add_Goto (Table.States (924), 272, 92);
             Add_Goto (Table.States (924), 293, 97);
-            Table.States (924).Minimal_Complete_Action := (Reduce, 241, 2);
-            Table.States (925).Productions := WisiToken.To_Vector ((1 => (244, 
1)));
+            Table.States (924).Kernel := To_Vector (((241, 41, 0, False), 
(314, 41, 5, False), (314, 41, 1, False)));
+            Table.States (924).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 2)));
             Add_Action (Table.States (925), 3, 121);
             Add_Action (Table.States (925), 39, 122);
             Add_Action (Table.States (925), 40, 123);
@@ -10706,12 +10967,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (925), 320, 144);
             Add_Goto (Table.States (925), 321, 145);
             Add_Goto (Table.States (925), 330, 146);
-            Table.States (925).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (926).Productions := WisiToken.To_Vector ((1 => (244, 
4)));
+            Table.States (925).Kernel := To_Vector ((0 => (244, 82, 1, 
False)));
+            Table.States (925).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (926), 96, 1071);
             Add_Error (Table.States (926));
-            Table.States (926).Minimal_Complete_Action := (Shift, 96, 1071);
-            Table.States (927).Productions := WisiToken.To_Vector ((1 => (244, 
2)));
+            Table.States (926).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (926).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1071)));
             Add_Action (Table.States (927), 3, 121);
             Add_Action (Table.States (927), 39, 122);
             Add_Action (Table.States (927), 40, 123);
@@ -10747,15 +11008,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (927), 320, 144);
             Add_Goto (Table.States (927), 321, 145);
             Add_Goto (Table.States (927), 330, 146);
-            Table.States (927).Minimal_Complete_Action := (Reduce, 192, 0);
-         end Subr_15;
-         procedure Subr_16
-         is begin
-            Table.States (928).Productions := WisiToken.To_Vector ((1 => (244, 
5)));
+            Table.States (927).Kernel := To_Vector ((0 => (244, 82, 1, 
False)));
+            Table.States (927).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (928), 96, 1073);
             Add_Error (Table.States (928));
-            Table.States (928).Minimal_Complete_Action := (Shift, 96, 1073);
-            Table.States (929).Productions := WisiToken.To_Vector ((1 => (244, 
0)));
+            Table.States (928).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (928).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1073)));
             Add_Action (Table.States (929), 3, 121);
             Add_Action (Table.States (929), 39, 122);
             Add_Action (Table.States (929), 40, 123);
@@ -10791,26 +11049,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (929), 320, 144);
             Add_Goto (Table.States (929), 321, 145);
             Add_Goto (Table.States (929), 330, 146);
-            Table.States (929).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (930).Productions := WisiToken.To_Vector ((1 => (244, 
3)));
+            Table.States (929).Kernel := To_Vector ((0 => (244, 82, 1, 
False)));
+            Table.States (929).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (930), 96, 1075);
             Add_Error (Table.States (930));
-            Table.States (930).Minimal_Complete_Action := (Shift, 96, 1075);
-            Table.States (931).Productions := WisiToken.To_Vector ((1 => (179, 
0)));
+            Table.States (930).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (930).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1075)));
             Add_Action (Table.States (931), 74, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (931), 76, 431);
             Add_Action (Table.States (931), 96, Reduce, (253, 1), 0, null, 
null);
             Add_Error (Table.States (931));
             Add_Goto (Table.States (931), 199, 344);
             Add_Goto (Table.States (931), 253, 1076);
-            Table.States (931).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (932).Productions := WisiToken.To_Vector ((1 => (179, 
1)));
+            Table.States (931).Kernel := To_Vector ((0 => (179, 77, 1, 
False)));
+            Table.States (931).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (932), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (179, 1), 6,
             entry_declaration_1'Access, null);
-            Table.States (932).Minimal_Complete_Action := (Reduce, 179, 6);
-            Table.States (933).Productions := WisiToken.To_Vector (((128, 0), 
(213, 2), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (932).Kernel := To_Vector ((0 => (179, 96, 0, 
False)));
+            Table.States (932).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 179, 6)));
             Add_Action (Table.States (933), 74, 337);
             Add_Action (Table.States (933), 76, 235);
             Add_Action (Table.States (933), 84, 237);
@@ -10821,9 +11078,10 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (933), 115, 241);
             Add_Goto (Table.States (933), 122, 1077);
             Add_Goto (Table.States (933), 322, 242);
-            Table.States (933).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (934).Productions := WisiToken.To_Vector (((128, 0), 
(213, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (933).Kernel := To_Vector (((128, 239, 2, True), 
(213, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (933).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (934), 74, 337);
             Add_Action (Table.States (934), 76, 235);
             Add_Action (Table.States (934), 84, 237);
@@ -10834,42 +11092,44 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (934), 115, 241);
             Add_Goto (Table.States (934), 122, 1078);
             Add_Goto (Table.States (934), 322, 242);
-            Table.States (934).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (935).Productions := WisiToken.To_Vector ((1 => (256, 
1)));
+            Table.States (934).Kernel := To_Vector (((128, 239, 2, True), 
(213, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (934).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (935), (74, 96), (256, 1), 3, 
paren_expression_1'Access, null);
-            Table.States (935).Minimal_Complete_Action := (Reduce, 256, 3);
-            Table.States (936).Productions := WisiToken.To_Vector ((1 => (256, 
2)));
+            Table.States (935).Kernel := To_Vector ((0 => (256, 77, 0, 
False)));
+            Table.States (935).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 256, 3)));
             Add_Action (Table.States (936), (74, 96), (256, 2), 3, 
paren_expression_2'Access, null);
-            Table.States (936).Minimal_Complete_Action := (Reduce, 256, 3);
-            Table.States (937).Productions := WisiToken.To_Vector ((1 => (256, 
0)));
+            Table.States (936).Kernel := To_Vector ((0 => (256, 77, 0, 
False)));
+            Table.States (936).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 256, 3)));
             Add_Action (Table.States (937), (74, 96), (256, 0), 3, 
paren_expression_0'Access, null);
-            Table.States (937).Minimal_Complete_Action := (Reduce, 256, 3);
-            Table.States (938).Productions := WisiToken.To_Vector ((1 => (193, 
0)));
+            Table.States (937).Kernel := To_Vector ((0 => (256, 77, 0, 
False)));
+            Table.States (937).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 256, 3)));
             Add_Action (Table.States (938), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (193, 0), 6,
             expression_function_declaration_0'Access, null);
-            Table.States (938).Minimal_Complete_Action := (Reduce, 193, 6);
-            Table.States (939).Productions := WisiToken.To_Vector ((1 => (243, 
0)));
+            Table.States (938).Kernel := To_Vector ((0 => (193, 96, 0, 
False)));
+            Table.States (938).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 193, 6)));
             Add_Action (Table.States (939), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (243, 0), 6,
             null_procedure_declaration_0'Access, null);
-            Table.States (939).Minimal_Complete_Action := (Reduce, 243, 6);
-            Table.States (940).Productions := WisiToken.To_Vector ((1 => (112, 
0)));
+            Table.States (939).Kernel := To_Vector ((0 => (243, 96, 0, 
False)));
+            Table.States (939).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 243, 6)));
             Add_Action (Table.States (940), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (112, 0), 6,
             abstract_subprogram_declaration_0'Access, null);
-            Table.States (940).Minimal_Complete_Action := (Reduce, 112, 6);
-            Table.States (941).Productions := WisiToken.To_Vector ((1 => (308, 
0)));
+            Table.States (940).Kernel := To_Vector ((0 => (112, 96, 0, 
False)));
+            Table.States (940).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 112, 6)));
             Add_Action (Table.States (941), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (308, 0), 6,
             subprogram_body_stub_0'Access, null);
-            Table.States (941).Minimal_Complete_Action := (Reduce, 308, 6);
-            Table.States (942).Productions := WisiToken.To_Vector ((1 => (311, 
0)));
+            Table.States (941).Kernel := To_Vector ((0 => (308, 96, 0, 
False)));
+            Table.States (941).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 308, 6)));
             Add_Action (Table.States (942), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (311, 0), 6,
             subprogram_renaming_declaration_0'Access, null);
-            Table.States (942).Minimal_Complete_Action := (Reduce, 311, 6);
-            Table.States (943).Productions := WisiToken.To_Vector ((1 => (307, 
0)));
+            Table.States (942).Kernel := To_Vector ((0 => (311, 96, 0, 
False)));
+            Table.States (942).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 311, 6)));
             Add_Action (Table.States (943), 4, 1);
             Add_Action (Table.States (943), 5, 2);
             Add_Action (Table.States (943), 13, Reduce, (132, 1), 0, null, 
null);
@@ -10927,27 +11187,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (943), 303, 101);
             Add_Goto (Table.States (943), 306, 363);
             Add_Goto (Table.States (943), 323, 114);
-            Table.States (943).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (944).Productions := WisiToken.To_Vector ((1 => (113, 
0)));
+            Table.States (943).Kernel := To_Vector ((0 => (307, 13, 2, 
False)));
+            Table.States (943).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (944), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (944), 104, 149);
             Add_Error (Table.States (944));
             Add_Goto (Table.States (944), 220, 1080);
-            Table.States (944).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (945).Productions := WisiToken.To_Vector (((137, 0), 
(166, 0)));
+            Table.States (944).Kernel := To_Vector ((0 => (113, 24, 1, 
False)));
+            Table.States (944).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (945), 79, 445);
             Add_Action (Table.States (945), 87, 1081);
             Add_Error (Table.States (945));
-            Table.States (945).Minimal_Complete_Action := (Shift, 87, 1081);
-            Table.States (946).Productions := WisiToken.To_Vector ((1 => (138, 
0)));
+            Table.States (945).Kernel := To_Vector (((137, 166, 1, False), 
(166, 166, 2, True)));
+            Table.States (945).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 1081)));
             Add_Action (Table.States (946), 72, 761);
             Add_Error (Table.States (946));
             Add_Goto (Table.States (946), 137, 1082);
-            Table.States (946).Minimal_Complete_Action := (Shift, 72, 761);
-            Table.States (947).Productions := WisiToken.To_Vector ((1 => (273, 
0)));
+            Table.States (946).Kernel := To_Vector ((0 => (138, 83, 2, True)));
+            Table.States (946).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 72, 761)));
+            Table.States (946).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (947), (1 =>  77), (273, 0), 5, 
quantified_expression_0'Access, null);
-            Table.States (947).Minimal_Complete_Action := (Reduce, 273, 5);
-            Table.States (948).Productions := WisiToken.To_Vector ((1 => (221, 
1)));
+            Table.States (947).Kernel := To_Vector ((0 => (273, 192, 0, 
False)));
+            Table.States (947).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 273, 5)));
             Add_Action (Table.States (948), 3, 121);
             Add_Action (Table.States (948), 39, 122);
             Add_Action (Table.States (948), 40, 123);
@@ -10982,8 +11243,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (948), 320, 144);
             Add_Goto (Table.States (948), 321, 145);
             Add_Goto (Table.States (948), 330, 146);
-            Table.States (948).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (949).Productions := WisiToken.To_Vector ((1 => (172, 
0)));
+            Table.States (948).Kernel := To_Vector ((0 => (221, 22, 0, 
False)));
+            Table.States (948).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (949), 3, 121);
             Add_Action (Table.States (949), 39, 122);
             Add_Action (Table.States (949), 40, 123);
@@ -11018,40 +11279,40 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (949), 320, 144);
             Add_Goto (Table.States (949), 321, 145);
             Add_Goto (Table.States (949), 330, 146);
-            Table.States (949).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (950).Productions := WisiToken.To_Vector ((1 => (173, 
1)));
+            Table.States (949).Kernel := To_Vector ((0 => (172, 23, 1, 
False)));
+            Table.States (949).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (950), (22, 23, 77), (173, 1), 1, null, 
null);
-            Table.States (950).Minimal_Complete_Action := (Reduce, 173, 1);
-            Table.States (951).Productions := WisiToken.To_Vector (((173, 0), 
(221, 0), (221, 2)));
+            Table.States (950).Kernel := To_Vector ((0 => (173, 172, 0, 
False)));
+            Table.States (950).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 173, 1)));
             Add_Action (Table.States (951), 22, 1085);
             Add_Action (Table.States (951), 23, 949);
             Add_Action (Table.States (951), 77, Reduce, (221, 2), 5, 
if_expression_2'Access, null);
             Add_Error (Table.States (951));
             Add_Goto (Table.States (951), 172, 1086);
-            Table.States (951).Minimal_Complete_Action := (Reduce, 221, 5);
-            Table.States (952).Productions := WisiToken.To_Vector ((1 => (117, 
0)));
+            Table.States (951).Kernel := To_Vector (((173, 173, 2, True), 
(221, 173, 1, False), (221, 173, 0, False)));
+            Table.States (951).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 221, 5)));
             Add_Action (Table.States (952), (4, 5, 10, 13, 15, 17, 18, 20, 21, 
22, 23, 27, 28, 31, 32, 33, 35, 37, 38,
             40, 41, 42, 43, 48, 52, 53, 55, 56, 57, 58, 61, 68, 71, 73, 74, 
75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87,
             88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 
105, 106), (117, 0), 6, aggregate_0'Access,
             null);
-            Table.States (952).Minimal_Complete_Action := (Reduce, 117, 6);
-            Table.States (953).Productions := WisiToken.To_Vector ((1 => (277, 
0)));
+            Table.States (952).Kernel := To_Vector ((0 => (117, 77, 0, 
False)));
+            Table.States (952).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 117, 6)));
             Add_Action (Table.States (953), 77, 1087);
             Add_Error (Table.States (953));
-            Table.States (953).Minimal_Complete_Action := (Shift, 77, 1087);
-            Table.States (954).Productions := WisiToken.To_Vector ((1 => (140, 
0)));
+            Table.States (953).Kernel := To_Vector ((0 => (277, 192, 1, 
False)));
+            Table.States (953).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1087)));
             Add_Action (Table.States (954), (24, 72), (140, 0), 4, 
case_statement_alternative_0'Access, null);
-            Table.States (954).Minimal_Complete_Action := (Reduce, 140, 4);
-            Table.States (955).Productions := WisiToken.To_Vector ((1 => (139, 
0)));
+            Table.States (954).Kernel := To_Vector ((0 => (140, 300, 0, 
False)));
+            Table.States (954).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 140, 4)));
             Add_Action (Table.States (955), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (139, 0), 7, case_statement_0'Access, null);
-            Table.States (955).Minimal_Complete_Action := (Reduce, 139, 7);
-            Table.States (956).Productions := WisiToken.To_Vector ((1 => (314, 
0)));
+            Table.States (955).Kernel := To_Vector ((0 => (139, 96, 0, 
False)));
+            Table.States (955).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 139, 7)));
             Add_Action (Table.States (956), (10, 21, 37, 42, 74, 77, 82, 83, 
87, 96), (314, 0), 4,
             subtype_indication_0'Access, null);
-            Table.States (956).Minimal_Complete_Action := (Reduce, 314, 4);
-            Table.States (957).Productions := WisiToken.To_Vector (((165, 1), 
(258, 1), (314, 0), (314, 1)));
+            Table.States (956).Kernel := To_Vector ((0 => (314, 155, 0, 
False)));
+            Table.States (956).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 314, 4)));
             Add_Action (Table.States (957), 10, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (957), 33, Reduce, (258, 1), 1, null, 
null);
             Add_Action (Table.States (957), 38, Reduce, (258, 1), 1, null, 
null);
@@ -11083,12 +11344,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (957), 239, 1088);
             Add_Goto (Table.States (957), 272, 92);
             Add_Goto (Table.States (957), 293, 97);
-            Table.States (957).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (958).Productions := WisiToken.To_Vector ((1 => (224, 
0)));
+            Table.States (957).Kernel := To_Vector (((165, 41, 1, False), 
(258, 41, 0, False), (314, 41, 5, False),
+            (314, 41, 1, False)));
+            Table.States (957).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 258, 1)));
             Add_Action (Table.States (958), (10, 21, 37, 42, 74, 77, 82, 83, 
87, 96), (224, 0), 3,
             index_constraint_0'Access, null);
-            Table.States (958).Minimal_Complete_Action := (Reduce, 224, 3);
-            Table.States (959).Productions := WisiToken.To_Vector ((1 => (168, 
0)));
+            Table.States (958).Kernel := To_Vector ((0 => (224, 77, 0, 
False)));
+            Table.States (958).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 224, 3)));
             Add_Action (Table.States (959), 3, 121);
             Add_Action (Table.States (959), 39, 122);
             Add_Action (Table.States (959), 40, 474);
@@ -11115,9 +11377,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (959), 320, 144);
             Add_Goto (Table.States (959), 321, 145);
             Add_Goto (Table.States (959), 330, 146);
-            Table.States (959).Minimal_Complete_Action := (Shift, 40, 474);
-            Table.States (960).Productions := WisiToken.To_Vector (((128, 0), 
(230, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (959).Kernel := To_Vector ((0 => (168, 83, 1, True)));
+            Table.States (959).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (959).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (960), 37, Reduce, (230, 0), 6, null, 
null);
             Add_Action (Table.States (960), 76, 235);
             Add_Action (Table.States (960), 84, 237);
@@ -11127,12 +11389,17 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (960));
             Add_Goto (Table.States (960), 115, 241);
             Add_Goto (Table.States (960), 322, 242);
-            Table.States (960).Minimal_Complete_Action := (Reduce, 230, 6);
-            Table.States (961).Productions := WisiToken.To_Vector ((1 => (235, 
0)));
+            Table.States (960).Kernel := To_Vector (((128, 239, 2, True), 
(230, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (960).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 230, 6)));
+         end Subr_16;
+         procedure Subr_17
+         is begin
             Add_Action (Table.States (961), 96, 1090);
             Add_Error (Table.States (961));
-            Table.States (961).Minimal_Complete_Action := (Shift, 96, 1090);
-            Table.States (962).Productions := WisiToken.To_Vector ((1 => (144, 
0)));
+            Table.States (961).Kernel := To_Vector ((0 => (235, 192, 1, 
False)));
+            Table.States (961).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1090)));
             Add_Action (Table.States (962), 3, 121);
             Add_Action (Table.States (962), 39, 122);
             Add_Action (Table.States (962), 40, 123);
@@ -11156,70 +11423,71 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (962), 320, 144);
             Add_Goto (Table.States (962), 321, 145);
             Add_Goto (Table.States (962), 330, 146);
-            Table.States (962).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (963).Productions := WisiToken.To_Vector ((1 => (281, 
0)));
+            Table.States (962).Kernel := To_Vector ((0 => (144, 12, 6, 
False)));
+            Table.States (962).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (963), 54, 1092);
             Add_Error (Table.States (963));
-            Table.States (963).Minimal_Complete_Action := (Shift, 54, 1092);
-            Table.States (964).Productions := WisiToken.To_Vector ((1 => (145, 
0)));
+            Table.States (963).Kernel := To_Vector ((0 => (281, 24, 2, 
False)));
+            Table.States (963).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 54, 1092)));
             Add_Action (Table.States (964), (24, 104), (145, 0), 2, null, 
null);
-            Table.States (964).Minimal_Complete_Action := (Reduce, 145, 2);
-            Table.States (965).Productions := WisiToken.To_Vector (((254, 2), 
(254, 3)));
+            Table.States (964).Kernel := To_Vector ((0 => (145, 144, 0, 
True)));
+            Table.States (964).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 145, 2)));
+            Table.States (964).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (965), 77, Reduce, (254, 3), 4, 
parameter_specification_3'Access, null);
             Add_Action (Table.States (965), 82, 1093);
             Add_Action (Table.States (965), 96, Reduce, (254, 3), 4, 
parameter_specification_3'Access, null);
             Add_Error (Table.States (965));
-            Table.States (965).Minimal_Complete_Action := (Reduce, 254, 4);
-            Table.States (966).Productions := WisiToken.To_Vector (((254, 0), 
(254, 1)));
+            Table.States (965).Kernel := To_Vector (((254, 114, 1, False), 
(254, 114, 0, False)));
+            Table.States (965).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 254, 4)));
             Add_Action (Table.States (966), 40, 386);
             Add_Action (Table.States (966), 104, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (966), 105, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (966), 106, Reduce, (241, 1), 0, null, 
null);
             Add_Error (Table.States (966));
             Add_Goto (Table.States (966), 241, 1094);
-            Table.States (966).Minimal_Complete_Action := (Reduce, 241, 0);
-            Table.States (967).Productions := WisiToken.To_Vector ((1 => (215, 
2)));
+            Table.States (966).Kernel := To_Vector (((254, 236, 2, False), 
(254, 236, 1, False)));
+            Table.States (966).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 0)));
             Add_Action (Table.States (967), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (215, 2), 7,
             generic_renaming_declaration_2'Access, null);
-            Table.States (967).Minimal_Complete_Action := (Reduce, 215, 7);
-            Table.States (968).Productions := WisiToken.To_Vector ((1 => (215, 
0)));
+            Table.States (967).Kernel := To_Vector ((0 => (215, 96, 0, 
False)));
+            Table.States (967).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 215, 7)));
             Add_Action (Table.States (968), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (215, 0), 7,
             generic_renaming_declaration_0'Access, null);
-            Table.States (968).Minimal_Complete_Action := (Reduce, 215, 7);
-            Table.States (969).Productions := WisiToken.To_Vector ((1 => (215, 
1)));
+            Table.States (968).Kernel := To_Vector ((0 => (215, 96, 0, 
False)));
+            Table.States (968).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 215, 7)));
             Add_Action (Table.States (969), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (215, 1), 7,
             generic_renaming_declaration_1'Access, null);
-            Table.States (969).Minimal_Complete_Action := (Reduce, 215, 7);
-            Table.States (970).Productions := WisiToken.To_Vector ((1 => (109, 
0)));
+            Table.States (969).Kernel := To_Vector ((0 => (215, 96, 0, 
False)));
+            Table.States (969).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 215, 7)));
             Add_Action (Table.States (970), (1 =>  39), (109, 0), 2, null, 
null);
-            Table.States (970).Minimal_Complete_Action := (Reduce, 109, 2);
-            Table.States (971).Productions := WisiToken.To_Vector (((202, 6), 
(202, 7)));
+            Table.States (970).Kernel := To_Vector ((0 => (109, 36, 0, 
False)));
+            Table.States (970).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 109, 2)));
             Add_Action (Table.States (971), 20, 1095);
             Add_Action (Table.States (971), 74, Reduce, (202, 7), 2, null, 
null);
             Add_Action (Table.States (971), 96, Reduce, (202, 7), 2, null, 
null);
             Add_Error (Table.States (971));
-            Table.States (971).Minimal_Complete_Action := (Reduce, 202, 2);
-            Table.States (972).Productions := WisiToken.To_Vector ((1 => (202, 
5)));
+            Table.States (971).Kernel := To_Vector (((202, 80, 2, False), 
(202, 80, 0, False)));
+            Table.States (971).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 2)));
             Add_Action (Table.States (972), (74, 96), (202, 5), 2, null, null);
-            Table.States (972).Minimal_Complete_Action := (Reduce, 202, 2);
-            Table.States (973).Productions := WisiToken.To_Vector ((1 => (202, 
4)));
+            Table.States (972).Kernel := To_Vector ((0 => (202, 80, 0, 
False)));
+            Table.States (972).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 2)));
             Add_Action (Table.States (973), (74, 96), (202, 4), 2, null, null);
-            Table.States (973).Minimal_Complete_Action := (Reduce, 202, 2);
-            Table.States (974).Productions := WisiToken.To_Vector ((1 => (202, 
3)));
+            Table.States (973).Kernel := To_Vector ((0 => (202, 80, 0, 
False)));
+            Table.States (973).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 2)));
             Add_Action (Table.States (974), (74, 96), (202, 3), 2, null, null);
-            Table.States (974).Minimal_Complete_Action := (Reduce, 202, 2);
-            Table.States (975).Productions := WisiToken.To_Vector ((1 => (201, 
1)));
+            Table.States (974).Kernel := To_Vector ((0 => (202, 80, 0, 
False)));
+            Table.States (974).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 2)));
             Add_Action (Table.States (975), 96, 1096);
             Add_Error (Table.States (975));
-            Table.States (975).Minimal_Complete_Action := (Shift, 96, 1096);
-            Table.States (976).Productions := WisiToken.To_Vector ((1 => (202, 
2)));
+            Table.States (975).Kernel := To_Vector ((0 => (201, 122, 1, 
False)));
+            Table.States (975).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1096)));
             Add_Action (Table.States (976), 77, 1097);
             Add_Error (Table.States (976));
-            Table.States (976).Minimal_Complete_Action := (Shift, 77, 1097);
-            Table.States (977).Productions := WisiToken.To_Vector (((203, 0), 
(203, 1)));
+            Table.States (976).Kernel := To_Vector ((0 => (202, 80, 1, 
False)));
+            Table.States (976).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1097)));
             Add_Action (Table.States (977), 104, 119);
             Add_Action (Table.States (977), 105, 33);
             Add_Action (Table.States (977), 106, 34);
@@ -11228,16 +11496,15 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (977), 239, 1098);
             Add_Goto (Table.States (977), 272, 92);
             Add_Goto (Table.States (977), 293, 97);
-            Table.States (977).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (978).Productions := WisiToken.To_Vector ((1 => (202, 
0)));
+            Table.States (977).Kernel := To_Vector (((203, 39, 3, False), 
(203, 39, 1, False)));
+            Table.States (977).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (978), (74, 96), (202, 0), 2, null, null);
-            Table.States (978).Minimal_Complete_Action := (Reduce, 202, 2);
-            Table.States (979).Productions := WisiToken.To_Vector ((1 => (201, 
0)));
+            Table.States (978).Kernel := To_Vector ((0 => (202, 49, 0, 
False)));
+            Table.States (978).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 2)));
             Add_Action (Table.States (979), 96, 1099);
             Add_Error (Table.States (979));
-            Table.States (979).Minimal_Complete_Action := (Shift, 96, 1099);
-            Table.States (980).Productions := WisiToken.To_Vector (((128, 0), 
(204, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (979).Kernel := To_Vector ((0 => (201, 122, 1, 
False)));
+            Table.States (979).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1099)));
             Add_Action (Table.States (980), 74, Reduce, (205, 1), 0, null, 
null);
             Add_Action (Table.States (980), 76, 1100);
             Add_Action (Table.States (980), 84, 237);
@@ -11248,30 +11515,32 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (980), 115, 241);
             Add_Goto (Table.States (980), 205, 1101);
             Add_Goto (Table.States (980), 322, 242);
-            Table.States (980).Minimal_Complete_Action := (Reduce, 205, 0);
-            Table.States (981).Productions := WisiToken.To_Vector ((1 => (200, 
2)));
+            Table.States (980).Kernel := To_Vector (((128, 239, 2, True), 
(204, 239, 1, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (980).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 205, 0)));
             Add_Action (Table.States (981), (29, 47, 48, 50, 69, 71, 74, 104), 
(200, 2), 6,
             formal_subprogram_declaration_2'Access, null);
-            Table.States (981).Minimal_Complete_Action := (Reduce, 200, 6);
-            Table.States (982).Productions := WisiToken.To_Vector ((1 => (200, 
0)));
+            Table.States (981).Kernel := To_Vector ((0 => (200, 96, 0, 
False)));
+            Table.States (981).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 200, 6)));
             Add_Action (Table.States (982), 96, 1102);
             Add_Error (Table.States (982));
-            Table.States (982).Minimal_Complete_Action := (Shift, 96, 1102);
-            Table.States (983).Productions := WisiToken.To_Vector ((1 => (200, 
1)));
+            Table.States (982).Kernel := To_Vector ((0 => (200, 122, 1, 
False)));
+            Table.States (982).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1102)));
             Add_Action (Table.States (983), (29, 47, 48, 50, 69, 71, 74, 104), 
(200, 1), 6,
             formal_subprogram_declaration_1'Access, null);
-            Table.States (983).Minimal_Complete_Action := (Reduce, 200, 6);
-            Table.States (984).Productions := WisiToken.To_Vector ((1 => (198, 
1)));
+            Table.States (983).Kernel := To_Vector ((0 => (200, 96, 0, 
False)));
+            Table.States (983).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 200, 6)));
             Add_Action (Table.States (984), 74, 337);
             Add_Action (Table.States (984), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (984));
             Add_Goto (Table.States (984), 122, 1103);
-            Table.States (984).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (985).Productions := WisiToken.To_Vector ((1 => (198, 
3)));
+            Table.States (984).Kernel := To_Vector ((0 => (198, 192, 1, 
False)));
+            Table.States (984).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (985), (29, 47, 48, 50, 69, 71, 74, 104), 
(198, 3), 6,
             formal_object_declaration_3'Access, null);
-            Table.States (985).Minimal_Complete_Action := (Reduce, 198, 6);
-            Table.States (986).Productions := WisiToken.To_Vector ((1 => (198, 
0)));
+            Table.States (985).Kernel := To_Vector ((0 => (198, 96, 0, 
False)));
+            Table.States (985).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 198, 6)));
             Add_Action (Table.States (986), 3, 121);
             Add_Action (Table.States (986), 39, 122);
             Add_Action (Table.States (986), 40, 123);
@@ -11307,16 +11576,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (986), 320, 144);
             Add_Goto (Table.States (986), 321, 145);
             Add_Goto (Table.States (986), 330, 146);
-            Table.States (986).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (987).Productions := WisiToken.To_Vector ((1 => (198, 
2)));
+            Table.States (986).Kernel := To_Vector ((0 => (198, 82, 1, 
False)));
+            Table.States (986).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (987), 96, 1105);
             Add_Error (Table.States (987));
-            Table.States (987).Minimal_Complete_Action := (Shift, 96, 1105);
-            Table.States (988).Productions := WisiToken.To_Vector ((1 => (222, 
1)));
+            Table.States (987).Kernel := To_Vector ((0 => (198, 122, 1, 
False)));
+            Table.States (987).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1105)));
             Add_Action (Table.States (988), 32, 1106);
             Add_Error (Table.States (988));
-            Table.States (988).Minimal_Complete_Action := (Shift, 32, 1106);
-            Table.States (989).Productions := WisiToken.To_Vector ((1 => (174, 
0)));
+            Table.States (988).Kernel := To_Vector ((0 => (222, 24, 2, 
False)));
+            Table.States (988).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 32, 1106)));
             Add_Action (Table.States (989), 4, 1);
             Add_Action (Table.States (989), 5, 2);
             Add_Action (Table.States (989), 13, Reduce, (132, 1), 0, null, 
null);
@@ -11374,26 +11643,26 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (989), 303, 101);
             Add_Goto (Table.States (989), 306, 363);
             Add_Goto (Table.States (989), 323, 114);
-            Table.States (989).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (990).Productions := WisiToken.To_Vector ((1 => (222, 
3)));
+            Table.States (989).Kernel := To_Vector ((0 => (174, 68, 0, 
False)));
+            Table.States (989).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (990), (4, 5, 13, 15, 17, 18, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (222, 3), 7, if_statement_3'Access, null);
-            Table.States (990).Minimal_Complete_Action := (Reduce, 222, 7);
-            Table.States (991).Productions := WisiToken.To_Vector ((1 => (222, 
0)));
+            Table.States (990).Kernel := To_Vector ((0 => (222, 96, 0, 
False)));
+            Table.States (990).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 222, 7)));
             Add_Action (Table.States (991), 24, 1108);
             Add_Error (Table.States (991));
-            Table.States (991).Minimal_Complete_Action := (Shift, 24, 1108);
-            Table.States (992).Productions := WisiToken.To_Vector ((1 => (222, 
2)));
+            Table.States (991).Kernel := To_Vector ((0 => (222, 300, 3, 
False)));
+            Table.States (991).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1108)));
             Add_Action (Table.States (992), 96, 1109);
             Add_Error (Table.States (992));
-            Table.States (992).Minimal_Complete_Action := (Shift, 96, 1109);
-            Table.States (993).Productions := WisiToken.To_Vector ((1 => (248, 
0)));
+            Table.States (992).Kernel := To_Vector ((0 => (222, 32, 1, 
False)));
+            Table.States (992).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1109)));
             Add_Action (Table.States (993), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (248, 0), 7,
             package_body_stub_0'Access, null);
-            Table.States (993).Minimal_Complete_Action := (Reduce, 248, 7);
-            Table.States (994).Productions := WisiToken.To_Vector ((1 => (247, 
0)));
+            Table.States (993).Kernel := To_Vector ((0 => (248, 96, 0, 
False)));
+            Table.States (993).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 248, 7)));
             Add_Action (Table.States (994), 4, 1);
             Add_Action (Table.States (994), 5, 2);
             Add_Action (Table.States (994), 13, Reduce, (132, 1), 0, null, 
null);
@@ -11451,11 +11720,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (994), 303, 101);
             Add_Goto (Table.States (994), 306, 363);
             Add_Goto (Table.States (994), 323, 114);
-            Table.States (994).Minimal_Complete_Action := (Reduce, 218, 0);
-         end Subr_16;
-         procedure Subr_17
-         is begin
-            Table.States (995).Productions := WisiToken.To_Vector ((1 => (247, 
1)));
+            Table.States (994).Kernel := To_Vector ((0 => (247, 13, 2, 
False)));
+            Table.States (994).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (995), 96, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (995), 104, 119);
             Add_Action (Table.States (995), 105, 33);
@@ -11466,50 +11732,51 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (995), 240, 1111);
             Add_Goto (Table.States (995), 272, 92);
             Add_Goto (Table.States (995), 293, 97);
-            Table.States (995).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (996).Productions := WisiToken.To_Vector ((1 => (213, 
0)));
+            Table.States (995).Kernel := To_Vector ((0 => (247, 24, 1, 
False)));
+            Table.States (995).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (996), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (213, 0), 7,
             generic_instantiation_0'Access, null);
-            Table.States (996).Minimal_Complete_Action := (Reduce, 213, 7);
-            Table.States (997).Productions := WisiToken.To_Vector ((1 => (251, 
1)));
+            Table.States (996).Kernel := To_Vector ((0 => (213, 96, 0, 
False)));
+            Table.States (996).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 213, 7)));
             Add_Action (Table.States (997), (1 =>  96), (251, 1), 7, 
package_specification_1'Access,
             package_specification_1_check'Access);
-            Table.States (997).Minimal_Complete_Action := (Reduce, 251, 7);
-            Table.States (998).Productions := WisiToken.To_Vector ((1 => (251, 
0)));
+            Table.States (997).Kernel := To_Vector ((0 => (251, 240, 0, 
False)));
+            Table.States (997).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 251, 7)));
             Add_Action (Table.States (998), 24, 1112);
             Add_Error (Table.States (998));
-            Table.States (998).Minimal_Complete_Action := (Shift, 24, 1112);
-            Table.States (999).Productions := WisiToken.To_Vector ((1 => (265, 
0)));
+            Table.States (998).Kernel := To_Vector ((0 => (251, 159, 1, 
False)));
+            Table.States (998).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1112)));
             Add_Action (Table.States (999), (4, 5, 13, 15, 17, 18, 24, 25, 27, 
28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (265, 0), 7,
             protected_body_stub_0'Access, null);
-            Table.States (999).Minimal_Complete_Action := (Reduce, 265, 7);
-            Table.States (1000).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (999).Kernel := To_Vector ((0 => (265, 96, 0, 
False)));
+            Table.States (999).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 265, 7)));
             Add_Action (Table.States (1000), 72, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (1000), 76, 1113);
             Add_Error (Table.States (1000));
             Add_Goto (Table.States (1000), 177, 1114);
             Add_Goto (Table.States (1000), 199, 344);
             Add_Goto (Table.States (1000), 253, 1115);
-            Table.States (1000).Minimal_Complete_Action := (Reduce, 177, 0);
-            Table.States (1001).Productions := WisiToken.To_Vector (((307, 0), 
(309, 0)));
+            Table.States (1000).Kernel := To_Vector ((0 => (176, 104, 5, 
False)));
+            Table.States (1000).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 177, 0)));
             Add_Action (Table.States (1001), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (1001), 74, 337);
             Add_Action (Table.States (1001), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1001));
             Add_Goto (Table.States (1001), 122, 430);
-            Table.States (1001).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1002).Productions := WisiToken.To_Vector ((1 => 
(268, 0)));
+            Table.States (1001).Kernel := To_Vector (((307, 312, 4, False), 
(309, 312, 1, False)));
+            Table.States (1001).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1002), (24, 25, 28, 29, 40, 46, 50), 
(268, 0), 2, null, null);
-            Table.States (1002).Minimal_Complete_Action := (Reduce, 268, 2);
-            Table.States (1003).Productions := WisiToken.To_Vector ((1 => 
(264, 0)));
+            Table.States (1002).Kernel := To_Vector ((0 => (268, 267, 0, 
True)));
+            Table.States (1002).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 268, 2)));
+            Table.States (1002).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1003), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1003), 104, 149);
             Add_Error (Table.States (1003));
             Add_Goto (Table.States (1003), 220, 1116);
-            Table.States (1003).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1004).Productions := WisiToken.To_Vector ((1 => 
(271, 0)));
+            Table.States (1003).Kernel := To_Vector ((0 => (264, 24, 1, 
False)));
+            Table.States (1003).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1004), 104, 119);
             Add_Action (Table.States (1004), 105, 33);
             Add_Action (Table.States (1004), 106, 34);
@@ -11519,12 +11786,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1004), 239, 841);
             Add_Goto (Table.States (1004), 272, 92);
             Add_Goto (Table.States (1004), 293, 97);
-            Table.States (1004).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1005).Productions := WisiToken.To_Vector ((1 => 
(271, 1)));
+            Table.States (1004).Kernel := To_Vector ((0 => (271, 39, 4, 
False)));
+            Table.States (1004).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1005), 96, 1118);
             Add_Error (Table.States (1005));
-            Table.States (1005).Minimal_Complete_Action := (Shift, 96, 1118);
-            Table.States (1006).Productions := WisiToken.To_Vector ((1 => 
(227, 0)));
+            Table.States (1005).Kernel := To_Vector ((0 => (271, 266, 1, 
False)));
+            Table.States (1005).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1118)));
             Add_Action (Table.States (1006), 104, 119);
             Add_Action (Table.States (1006), 105, 33);
             Add_Action (Table.States (1006), 106, 34);
@@ -11533,8 +11800,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1006), 239, 1119);
             Add_Goto (Table.States (1006), 272, 92);
             Add_Goto (Table.States (1006), 293, 97);
-            Table.States (1006).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1007).Productions := WisiToken.To_Vector ((1 => 
(304, 0)));
+            Table.States (1006).Kernel := To_Vector ((0 => (227, 10, 1, 
True)));
+            Table.States (1006).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (1006).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1007), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (1007), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (1007), 28, 183);
@@ -11607,16 +11875,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1007), 319, 113);
             Add_Goto (Table.States (1007), 325, 115);
             Add_Goto (Table.States (1007), 331, 116);
-            Table.States (1007).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (1008).Productions := WisiToken.To_Vector ((1 => 
(266, 1)));
+            Table.States (1007).Kernel := To_Vector ((0 => (304, 74, 2, 
False)));
+            Table.States (1007).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (1008), (1 =>  96), (266, 1), 3, 
protected_definition_1'Access,
             protected_definition_1_check'Access);
-            Table.States (1008).Minimal_Complete_Action := (Reduce, 266, 3);
-            Table.States (1009).Productions := WisiToken.To_Vector ((1 => 
(266, 0)));
+            Table.States (1008).Kernel := To_Vector ((0 => (266, 220, 0, 
False)));
+            Table.States (1008).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 266, 3)));
             Add_Action (Table.States (1009), 24, 1121);
             Add_Error (Table.States (1009));
-            Table.States (1009).Minimal_Complete_Action := (Shift, 24, 1121);
-            Table.States (1010).Productions := WisiToken.To_Vector ((1 => 
(194, 0)));
+            Table.States (1009).Kernel := To_Vector ((0 => (266, 159, 1, 
False)));
+            Table.States (1009).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1121)));
             Add_Action (Table.States (1010), 3, 121);
             Add_Action (Table.States (1010), 21, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (1010), 39, 122);
@@ -11652,14 +11920,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1010), 320, 144);
             Add_Goto (Table.States (1010), 321, 145);
             Add_Goto (Table.States (1010), 330, 146);
-            Table.States (1010).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1011).Productions := WisiToken.To_Vector ((1 => 
(196, 0)));
+            Table.States (1010).Kernel := To_Vector ((0 => (194, 82, 0, 
False)));
+            Table.States (1010).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1011), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (196, 0), 7, extended_return_statement_0'Access, null);
-            Table.States (1011).Minimal_Complete_Action := (Reduce, 196, 7);
-            Table.States (1012).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (247, 0), (247, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1011).Kernel := To_Vector ((0 => (196, 96, 0, 
False)));
+            Table.States (1011).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 196, 7)));
             Add_Action (Table.States (1012), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (1012), 74, 337);
             Add_Action (Table.States (1012), 76, 235);
@@ -11670,48 +11937,50 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1012), 115, 241);
             Add_Goto (Table.States (1012), 122, 511);
             Add_Goto (Table.States (1012), 322, 242);
-            Table.States (1012).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1013).Productions := WisiToken.To_Vector ((1 => 
(264, 0)));
+            Table.States (1012).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (247, 239, 4, False), (247, 239, 3, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (1012).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1013), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (1013), 74, 337);
             Add_Error (Table.States (1013));
             Add_Goto (Table.States (1013), 122, 520);
-            Table.States (1013).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1014).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1013).Kernel := To_Vector ((0 => (264, 104, 3, 
False)));
+            Table.States (1013).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1014), 35, Reduce, (122, 1), 0, null, 
null);
             Add_Action (Table.States (1014), 74, 337);
             Add_Error (Table.States (1014));
             Add_Goto (Table.States (1014), 122, 540);
-            Table.States (1014).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1015).Productions := WisiToken.To_Vector ((1 => 
(307, 0)));
+            Table.States (1014).Kernel := To_Vector ((0 => (316, 104, 4, 
False)));
+            Table.States (1014).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1015), 35, 585);
             Add_Error (Table.States (1015));
-            Table.States (1015).Minimal_Complete_Action := (Shift, 35, 585);
-            Table.States (1016).Productions := WisiToken.To_Vector ((1 => 
(152, 0)));
+            Table.States (1015).Kernel := To_Vector ((0 => (307, 122, 4, 
False)));
+            Table.States (1015).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 585)));
             Add_Action (Table.States (1016), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (152, 0), 7, conditional_entry_call_0'Access, null);
-            Table.States (1016).Minimal_Complete_Action := (Reduce, 152, 7);
-            Table.States (1017).Productions := WisiToken.To_Vector ((1 => 
(323, 0)));
+            Table.States (1016).Kernel := To_Vector ((0 => (152, 96, 0, 
False)));
+            Table.States (1016).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 152, 7)));
             Add_Action (Table.States (1017), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (323, 0), 7, timed_entry_call_0'Access, null);
-            Table.States (1017).Minimal_Complete_Action := (Reduce, 323, 7);
-            Table.States (1018).Productions := WisiToken.To_Vector ((1 => 
(294, 0)));
+            Table.States (1017).Kernel := To_Vector ((0 => (323, 96, 0, 
False)));
+            Table.States (1017).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 323, 7)));
             Add_Action (Table.States (1018), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (294, 0), 7, selective_accept_0'Access, null);
-            Table.States (1018).Minimal_Complete_Action := (Reduce, 294, 7);
-            Table.States (1019).Productions := WisiToken.To_Vector ((1 => 
(126, 0)));
+            Table.States (1018).Kernel := To_Vector ((0 => (294, 96, 0, 
False)));
+            Table.States (1018).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 294, 7)));
             Add_Action (Table.States (1019), 96, 1123);
             Add_Error (Table.States (1019));
-            Table.States (1019).Minimal_Complete_Action := (Shift, 96, 1123);
-            Table.States (1020).Productions := WisiToken.To_Vector ((1 => 
(317, 0)));
+            Table.States (1019).Kernel := To_Vector ((0 => (126, 61, 1, 
False)));
+            Table.States (1019).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1123)));
             Add_Action (Table.States (1020), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (317, 0), 7,
             task_body_stub_0'Access, null);
-            Table.States (1020).Minimal_Complete_Action := (Reduce, 317, 7);
-            Table.States (1021).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1020).Kernel := To_Vector ((0 => (317, 96, 0, 
False)));
+            Table.States (1020).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 317, 7)));
             Add_Action (Table.States (1021), 4, 1);
             Add_Action (Table.States (1021), 5, 2);
             Add_Action (Table.States (1021), 13, Reduce, (132, 1), 0, null, 
null);
@@ -11769,8 +12038,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1021), 303, 101);
             Add_Goto (Table.States (1021), 306, 363);
             Add_Goto (Table.States (1021), 323, 114);
-            Table.States (1021).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (1022).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1021).Kernel := To_Vector ((0 => (316, 13, 2, 
False)));
+            Table.States (1021).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (1022), 104, 119);
             Add_Action (Table.States (1022), 105, 33);
             Add_Action (Table.States (1022), 106, 34);
@@ -11780,12 +12049,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1022), 239, 841);
             Add_Goto (Table.States (1022), 272, 92);
             Add_Goto (Table.States (1022), 293, 97);
-            Table.States (1022).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1023).Productions := WisiToken.To_Vector ((1 => 
(319, 1)));
+            Table.States (1022).Kernel := To_Vector ((0 => (319, 39, 4, 
False)));
+            Table.States (1022).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1023), 24, 1126);
             Add_Error (Table.States (1023));
-            Table.States (1023).Minimal_Complete_Action := (Shift, 24, 1126);
-            Table.States (1024).Productions := WisiToken.To_Vector ((1 => 
(305, 0)));
+            Table.States (1023).Kernel := To_Vector ((0 => (319, 318, 2, 
False)));
+            Table.States (1023).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1126)));
             Add_Action (Table.States (1024), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (1024), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (1024), 28, 183);
@@ -11858,15 +12127,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1024), 319, 113);
             Add_Goto (Table.States (1024), 325, 115);
             Add_Goto (Table.States (1024), 331, 116);
-            Table.States (1024).Minimal_Complete_Action := (Reduce, 318, 0);
-            Table.States (1025).Productions := WisiToken.To_Vector ((1 => 
(318, 0)));
+            Table.States (1024).Kernel := To_Vector ((0 => (305, 74, 2, 
False)));
+            Table.States (1024).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 0)));
+         end Subr_17;
+         procedure Subr_18
+         is begin
             Add_Action (Table.States (1025), (1 =>  24), (318, 0), 3, 
task_definition_0'Access, null);
-            Table.States (1025).Minimal_Complete_Action := (Reduce, 318, 3);
-            Table.States (1026).Productions := WisiToken.To_Vector ((1 => 
(305, 1)));
+            Table.States (1025).Kernel := To_Vector ((0 => (318, 159, 0, 
False)));
+            Table.States (1025).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 3)));
             Add_Action (Table.States (1026), 96, 1128);
             Add_Error (Table.States (1026));
-            Table.States (1026).Minimal_Complete_Action := (Shift, 96, 1128);
-            Table.States (1027).Productions := WisiToken.To_Vector (((241, 0), 
(242, 2), (242, 3)));
+            Table.States (1026).Kernel := To_Vector ((0 => (305, 220, 1, 
False)));
+            Table.States (1026).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1128)));
             Add_Action (Table.States (1027), 7, Reduce, (241, 0), 2, null, 
null);
             Add_Action (Table.States (1027), 104, 1129);
             Add_Action (Table.States (1027), 105, 33);
@@ -11876,8 +12148,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1027), 239, 871);
             Add_Goto (Table.States (1027), 272, 92);
             Add_Goto (Table.States (1027), 293, 1130);
-            Table.States (1027).Minimal_Complete_Action := (Reduce, 241, 2);
-            Table.States (1028).Productions := WisiToken.To_Vector ((1 => 
(170, 1)));
+            Table.States (1027).Kernel := To_Vector (((241, 41, 0, False), 
(242, 41, 1, False), (242, 41, 3, False)));
+            Table.States (1027).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 241, 2)));
             Add_Action (Table.States (1028), 3, 121);
             Add_Action (Table.States (1028), 39, 122);
             Add_Action (Table.States (1028), 40, 123);
@@ -11913,8 +12185,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1028), 320, 144);
             Add_Goto (Table.States (1028), 321, 145);
             Add_Goto (Table.States (1028), 330, 146);
-            Table.States (1028).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1029).Productions := WisiToken.To_Vector ((1 => 
(170, 0)));
+            Table.States (1028).Kernel := To_Vector ((0 => (170, 82, 0, 
False)));
+            Table.States (1028).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1029), 3, 121);
             Add_Action (Table.States (1029), 39, 122);
             Add_Action (Table.States (1029), 40, 123);
@@ -11950,25 +12222,24 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1029), 320, 144);
             Add_Goto (Table.States (1029), 321, 145);
             Add_Goto (Table.States (1029), 330, 146);
-            Table.States (1029).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1030).Productions := WisiToken.To_Vector ((1 => 
(111, 0)));
+            Table.States (1029).Kernel := To_Vector ((0 => (170, 82, 0, 
False)));
+            Table.States (1029).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1030), (41, 49, 54), (111, 0), 3, null, 
null);
-            Table.States (1030).Minimal_Complete_Action := (Reduce, 111, 3);
-            Table.States (1031).Productions := WisiToken.To_Vector (((120, 1), 
(168, 0)));
+            Table.States (1030).Kernel := To_Vector ((0 => (111, 36, 0, 
False)));
+            Table.States (1030).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 111, 3)));
             Add_Action (Table.States (1031), 77, 1133);
             Add_Action (Table.States (1031), 83, 959);
             Add_Error (Table.States (1031));
-            Table.States (1031).Minimal_Complete_Action := (Shift, 77, 1133);
-            Table.States (1032).Productions := WisiToken.To_Vector ((1 => 
(226, 1)));
+            Table.States (1031).Kernel := To_Vector (((120, 168, 3, False), 
(168, 168, 2, True)));
+            Table.States (1031).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1133)));
             Add_Action (Table.States (1032), (77, 83), (226, 1), 1, null, 
null);
-            Table.States (1032).Minimal_Complete_Action := (Reduce, 226, 1);
-            Table.States (1033).Productions := WisiToken.To_Vector (((120, 0), 
(226, 0)));
+            Table.States (1032).Kernel := To_Vector ((0 => (226, 225, 0, 
False)));
+            Table.States (1032).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 226, 1)));
             Add_Action (Table.States (1033), 77, 1134);
             Add_Action (Table.States (1033), 83, 1135);
             Add_Error (Table.States (1033));
-            Table.States (1033).Minimal_Complete_Action := (Shift, 77, 1134);
-            Table.States (1034).Productions := WisiToken.To_Vector (((128, 0), 
(225, 0), (239, 0), (239, 1), (258, 3),
-            (272, 0), (277, 0), (277, 1), (293, 0), (293, 1), (293, 2), (293, 
3), (314, 2), (314, 3)));
+            Table.States (1033).Kernel := To_Vector (((120, 226, 3, False), 
(226, 226, 4, True)));
+            Table.States (1033).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1134)));
             Add_Action (Table.States (1034), 38, Reduce, (258, 3), 1, null, 
null);
             Add_Action (Table.States (1034), 53, 1136);
             Add_Action (Table.States (1034), 55, Reduce, (258, 3), 1, null, 
null);
@@ -11990,8 +12261,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1034), 155, 620);
             Add_Goto (Table.States (1034), 224, 621);
             Add_Goto (Table.States (1034), 322, 448);
-            Table.States (1034).Minimal_Complete_Action := (Reduce, 258, 1);
-            Table.States (1035).Productions := WisiToken.To_Vector ((1 => 
(326, 4)));
+            Table.States (1034).Kernel := To_Vector (((128, 239, 2, True), 
(225, 239, 2, False), (239, 239, 5, True),
+            (239, 239, 2, True), (258, 239, 0, False), (272, 239, 3, True), 
(277, 239, 4, False), (277, 239, 2, False),
+            (293, 239, 2, True), (293, 239, 2, True), (293, 239, 2, True), 
(293, 239, 2, True), (314, 239, 4, False),
+            (314, 239, 0, False)));
+            Table.States (1034).Minimal_Complete_Actions := To_Vector 
(((Reduce, 258, 1), (Reduce, 314, 1)));
             Add_Action (Table.States (1035), 3, 121);
             Add_Action (Table.States (1035), 39, 122);
             Add_Action (Table.States (1035), 40, 123);
@@ -12028,8 +12302,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1035), 320, 144);
             Add_Goto (Table.States (1035), 321, 145);
             Add_Goto (Table.States (1035), 330, 146);
-            Table.States (1035).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1036).Productions := WisiToken.To_Vector ((1 => 
(279, 0)));
+            Table.States (1035).Kernel := To_Vector ((0 => (326, 20, 0, 
False)));
+            Table.States (1035).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1036), 3, 121);
             Add_Action (Table.States (1036), 39, 122);
             Add_Action (Table.States (1036), 40, 123);
@@ -12053,14 +12327,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1036), 320, 144);
             Add_Goto (Table.States (1036), 321, 145);
             Add_Goto (Table.States (1036), 330, 146);
-            Table.States (1036).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (1037).Productions := WisiToken.To_Vector ((1 => 
(326, 5)));
+            Table.States (1036).Kernel := To_Vector ((0 => (279, 53, 3, 
False)));
+            Table.States (1036).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (1037), (74, 96), (326, 5), 3, null, 
null);
-            Table.States (1037).Minimal_Complete_Action := (Reduce, 326, 3);
-            Table.States (1038).Productions := WisiToken.To_Vector ((1 => 
(326, 3)));
+            Table.States (1037).Kernel := To_Vector ((0 => (326, 279, 0, 
False)));
+            Table.States (1037).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 3)));
             Add_Action (Table.States (1038), (74, 96), (326, 3), 3, null, 
null);
-            Table.States (1038).Minimal_Complete_Action := (Reduce, 326, 3);
-            Table.States (1039).Productions := WisiToken.To_Vector ((1 => 
(228, 0)));
+            Table.States (1038).Kernel := To_Vector ((0 => (326, 279, 0, 
False)));
+            Table.States (1038).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 3)));
             Add_Action (Table.States (1039), 104, 119);
             Add_Action (Table.States (1039), 105, 33);
             Add_Action (Table.States (1039), 106, 34);
@@ -12070,8 +12344,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1039), 239, 841);
             Add_Goto (Table.States (1039), 272, 92);
             Add_Goto (Table.States (1039), 293, 97);
-            Table.States (1039).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1040).Productions := WisiToken.To_Vector ((1 => 
(228, 2)));
+            Table.States (1039).Kernel := To_Vector ((0 => (228, 10, 1, 
False)));
+            Table.States (1039).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1040), 104, 119);
             Add_Action (Table.States (1040), 105, 33);
             Add_Action (Table.States (1040), 106, 34);
@@ -12081,8 +12355,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1040), 239, 841);
             Add_Goto (Table.States (1040), 272, 92);
             Add_Goto (Table.States (1040), 293, 97);
-            Table.States (1040).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1041).Productions := WisiToken.To_Vector ((1 => 
(326, 1)));
+            Table.States (1040).Kernel := To_Vector ((0 => (228, 10, 1, 
False)));
+            Table.States (1040).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1041), 3, 121);
             Add_Action (Table.States (1041), 39, 122);
             Add_Action (Table.States (1041), 40, 123);
@@ -12106,34 +12380,36 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1041), 320, 144);
             Add_Goto (Table.States (1041), 321, 145);
             Add_Goto (Table.States (1041), 330, 146);
-            Table.States (1041).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (1042).Productions := WisiToken.To_Vector ((1 => 
(163, 0)));
+            Table.States (1041).Kernel := To_Vector ((0 => (326, 85, 1, 
False)));
+            Table.States (1041).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (1042), (1 =>  35), (163, 0), 1, null, 
null);
-            Table.States (1042).Minimal_Complete_Action := (Reduce, 163, 1);
-            Table.States (1043).Productions := WisiToken.To_Vector ((1 => 
(163, 1)));
+            Table.States (1042).Kernel := To_Vector ((0 => (163, 104, 0, 
False)));
+            Table.States (1042).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 163, 1)));
             Add_Action (Table.States (1043), (1 =>  35), (163, 1), 1, null, 
null);
-            Table.States (1043).Minimal_Complete_Action := (Reduce, 163, 1);
-            Table.States (1044).Productions := WisiToken.To_Vector ((1 => 
(164, 0)));
+            Table.States (1043).Kernel := To_Vector ((0 => (163, 105, 0, 
False)));
+            Table.States (1043).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 163, 1)));
             Add_Action (Table.States (1044), (1 =>  35), (164, 0), 1, null, 
null);
-            Table.States (1044).Minimal_Complete_Action := (Reduce, 164, 1);
-            Table.States (1045).Productions := WisiToken.To_Vector ((1 => 
(327, 0)));
+            Table.States (1044).Kernel := To_Vector ((0 => (164, 163, 0, 
False)));
+            Table.States (1044).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 164, 1)));
             Add_Action (Table.States (1045), 35, 1142);
             Add_Error (Table.States (1045));
-            Table.States (1045).Minimal_Complete_Action := (Shift, 35, 1142);
-            Table.States (1046).Productions := WisiToken.To_Vector ((1 => 
(149, 4)));
+            Table.States (1045).Kernel := To_Vector ((0 => (327, 164, 6, 
False)));
+            Table.States (1045).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 1142)));
             Add_Action (Table.States (1046), (15, 24, 28, 72, 104), (149, 4), 
2, component_list_4'Access, null);
-            Table.States (1046).Minimal_Complete_Action := (Reduce, 149, 2);
-            Table.States (1047).Productions := WisiToken.To_Vector ((1 => 
(149, 0)));
+            Table.States (1046).Kernel := To_Vector ((0 => (149, 96, 0, 
False)));
+            Table.States (1046).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 149, 2)));
             Add_Action (Table.States (1047), (15, 24, 28, 72, 104), (149, 0), 
2, null, null);
-            Table.States (1047).Minimal_Complete_Action := (Reduce, 149, 2);
-            Table.States (1048).Productions := WisiToken.To_Vector ((1 => 
(149, 1)));
+            Table.States (1047).Kernel := To_Vector ((0 => (149, 148, 0, 
True)));
+            Table.States (1047).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 149, 2)));
+            Table.States (1047).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1048), (15, 24, 28, 72, 104), (149, 1), 
2, null, null);
-            Table.States (1048).Minimal_Complete_Action := (Reduce, 149, 2);
-            Table.States (1049).Productions := WisiToken.To_Vector ((1 => 
(280, 0)));
+            Table.States (1048).Kernel := To_Vector ((0 => (149, 327, 0, 
True)));
+            Table.States (1048).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 149, 2)));
+            Table.States (1048).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1049), 54, 1143);
             Add_Error (Table.States (1049));
-            Table.States (1049).Minimal_Complete_Action := (Shift, 54, 1143);
-            Table.States (1050).Productions := WisiToken.To_Vector (((146, 0), 
(146, 1)));
+            Table.States (1049).Kernel := To_Vector ((0 => (280, 24, 1, 
False)));
+            Table.States (1049).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 54, 1143)));
             Add_Action (Table.States (1050), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (1050), 8, 1144);
             Add_Action (Table.States (1050), 40, 742);
@@ -12149,8 +12425,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1050), 272, 92);
             Add_Goto (Table.States (1050), 293, 97);
             Add_Goto (Table.States (1050), 314, 1147);
-            Table.States (1050).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1051).Productions := WisiToken.To_Vector ((1 => 
(228, 3)));
+            Table.States (1050).Kernel := To_Vector (((146, 81, 3, False), 
(146, 81, 2, False)));
+            Table.States (1050).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1051), 104, 119);
             Add_Action (Table.States (1051), 105, 33);
             Add_Action (Table.States (1051), 106, 34);
@@ -12160,8 +12436,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1051), 239, 841);
             Add_Goto (Table.States (1051), 272, 92);
             Add_Goto (Table.States (1051), 293, 97);
-            Table.States (1051).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1052).Productions := WisiToken.To_Vector ((1 => 
(228, 1)));
+            Table.States (1051).Kernel := To_Vector ((0 => (228, 10, 1, 
False)));
+            Table.States (1051).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1052), 104, 119);
             Add_Action (Table.States (1052), 105, 33);
             Add_Action (Table.States (1052), 106, 34);
@@ -12171,30 +12447,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1052), 239, 841);
             Add_Goto (Table.States (1052), 272, 92);
             Add_Goto (Table.States (1052), 293, 97);
-            Table.States (1052).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1053).Productions := WisiToken.To_Vector ((1 => 
(183, 0)));
+            Table.States (1052).Kernel := To_Vector ((0 => (228, 10, 1, 
False)));
+            Table.States (1052).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1053), (74, 96), (183, 0), 3, 
enumeration_type_definition_0'Access, null);
-            Table.States (1053).Minimal_Complete_Action := (Reduce, 183, 3);
-            Table.States (1054).Productions := WisiToken.To_Vector ((1 => 
(181, 0)));
+            Table.States (1053).Kernel := To_Vector ((0 => (183, 77, 0, 
False)));
+            Table.States (1053).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 183, 3)));
             Add_Action (Table.States (1054), 104, 898);
             Add_Action (Table.States (1054), 106, 899);
             Add_Error (Table.States (1054));
             Add_Goto (Table.States (1054), 180, 1150);
-            Table.States (1054).Minimal_Complete_Action := (Shift, 104, 898);
-         end Subr_17;
-         procedure Subr_18
-         is begin
-            Table.States (1055).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1054).Kernel := To_Vector ((0 => (181, 83, 1, 
True)));
+            Table.States (1054).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 898)));
+            Table.States (1054).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1055), 10, 1151);
             Add_Action (Table.States (1055), 74, Reduce, (119, 1), 0, null, 
null);
             Add_Error (Table.States (1055));
             Add_Goto (Table.States (1055), 119, 1152);
-            Table.States (1055).Minimal_Complete_Action := (Reduce, 119, 0);
-            Table.States (1056).Productions := WisiToken.To_Vector (((128, 0), 
(162, 0), (162, 1), (239, 0), (239, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1055).Kernel := To_Vector ((0 => (259, 314, 3, 
False)));
+            Table.States (1055).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 119, 0)));
             Add_Action (Table.States (1056), 10, 1151);
             Add_Action (Table.States (1056), 53, 618);
-            Add_Action (Table.States (1056), 74, Reduce, (119, 1), 0, null, 
null, (156, 1), 0, null, null);
+            Add_Action (Table.States (1056), 74, Reduce, (119, 1), 0, null, 
null);
+            Add_Conflict (Table.States (1056), 74, (156, 1), 0, null, null);
             Add_Action (Table.States (1056), 76, 619);
             Add_Action (Table.States (1056), 84, 237);
             Add_Action (Table.States (1056), 96, Reduce, (156, 1), 0, null, 
null);
@@ -12207,39 +12481,42 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1056), 156, 1155);
             Add_Goto (Table.States (1056), 224, 621);
             Add_Goto (Table.States (1056), 322, 242);
-            Table.States (1056).Minimal_Complete_Action := (Reduce, 156, 0);
-            Table.States (1057).Productions := WisiToken.To_Vector ((1 => 
(260, 0)));
+            Table.States (1056).Kernel := To_Vector (((128, 239, 2, True), 
(162, 239, 3, False), (162, 239, 0, False),
+            (239, 239, 5, True), (239, 239, 2, True), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (1056).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 156, 0)));
             Add_Action (Table.States (1057), 96, 1156);
             Add_Error (Table.States (1057));
-            Table.States (1057).Minimal_Complete_Action := (Shift, 96, 1156);
-            Table.States (1058).Productions := WisiToken.To_Vector ((1 => 
(206, 0)));
+            Table.States (1057).Kernel := To_Vector ((0 => (260, 122, 1, 
False)));
+            Table.States (1057).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1156)));
             Add_Action (Table.States (1058), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (206, 0), 7,
             full_type_declaration_0'Access, null);
-            Table.States (1058).Minimal_Complete_Action := (Reduce, 206, 7);
-            Table.States (1059).Productions := WisiToken.To_Vector ((1 => 
(245, 2)));
+            Table.States (1058).Kernel := To_Vector ((0 => (206, 96, 0, 
False)));
+            Table.States (1058).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 206, 7)));
             Add_Action (Table.States (1059), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (245, 2), 7,
             object_renaming_declaration_2'Access, null);
-            Table.States (1059).Minimal_Complete_Action := (Reduce, 245, 7);
-            Table.States (1060).Productions := WisiToken.To_Vector ((1 => 
(245, 1)));
+            Table.States (1059).Kernel := To_Vector ((0 => (245, 96, 0, 
False)));
+            Table.States (1059).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 245, 7)));
             Add_Action (Table.States (1060), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (245, 1), 7,
             object_renaming_declaration_1'Access, null);
-            Table.States (1060).Minimal_Complete_Action := (Reduce, 245, 7);
-            Table.States (1061).Productions := WisiToken.To_Vector ((1 => 
(114, 1)));
+            Table.States (1060).Kernel := To_Vector ((0 => (245, 96, 0, 
False)));
+            Table.States (1060).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 245, 7)));
             Add_Action (Table.States (1061), (21, 35, 56, 74, 77, 82, 96), 
(114, 1), 5, access_definition_1'Access,
             null);
-            Table.States (1061).Minimal_Complete_Action := (Reduce, 114, 5);
-            Table.States (1062).Productions := WisiToken.To_Vector ((1 => 
(114, 0)));
+            Table.States (1061).Kernel := To_Vector ((0 => (114, 252, 0, 
True)));
+            Table.States (1061).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 114, 5)));
+            Table.States (1061).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1062), (21, 35, 56, 74, 77, 82, 96), 
(114, 0), 5, access_definition_0'Access,
             null);
-            Table.States (1062).Minimal_Complete_Action := (Reduce, 114, 5);
-            Table.States (1063).Productions := WisiToken.To_Vector ((1 => 
(245, 0)));
+            Table.States (1062).Kernel := To_Vector ((0 => (114, 253, 0, 
False)));
+            Table.States (1062).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 114, 5)));
             Add_Action (Table.States (1063), 96, 1157);
             Add_Error (Table.States (1063));
-            Table.States (1063).Minimal_Complete_Action := (Shift, 96, 1157);
-            Table.States (1064).Productions := WisiToken.To_Vector ((1 => 
(187, 0)));
+            Table.States (1063).Kernel := To_Vector ((0 => (245, 122, 1, 
False)));
+            Table.States (1063).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1157)));
             Add_Action (Table.States (1064), 44, 914);
             Add_Action (Table.States (1064), 104, 119);
             Add_Action (Table.States (1064), 105, 33);
@@ -12251,8 +12528,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1064), 239, 918);
             Add_Goto (Table.States (1064), 272, 92);
             Add_Goto (Table.States (1064), 293, 97);
-            Table.States (1064).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1065).Productions := WisiToken.To_Vector ((1 => 
(185, 0)));
+            Table.States (1064).Kernel := To_Vector ((0 => (187, 81, 2, 
False)));
+            Table.States (1064).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1065), 44, 914);
             Add_Action (Table.States (1065), 104, 119);
             Add_Action (Table.States (1065), 105, 33);
@@ -12263,8 +12540,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1065), 239, 918);
             Add_Goto (Table.States (1065), 272, 92);
             Add_Goto (Table.States (1065), 293, 97);
-            Table.States (1065).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1066).Productions := WisiToken.To_Vector ((1 => 
(187, 1)));
+            Table.States (1065).Kernel := To_Vector ((0 => (185, 79, 1, 
True)));
+            Table.States (1065).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (1065).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1066), 4, 1);
             Add_Action (Table.States (1066), 5, 2);
             Add_Action (Table.States (1066), 13, Reduce, (132, 1), 0, null, 
null);
@@ -12321,76 +12599,76 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1066), 303, 101);
             Add_Goto (Table.States (1066), 306, 363);
             Add_Goto (Table.States (1066), 323, 114);
-            Table.States (1066).Minimal_Complete_Action := (Reduce, 300, 0);
-            Table.States (1067).Productions := WisiToken.To_Vector ((1 => 
(133, 0)));
+            Table.States (1066).Kernel := To_Vector ((0 => (187, 87, 0, 
False)));
+            Table.States (1066).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (1067), 96, 1161);
             Add_Error (Table.States (1067));
-            Table.States (1067).Minimal_Complete_Action := (Shift, 96, 1161);
-            Table.States (1068).Productions := WisiToken.To_Vector ((1 => 
(232, 1)));
+            Table.States (1067).Kernel := To_Vector ((0 => (133, 220, 1, 
False)));
+            Table.States (1067).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1161)));
             Add_Action (Table.States (1068), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (232, 1), 7, loop_statement_1'Access, 
loop_statement_1_check'Access);
-            Table.States (1068).Minimal_Complete_Action := (Reduce, 232, 7);
-            Table.States (1069).Productions := WisiToken.To_Vector ((1 => 
(232, 0)));
+            Table.States (1068).Kernel := To_Vector ((0 => (232, 96, 0, 
False)));
+            Table.States (1068).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 232, 7)));
             Add_Action (Table.States (1069), 96, 1162);
             Add_Error (Table.States (1069));
-            Table.States (1069).Minimal_Complete_Action := (Shift, 96, 1162);
-            Table.States (1070).Productions := WisiToken.To_Vector ((1 => 
(244, 1)));
+            Table.States (1069).Kernel := To_Vector ((0 => (232, 220, 1, 
False)));
+            Table.States (1069).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1162)));
             Add_Action (Table.States (1070), 74, 337);
             Add_Action (Table.States (1070), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1070));
             Add_Goto (Table.States (1070), 122, 1163);
-            Table.States (1070).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1071).Productions := WisiToken.To_Vector ((1 => 
(244, 4)));
+            Table.States (1070).Kernel := To_Vector ((0 => (244, 192, 1, 
False)));
+            Table.States (1070).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1071), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 4), 7,
             object_declaration_4'Access, null);
-            Table.States (1071).Minimal_Complete_Action := (Reduce, 244, 7);
-            Table.States (1072).Productions := WisiToken.To_Vector ((1 => 
(244, 2)));
+            Table.States (1071).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1071).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 7)));
             Add_Action (Table.States (1072), 74, 337);
             Add_Action (Table.States (1072), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1072));
             Add_Goto (Table.States (1072), 122, 1164);
-            Table.States (1072).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1073).Productions := WisiToken.To_Vector ((1 => 
(244, 5)));
+            Table.States (1072).Kernel := To_Vector ((0 => (244, 192, 1, 
False)));
+            Table.States (1072).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1073), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 5), 7,
             object_declaration_5'Access, null);
-            Table.States (1073).Minimal_Complete_Action := (Reduce, 244, 7);
-            Table.States (1074).Productions := WisiToken.To_Vector ((1 => 
(244, 0)));
+            Table.States (1073).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1073).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 7)));
             Add_Action (Table.States (1074), 74, 337);
             Add_Action (Table.States (1074), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1074));
             Add_Goto (Table.States (1074), 122, 1165);
-            Table.States (1074).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1075).Productions := WisiToken.To_Vector ((1 => 
(244, 3)));
+            Table.States (1074).Kernel := To_Vector ((0 => (244, 192, 1, 
False)));
+            Table.States (1074).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1075), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 3), 7,
             object_declaration_3'Access, null);
-            Table.States (1075).Minimal_Complete_Action := (Reduce, 244, 7);
-            Table.States (1076).Productions := WisiToken.To_Vector ((1 => 
(179, 0)));
+            Table.States (1075).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1075).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 7)));
             Add_Action (Table.States (1076), 74, 337);
             Add_Action (Table.States (1076), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1076));
             Add_Goto (Table.States (1076), 122, 1166);
-            Table.States (1076).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1077).Productions := WisiToken.To_Vector ((1 => 
(213, 2)));
+            Table.States (1076).Kernel := To_Vector ((0 => (179, 253, 1, 
False)));
+            Table.States (1076).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1077), 96, 1167);
             Add_Error (Table.States (1077));
-            Table.States (1077).Minimal_Complete_Action := (Shift, 96, 1167);
-            Table.States (1078).Productions := WisiToken.To_Vector ((1 => 
(213, 1)));
+            Table.States (1077).Kernel := To_Vector ((0 => (213, 122, 1, 
False)));
+            Table.States (1077).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1167)));
             Add_Action (Table.States (1078), 96, 1168);
             Add_Error (Table.States (1078));
-            Table.States (1078).Minimal_Complete_Action := (Shift, 96, 1168);
-            Table.States (1079).Productions := WisiToken.To_Vector ((1 => 
(307, 0)));
+            Table.States (1078).Kernel := To_Vector ((0 => (213, 122, 1, 
False)));
+            Table.States (1078).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1168)));
             Add_Action (Table.States (1079), 24, 1169);
             Add_Error (Table.States (1079));
-            Table.States (1079).Minimal_Complete_Action := (Shift, 24, 1169);
-            Table.States (1080).Productions := WisiToken.To_Vector ((1 => 
(113, 0)));
+            Table.States (1079).Kernel := To_Vector ((0 => (307, 218, 2, 
False)));
+            Table.States (1079).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1169)));
             Add_Action (Table.States (1080), 96, 1170);
             Add_Error (Table.States (1080));
-            Table.States (1080).Minimal_Complete_Action := (Shift, 96, 1170);
-            Table.States (1081).Productions := WisiToken.To_Vector ((1 => 
(137, 0)));
+            Table.States (1080).Kernel := To_Vector ((0 => (113, 220, 1, 
False)));
+            Table.States (1080).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1170)));
             Add_Action (Table.States (1081), 3, 121);
             Add_Action (Table.States (1081), 39, 122);
             Add_Action (Table.States (1081), 40, 123);
@@ -12426,18 +12704,19 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1081), 320, 144);
             Add_Goto (Table.States (1081), 321, 145);
             Add_Goto (Table.States (1081), 330, 146);
-            Table.States (1081).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1082).Productions := WisiToken.To_Vector ((1 => 
(138, 0)));
+            Table.States (1081).Kernel := To_Vector ((0 => (137, 87, 0, 
False)));
+            Table.States (1081).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1082), (77, 83), (138, 0), 3, 
case_expression_alternative_list_0'Access, null);
-            Table.States (1082).Minimal_Complete_Action := (Reduce, 138, 3);
-            Table.States (1083).Productions := WisiToken.To_Vector ((1 => 
(221, 1)));
+            Table.States (1082).Kernel := To_Vector ((0 => (138, 137, 0, 
True)));
+            Table.States (1082).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 138, 3)));
+            Table.States (1082).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1083), (1 =>  77), (221, 1), 6, 
if_expression_1'Access, null);
-            Table.States (1083).Minimal_Complete_Action := (Reduce, 221, 6);
-            Table.States (1084).Productions := WisiToken.To_Vector ((1 => 
(172, 0)));
+            Table.States (1083).Kernel := To_Vector ((0 => (221, 192, 0, 
False)));
+            Table.States (1083).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 221, 6)));
             Add_Action (Table.States (1084), 68, 1172);
             Add_Error (Table.States (1084));
-            Table.States (1084).Minimal_Complete_Action := (Shift, 68, 1172);
-            Table.States (1085).Productions := WisiToken.To_Vector ((1 => 
(221, 0)));
+            Table.States (1084).Kernel := To_Vector ((0 => (172, 192, 1, 
False)));
+            Table.States (1084).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 68, 1172)));
             Add_Action (Table.States (1085), 3, 121);
             Add_Action (Table.States (1085), 39, 122);
             Add_Action (Table.States (1085), 40, 123);
@@ -12472,16 +12751,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1085), 320, 144);
             Add_Goto (Table.States (1085), 321, 145);
             Add_Goto (Table.States (1085), 330, 146);
-            Table.States (1085).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1086).Productions := WisiToken.To_Vector ((1 => 
(173, 0)));
+            Table.States (1085).Kernel := To_Vector ((0 => (221, 22, 0, 
False)));
+            Table.States (1085).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1086), (22, 23, 77), (173, 0), 2, null, 
null);
-            Table.States (1086).Minimal_Complete_Action := (Reduce, 173, 2);
-            Table.States (1087).Productions := WisiToken.To_Vector ((1 => 
(277, 0)));
+            Table.States (1086).Kernel := To_Vector ((0 => (173, 172, 0, 
True)));
+            Table.States (1086).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 173, 2)));
+            Table.States (1086).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1087), (10, 20, 21, 22, 23, 35, 37, 42, 
43, 53, 68, 74, 75, 77, 79, 82, 83, 87,
             96), (277, 0), 6, range_g_0'Access, null);
-            Table.States (1087).Minimal_Complete_Action := (Reduce, 277, 6);
-            Table.States (1088).Productions := WisiToken.To_Vector (((128, 0), 
(165, 1), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3), (314, 0), (314, 1)));
+            Table.States (1087).Kernel := To_Vector ((0 => (277, 77, 0, 
False)));
+            Table.States (1087).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 277, 6)));
             Add_Action (Table.States (1088), 53, 618);
             Add_Action (Table.States (1088), 76, 619);
             Add_Action (Table.States (1088), 77, Reduce, (314, 1), 3, 
subtype_indication_1'Access, null);
@@ -12496,22 +12775,25 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1088), 155, 956);
             Add_Goto (Table.States (1088), 224, 621);
             Add_Goto (Table.States (1088), 322, 242);
-            Table.States (1088).Minimal_Complete_Action := (Reduce, 165, 3);
-            Table.States (1089).Productions := WisiToken.To_Vector ((1 => 
(168, 0)));
+            Table.States (1088).Kernel := To_Vector (((128, 239, 2, True), 
(165, 239, 0, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (314, 239, 4, False), (314, 239, 0, False)));
+            Table.States (1088).Minimal_Complete_Actions := To_Vector 
(((Reduce, 165, 3), (Reduce, 314, 3)));
             Add_Action (Table.States (1089), (77, 83), (168, 0), 3, null, 
null);
-            Table.States (1089).Minimal_Complete_Action := (Reduce, 168, 3);
-            Table.States (1090).Productions := WisiToken.To_Vector ((1 => 
(235, 0)));
+            Table.States (1089).Kernel := To_Vector ((0 => (168, 167, 0, 
True)));
+            Table.States (1089).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 168, 3)));
+            Table.States (1089).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1090), (1 =>  104), (235, 0), 4, null, 
null);
-            Table.States (1090).Minimal_Complete_Action := (Reduce, 235, 4);
-            Table.States (1091).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1090).Kernel := To_Vector ((0 => (235, 96, 0, 
False)));
+            Table.States (1090).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 235, 4)));
             Add_Action (Table.States (1091), 53, 1174);
             Add_Error (Table.States (1091));
-            Table.States (1091).Minimal_Complete_Action := (Shift, 53, 1174);
-            Table.States (1092).Productions := WisiToken.To_Vector ((1 => 
(281, 0)));
+            Table.States (1091).Kernel := To_Vector ((0 => (144, 301, 5, 
False)));
+            Table.States (1091).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 53, 1174)));
             Add_Action (Table.States (1092), 96, 1175);
             Add_Error (Table.States (1092));
-            Table.States (1092).Minimal_Complete_Action := (Shift, 96, 1175);
-            Table.States (1093).Productions := WisiToken.To_Vector ((1 => 
(254, 2)));
+            Table.States (1092).Kernel := To_Vector ((0 => (281, 54, 1, 
False)));
+            Table.States (1092).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1175)));
             Add_Action (Table.States (1093), 3, 121);
             Add_Action (Table.States (1093), 39, 122);
             Add_Action (Table.States (1093), 40, 123);
@@ -12547,8 +12829,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1093), 320, 144);
             Add_Goto (Table.States (1093), 321, 145);
             Add_Goto (Table.States (1093), 330, 146);
-            Table.States (1093).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1094).Productions := WisiToken.To_Vector (((254, 0), 
(254, 1)));
+            Table.States (1093).Kernel := To_Vector ((0 => (254, 82, 0, 
False)));
+            Table.States (1093).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1094), 104, 119);
             Add_Action (Table.States (1094), 105, 33);
             Add_Action (Table.States (1094), 106, 34);
@@ -12557,20 +12839,22 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1094), 239, 1177);
             Add_Goto (Table.States (1094), 272, 92);
             Add_Goto (Table.States (1094), 293, 97);
-            Table.States (1094).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1095).Productions := WisiToken.To_Vector ((1 => 
(202, 6)));
+            Table.States (1094).Kernel := To_Vector (((254, 241, 2, False), 
(254, 241, 1, False)));
+            Table.States (1094).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+         end Subr_18;
+         procedure Subr_19
+         is begin
             Add_Action (Table.States (1095), 80, 1178);
             Add_Error (Table.States (1095));
-            Table.States (1095).Minimal_Complete_Action := (Shift, 80, 1178);
-            Table.States (1096).Productions := WisiToken.To_Vector ((1 => 
(201, 1)));
+            Table.States (1095).Kernel := To_Vector ((0 => (202, 20, 1, 
False)));
+            Table.States (1095).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 1178)));
             Add_Action (Table.States (1096), (29, 47, 48, 50, 69, 71, 74, 
104), (201, 1), 7,
             formal_type_declaration_1'Access, null);
-            Table.States (1096).Minimal_Complete_Action := (Reduce, 201, 7);
-            Table.States (1097).Productions := WisiToken.To_Vector ((1 => 
(202, 2)));
+            Table.States (1096).Kernel := To_Vector ((0 => (201, 96, 0, 
False)));
+            Table.States (1096).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 201, 7)));
             Add_Action (Table.States (1097), (74, 96), (202, 2), 3, null, 
null);
-            Table.States (1097).Minimal_Complete_Action := (Reduce, 202, 3);
-            Table.States (1098).Productions := WisiToken.To_Vector (((128, 0), 
(203, 0), (203, 1), (239, 0), (239, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1097).Kernel := To_Vector ((0 => (202, 77, 0, 
False)));
+            Table.States (1097).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 3)));
             Add_Action (Table.States (1098), 10, 1151);
             Add_Action (Table.States (1098), 74, Reduce, (119, 1), 0, null, 
null);
             Add_Action (Table.States (1098), 76, 235);
@@ -12582,12 +12866,14 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1098), 115, 241);
             Add_Goto (Table.States (1098), 119, 1179);
             Add_Goto (Table.States (1098), 322, 242);
-            Table.States (1098).Minimal_Complete_Action := (Reduce, 119, 0);
-            Table.States (1099).Productions := WisiToken.To_Vector ((1 => 
(201, 0)));
+            Table.States (1098).Kernel := To_Vector (((128, 239, 2, True), 
(203, 239, 2, False), (203, 239, 0, False),
+            (239, 239, 5, True), (239, 239, 2, True), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (1098).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 119, 0)));
             Add_Action (Table.States (1099), (29, 47, 48, 50, 69, 71, 74, 
104), (201, 0), 7,
             formal_type_declaration_0'Access, null);
-            Table.States (1099).Minimal_Complete_Action := (Reduce, 201, 7);
-            Table.States (1100).Productions := WisiToken.To_Vector (((115, 0), 
(115, 1), (205, 0), (239, 0)));
+            Table.States (1099).Kernel := To_Vector ((0 => (201, 96, 0, 
False)));
+            Table.States (1099).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 201, 7)));
             Add_Action (Table.States (1100), 3, 121);
             Add_Action (Table.States (1100), 15, 258);
             Add_Action (Table.States (1100), 28, 259);
@@ -12639,56 +12925,58 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1100), 320, 144);
             Add_Goto (Table.States (1100), 321, 145);
             Add_Goto (Table.States (1100), 330, 146);
-            Table.States (1100).Minimal_Complete_Action := (Reduce, 125, 0);
-            Table.States (1101).Productions := WisiToken.To_Vector ((1 => 
(204, 0)));
+            Table.States (1100).Kernel := To_Vector (((115, 76, 1, False), 
(115, 76, 3, False), (205, 76, 2, False),
+            (239, 76, 4, True)));
+            Table.States (1100).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 125, 0)));
+            Table.States (1100).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1101), 74, 337);
             Add_Action (Table.States (1101), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1101));
             Add_Goto (Table.States (1101), 122, 1181);
-            Table.States (1101).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1102).Productions := WisiToken.To_Vector ((1 => 
(200, 0)));
+            Table.States (1101).Kernel := To_Vector ((0 => (204, 205, 1, 
False)));
+            Table.States (1101).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1102), (29, 47, 48, 50, 69, 71, 74, 
104), (200, 0), 7,
             formal_subprogram_declaration_0'Access, null);
-            Table.States (1102).Minimal_Complete_Action := (Reduce, 200, 7);
-            Table.States (1103).Productions := WisiToken.To_Vector ((1 => 
(198, 1)));
+            Table.States (1102).Kernel := To_Vector ((0 => (200, 96, 0, 
False)));
+            Table.States (1102).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 200, 7)));
             Add_Action (Table.States (1103), 96, 1182);
             Add_Error (Table.States (1103));
-            Table.States (1103).Minimal_Complete_Action := (Shift, 96, 1182);
-            Table.States (1104).Productions := WisiToken.To_Vector ((1 => 
(198, 0)));
+            Table.States (1103).Kernel := To_Vector ((0 => (198, 122, 1, 
False)));
+            Table.States (1103).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1182)));
             Add_Action (Table.States (1104), 74, 337);
             Add_Action (Table.States (1104), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1104));
             Add_Goto (Table.States (1104), 122, 1183);
-            Table.States (1104).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1105).Productions := WisiToken.To_Vector ((1 => 
(198, 2)));
+            Table.States (1104).Kernel := To_Vector ((0 => (198, 192, 1, 
False)));
+            Table.States (1104).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1105), (29, 47, 48, 50, 69, 71, 74, 
104), (198, 2), 7,
             formal_object_declaration_2'Access, null);
-            Table.States (1105).Minimal_Complete_Action := (Reduce, 198, 7);
-            Table.States (1106).Productions := WisiToken.To_Vector ((1 => 
(222, 1)));
+            Table.States (1105).Kernel := To_Vector ((0 => (198, 96, 0, 
False)));
+            Table.States (1105).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 198, 7)));
             Add_Action (Table.States (1106), 96, 1184);
             Add_Error (Table.States (1106));
-            Table.States (1106).Minimal_Complete_Action := (Shift, 96, 1184);
-            Table.States (1107).Productions := WisiToken.To_Vector ((1 => 
(174, 0)));
+            Table.States (1106).Kernel := To_Vector ((0 => (222, 32, 1, 
False)));
+            Table.States (1106).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1184)));
             Add_Action (Table.States (1107), (22, 23, 24), (174, 0), 4, 
elsif_statement_item_0'Access, null);
-            Table.States (1107).Minimal_Complete_Action := (Reduce, 174, 4);
-            Table.States (1108).Productions := WisiToken.To_Vector ((1 => 
(222, 0)));
+            Table.States (1107).Kernel := To_Vector ((0 => (174, 300, 0, 
False)));
+            Table.States (1107).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 174, 4)));
             Add_Action (Table.States (1108), 32, 1185);
             Add_Error (Table.States (1108));
-            Table.States (1108).Minimal_Complete_Action := (Shift, 32, 1185);
-            Table.States (1109).Productions := WisiToken.To_Vector ((1 => 
(222, 2)));
+            Table.States (1108).Kernel := To_Vector ((0 => (222, 24, 2, 
False)));
+            Table.States (1108).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 32, 1185)));
             Add_Action (Table.States (1109), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (222, 2), 8, if_statement_2'Access, null);
-            Table.States (1109).Minimal_Complete_Action := (Reduce, 222, 8);
-            Table.States (1110).Productions := WisiToken.To_Vector ((1 => 
(247, 0)));
+            Table.States (1109).Kernel := To_Vector ((0 => (222, 96, 0, 
False)));
+            Table.States (1109).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 222, 8)));
             Add_Action (Table.States (1110), 24, 1186);
             Add_Error (Table.States (1110));
-            Table.States (1110).Minimal_Complete_Action := (Shift, 24, 1186);
-            Table.States (1111).Productions := WisiToken.To_Vector ((1 => 
(247, 1)));
+            Table.States (1110).Kernel := To_Vector ((0 => (247, 218, 2, 
False)));
+            Table.States (1110).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1186)));
             Add_Action (Table.States (1111), 96, 1187);
             Add_Error (Table.States (1111));
-            Table.States (1111).Minimal_Complete_Action := (Shift, 96, 1187);
-            Table.States (1112).Productions := WisiToken.To_Vector ((1 => 
(251, 0)));
+            Table.States (1111).Kernel := To_Vector ((0 => (247, 240, 1, 
False)));
+            Table.States (1111).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1187)));
             Add_Action (Table.States (1112), 96, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (1112), 104, 119);
             Add_Action (Table.States (1112), 105, 33);
@@ -12699,8 +12987,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1112), 240, 1188);
             Add_Goto (Table.States (1112), 272, 92);
             Add_Goto (Table.States (1112), 293, 97);
-            Table.States (1112).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (1113).Productions := WisiToken.To_Vector (((177, 0), 
(199, 0)));
+            Table.States (1112).Kernel := To_Vector ((0 => (251, 24, 0, 
False)));
+            Table.States (1112).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (1113), 28, 1189);
             Add_Action (Table.States (1113), 77, Reduce, (254, 4), 0, null, 
null);
             Add_Action (Table.States (1113), 96, Reduce, (254, 4), 0, null, 
null);
@@ -12709,30 +12997,29 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1113), 219, 493);
             Add_Goto (Table.States (1113), 254, 494);
             Add_Goto (Table.States (1113), 255, 495);
-            Table.States (1113).Minimal_Complete_Action := (Reduce, 255, 0);
-            Table.States (1114).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1113).Kernel := To_Vector (((177, 76, 5, False), 
(199, 76, 1, False)));
+            Table.States (1113).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 255, 0)));
             Add_Action (Table.States (1114), 72, 1190);
             Add_Error (Table.States (1114));
-            Table.States (1114).Minimal_Complete_Action := (Shift, 72, 1190);
-            Table.States (1115).Productions := WisiToken.To_Vector ((1 => 
(177, 1)));
+            Table.States (1114).Kernel := To_Vector ((0 => (176, 177, 5, 
False)));
+            Table.States (1114).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 72, 1190)));
             Add_Action (Table.States (1115), (1 =>  72), (177, 1), 1, null, 
null);
-            Table.States (1115).Minimal_Complete_Action := (Reduce, 177, 1);
-            Table.States (1116).Productions := WisiToken.To_Vector ((1 => 
(264, 0)));
+            Table.States (1115).Kernel := To_Vector ((0 => (177, 253, 0, 
False)));
+            Table.States (1115).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 177, 1)));
             Add_Action (Table.States (1116), 96, 1191);
             Add_Error (Table.States (1116));
-            Table.States (1116).Minimal_Complete_Action := (Shift, 96, 1191);
-            Table.States (1117).Productions := WisiToken.To_Vector (((227, 0), 
(271, 0)));
+            Table.States (1116).Kernel := To_Vector ((0 => (264, 220, 1, 
False)));
+            Table.States (1116).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1191)));
             Add_Action (Table.States (1117), 10, 1006);
             Add_Action (Table.States (1117), 74, 1192);
             Add_Error (Table.States (1117));
-            Table.States (1117).Minimal_Complete_Action := (Shift, 74, 1192);
-            Table.States (1118).Productions := WisiToken.To_Vector ((1 => 
(271, 1)));
+            Table.States (1117).Kernel := To_Vector (((227, 227, 2, True), 
(271, 227, 3, False)));
+            Table.States (1117).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1192)));
             Add_Action (Table.States (1118), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (271, 1), 8,
             protected_type_declaration_1'Access, 
protected_type_declaration_1_check'Access);
-            Table.States (1118).Minimal_Complete_Action := (Reduce, 271, 8);
-            Table.States (1119).Productions := WisiToken.To_Vector (((128, 0), 
(227, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1118).Kernel := To_Vector ((0 => (271, 96, 0, 
False)));
+            Table.States (1118).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 271, 8)));
             Add_Action (Table.States (1119), 10, Reduce, (227, 0), 3, 
interface_list_0'Access, null);
             Add_Action (Table.States (1119), 74, Reduce, (227, 0), 3, 
interface_list_0'Access, null);
             Add_Action (Table.States (1119), 76, 235);
@@ -12743,50 +13030,53 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (1119));
             Add_Goto (Table.States (1119), 115, 241);
             Add_Goto (Table.States (1119), 322, 242);
-            Table.States (1119).Minimal_Complete_Action := (Reduce, 227, 3);
-            Table.States (1120).Productions := WisiToken.To_Vector ((1 => 
(304, 0)));
+            Table.States (1119).Kernel := To_Vector (((128, 239, 2, True), 
(227, 239, 0, True), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (1119).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 227, 3)));
+            Table.States (1119).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1120), 96, 1193);
             Add_Error (Table.States (1120));
-            Table.States (1120).Minimal_Complete_Action := (Shift, 96, 1193);
-            Table.States (1121).Productions := WisiToken.To_Vector ((1 => 
(266, 0)));
+            Table.States (1120).Kernel := To_Vector ((0 => (304, 266, 1, 
False)));
+            Table.States (1120).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1193)));
             Add_Action (Table.States (1121), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1121), 104, 149);
             Add_Error (Table.States (1121));
             Add_Goto (Table.States (1121), 220, 1194);
-            Table.States (1121).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1122).Productions := WisiToken.To_Vector ((1 => 
(194, 0)));
+            Table.States (1121).Kernel := To_Vector ((0 => (266, 24, 0, 
False)));
+            Table.States (1121).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1122), (21, 96), (194, 0), 7, 
extended_return_object_declaration_0'Access, null);
-            Table.States (1122).Minimal_Complete_Action := (Reduce, 194, 7);
-            Table.States (1123).Productions := WisiToken.To_Vector ((1 => 
(126, 0)));
+            Table.States (1122).Kernel := To_Vector ((0 => (194, 192, 0, 
False)));
+            Table.States (1122).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 194, 7)));
             Add_Action (Table.States (1123), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (126, 0), 8, asynchronous_select_0'Access, null);
-            Table.States (1123).Minimal_Complete_Action := (Reduce, 126, 8);
-            Table.States (1124).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1123).Kernel := To_Vector ((0 => (126, 96, 0, 
False)));
+            Table.States (1123).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 126, 8)));
             Add_Action (Table.States (1124), 24, 1195);
             Add_Error (Table.States (1124));
-            Table.States (1124).Minimal_Complete_Action := (Shift, 24, 1195);
-            Table.States (1125).Productions := WisiToken.To_Vector (((227, 0), 
(319, 0)));
+            Table.States (1124).Kernel := To_Vector ((0 => (316, 218, 2, 
False)));
+            Table.States (1124).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1195)));
             Add_Action (Table.States (1125), 10, 1006);
             Add_Action (Table.States (1125), 74, 1196);
             Add_Error (Table.States (1125));
-            Table.States (1125).Minimal_Complete_Action := (Shift, 74, 1196);
-            Table.States (1126).Productions := WisiToken.To_Vector ((1 => 
(319, 1)));
+            Table.States (1125).Kernel := To_Vector (((227, 227, 2, True), 
(319, 227, 3, False)));
+            Table.States (1125).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1196)));
             Add_Action (Table.States (1126), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1126), 104, 149);
             Add_Error (Table.States (1126));
             Add_Goto (Table.States (1126), 220, 1197);
-            Table.States (1126).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1127).Productions := WisiToken.To_Vector ((1 => 
(305, 0)));
+            Table.States (1126).Kernel := To_Vector ((0 => (319, 24, 1, 
False)));
+            Table.States (1126).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1127), 24, 1198);
             Add_Error (Table.States (1127));
-            Table.States (1127).Minimal_Complete_Action := (Shift, 24, 1198);
-            Table.States (1128).Productions := WisiToken.To_Vector ((1 => 
(305, 1)));
+            Table.States (1127).Kernel := To_Vector ((0 => (305, 318, 2, 
False)));
+            Table.States (1127).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1198)));
             Add_Action (Table.States (1128), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (305, 1), 8,
             single_task_declaration_1'Access, 
single_task_declaration_1_check'Access);
-            Table.States (1128).Minimal_Complete_Action := (Reduce, 305, 8);
-            Table.States (1129).Productions := WisiToken.To_Vector (((239, 5), 
(242, 2)));
+            Table.States (1128).Kernel := To_Vector ((0 => (305, 96, 0, 
False)));
+            Table.States (1128).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 305, 8)));
             Add_Action (Table.States (1129), 76, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (1129), 77, Reduce, (242, 2), 3, 
null_exclusion_opt_name_type_2'Access, null);
             Add_Action (Table.States (1129), 82, Reduce, (242, 2), 3, 
null_exclusion_opt_name_type_2'Access, null);
@@ -12795,8 +13085,8 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (1129), 101, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Action (Table.States (1129), 102, Reduce, (239, 5), 1, 
name_5'Access, name_5_check'Access);
             Add_Error (Table.States (1129));
-            Table.States (1129).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (1130).Productions := WisiToken.To_Vector (((239, 2), 
(242, 3)));
+            Table.States (1129).Kernel := To_Vector (((239, 104, 0, False), 
(242, 104, 0, False)));
+            Table.States (1129).Minimal_Complete_Actions := To_Vector 
(((Reduce, 239, 1), (Reduce, 242, 3)));
             Add_Action (Table.States (1130), 76, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Action (Table.States (1130), 77, Reduce, (242, 3), 3, 
null_exclusion_opt_name_type_3'Access, null);
             Add_Action (Table.States (1130), 82, Reduce, (242, 3), 3, 
null_exclusion_opt_name_type_3'Access, null);
@@ -12805,22 +13095,23 @@ package body Ada_Process_LALR_Main is
             Add_Action (Table.States (1130), 101, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Action (Table.States (1130), 102, Reduce, (239, 2), 1, null, 
name_2_check'Access);
             Add_Error (Table.States (1130));
-            Table.States (1130).Minimal_Complete_Action := (Reduce, 239, 1);
-            Table.States (1131).Productions := WisiToken.To_Vector ((1 => 
(170, 1)));
+            Table.States (1130).Kernel := To_Vector (((239, 293, 0, True), 
(242, 293, 0, False)));
+            Table.States (1130).Minimal_Complete_Actions := To_Vector 
(((Reduce, 239, 1), (Reduce, 242, 3)));
+            Table.States (1130).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1131), (77, 96), (170, 1), 5, null, 
null);
-            Table.States (1131).Minimal_Complete_Action := (Reduce, 170, 5);
-            Table.States (1132).Productions := WisiToken.To_Vector ((1 => 
(170, 0)));
+            Table.States (1131).Kernel := To_Vector ((0 => (170, 192, 0, 
False)));
+            Table.States (1131).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 170, 5)));
             Add_Action (Table.States (1132), (77, 96), (170, 0), 5, null, 
null);
-            Table.States (1132).Minimal_Complete_Action := (Reduce, 170, 5);
-            Table.States (1133).Productions := WisiToken.To_Vector ((1 => 
(120, 1)));
+            Table.States (1132).Kernel := To_Vector ((0 => (170, 192, 0, 
False)));
+            Table.States (1132).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 170, 5)));
             Add_Action (Table.States (1133), 42, 1199);
             Add_Error (Table.States (1133));
-            Table.States (1133).Minimal_Complete_Action := (Shift, 42, 1199);
-            Table.States (1134).Productions := WisiToken.To_Vector ((1 => 
(120, 0)));
+            Table.States (1133).Kernel := To_Vector ((0 => (120, 77, 2, 
False)));
+            Table.States (1133).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 42, 1199)));
             Add_Action (Table.States (1134), 42, 1200);
             Add_Error (Table.States (1134));
-            Table.States (1134).Minimal_Complete_Action := (Shift, 42, 1200);
-            Table.States (1135).Productions := WisiToken.To_Vector ((1 => 
(226, 0)));
+            Table.States (1134).Kernel := To_Vector ((0 => (120, 77, 2, 
False)));
+            Table.States (1134).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 42, 1200)));
             Add_Action (Table.States (1135), 104, 119);
             Add_Action (Table.States (1135), 105, 33);
             Add_Action (Table.States (1135), 106, 34);
@@ -12830,8 +13121,9 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1135), 239, 1202);
             Add_Goto (Table.States (1135), 272, 92);
             Add_Goto (Table.States (1135), 293, 97);
-            Table.States (1135).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1136).Productions := WisiToken.To_Vector (((155, 0), 
(225, 0)));
+            Table.States (1135).Kernel := To_Vector ((0 => (226, 83, 3, 
True)));
+            Table.States (1135).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
+            Table.States (1135).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1136), 3, 121);
             Add_Action (Table.States (1136), 39, 122);
             Add_Action (Table.States (1136), 40, 123);
@@ -12857,46 +13149,43 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1136), 320, 144);
             Add_Goto (Table.States (1136), 321, 145);
             Add_Goto (Table.States (1136), 330, 146);
-            Table.States (1136).Minimal_Complete_Action := (Shift, 80, 1203);
-            Table.States (1137).Productions := WisiToken.To_Vector ((1 => 
(326, 4)));
+            Table.States (1136).Kernel := To_Vector (((155, 53, 3, False), 
(225, 53, 1, False)));
+            Table.States (1136).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 1203)));
             Add_Action (Table.States (1137), 53, 1036);
             Add_Action (Table.States (1137), 74, Reduce, (279, 1), 0, null, 
null);
             Add_Action (Table.States (1137), 96, Reduce, (279, 1), 0, null, 
null);
             Add_Error (Table.States (1137));
             Add_Goto (Table.States (1137), 279, 1204);
-            Table.States (1137).Minimal_Complete_Action := (Reduce, 279, 0);
-            Table.States (1138).Productions := WisiToken.To_Vector ((1 => 
(279, 0)));
+            Table.States (1137).Kernel := To_Vector ((0 => (326, 192, 0, 
False)));
+            Table.States (1137).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 279, 0)));
             Add_Action (Table.States (1138), 85, 1205);
             Add_Error (Table.States (1138));
-            Table.States (1138).Minimal_Complete_Action := (Shift, 85, 1205);
-            Table.States (1139).Productions := WisiToken.To_Vector (((227, 0), 
(228, 0)));
+            Table.States (1138).Kernel := To_Vector ((0 => (279, 301, 2, 
False)));
+            Table.States (1138).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 85, 1205)));
             Add_Action (Table.States (1139), 10, 1006);
             Add_Action (Table.States (1139), 74, Reduce, (228, 0), 4, null, 
null);
             Add_Action (Table.States (1139), 96, Reduce, (228, 0), 4, null, 
null);
             Add_Error (Table.States (1139));
-            Table.States (1139).Minimal_Complete_Action := (Reduce, 228, 4);
-            Table.States (1140).Productions := WisiToken.To_Vector (((227, 0), 
(228, 2)));
+            Table.States (1139).Kernel := To_Vector (((227, 227, 2, True), 
(228, 227, 0, False)));
+            Table.States (1139).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 4)));
             Add_Action (Table.States (1140), 10, 1006);
             Add_Action (Table.States (1140), 74, Reduce, (228, 2), 4, null, 
null);
             Add_Action (Table.States (1140), 96, Reduce, (228, 2), 4, null, 
null);
             Add_Error (Table.States (1140));
-            Table.States (1140).Minimal_Complete_Action := (Reduce, 228, 4);
-         end Subr_18;
-         procedure Subr_19
-         is begin
-            Table.States (1141).Productions := WisiToken.To_Vector ((1 => 
(326, 1)));
+            Table.States (1140).Kernel := To_Vector (((227, 227, 2, True), 
(228, 227, 0, False)));
+            Table.States (1140).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 4)));
             Add_Action (Table.States (1141), (74, 96), (326, 1), 4, null, 
null);
-            Table.States (1141).Minimal_Complete_Action := (Reduce, 326, 4);
-            Table.States (1142).Productions := WisiToken.To_Vector ((1 => 
(327, 0)));
+            Table.States (1141).Kernel := To_Vector ((0 => (326, 301, 0, 
False)));
+            Table.States (1141).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 4)));
             Add_Action (Table.States (1142), 72, 1206);
             Add_Error (Table.States (1142));
             Add_Goto (Table.States (1142), 328, 1207);
             Add_Goto (Table.States (1142), 329, 1208);
-            Table.States (1142).Minimal_Complete_Action := (Shift, 72, 1206);
-            Table.States (1143).Productions := WisiToken.To_Vector ((1 => 
(280, 0)));
+            Table.States (1142).Kernel := To_Vector ((0 => (327, 35, 5, 
False)));
+            Table.States (1142).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 72, 1206)));
             Add_Action (Table.States (1143), (74, 96), (280, 0), 4, 
record_definition_0'Access, null);
-            Table.States (1143).Minimal_Complete_Action := (Reduce, 280, 4);
-            Table.States (1144).Productions := WisiToken.To_Vector (((147, 0), 
(147, 2)));
+            Table.States (1143).Kernel := To_Vector ((0 => (280, 54, 0, 
False)));
+            Table.States (1143).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 280, 4)));
             Add_Action (Table.States (1144), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (1144), 40, 742);
             Add_Action (Table.States (1144), 104, 119);
@@ -12910,36 +13199,37 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1144), 272, 92);
             Add_Goto (Table.States (1144), 293, 97);
             Add_Goto (Table.States (1144), 314, 1210);
-            Table.States (1144).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1145).Productions := WisiToken.To_Vector ((1 => 
(147, 3)));
+            Table.States (1144).Kernel := To_Vector (((147, 8, 1, False), 
(147, 8, 2, False)));
+            Table.States (1144).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1145), (74, 82, 96), (147, 3), 1, null, 
null);
-            Table.States (1145).Minimal_Complete_Action := (Reduce, 147, 1);
-            Table.States (1146).Productions := WisiToken.To_Vector (((146, 0), 
(146, 1)));
+            Table.States (1145).Kernel := To_Vector ((0 => (147, 114, 0, 
False)));
+            Table.States (1145).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 147, 1)));
             Add_Action (Table.States (1146), 74, 337);
             Add_Action (Table.States (1146), 82, 1211);
             Add_Action (Table.States (1146), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1146));
             Add_Goto (Table.States (1146), 122, 1212);
-            Table.States (1146).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1147).Productions := WisiToken.To_Vector ((1 => 
(147, 1)));
+            Table.States (1146).Kernel := To_Vector (((146, 147, 2, False), 
(146, 147, 1, False)));
+            Table.States (1146).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1147), (74, 82, 96), (147, 1), 1, null, 
null);
-            Table.States (1147).Minimal_Complete_Action := (Reduce, 147, 1);
-            Table.States (1148).Productions := WisiToken.To_Vector (((227, 0), 
(228, 3)));
+            Table.States (1147).Kernel := To_Vector ((0 => (147, 314, 0, 
False)));
+            Table.States (1147).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 147, 1)));
             Add_Action (Table.States (1148), 10, 1006);
             Add_Action (Table.States (1148), 74, Reduce, (228, 3), 4, null, 
null);
             Add_Action (Table.States (1148), 96, Reduce, (228, 3), 4, null, 
null);
             Add_Error (Table.States (1148));
-            Table.States (1148).Minimal_Complete_Action := (Reduce, 228, 4);
-            Table.States (1149).Productions := WisiToken.To_Vector (((227, 0), 
(228, 1)));
+            Table.States (1148).Kernel := To_Vector (((227, 227, 2, True), 
(228, 227, 0, False)));
+            Table.States (1148).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 4)));
             Add_Action (Table.States (1149), 10, 1006);
             Add_Action (Table.States (1149), 74, Reduce, (228, 1), 4, null, 
null);
             Add_Action (Table.States (1149), 96, Reduce, (228, 1), 4, null, 
null);
             Add_Error (Table.States (1149));
-            Table.States (1149).Minimal_Complete_Action := (Reduce, 228, 4);
-            Table.States (1150).Productions := WisiToken.To_Vector ((1 => 
(181, 0)));
+            Table.States (1149).Kernel := To_Vector (((227, 227, 2, True), 
(228, 227, 0, False)));
+            Table.States (1149).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 228, 4)));
             Add_Action (Table.States (1150), (77, 83), (181, 0), 3, null, 
null);
-            Table.States (1150).Minimal_Complete_Action := (Reduce, 181, 3);
-            Table.States (1151).Productions := WisiToken.To_Vector ((1 => 
(119, 0)));
+            Table.States (1150).Kernel := To_Vector ((0 => (181, 180, 0, 
True)));
+            Table.States (1150).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 181, 3)));
+            Table.States (1150).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1151), 104, 119);
             Add_Action (Table.States (1151), 105, 33);
             Add_Action (Table.States (1151), 106, 34);
@@ -12949,79 +13239,80 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1151), 239, 841);
             Add_Goto (Table.States (1151), 272, 92);
             Add_Goto (Table.States (1151), 293, 97);
-            Table.States (1151).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1152).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1151).Kernel := To_Vector ((0 => (119, 10, 1, 
False)));
+            Table.States (1151).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1152), 74, 1214);
             Add_Error (Table.States (1152));
-            Table.States (1152).Minimal_Complete_Action := (Shift, 74, 1214);
-            Table.States (1153).Productions := WisiToken.To_Vector ((1 => 
(162, 0)));
+            Table.States (1152).Kernel := To_Vector ((0 => (259, 119, 3, 
False)));
+            Table.States (1152).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1214)));
             Add_Action (Table.States (1153), 74, 1215);
             Add_Error (Table.States (1153));
-            Table.States (1153).Minimal_Complete_Action := (Shift, 74, 1215);
-            Table.States (1154).Productions := WisiToken.To_Vector ((1 => 
(156, 0)));
+            Table.States (1153).Kernel := To_Vector ((0 => (162, 119, 3, 
False)));
+            Table.States (1153).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 74, 1215)));
             Add_Action (Table.States (1154), (74, 96), (156, 0), 1, null, 
null);
-            Table.States (1154).Minimal_Complete_Action := (Reduce, 156, 1);
-            Table.States (1155).Productions := WisiToken.To_Vector ((1 => 
(162, 1)));
+            Table.States (1154).Kernel := To_Vector ((0 => (156, 155, 0, 
False)));
+            Table.States (1154).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 156, 1)));
             Add_Action (Table.States (1155), (74, 96), (162, 1), 4, 
derived_type_definition_1'Access, null);
-            Table.States (1155).Minimal_Complete_Action := (Reduce, 162, 4);
-            Table.States (1156).Productions := WisiToken.To_Vector ((1 => 
(260, 0)));
+            Table.States (1155).Kernel := To_Vector ((0 => (162, 156, 0, 
False)));
+            Table.States (1155).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 162, 4)));
             Add_Action (Table.States (1156), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (260, 0), 8,
             private_type_declaration_0'Access, null);
-            Table.States (1156).Minimal_Complete_Action := (Reduce, 260, 8);
-            Table.States (1157).Productions := WisiToken.To_Vector ((1 => 
(245, 0)));
+            Table.States (1156).Kernel := To_Vector ((0 => (260, 96, 0, 
False)));
+            Table.States (1156).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 260, 8)));
             Add_Action (Table.States (1157), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (245, 0), 8,
             object_renaming_declaration_0'Access, null);
-            Table.States (1157).Minimal_Complete_Action := (Reduce, 245, 8);
-            Table.States (1158).Productions := WisiToken.To_Vector (((185, 0), 
(187, 0)));
+            Table.States (1157).Kernel := To_Vector ((0 => (245, 96, 0, 
False)));
+            Table.States (1157).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 245, 8)));
             Add_Action (Table.States (1158), 79, 1065);
             Add_Action (Table.States (1158), 87, 1216);
             Add_Error (Table.States (1158));
-            Table.States (1158).Minimal_Complete_Action := (Shift, 87, 1216);
-            Table.States (1159).Productions := WisiToken.To_Vector ((1 => 
(185, 0)));
+            Table.States (1158).Kernel := To_Vector (((185, 185, 2, True), 
(187, 185, 1, False)));
+            Table.States (1158).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 1216)));
             Add_Action (Table.States (1159), (79, 87), (185, 0), 3, null, 
null);
-            Table.States (1159).Minimal_Complete_Action := (Reduce, 185, 3);
-            Table.States (1160).Productions := WisiToken.To_Vector ((1 => 
(187, 1)));
+            Table.States (1159).Kernel := To_Vector ((0 => (185, 184, 0, 
True)));
+            Table.States (1159).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 185, 3)));
+            Table.States (1159).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1160), (24, 72), (187, 1), 4, 
exception_handler_1'Access, null);
-            Table.States (1160).Minimal_Complete_Action := (Reduce, 187, 4);
-            Table.States (1161).Productions := WisiToken.To_Vector ((1 => 
(133, 0)));
+            Table.States (1160).Kernel := To_Vector ((0 => (187, 300, 0, 
False)));
+            Table.States (1160).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 187, 4)));
             Add_Action (Table.States (1161), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (133, 0), 8, block_statement_0'Access, 
block_statement_0_check'Access);
-            Table.States (1161).Minimal_Complete_Action := (Reduce, 133, 8);
-            Table.States (1162).Productions := WisiToken.To_Vector ((1 => 
(232, 0)));
+            Table.States (1161).Kernel := To_Vector ((0 => (133, 96, 0, 
False)));
+            Table.States (1161).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 133, 8)));
             Add_Action (Table.States (1162), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (232, 0), 8, loop_statement_0'Access, 
loop_statement_0_check'Access);
-            Table.States (1162).Minimal_Complete_Action := (Reduce, 232, 8);
-            Table.States (1163).Productions := WisiToken.To_Vector ((1 => 
(244, 1)));
+            Table.States (1162).Kernel := To_Vector ((0 => (232, 96, 0, 
False)));
+            Table.States (1162).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 232, 8)));
             Add_Action (Table.States (1163), 96, 1217);
             Add_Error (Table.States (1163));
-            Table.States (1163).Minimal_Complete_Action := (Shift, 96, 1217);
-            Table.States (1164).Productions := WisiToken.To_Vector ((1 => 
(244, 2)));
+            Table.States (1163).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (1163).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1217)));
             Add_Action (Table.States (1164), 96, 1218);
             Add_Error (Table.States (1164));
-            Table.States (1164).Minimal_Complete_Action := (Shift, 96, 1218);
-            Table.States (1165).Productions := WisiToken.To_Vector ((1 => 
(244, 0)));
+            Table.States (1164).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (1164).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1218)));
             Add_Action (Table.States (1165), 96, 1219);
             Add_Error (Table.States (1165));
-            Table.States (1165).Minimal_Complete_Action := (Shift, 96, 1219);
-            Table.States (1166).Productions := WisiToken.To_Vector ((1 => 
(179, 0)));
+            Table.States (1165).Kernel := To_Vector ((0 => (244, 122, 1, 
False)));
+            Table.States (1165).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1219)));
             Add_Action (Table.States (1166), 96, 1220);
             Add_Error (Table.States (1166));
-            Table.States (1166).Minimal_Complete_Action := (Shift, 96, 1220);
-            Table.States (1167).Productions := WisiToken.To_Vector ((1 => 
(213, 2)));
+            Table.States (1166).Kernel := To_Vector ((0 => (179, 122, 1, 
False)));
+            Table.States (1166).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1220)));
             Add_Action (Table.States (1167), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (213, 2), 8,
             generic_instantiation_2'Access, null);
-            Table.States (1167).Minimal_Complete_Action := (Reduce, 213, 8);
-            Table.States (1168).Productions := WisiToken.To_Vector ((1 => 
(213, 1)));
+            Table.States (1167).Kernel := To_Vector ((0 => (213, 96, 0, 
False)));
+            Table.States (1167).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 213, 8)));
             Add_Action (Table.States (1168), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (213, 1), 8,
             generic_instantiation_1'Access, null);
-            Table.States (1168).Minimal_Complete_Action := (Reduce, 213, 8);
-            Table.States (1169).Productions := WisiToken.To_Vector ((1 => 
(307, 0)));
+            Table.States (1168).Kernel := To_Vector ((0 => (213, 96, 0, 
False)));
+            Table.States (1168).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 213, 8)));
             Add_Action (Table.States (1169), 96, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (1169), 104, 119);
             Add_Action (Table.States (1169), 105, 33);
@@ -13032,16 +13323,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1169), 240, 1221);
             Add_Goto (Table.States (1169), 272, 92);
             Add_Goto (Table.States (1169), 293, 97);
-            Table.States (1169).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (1170).Productions := WisiToken.To_Vector ((1 => 
(113, 0)));
+            Table.States (1169).Kernel := To_Vector ((0 => (307, 24, 1, 
False)));
+            Table.States (1169).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (1170), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (113, 0), 9, accept_statement_0'Access, 
accept_statement_0_check'Access);
-            Table.States (1170).Minimal_Complete_Action := (Reduce, 113, 9);
-            Table.States (1171).Productions := WisiToken.To_Vector ((1 => 
(137, 0)));
+            Table.States (1170).Kernel := To_Vector ((0 => (113, 96, 0, 
False)));
+            Table.States (1170).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 113, 9)));
             Add_Action (Table.States (1171), (77, 83), (137, 0), 4, 
case_expression_alternative_0'Access, null);
-            Table.States (1171).Minimal_Complete_Action := (Reduce, 137, 4);
-            Table.States (1172).Productions := WisiToken.To_Vector ((1 => 
(172, 0)));
+            Table.States (1171).Kernel := To_Vector ((0 => (137, 192, 0, 
False)));
+            Table.States (1171).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 137, 4)));
             Add_Action (Table.States (1172), 3, 121);
             Add_Action (Table.States (1172), 22, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (1172), 23, Reduce, (192, 1), 0, null, 
null);
@@ -13078,11 +13369,11 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1172), 320, 144);
             Add_Goto (Table.States (1172), 321, 145);
             Add_Goto (Table.States (1172), 330, 146);
-            Table.States (1172).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1173).Productions := WisiToken.To_Vector ((1 => 
(221, 0)));
+            Table.States (1172).Kernel := To_Vector ((0 => (172, 68, 0, 
False)));
+            Table.States (1172).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1173), (1 =>  77), (221, 0), 7, 
if_expression_0'Access, null);
-            Table.States (1173).Minimal_Complete_Action := (Reduce, 221, 7);
-            Table.States (1174).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1173).Kernel := To_Vector ((0 => (221, 192, 0, 
False)));
+            Table.States (1173).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 221, 7)));
             Add_Action (Table.States (1174), 3, 121);
             Add_Action (Table.States (1174), 39, 122);
             Add_Action (Table.States (1174), 40, 123);
@@ -13106,17 +13397,16 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1174), 320, 144);
             Add_Goto (Table.States (1174), 321, 145);
             Add_Goto (Table.States (1174), 330, 146);
-            Table.States (1174).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (1175).Productions := WisiToken.To_Vector ((1 => 
(281, 0)));
+            Table.States (1174).Kernel := To_Vector ((0 => (144, 53, 4, 
False)));
+            Table.States (1174).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (1175), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 72, 73, 
74, 93, 104, 105, 106, 107), (281, 0), 9,
             record_representation_clause_0'Access, null);
-            Table.States (1175).Minimal_Complete_Action := (Reduce, 281, 9);
-            Table.States (1176).Productions := WisiToken.To_Vector ((1 => 
(254, 2)));
+            Table.States (1175).Kernel := To_Vector ((0 => (281, 96, 0, 
False)));
+            Table.States (1175).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 281, 9)));
             Add_Action (Table.States (1176), (77, 96), (254, 2), 6, 
parameter_specification_2'Access, null);
-            Table.States (1176).Minimal_Complete_Action := (Reduce, 254, 6);
-            Table.States (1177).Productions := WisiToken.To_Vector (((128, 0), 
(239, 0), (239, 1), (254, 0), (254, 1),
-            (272, 0), (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1176).Kernel := To_Vector ((0 => (254, 192, 0, 
False)));
+            Table.States (1176).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 254, 6)));
             Add_Action (Table.States (1177), 76, 235);
             Add_Action (Table.States (1177), 77, Reduce, (254, 1), 6, 
parameter_specification_1'Access, null);
             Add_Action (Table.States (1177), 82, 1224);
@@ -13127,41 +13417,44 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (1177));
             Add_Goto (Table.States (1177), 115, 241);
             Add_Goto (Table.States (1177), 322, 242);
-            Table.States (1177).Minimal_Complete_Action := (Reduce, 254, 6);
-            Table.States (1178).Productions := WisiToken.To_Vector ((1 => 
(202, 6)));
+            Table.States (1177).Kernel := To_Vector (((128, 239, 2, True), 
(239, 239, 5, True), (239, 239, 2, True),
+            (254, 239, 1, False), (254, 239, 0, False), (272, 239, 3, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True), (293, 239, 2, True)));
+            Table.States (1177).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 254, 6)));
             Add_Action (Table.States (1178), (74, 96), (202, 6), 4, null, 
null);
-            Table.States (1178).Minimal_Complete_Action := (Reduce, 202, 4);
-            Table.States (1179).Productions := WisiToken.To_Vector (((203, 0), 
(203, 1)));
-            Add_Action (Table.States (1179), 74, 1225, (203, 1), 4, 
formal_derived_type_definition_1'Access, null);
+            Table.States (1178).Kernel := To_Vector ((0 => (202, 80, 0, 
False)));
+            Table.States (1178).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 202, 4)));
+            Add_Action (Table.States (1179), 74, 1225);
+            Add_Conflict (Table.States (1179), 74, (203, 1), 4, 
formal_derived_type_definition_1'Access, null);
             Add_Action (Table.States (1179), 96, Reduce, (203, 1), 4, 
formal_derived_type_definition_1'Access, null);
             Add_Error (Table.States (1179));
-            Table.States (1179).Minimal_Complete_Action := (Reduce, 203, 4);
-            Table.States (1180).Productions := WisiToken.To_Vector ((1 => 
(205, 0)));
+            Table.States (1179).Kernel := To_Vector (((203, 119, 2, False), 
(203, 119, 0, False)));
+            Table.States (1179).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 203, 4)));
             Add_Action (Table.States (1180), 77, 1226);
             Add_Error (Table.States (1180));
-            Table.States (1180).Minimal_Complete_Action := (Shift, 77, 1226);
-            Table.States (1181).Productions := WisiToken.To_Vector ((1 => 
(204, 0)));
+            Table.States (1180).Kernel := To_Vector ((0 => (205, 80, 1, 
False)));
+            Table.States (1180).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1226)));
             Add_Action (Table.States (1181), 96, 1227);
             Add_Error (Table.States (1181));
-            Table.States (1181).Minimal_Complete_Action := (Shift, 96, 1227);
-            Table.States (1182).Productions := WisiToken.To_Vector ((1 => 
(198, 1)));
+            Table.States (1181).Kernel := To_Vector ((0 => (204, 122, 1, 
False)));
+            Table.States (1181).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1227)));
             Add_Action (Table.States (1182), (29, 47, 48, 50, 69, 71, 74, 
104), (198, 1), 8,
             formal_object_declaration_1'Access, null);
-            Table.States (1182).Minimal_Complete_Action := (Reduce, 198, 8);
-            Table.States (1183).Productions := WisiToken.To_Vector ((1 => 
(198, 0)));
+            Table.States (1182).Kernel := To_Vector ((0 => (198, 96, 0, 
False)));
+            Table.States (1182).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 198, 8)));
             Add_Action (Table.States (1183), 96, 1228);
             Add_Error (Table.States (1183));
-            Table.States (1183).Minimal_Complete_Action := (Shift, 96, 1228);
-            Table.States (1184).Productions := WisiToken.To_Vector ((1 => 
(222, 1)));
+            Table.States (1183).Kernel := To_Vector ((0 => (198, 122, 1, 
False)));
+            Table.States (1183).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1228)));
             Add_Action (Table.States (1184), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (222, 1), 9, if_statement_1'Access, null);
-            Table.States (1184).Minimal_Complete_Action := (Reduce, 222, 9);
-            Table.States (1185).Productions := WisiToken.To_Vector ((1 => 
(222, 0)));
+            Table.States (1184).Kernel := To_Vector ((0 => (222, 96, 0, 
False)));
+            Table.States (1184).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 222, 9)));
             Add_Action (Table.States (1185), 96, 1229);
             Add_Error (Table.States (1185));
-            Table.States (1185).Minimal_Complete_Action := (Shift, 96, 1229);
-            Table.States (1186).Productions := WisiToken.To_Vector ((1 => 
(247, 0)));
+            Table.States (1185).Kernel := To_Vector ((0 => (222, 32, 1, 
False)));
+            Table.States (1185).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1229)));
             Add_Action (Table.States (1186), 96, Reduce, (240, 1), 0, null, 
null);
             Add_Action (Table.States (1186), 104, 119);
             Add_Action (Table.States (1186), 105, 33);
@@ -13172,21 +13465,21 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1186), 240, 1230);
             Add_Goto (Table.States (1186), 272, 92);
             Add_Goto (Table.States (1186), 293, 97);
-            Table.States (1186).Minimal_Complete_Action := (Reduce, 240, 0);
-            Table.States (1187).Productions := WisiToken.To_Vector ((1 => 
(247, 1)));
+            Table.States (1186).Kernel := To_Vector ((0 => (247, 24, 1, 
False)));
+            Table.States (1186).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 240, 0)));
             Add_Action (Table.States (1187), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (247, 1), 9,
             package_body_1'Access, package_body_1_check'Access);
-            Table.States (1187).Minimal_Complete_Action := (Reduce, 247, 9);
-            Table.States (1188).Productions := WisiToken.To_Vector ((1 => 
(251, 0)));
+            Table.States (1187).Kernel := To_Vector ((0 => (247, 96, 0, 
False)));
+            Table.States (1187).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 247, 9)));
             Add_Action (Table.States (1188), (1 =>  96), (251, 0), 9, 
package_specification_0'Access,
             package_specification_0_check'Access);
-            Table.States (1188).Minimal_Complete_Action := (Reduce, 251, 9);
-            Table.States (1189).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1188).Kernel := To_Vector ((0 => (251, 240, 0, 
False)));
+            Table.States (1188).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 251, 9)));
             Add_Action (Table.States (1189), 104, 1231);
             Add_Error (Table.States (1189));
-            Table.States (1189).Minimal_Complete_Action := (Shift, 104, 1231);
-            Table.States (1190).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1189).Kernel := To_Vector ((0 => (177, 28, 4, 
False)));
+            Table.States (1189).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 1231)));
             Add_Action (Table.States (1190), 3, 121);
             Add_Action (Table.States (1190), 35, Reduce, (192, 1), 0, null, 
null);
             Add_Action (Table.States (1190), 39, 122);
@@ -13221,13 +13514,13 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1190), 320, 144);
             Add_Goto (Table.States (1190), 321, 145);
             Add_Goto (Table.States (1190), 330, 146);
-            Table.States (1190).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1191).Productions := WisiToken.To_Vector ((1 => 
(264, 0)));
+            Table.States (1190).Kernel := To_Vector ((0 => (176, 72, 4, 
False)));
+            Table.States (1190).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1191), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (264, 0), 9,
             protected_body_0'Access, protected_body_0_check'Access);
-            Table.States (1191).Minimal_Complete_Action := (Reduce, 264, 9);
-            Table.States (1192).Productions := WisiToken.To_Vector ((1 => 
(271, 0)));
+            Table.States (1191).Kernel := To_Vector ((0 => (264, 96, 0, 
False)));
+            Table.States (1191).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 264, 9)));
             Add_Action (Table.States (1192), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (1192), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (1192), 28, 183);
@@ -13300,23 +13593,26 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1192), 319, 113);
             Add_Goto (Table.States (1192), 325, 115);
             Add_Goto (Table.States (1192), 331, 116);
-            Table.States (1192).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (1193).Productions := WisiToken.To_Vector ((1 => 
(304, 0)));
+            Table.States (1192).Kernel := To_Vector ((0 => (271, 74, 2, 
False)));
+            Table.States (1192).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
+         end Subr_19;
+         procedure Subr_20
+         is begin
             Add_Action (Table.States (1193), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (304, 0), 9,
             single_protected_declaration_0'Access, 
single_protected_declaration_0_check'Access);
-            Table.States (1193).Minimal_Complete_Action := (Reduce, 304, 9);
-            Table.States (1194).Productions := WisiToken.To_Vector ((1 => 
(266, 0)));
+            Table.States (1193).Kernel := To_Vector ((0 => (304, 96, 0, 
False)));
+            Table.States (1193).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 304, 9)));
             Add_Action (Table.States (1194), (1 =>  96), (266, 0), 5, 
protected_definition_0'Access,
             protected_definition_0_check'Access);
-            Table.States (1194).Minimal_Complete_Action := (Reduce, 266, 5);
-            Table.States (1195).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1194).Kernel := To_Vector ((0 => (266, 220, 0, 
False)));
+            Table.States (1194).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 266, 5)));
             Add_Action (Table.States (1195), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1195), 104, 149);
             Add_Error (Table.States (1195));
             Add_Goto (Table.States (1195), 220, 1234);
-            Table.States (1195).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1196).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1195).Kernel := To_Vector ((0 => (316, 24, 1, 
False)));
+            Table.States (1195).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1196), 24, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (1196), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (1196), 28, 183);
@@ -13389,18 +13685,18 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1196), 319, 113);
             Add_Goto (Table.States (1196), 325, 115);
             Add_Goto (Table.States (1196), 331, 116);
-            Table.States (1196).Minimal_Complete_Action := (Reduce, 318, 0);
-            Table.States (1197).Productions := WisiToken.To_Vector ((1 => 
(319, 1)));
+            Table.States (1196).Kernel := To_Vector ((0 => (319, 74, 2, 
False)));
+            Table.States (1196).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 318, 0)));
             Add_Action (Table.States (1197), 96, 1236);
             Add_Error (Table.States (1197));
-            Table.States (1197).Minimal_Complete_Action := (Shift, 96, 1236);
-            Table.States (1198).Productions := WisiToken.To_Vector ((1 => 
(305, 0)));
+            Table.States (1197).Kernel := To_Vector ((0 => (319, 220, 1, 
False)));
+            Table.States (1197).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1236)));
             Add_Action (Table.States (1198), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1198), 104, 149);
             Add_Error (Table.States (1198));
             Add_Goto (Table.States (1198), 220, 1237);
-            Table.States (1198).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1199).Productions := WisiToken.To_Vector ((1 => 
(120, 1)));
+            Table.States (1198).Kernel := To_Vector ((0 => (305, 24, 1, 
False)));
+            Table.States (1198).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1199), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (1199), 8, 1144);
             Add_Action (Table.States (1199), 40, 742);
@@ -13416,8 +13712,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1199), 272, 92);
             Add_Goto (Table.States (1199), 293, 97);
             Add_Goto (Table.States (1199), 314, 1147);
-            Table.States (1199).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1200).Productions := WisiToken.To_Vector ((1 => 
(120, 0)));
+            Table.States (1199).Kernel := To_Vector ((0 => (120, 42, 1, 
False)));
+            Table.States (1199).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1200), 7, Reduce, (241, 1), 0, null, 
null);
             Add_Action (Table.States (1200), 8, 1144);
             Add_Action (Table.States (1200), 40, 742);
@@ -13433,12 +13729,12 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1200), 272, 92);
             Add_Goto (Table.States (1200), 293, 97);
             Add_Goto (Table.States (1200), 314, 1147);
-            Table.States (1200).Minimal_Complete_Action := (Shift, 104, 119);
-            Table.States (1201).Productions := WisiToken.To_Vector ((1 => 
(226, 0)));
+            Table.States (1200).Kernel := To_Vector ((0 => (120, 42, 1, 
False)));
+            Table.States (1200).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1201), (77, 83), (226, 0), 3, null, 
null);
-            Table.States (1201).Minimal_Complete_Action := (Reduce, 226, 3);
-            Table.States (1202).Productions := WisiToken.To_Vector (((128, 0), 
(225, 0), (239, 0), (239, 1), (272, 0),
-            (293, 0), (293, 1), (293, 2), (293, 3)));
+            Table.States (1201).Kernel := To_Vector ((0 => (226, 225, 0, 
True)));
+            Table.States (1201).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 226, 3)));
+            Table.States (1201).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1202), 53, 1240);
             Add_Action (Table.States (1202), 76, 235);
             Add_Action (Table.States (1202), 84, 237);
@@ -13447,14 +13743,16 @@ package body Ada_Process_LALR_Main is
             Add_Error (Table.States (1202));
             Add_Goto (Table.States (1202), 115, 241);
             Add_Goto (Table.States (1202), 322, 242);
-            Table.States (1202).Minimal_Complete_Action := (Shift, 53, 1240);
-            Table.States (1203).Productions := WisiToken.To_Vector ((1 => 
(225, 0)));
+            Table.States (1202).Kernel := To_Vector (((128, 239, 2, True), 
(225, 239, 2, False), (239, 239, 5, True),
+            (239, 239, 2, True), (272, 239, 3, True), (293, 239, 2, True), 
(293, 239, 2, True), (293, 239, 2, True),
+            (293, 239, 2, True)));
+            Table.States (1202).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 53, 1240)));
             Add_Action (Table.States (1203), (77, 83), (225, 0), 3, null, 
null);
-            Table.States (1203).Minimal_Complete_Action := (Reduce, 225, 3);
-            Table.States (1204).Productions := WisiToken.To_Vector ((1 => 
(326, 4)));
+            Table.States (1203).Kernel := To_Vector ((0 => (225, 80, 0, 
False)));
+            Table.States (1203).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 225, 3)));
             Add_Action (Table.States (1204), (74, 96), (326, 4), 5, null, 
null);
-            Table.States (1204).Minimal_Complete_Action := (Reduce, 326, 5);
-            Table.States (1205).Productions := WisiToken.To_Vector ((1 => 
(279, 0)));
+            Table.States (1204).Kernel := To_Vector ((0 => (326, 279, 0, 
False)));
+            Table.States (1204).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 326, 5)));
             Add_Action (Table.States (1205), 3, 121);
             Add_Action (Table.States (1205), 39, 122);
             Add_Action (Table.States (1205), 40, 123);
@@ -13478,8 +13776,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1205), 320, 144);
             Add_Goto (Table.States (1205), 321, 145);
             Add_Goto (Table.States (1205), 330, 146);
-            Table.States (1205).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (1206).Productions := WisiToken.To_Vector ((1 => 
(329, 0)));
+            Table.States (1205).Kernel := To_Vector ((0 => (279, 85, 1, 
False)));
+            Table.States (1205).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (1206), 3, 121);
             Add_Action (Table.States (1206), 39, 122);
             Add_Action (Table.States (1206), 40, 261);
@@ -13518,23 +13816,23 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1206), 320, 144);
             Add_Goto (Table.States (1206), 321, 145);
             Add_Goto (Table.States (1206), 330, 146);
-            Table.States (1206).Minimal_Complete_Action := (Reduce, 166, 0);
-            Table.States (1207).Productions := WisiToken.To_Vector (((327, 0), 
(328, 0)));
+            Table.States (1206).Kernel := To_Vector ((0 => (329, 72, 1, 
False)));
+            Table.States (1206).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 166, 0)));
             Add_Action (Table.States (1207), 24, 1243);
             Add_Action (Table.States (1207), 72, 1206);
             Add_Error (Table.States (1207));
             Add_Goto (Table.States (1207), 329, 1244);
-            Table.States (1207).Minimal_Complete_Action := (Shift, 24, 1243);
-            Table.States (1208).Productions := WisiToken.To_Vector ((1 => 
(328, 1)));
+            Table.States (1207).Kernel := To_Vector (((327, 328, 3, False), 
(328, 328, 2, True)));
+            Table.States (1207).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1243)));
             Add_Action (Table.States (1208), (24, 72), (328, 1), 1, null, 
null);
-            Table.States (1208).Minimal_Complete_Action := (Reduce, 328, 1);
-            Table.States (1209).Productions := WisiToken.To_Vector ((1 => 
(147, 2)));
+            Table.States (1208).Kernel := To_Vector ((0 => (328, 329, 0, 
False)));
+            Table.States (1208).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 328, 1)));
             Add_Action (Table.States (1209), (74, 82, 96), (147, 2), 2, null, 
null);
-            Table.States (1209).Minimal_Complete_Action := (Reduce, 147, 2);
-            Table.States (1210).Productions := WisiToken.To_Vector ((1 => 
(147, 0)));
+            Table.States (1209).Kernel := To_Vector ((0 => (147, 114, 0, 
False)));
+            Table.States (1209).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 147, 2)));
             Add_Action (Table.States (1210), (74, 82, 96), (147, 0), 2, null, 
null);
-            Table.States (1210).Minimal_Complete_Action := (Reduce, 147, 2);
-            Table.States (1211).Productions := WisiToken.To_Vector ((1 => 
(146, 0)));
+            Table.States (1210).Kernel := To_Vector ((0 => (147, 314, 0, 
False)));
+            Table.States (1210).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 147, 2)));
             Add_Action (Table.States (1211), 3, 121);
             Add_Action (Table.States (1211), 39, 122);
             Add_Action (Table.States (1211), 40, 123);
@@ -13570,28 +13868,28 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1211), 320, 144);
             Add_Goto (Table.States (1211), 321, 145);
             Add_Goto (Table.States (1211), 330, 146);
-            Table.States (1211).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1212).Productions := WisiToken.To_Vector ((1 => 
(146, 1)));
+            Table.States (1211).Kernel := To_Vector ((0 => (146, 82, 1, 
False)));
+            Table.States (1211).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1212), 96, 1246);
             Add_Error (Table.States (1212));
-            Table.States (1212).Minimal_Complete_Action := (Shift, 96, 1246);
-            Table.States (1213).Productions := WisiToken.To_Vector (((119, 0), 
(227, 0)));
+            Table.States (1212).Kernel := To_Vector ((0 => (146, 122, 1, 
False)));
+            Table.States (1212).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1246)));
             Add_Action (Table.States (1213), 10, 1006);
             Add_Action (Table.States (1213), 74, Reduce, (119, 0), 2, null, 
null);
             Add_Action (Table.States (1213), 96, Reduce, (119, 0), 2, null, 
null);
             Add_Error (Table.States (1213));
-            Table.States (1213).Minimal_Complete_Action := (Reduce, 119, 2);
-            Table.States (1214).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1213).Kernel := To_Vector (((119, 227, 0, False), 
(227, 227, 2, True)));
+            Table.States (1213).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 119, 2)));
             Add_Action (Table.States (1214), 49, 1247);
             Add_Error (Table.States (1214));
-            Table.States (1214).Minimal_Complete_Action := (Shift, 49, 1247);
-            Table.States (1215).Productions := WisiToken.To_Vector ((1 => 
(162, 0)));
+            Table.States (1214).Kernel := To_Vector ((0 => (259, 74, 2, 
False)));
+            Table.States (1214).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 49, 1247)));
             Add_Action (Table.States (1215), 41, 705);
             Add_Action (Table.States (1215), 54, 708);
             Add_Error (Table.States (1215));
             Add_Goto (Table.States (1215), 280, 1248);
-            Table.States (1215).Minimal_Complete_Action := (Shift, 41, 705);
-            Table.States (1216).Productions := WisiToken.To_Vector ((1 => 
(187, 0)));
+            Table.States (1215).Kernel := To_Vector ((0 => (162, 74, 2, 
False)));
+            Table.States (1215).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 41, 705)));
             Add_Action (Table.States (1216), 4, 1);
             Add_Action (Table.States (1216), 5, 2);
             Add_Action (Table.States (1216), 13, Reduce, (132, 1), 0, null, 
null);
@@ -13648,42 +13946,39 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1216), 303, 101);
             Add_Goto (Table.States (1216), 306, 363);
             Add_Goto (Table.States (1216), 323, 114);
-            Table.States (1216).Minimal_Complete_Action := (Reduce, 300, 0);
-         end Subr_19;
-         procedure Subr_20
-         is begin
-            Table.States (1217).Productions := WisiToken.To_Vector ((1 => 
(244, 1)));
+            Table.States (1216).Kernel := To_Vector ((0 => (187, 87, 0, 
False)));
+            Table.States (1216).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 300, 0)));
             Add_Action (Table.States (1217), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 1), 9,
             object_declaration_1'Access, null);
-            Table.States (1217).Minimal_Complete_Action := (Reduce, 244, 9);
-            Table.States (1218).Productions := WisiToken.To_Vector ((1 => 
(244, 2)));
+            Table.States (1217).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1217).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 9)));
             Add_Action (Table.States (1218), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 2), 9,
             object_declaration_2'Access, null);
-            Table.States (1218).Minimal_Complete_Action := (Reduce, 244, 9);
-            Table.States (1219).Productions := WisiToken.To_Vector ((1 => 
(244, 0)));
+            Table.States (1218).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1218).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 9)));
             Add_Action (Table.States (1219), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (244, 0), 9,
             object_declaration_0'Access, null);
-            Table.States (1219).Minimal_Complete_Action := (Reduce, 244, 9);
-            Table.States (1220).Productions := WisiToken.To_Vector ((1 => 
(179, 0)));
+            Table.States (1219).Kernel := To_Vector ((0 => (244, 96, 0, 
False)));
+            Table.States (1219).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 244, 9)));
             Add_Action (Table.States (1220), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (179, 0), 9,
             entry_declaration_0'Access, null);
-            Table.States (1220).Minimal_Complete_Action := (Reduce, 179, 9);
-            Table.States (1221).Productions := WisiToken.To_Vector ((1 => 
(307, 0)));
+            Table.States (1220).Kernel := To_Vector ((0 => (179, 96, 0, 
False)));
+            Table.States (1220).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 179, 9)));
             Add_Action (Table.States (1221), 96, 1250);
             Add_Error (Table.States (1221));
-            Table.States (1221).Minimal_Complete_Action := (Shift, 96, 1250);
-            Table.States (1222).Productions := WisiToken.To_Vector ((1 => 
(172, 0)));
+            Table.States (1221).Kernel := To_Vector ((0 => (307, 240, 1, 
False)));
+            Table.States (1221).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1250)));
             Add_Action (Table.States (1222), (22, 23, 77), (172, 0), 4, 
elsif_expression_item_0'Access, null);
-            Table.States (1222).Minimal_Complete_Action := (Reduce, 172, 4);
-            Table.States (1223).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1222).Kernel := To_Vector ((0 => (172, 192, 0, 
False)));
+            Table.States (1222).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 172, 4)));
             Add_Action (Table.States (1223), 85, 1251);
             Add_Error (Table.States (1223));
-            Table.States (1223).Minimal_Complete_Action := (Shift, 85, 1251);
-            Table.States (1224).Productions := WisiToken.To_Vector ((1 => 
(254, 0)));
+            Table.States (1223).Kernel := To_Vector ((0 => (144, 301, 3, 
False)));
+            Table.States (1223).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 85, 1251)));
             Add_Action (Table.States (1224), 3, 121);
             Add_Action (Table.States (1224), 39, 122);
             Add_Action (Table.States (1224), 40, 123);
@@ -13719,112 +14014,113 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1224), 320, 144);
             Add_Goto (Table.States (1224), 321, 145);
             Add_Goto (Table.States (1224), 330, 146);
-            Table.States (1224).Minimal_Complete_Action := (Reduce, 192, 0);
-            Table.States (1225).Productions := WisiToken.To_Vector ((1 => 
(203, 0)));
+            Table.States (1224).Kernel := To_Vector ((0 => (254, 82, 0, 
False)));
+            Table.States (1224).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 192, 0)));
             Add_Action (Table.States (1225), 49, 1253);
             Add_Error (Table.States (1225));
-            Table.States (1225).Minimal_Complete_Action := (Shift, 49, 1253);
-            Table.States (1226).Productions := WisiToken.To_Vector ((1 => 
(205, 0)));
+            Table.States (1225).Kernel := To_Vector ((0 => (203, 74, 1, 
False)));
+            Table.States (1225).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 49, 1253)));
             Add_Action (Table.States (1226), (74, 96), (205, 0), 3, null, 
null);
-            Table.States (1226).Minimal_Complete_Action := (Reduce, 205, 3);
-            Table.States (1227).Productions := WisiToken.To_Vector ((1 => 
(204, 0)));
+            Table.States (1226).Kernel := To_Vector ((0 => (205, 77, 0, 
False)));
+            Table.States (1226).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 205, 3)));
             Add_Action (Table.States (1227), (29, 47, 48, 50, 69, 71, 74, 
104), (204, 0), 9,
             formal_package_declaration_0'Access, null);
-            Table.States (1227).Minimal_Complete_Action := (Reduce, 204, 9);
-            Table.States (1228).Productions := WisiToken.To_Vector ((1 => 
(198, 0)));
+            Table.States (1227).Kernel := To_Vector ((0 => (204, 96, 0, 
False)));
+            Table.States (1227).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 204, 9)));
             Add_Action (Table.States (1228), (29, 47, 48, 50, 69, 71, 74, 
104), (198, 0), 9,
             formal_object_declaration_0'Access, null);
-            Table.States (1228).Minimal_Complete_Action := (Reduce, 198, 9);
-            Table.States (1229).Productions := WisiToken.To_Vector ((1 => 
(222, 0)));
+            Table.States (1228).Kernel := To_Vector ((0 => (198, 96, 0, 
False)));
+            Table.States (1228).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 198, 9)));
             Add_Action (Table.States (1229), (4, 5, 13, 15, 17, 18, 22, 23, 
24, 25, 26, 27, 28, 29, 30, 31, 32, 36, 37,
             40, 41, 43, 46, 47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 
68, 69, 71, 72, 73, 74, 93, 104, 105, 106,
             107), (222, 0), 10, if_statement_0'Access, null);
-            Table.States (1229).Minimal_Complete_Action := (Reduce, 222, 10);
-            Table.States (1230).Productions := WisiToken.To_Vector ((1 => 
(247, 0)));
+            Table.States (1229).Kernel := To_Vector ((0 => (222, 96, 0, 
False)));
+            Table.States (1229).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 222, 10)));
             Add_Action (Table.States (1230), 96, 1254);
             Add_Error (Table.States (1230));
-            Table.States (1230).Minimal_Complete_Action := (Shift, 96, 1254);
-            Table.States (1231).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1230).Kernel := To_Vector ((0 => (247, 240, 1, 
False)));
+            Table.States (1230).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1254)));
             Add_Action (Table.States (1231), 33, 1255);
             Add_Error (Table.States (1231));
-            Table.States (1231).Minimal_Complete_Action := (Shift, 33, 1255);
-            Table.States (1232).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1231).Kernel := To_Vector ((0 => (177, 104, 3, 
False)));
+            Table.States (1231).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 1255)));
             Add_Action (Table.States (1232), 35, 1256);
             Add_Error (Table.States (1232));
-            Table.States (1232).Minimal_Complete_Action := (Shift, 35, 1256);
-            Table.States (1233).Productions := WisiToken.To_Vector ((1 => 
(271, 0)));
+            Table.States (1232).Kernel := To_Vector ((0 => (176, 192, 4, 
False)));
+            Table.States (1232).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 35, 1256)));
             Add_Action (Table.States (1233), 96, 1257);
             Add_Error (Table.States (1233));
-            Table.States (1233).Minimal_Complete_Action := (Shift, 96, 1257);
-            Table.States (1234).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1233).Kernel := To_Vector ((0 => (271, 266, 1, 
False)));
+            Table.States (1233).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1257)));
             Add_Action (Table.States (1234), 96, 1258);
             Add_Error (Table.States (1234));
-            Table.States (1234).Minimal_Complete_Action := (Shift, 96, 1258);
-            Table.States (1235).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1234).Kernel := To_Vector ((0 => (316, 220, 1, 
False)));
+            Table.States (1234).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1258)));
             Add_Action (Table.States (1235), 24, 1259);
             Add_Error (Table.States (1235));
-            Table.States (1235).Minimal_Complete_Action := (Shift, 24, 1259);
-            Table.States (1236).Productions := WisiToken.To_Vector ((1 => 
(319, 1)));
+            Table.States (1235).Kernel := To_Vector ((0 => (319, 318, 2, 
False)));
+            Table.States (1235).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1259)));
             Add_Action (Table.States (1236), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (319, 1), 10,
             task_type_declaration_1'Access, 
task_type_declaration_1_check'Access);
-            Table.States (1236).Minimal_Complete_Action := (Reduce, 319, 10);
-            Table.States (1237).Productions := WisiToken.To_Vector ((1 => 
(305, 0)));
+            Table.States (1236).Kernel := To_Vector ((0 => (319, 96, 0, 
False)));
+            Table.States (1236).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 319, 10)));
             Add_Action (Table.States (1237), 96, 1260);
             Add_Error (Table.States (1237));
-            Table.States (1237).Minimal_Complete_Action := (Shift, 96, 1260);
-            Table.States (1238).Productions := WisiToken.To_Vector ((1 => 
(120, 1)));
+            Table.States (1237).Kernel := To_Vector ((0 => (305, 220, 1, 
False)));
+            Table.States (1237).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1260)));
             Add_Action (Table.States (1238), (74, 82, 96), (120, 1), 6, 
array_type_definition_1'Access, null);
-            Table.States (1238).Minimal_Complete_Action := (Reduce, 120, 6);
-            Table.States (1239).Productions := WisiToken.To_Vector ((1 => 
(120, 0)));
+            Table.States (1238).Kernel := To_Vector ((0 => (120, 147, 0, 
False)));
+            Table.States (1238).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 120, 6)));
             Add_Action (Table.States (1239), (74, 82, 96), (120, 0), 6, 
array_type_definition_0'Access, null);
-            Table.States (1239).Minimal_Complete_Action := (Reduce, 120, 6);
-            Table.States (1240).Productions := WisiToken.To_Vector ((1 => 
(225, 0)));
+            Table.States (1239).Kernel := To_Vector ((0 => (120, 147, 0, 
False)));
+            Table.States (1239).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 120, 6)));
             Add_Action (Table.States (1240), 80, 1203);
             Add_Error (Table.States (1240));
-            Table.States (1240).Minimal_Complete_Action := (Shift, 80, 1203);
-            Table.States (1241).Productions := WisiToken.To_Vector ((1 => 
(279, 0)));
+            Table.States (1240).Kernel := To_Vector ((0 => (225, 53, 1, 
False)));
+            Table.States (1240).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 80, 1203)));
             Add_Action (Table.States (1241), (74, 96), (279, 0), 4, null, 
null);
-            Table.States (1241).Minimal_Complete_Action := (Reduce, 279, 4);
-            Table.States (1242).Productions := WisiToken.To_Vector (((166, 0), 
(329, 0)));
+            Table.States (1241).Kernel := To_Vector ((0 => (279, 301, 0, 
False)));
+            Table.States (1241).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 279, 4)));
             Add_Action (Table.States (1242), 79, 445);
             Add_Action (Table.States (1242), 87, 1261);
             Add_Error (Table.States (1242));
-            Table.States (1242).Minimal_Complete_Action := (Shift, 87, 1261);
-            Table.States (1243).Productions := WisiToken.To_Vector ((1 => 
(327, 0)));
+            Table.States (1242).Kernel := To_Vector (((166, 166, 2, True), 
(329, 166, 1, False)));
+            Table.States (1242).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 87, 1261)));
             Add_Action (Table.States (1243), 15, 1262);
             Add_Error (Table.States (1243));
-            Table.States (1243).Minimal_Complete_Action := (Shift, 15, 1262);
-            Table.States (1244).Productions := WisiToken.To_Vector ((1 => 
(328, 0)));
+            Table.States (1243).Kernel := To_Vector ((0 => (327, 24, 2, 
False)));
+            Table.States (1243).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 15, 1262)));
             Add_Action (Table.States (1244), (24, 72), (328, 0), 2, null, 
null);
-            Table.States (1244).Minimal_Complete_Action := (Reduce, 328, 2);
-            Table.States (1245).Productions := WisiToken.To_Vector ((1 => 
(146, 0)));
+            Table.States (1244).Kernel := To_Vector ((0 => (328, 329, 0, 
True)));
+            Table.States (1244).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 328, 2)));
+            Table.States (1244).Minimal_Complete_Actions_Recursive := True;
             Add_Action (Table.States (1245), 74, 337);
             Add_Action (Table.States (1245), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1245));
             Add_Goto (Table.States (1245), 122, 1263);
-            Table.States (1245).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1246).Productions := WisiToken.To_Vector ((1 => 
(146, 1)));
+            Table.States (1245).Kernel := To_Vector ((0 => (146, 192, 1, 
False)));
+            Table.States (1245).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1246), (15, 24, 28, 72, 104), (146, 1), 
5, component_declaration_1'Access, null);
-            Table.States (1246).Minimal_Complete_Action := (Reduce, 146, 5);
-            Table.States (1247).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1246).Kernel := To_Vector ((0 => (146, 96, 0, 
False)));
+            Table.States (1246).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 146, 5)));
             Add_Action (Table.States (1247), 74, 337);
             Add_Action (Table.States (1247), 96, Reduce, (122, 1), 0, null, 
null);
             Add_Error (Table.States (1247));
             Add_Goto (Table.States (1247), 122, 1264);
-            Table.States (1247).Minimal_Complete_Action := (Reduce, 122, 0);
-            Table.States (1248).Productions := WisiToken.To_Vector ((1 => 
(162, 0)));
+            Table.States (1247).Kernel := To_Vector ((0 => (259, 49, 1, 
False)));
+            Table.States (1247).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 122, 0)));
             Add_Action (Table.States (1248), (74, 96), (162, 0), 6, 
derived_type_definition_0'Access, null);
-            Table.States (1248).Minimal_Complete_Action := (Reduce, 162, 6);
-            Table.States (1249).Productions := WisiToken.To_Vector ((1 => 
(187, 0)));
+            Table.States (1248).Kernel := To_Vector ((0 => (162, 280, 0, 
False)));
+            Table.States (1248).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 162, 6)));
             Add_Action (Table.States (1249), (24, 72), (187, 0), 6, 
exception_handler_0'Access, null);
-            Table.States (1249).Minimal_Complete_Action := (Reduce, 187, 6);
-            Table.States (1250).Productions := WisiToken.To_Vector ((1 => 
(307, 0)));
+            Table.States (1249).Kernel := To_Vector ((0 => (187, 300, 0, 
False)));
+            Table.States (1249).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 187, 6)));
             Add_Action (Table.States (1250), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (307, 0), 10,
             subprogram_body_0'Access, subprogram_body_0_check'Access);
-            Table.States (1250).Minimal_Complete_Action := (Reduce, 307, 10);
-            Table.States (1251).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1250).Kernel := To_Vector ((0 => (307, 96, 0, 
False)));
+            Table.States (1250).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 307, 10)));
             Add_Action (Table.States (1251), 3, 121);
             Add_Action (Table.States (1251), 39, 122);
             Add_Action (Table.States (1251), 40, 123);
@@ -13848,19 +14144,19 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1251), 320, 144);
             Add_Goto (Table.States (1251), 321, 145);
             Add_Goto (Table.States (1251), 330, 146);
-            Table.States (1251).Minimal_Complete_Action := (Shift, 103, 129);
-            Table.States (1252).Productions := WisiToken.To_Vector ((1 => 
(254, 0)));
+            Table.States (1251).Kernel := To_Vector ((0 => (144, 85, 2, 
False)));
+            Table.States (1251).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 103, 129)));
             Add_Action (Table.States (1252), (77, 96), (254, 0), 8, 
parameter_specification_0'Access, null);
-            Table.States (1252).Minimal_Complete_Action := (Reduce, 254, 8);
-            Table.States (1253).Productions := WisiToken.To_Vector ((1 => 
(203, 0)));
+            Table.States (1252).Kernel := To_Vector ((0 => (254, 192, 0, 
False)));
+            Table.States (1252).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 254, 8)));
             Add_Action (Table.States (1253), (74, 96), (203, 0), 6, 
formal_derived_type_definition_0'Access, null);
-            Table.States (1253).Minimal_Complete_Action := (Reduce, 203, 6);
-            Table.States (1254).Productions := WisiToken.To_Vector ((1 => 
(247, 0)));
+            Table.States (1253).Kernel := To_Vector ((0 => (203, 49, 0, 
False)));
+            Table.States (1253).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 203, 6)));
             Add_Action (Table.States (1254), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (247, 0), 11,
             package_body_0'Access, package_body_0_check'Access);
-            Table.States (1254).Minimal_Complete_Action := (Reduce, 247, 11);
-            Table.States (1255).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1254).Kernel := To_Vector ((0 => (247, 96, 0, 
False)));
+            Table.States (1254).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 247, 11)));
             Add_Action (Table.States (1255), 3, 121);
             Add_Action (Table.States (1255), 39, 122);
             Add_Action (Table.States (1255), 40, 474);
@@ -13887,8 +14183,8 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1255), 320, 144);
             Add_Goto (Table.States (1255), 321, 145);
             Add_Goto (Table.States (1255), 330, 146);
-            Table.States (1255).Minimal_Complete_Action := (Shift, 40, 474);
-            Table.States (1256).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1255).Kernel := To_Vector ((0 => (177, 33, 2, 
False)));
+            Table.States (1255).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 104, 119)));
             Add_Action (Table.States (1256), 13, Reduce, (159, 1), 0, null, 
null);
             Add_Action (Table.States (1256), 25, Reduce, (246, 2), 0, null, 
null);
             Add_Action (Table.States (1256), 28, 183);
@@ -13959,29 +14255,29 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1256), 319, 113);
             Add_Goto (Table.States (1256), 325, 115);
             Add_Goto (Table.States (1256), 331, 116);
-            Table.States (1256).Minimal_Complete_Action := (Reduce, 159, 0);
-            Table.States (1257).Productions := WisiToken.To_Vector ((1 => 
(271, 0)));
+            Table.States (1256).Kernel := To_Vector ((0 => (176, 35, 3, 
False)));
+            Table.States (1256).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 159, 0)));
             Add_Action (Table.States (1257), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (271, 0), 11,
             protected_type_declaration_0'Access, 
protected_type_declaration_0_check'Access);
-            Table.States (1257).Minimal_Complete_Action := (Reduce, 271, 11);
-            Table.States (1258).Productions := WisiToken.To_Vector ((1 => 
(316, 0)));
+            Table.States (1257).Kernel := To_Vector ((0 => (271, 96, 0, 
False)));
+            Table.States (1257).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 271, 11)));
             Add_Action (Table.States (1258), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (316, 0), 11,
             task_body_0'Access, task_body_0_check'Access);
-            Table.States (1258).Minimal_Complete_Action := (Reduce, 316, 11);
-            Table.States (1259).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1258).Kernel := To_Vector ((0 => (316, 96, 0, 
False)));
+            Table.States (1258).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 316, 11)));
             Add_Action (Table.States (1259), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1259), 104, 149);
             Add_Error (Table.States (1259));
             Add_Goto (Table.States (1259), 220, 1268);
-            Table.States (1259).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1260).Productions := WisiToken.To_Vector ((1 => 
(305, 0)));
+            Table.States (1259).Kernel := To_Vector ((0 => (319, 24, 1, 
False)));
+            Table.States (1259).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1260), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (305, 0), 11,
             single_task_declaration_0'Access, 
single_task_declaration_0_check'Access);
-            Table.States (1260).Minimal_Complete_Action := (Reduce, 305, 11);
-            Table.States (1261).Productions := WisiToken.To_Vector ((1 => 
(329, 0)));
+            Table.States (1260).Kernel := To_Vector ((0 => (305, 96, 0, 
False)));
+            Table.States (1260).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 305, 11)));
             Add_Action (Table.States (1261), 15, 885);
             Add_Action (Table.States (1261), 24, Reduce, (150, 1), 0, null, 
null);
             Add_Action (Table.States (1261), 28, 183);
@@ -13999,60 +14295,63 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1261), 219, 892);
             Add_Goto (Table.States (1261), 281, 94);
             Add_Goto (Table.States (1261), 327, 893);
-            Table.States (1261).Minimal_Complete_Action := (Reduce, 150, 0);
-            Table.States (1262).Productions := WisiToken.To_Vector ((1 => 
(327, 0)));
+            Table.States (1261).Kernel := To_Vector ((0 => (329, 87, 0, 
False)));
+            Table.States (1261).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 150, 0)));
             Add_Action (Table.States (1262), 96, 1270);
             Add_Error (Table.States (1262));
-            Table.States (1262).Minimal_Complete_Action := (Shift, 96, 1270);
-            Table.States (1263).Productions := WisiToken.To_Vector ((1 => 
(146, 0)));
+            Table.States (1262).Kernel := To_Vector ((0 => (327, 15, 1, 
False)));
+            Table.States (1262).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1270)));
             Add_Action (Table.States (1263), 96, 1271);
             Add_Error (Table.States (1263));
-            Table.States (1263).Minimal_Complete_Action := (Shift, 96, 1271);
-            Table.States (1264).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1263).Kernel := To_Vector ((0 => (146, 122, 1, 
False)));
+            Table.States (1263).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1271)));
             Add_Action (Table.States (1264), 96, 1272);
             Add_Error (Table.States (1264));
-            Table.States (1264).Minimal_Complete_Action := (Shift, 96, 1272);
-            Table.States (1265).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1264).Kernel := To_Vector ((0 => (259, 122, 1, 
False)));
+            Table.States (1264).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1272)));
             Add_Action (Table.States (1265), 96, 1273);
             Add_Error (Table.States (1265));
-            Table.States (1265).Minimal_Complete_Action := (Shift, 96, 1273);
-            Table.States (1266).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1265).Kernel := To_Vector ((0 => (144, 301, 1, 
False)));
+            Table.States (1265).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1273)));
             Add_Action (Table.States (1266), 77, 1274);
             Add_Error (Table.States (1266));
-            Table.States (1266).Minimal_Complete_Action := (Shift, 77, 1274);
-            Table.States (1267).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1266).Kernel := To_Vector ((0 => (177, 167, 1, 
False)));
+            Table.States (1266).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 77, 1274)));
             Add_Action (Table.States (1267), 13, 1275);
             Add_Error (Table.States (1267));
-            Table.States (1267).Minimal_Complete_Action := (Shift, 13, 1275);
-            Table.States (1268).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1267).Kernel := To_Vector ((0 => (176, 159, 3, 
False)));
+            Table.States (1267).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 1275)));
             Add_Action (Table.States (1268), 96, 1276);
             Add_Error (Table.States (1268));
-            Table.States (1268).Minimal_Complete_Action := (Shift, 96, 1276);
-            Table.States (1269).Productions := WisiToken.To_Vector ((1 => 
(329, 0)));
+            Table.States (1268).Kernel := To_Vector ((0 => (319, 220, 1, 
False)));
+            Table.States (1268).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1276)));
+         end Subr_20;
+         procedure Subr_21
+         is begin
             Add_Action (Table.States (1269), (24, 72), (329, 0), 4, 
variant_0'Access, null);
-            Table.States (1269).Minimal_Complete_Action := (Reduce, 329, 4);
-            Table.States (1270).Productions := WisiToken.To_Vector ((1 => 
(327, 0)));
+            Table.States (1269).Kernel := To_Vector ((0 => (329, 150, 0, 
False)));
+            Table.States (1269).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 329, 4)));
             Add_Action (Table.States (1270), (15, 24, 28, 72, 104), (327, 0), 
7, variant_part_0'Access, null);
-            Table.States (1270).Minimal_Complete_Action := (Reduce, 327, 7);
-            Table.States (1271).Productions := WisiToken.To_Vector ((1 => 
(146, 0)));
+            Table.States (1270).Kernel := To_Vector ((0 => (327, 96, 0, 
False)));
+            Table.States (1270).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 327, 7)));
             Add_Action (Table.States (1271), (15, 24, 28, 72, 104), (146, 0), 
7, component_declaration_0'Access, null);
-            Table.States (1271).Minimal_Complete_Action := (Reduce, 146, 7);
-            Table.States (1272).Productions := WisiToken.To_Vector ((1 => 
(259, 0)));
+            Table.States (1271).Kernel := To_Vector ((0 => (146, 96, 0, 
False)));
+            Table.States (1271).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 146, 7)));
             Add_Action (Table.States (1272), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (259, 0), 12,
             private_extension_declaration_0'Access, null);
-            Table.States (1272).Minimal_Complete_Action := (Reduce, 259, 12);
-            Table.States (1273).Productions := WisiToken.To_Vector ((1 => 
(144, 0)));
+            Table.States (1272).Kernel := To_Vector ((0 => (259, 96, 0, 
False)));
+            Table.States (1272).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 259, 12)));
             Add_Action (Table.States (1273), (24, 104), (144, 0), 8, 
component_clause_0'Access, null);
-            Table.States (1273).Minimal_Complete_Action := (Reduce, 144, 8);
-            Table.States (1274).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1273).Kernel := To_Vector ((0 => (144, 96, 0, 
False)));
+            Table.States (1273).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 144, 8)));
             Add_Action (Table.States (1274), 72, Reduce, (253, 1), 0, null, 
null);
             Add_Action (Table.States (1274), 76, 431);
             Add_Error (Table.States (1274));
             Add_Goto (Table.States (1274), 199, 344);
             Add_Goto (Table.States (1274), 253, 1277);
-            Table.States (1274).Minimal_Complete_Action := (Reduce, 253, 0);
-            Table.States (1275).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1274).Kernel := To_Vector ((0 => (177, 77, 0, 
False)));
+            Table.States (1274).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 253, 0)));
             Add_Action (Table.States (1275), 4, 1);
             Add_Action (Table.States (1275), 5, 2);
             Add_Action (Table.States (1275), 13, Reduce, (132, 1), 0, null, 
null);
@@ -14110,34 +14409,35 @@ package body Ada_Process_LALR_Main is
             Add_Goto (Table.States (1275), 303, 101);
             Add_Goto (Table.States (1275), 306, 363);
             Add_Goto (Table.States (1275), 323, 114);
-            Table.States (1275).Minimal_Complete_Action := (Reduce, 218, 0);
-            Table.States (1276).Productions := WisiToken.To_Vector ((1 => 
(319, 0)));
+            Table.States (1275).Kernel := To_Vector ((0 => (176, 13, 2, 
False)));
+            Table.States (1275).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 218, 0)));
             Add_Action (Table.States (1276), (4, 5, 13, 15, 17, 18, 24, 25, 
27, 28, 29, 30, 31, 32, 36, 37, 40, 41, 46,
             47, 48, 49, 50, 51, 52, 57, 58, 60, 61, 63, 66, 69, 71, 73, 74, 
93, 104, 105, 106, 107), (319, 0), 13,
             task_type_declaration_0'Access, 
task_type_declaration_0_check'Access);
-            Table.States (1276).Minimal_Complete_Action := (Reduce, 319, 13);
-            Table.States (1277).Productions := WisiToken.To_Vector ((1 => 
(177, 0)));
+            Table.States (1276).Kernel := To_Vector ((0 => (319, 96, 0, 
False)));
+            Table.States (1276).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 319, 13)));
             Add_Action (Table.States (1277), (1 =>  72), (177, 0), 7, 
entry_body_formal_part_0'Access, null);
-            Table.States (1277).Minimal_Complete_Action := (Reduce, 177, 7);
-            Table.States (1278).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1277).Kernel := To_Vector ((0 => (177, 253, 0, 
False)));
+            Table.States (1277).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 177, 7)));
             Add_Action (Table.States (1278), 24, 1279);
             Add_Error (Table.States (1278));
-            Table.States (1278).Minimal_Complete_Action := (Shift, 24, 1279);
-            Table.States (1279).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1278).Kernel := To_Vector ((0 => (176, 218, 2, 
False)));
+            Table.States (1278).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 1279)));
             Add_Action (Table.States (1279), 96, Reduce, (220, 1), 0, null, 
null);
             Add_Action (Table.States (1279), 104, 149);
             Add_Error (Table.States (1279));
             Add_Goto (Table.States (1279), 220, 1280);
-            Table.States (1279).Minimal_Complete_Action := (Reduce, 220, 0);
-            Table.States (1280).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1279).Kernel := To_Vector ((0 => (176, 24, 1, 
False)));
+            Table.States (1279).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 220, 0)));
             Add_Action (Table.States (1280), 96, 1281);
             Add_Error (Table.States (1280));
-            Table.States (1280).Minimal_Complete_Action := (Shift, 96, 1281);
-            Table.States (1281).Productions := WisiToken.To_Vector ((1 => 
(176, 0)));
+            Table.States (1280).Kernel := To_Vector ((0 => (176, 220, 1, 
False)));
+            Table.States (1280).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 96, 1281)));
             Add_Action (Table.States (1281), (24, 25, 28, 29, 40, 46, 50), 
(176, 0), 12, entry_body_0'Access,
             entry_body_0_check'Access);
-            Table.States (1281).Minimal_Complete_Action := (Reduce, 176, 12);
-         end Subr_20;
+            Table.States (1281).Kernel := To_Vector ((0 => (176, 96, 0, 
False)));
+            Table.States (1281).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 176, 12)));
+         end Subr_21;
       begin
          Subr_1;
          Subr_2;
@@ -14159,6 +14459,7 @@ package body Ada_Process_LALR_Main is
          Subr_18;
          Subr_19;
          Subr_20;
+         Subr_21;
       end;
 
       WisiToken.Parse.LR.Parser.New_Parser
@@ -14167,7 +14468,7 @@ package body Ada_Process_LALR_Main is
          Lexer.New_Lexer (Trace.Descriptor),
          Table,
          Language_Fixes,
-         Language_Use_Minimal_Complete_Actions,
+         Language_Matching_Begin_Tokens,
          Language_String_ID_Set,
          User_Data,
          Max_Parallel         => 15,
diff --git a/packages/ada-mode/ada_process_lalr_main.ads 
b/packages/ada-mode/ada_process_lalr_main.ads
index 5697568..8ef164a 100644
--- a/packages/ada-mode/ada_process_lalr_main.ads
+++ b/packages/ada-mode/ada_process_lalr_main.ads
@@ -22,11 +22,10 @@ with WisiToken.Parse.LR.Parser;
 package Ada_Process_LALR_Main is
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access);
 
diff --git a/packages/ada-mode/ada_process_lr1_main.adb 
b/packages/ada-mode/ada_process_lr1_main.adb
index 7b574aa..593d0a4 100644
--- a/packages/ada-mode/ada_process_lr1_main.adb
+++ b/packages/ada-mode/ada_process_lr1_main.adb
@@ -20,7 +20,6 @@
 with Ada_Process_Actions; use Ada_Process_Actions;
 with WisiToken.Lexer.re2c;
 with ada_re2c_c;
-with WisiToken.Productions;
 package body Ada_Process_LR1_Main is
 
    package Lexer is new WisiToken.Lexer.re2c
@@ -30,10 +29,9 @@ package body Ada_Process_LR1_Main is
       ada_re2c_c.Next_Token);
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
       Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access;
@@ -46,884 +44,418 @@ package body Ada_Process_LR1_Main is
          First_Nonterminal => 108,
          Last_Nonterminal  => 332,
          Insert =>
-           (3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 1, 
3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 3,
-            3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 
2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3,
-            3, 2, 1, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 3, 
4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
          Delete =>
-           (3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 2, 3, 1, 3, 3, 3, 3, 1, 3, 2, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 3,
-            3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-            3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 
3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
          Push_Back =>
-           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2),
-         Ignore_Check_Fail  => 0,
+         Undo_Reduce =>
+           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+            2, 2, 2, 2, 2, 2, 2, 2, 2),
+         Minimal_Complete_Cost_Delta => -3,
+         Fast_Forward =>  2,
+         Matching_Begin =>  3,
+         Ignore_Check_Fail  => 2,
          Task_Count  => 0,
-         Cost_Limit  => 20,
          Check_Limit => 4,
-         Check_Delta_Limit => 200,
-         Enqueue_Limit => 15000);
+         Check_Delta_Limit => 100,
+         Enqueue_Limit => 45000);
 
-      function Productions return WisiToken.Productions.Prod_Arrays.Vector
+      function Actions return 
WisiToken.Parse.LR.Semantic_Action_Array_Arrays.Vector
       is begin
-         return Prods : WisiToken.Productions.Prod_Arrays.Vector do
-            Prods.Set_First (108);
-            Prods.Set_Last (332);
-            Set_Production (Prods (108), 108, 0);
-            Set_RHS (Prods (108), 0, (143, 107), null, null);
-            Set_Production (Prods (109), 109, 5);
-            Set_RHS (Prods (109), 0, (6, 36), null, null);
-            Set_RHS (Prods (109), 1, (6, 64), null, null);
-            Set_RHS (Prods (109), 2, (1 => 6), null, null);
-            Set_RHS (Prods (109), 3, (1 => 36), null, null);
-            Set_RHS (Prods (109), 4, (1 => 64), null, null);
-            Set_RHS (Prods (109), 5, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (110), 110, 3);
-            Set_RHS (Prods (110), 0, (6, 36), null, null);
-            Set_RHS (Prods (110), 1, (1 => 36), null, null);
-            Set_RHS (Prods (110), 2, (1 => 6), null, null);
-            Set_RHS (Prods (110), 3, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (111), 111, 5);
-            Set_RHS (Prods (111), 0, (6, 65, 36), null, null);
-            Set_RHS (Prods (111), 1, (6, 65), null, null);
-            Set_RHS (Prods (111), 2, (65, 36), null, null);
-            Set_RHS (Prods (111), 3, (1 => 65), null, null);
-            Set_RHS (Prods (111), 4, (1 => 36), null, null);
-            Set_RHS (Prods (111), 5, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (112), 112, 0);
-            Set_RHS (Prods (112), 0, (246, 312, 35, 6, 122, 96), 
abstract_subprogram_declaration_0'Access, null);
-            Set_Production (Prods (113), 113, 1);
-            Set_RHS (Prods (113), 0, (4, 104, 116, 253, 21, 218, 24, 220, 96), 
accept_statement_0'Access,
-            accept_statement_0_check'Access);
-            Set_RHS (Prods (113), 1, (4, 104, 116, 253, 96), 
accept_statement_1'Access, null);
-            Set_Production (Prods (114), 114, 2);
-            Set_RHS (Prods (114), 0, (241, 7, 270, 50, 253), 
access_definition_0'Access, null);
-            Set_RHS (Prods (114), 1, (241, 7, 270, 29, 252), 
access_definition_1'Access, null);
-            Set_RHS (Prods (114), 2, (241, 7, 208, 239), 
access_definition_2'Access, null);
-            Set_Production (Prods (115), 115, 1);
-            Set_RHS (Prods (115), 0, (76, 125, 77), 
actual_parameter_part_0'Access, null);
-            Set_RHS (Prods (115), 1, (76, 153, 77), 
actual_parameter_part_1'Access, null);
-            Set_Production (Prods (116), 116, 1);
-            Set_RHS (Prods (116), 0, (1 => 115), null, null);
-            Set_RHS (Prods (116), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (117), 117, 4);
-            Set_RHS (Prods (117), 0, (76, 192, 74, 41, 54, 77), 
aggregate_0'Access, null);
-            Set_RHS (Prods (117), 1, (76, 192, 74, 125, 77), 
aggregate_1'Access, null);
-            Set_RHS (Prods (117), 2, (76, 41, 54, 77), null, null);
-            Set_RHS (Prods (117), 3, (76, 153, 77), aggregate_3'Access, null);
-            Set_RHS (Prods (117), 4, (76, 125, 77), aggregate_4'Access, null);
-            Set_Production (Prods (118), 118, 1);
-            Set_RHS (Prods (118), 0, (1 => 8), null, null);
-            Set_RHS (Prods (118), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (119), 119, 1);
-            Set_RHS (Prods (119), 0, (10, 227), null, null);
-            Set_RHS (Prods (119), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (120), 120, 1);
-            Set_RHS (Prods (120), 0, (11, 76, 226, 77, 42, 147), 
array_type_definition_0'Access, null);
-            Set_RHS (Prods (120), 1, (11, 76, 168, 77, 42, 147), 
array_type_definition_1'Access, null);
-            Set_Production (Prods (121), 121, 3);
-            Set_RHS (Prods (121), 0, (28, 128, 71, 192, 96), 
aspect_clause_0'Access, null);
-            Set_RHS (Prods (121), 1, (1 => 182), null, null);
-            Set_RHS (Prods (121), 2, (1 => 281), null, null);
-            Set_RHS (Prods (121), 3, (1 => 127), null, null);
-            Set_Production (Prods (122), 122, 1);
-            Set_RHS (Prods (122), 0, (74, 125), 
aspect_specification_opt_0'Access, null);
-            Set_RHS (Prods (122), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (123), 123, 0);
-            Set_RHS (Prods (123), 0, (239, 82, 192, 96), 
assignment_statement_0'Access, null);
-            Set_Production (Prods (124), 124, 5);
-            Set_RHS (Prods (124), 0, (106, 87, 192), association_opt_0'Access, 
null);
-            Set_RHS (Prods (124), 1, (106, 87, 80), null, null);
-            Set_RHS (Prods (124), 2, (166, 87, 192), association_opt_2'Access, 
null);
-            Set_RHS (Prods (124), 3, (166, 87, 80), association_opt_3'Access, 
null);
-            Set_RHS (Prods (124), 4, (1 => 191), association_opt_4'Access, 
null);
-            Set_RHS (Prods (124), 5, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (125), 125, 1);
-            Set_RHS (Prods (125), 0, (125, 83, 124), null, null);
-            Set_RHS (Prods (125), 1, (1 => 124), null, null);
-            Set_Production (Prods (126), 126, 0);
-            Set_RHS (Prods (126), 0, (61, 324, 68, 5, 300, 24, 61, 96), 
asynchronous_select_0'Access, null);
-            Set_Production (Prods (127), 127, 0);
-            Set_RHS (Prods (127), 0, (28, 163, 71, 12, 192, 96), 
at_clause_0'Access, null);
-            Set_Production (Prods (128), 128, 0);
-            Set_RHS (Prods (128), 0, (239, 322, 129), null, null);
-            Set_Production (Prods (129), 129, 4);
-            Set_RHS (Prods (129), 0, (1 => 239), null, null);
-            Set_RHS (Prods (129), 1, (1 => 7), null, null);
-            Set_RHS (Prods (129), 2, (1 => 19), null, null);
-            Set_RHS (Prods (129), 3, (1 => 20), null, null);
-            Set_RHS (Prods (129), 4, (1 => 38), null, null);
-            Set_Production (Prods (130), 130, 2);
-            Set_RHS (Prods (130), 0, (1 => 95), null, null);
-            Set_RHS (Prods (130), 1, (1 => 94), null, null);
-            Set_RHS (Prods (130), 2, (1 => 78), null, null);
-            Set_Production (Prods (131), 131, 0);
-            Set_RHS (Prods (131), 0, (104, 81), block_label_0'Access, 
block_label_0_check'Access);
-            Set_Production (Prods (132), 132, 1);
-            Set_RHS (Prods (132), 0, (1 => 131), null, 
block_label_opt_0_check'Access);
-            Set_RHS (Prods (132), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (133), 133, 1);
-            Set_RHS (Prods (133), 0, (132, 17, 159, 13, 218, 24, 220, 96), 
block_statement_0'Access,
-            block_statement_0_check'Access);
-            Set_RHS (Prods (133), 1, (132, 13, 218, 24, 220, 96), 
block_statement_1'Access,
-            block_statement_1_check'Access);
-            Set_Production (Prods (134), 134, 1);
-            Set_RHS (Prods (134), 0, (1 => 263), null, null);
-            Set_RHS (Prods (134), 1, (1 => 135), null, null);
-            Set_Production (Prods (135), 135, 3);
-            Set_RHS (Prods (135), 0, (1 => 308), null, null);
-            Set_RHS (Prods (135), 1, (1 => 248), null, null);
-            Set_RHS (Prods (135), 2, (1 => 317), null, null);
-            Set_RHS (Prods (135), 3, (1 => 265), null, null);
-            Set_Production (Prods (136), 136, 0);
-            Set_RHS (Prods (136), 0, (15, 192, 35, 138), 
case_expression_0'Access, null);
-            Set_Production (Prods (137), 137, 0);
-            Set_RHS (Prods (137), 0, (72, 166, 87, 192), 
case_expression_alternative_0'Access, null);
-            Set_Production (Prods (138), 138, 1);
-            Set_RHS (Prods (138), 0, (138, 83, 137), 
case_expression_alternative_list_0'Access, null);
-            Set_RHS (Prods (138), 1, (1 => 137), null, null);
-            Set_Production (Prods (139), 139, 0);
-            Set_RHS (Prods (139), 0, (15, 192, 35, 141, 24, 15, 96), 
case_statement_0'Access, null);
-            Set_Production (Prods (140), 140, 0);
-            Set_RHS (Prods (140), 0, (72, 166, 87, 300), 
case_statement_alternative_0'Access, null);
-            Set_Production (Prods (141), 141, 1);
-            Set_RHS (Prods (141), 0, (141, 140), null, null);
-            Set_RHS (Prods (141), 1, (1 => 140), null, null);
-            Set_Production (Prods (142), 142, 4);
-            Set_RHS (Prods (142), 0, (1 => 332), null, null);
-            Set_RHS (Prods (142), 1, (1 => 315), null, null);
-            Set_RHS (Prods (142), 2, (49, 157), compilation_unit_2'Access, 
null);
-            Set_RHS (Prods (142), 3, (1 => 157), null, null);
-            Set_RHS (Prods (142), 4, (1 => 306), null, null);
-            Set_Production (Prods (143), 143, 1);
-            Set_RHS (Prods (143), 0, (143, 142), 
compilation_unit_list_0'Access, null);
-            Set_RHS (Prods (143), 1, (1 => 142), 
compilation_unit_list_1'Access, compilation_unit_list_1_check'Access);
-            Set_Production (Prods (144), 144, 0);
-            Set_RHS (Prods (144), 0, (104, 12, 301, 53, 301, 85, 301, 96), 
component_clause_0'Access, null);
-            Set_Production (Prods (145), 145, 1);
-            Set_RHS (Prods (145), 0, (145, 144), null, null);
-            Set_RHS (Prods (145), 1, (1 => 144), null, null);
-            Set_Production (Prods (146), 146, 1);
-            Set_RHS (Prods (146), 0, (219, 81, 147, 82, 192, 122, 96), 
component_declaration_0'Access, null);
-            Set_RHS (Prods (146), 1, (219, 81, 147, 122, 96), 
component_declaration_1'Access, null);
-            Set_Production (Prods (147), 147, 3);
-            Set_RHS (Prods (147), 0, (8, 314), null, null);
-            Set_RHS (Prods (147), 1, (1 => 314), null, null);
-            Set_RHS (Prods (147), 2, (8, 114), null, null);
-            Set_RHS (Prods (147), 3, (1 => 114), null, null);
-            Set_Production (Prods (148), 148, 1);
-            Set_RHS (Prods (148), 0, (1 => 146), null, null);
-            Set_RHS (Prods (148), 1, (1 => 121), null, null);
-            Set_Production (Prods (149), 149, 4);
-            Set_RHS (Prods (149), 0, (149, 148), null, null);
-            Set_RHS (Prods (149), 1, (149, 327), null, null);
-            Set_RHS (Prods (149), 2, (1 => 148), null, null);
-            Set_RHS (Prods (149), 3, (1 => 327), null, null);
-            Set_RHS (Prods (149), 4, (41, 96), component_list_4'Access, null);
-            Set_Production (Prods (150), 150, 1);
-            Set_RHS (Prods (150), 0, (1 => 149), null, null);
-            Set_RHS (Prods (150), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (151), 151, 6);
-            Set_RHS (Prods (151), 0, (1 => 222), null, null);
-            Set_RHS (Prods (151), 1, (1 => 139), null, null);
-            Set_RHS (Prods (151), 2, (1 => 232), null, null);
-            Set_RHS (Prods (151), 3, (1 => 133), null, null);
-            Set_RHS (Prods (151), 4, (1 => 196), null, null);
-            Set_RHS (Prods (151), 5, (1 => 113), null, null);
-            Set_RHS (Prods (151), 6, (1 => 298), null, null);
-            Set_Production (Prods (152), 152, 0);
-            Set_RHS (Prods (152), 0, (61, 178, 22, 300, 24, 61, 96), 
conditional_entry_call_0'Access, null);
-            Set_Production (Prods (153), 153, 2);
-            Set_RHS (Prods (153), 0, (1 => 221), null, null);
-            Set_RHS (Prods (153), 1, (1 => 136), null, null);
-            Set_RHS (Prods (153), 2, (1 => 273), null, null);
-            Set_Production (Prods (154), 154, 1);
-            Set_RHS (Prods (154), 0, (1 => 16), null, null);
-            Set_RHS (Prods (154), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (155), 155, 1);
-            Set_RHS (Prods (155), 0, (53, 277), null, null);
-            Set_RHS (Prods (155), 1, (1 => 224), null, null);
-            Set_Production (Prods (156), 156, 1);
-            Set_RHS (Prods (156), 0, (1 => 155), null, null);
-            Set_RHS (Prods (156), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (157), 157, 16);
-            Set_RHS (Prods (157), 0, (1 => 112), null, null);
-            Set_RHS (Prods (157), 1, (1 => 121), null, null);
-            Set_RHS (Prods (157), 2, (1 => 134), null, null);
-            Set_RHS (Prods (157), 3, (1 => 179), null, null);
-            Set_RHS (Prods (157), 4, (1 => 186), null, null);
-            Set_RHS (Prods (157), 5, (1 => 193), null, null);
-            Set_RHS (Prods (157), 6, (1 => 209), null, null);
-            Set_RHS (Prods (157), 7, (1 => 213), null, null);
-            Set_RHS (Prods (157), 8, (1 => 243), null, null);
-            Set_RHS (Prods (157), 9, (219, 81, 16, 82, 192, 96), 
declaration_9'Access, null);
-            Set_RHS (Prods (157), 10, (1 => 244), null, null);
-            Set_RHS (Prods (157), 11, (1 => 249), null, null);
-            Set_RHS (Prods (157), 12, (1 => 289), null, null);
-            Set_RHS (Prods (157), 13, (1 => 309), null, null);
-            Set_RHS (Prods (157), 14, (1 => 313), null, null);
-            Set_RHS (Prods (157), 15, (1 => 325), null, null);
-            Set_RHS (Prods (157), 16, (1 => 331), null, null);
-            Set_Production (Prods (158), 158, 3);
-            Set_RHS (Prods (158), 0, (158, 157), null, null);
-            Set_RHS (Prods (158), 1, (158, 257), null, null);
-            Set_RHS (Prods (158), 2, (1 => 157), null, null);
-            Set_RHS (Prods (158), 3, (1 => 257), null, null);
-            Set_Production (Prods (159), 159, 1);
-            Set_RHS (Prods (159), 0, (1 => 158), null, null);
-            Set_RHS (Prods (159), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (160), 160, 0);
-            Set_RHS (Prods (160), 0, (161, 300), null, null);
-            Set_Production (Prods (161), 161, 1);
-            Set_RHS (Prods (161), 0, (18, 70, 192, 96), 
delay_statement_0'Access, null);
-            Set_RHS (Prods (161), 1, (18, 192, 96), delay_statement_1'Access, 
null);
-            Set_Production (Prods (162), 162, 1);
-            Set_RHS (Prods (162), 0, (110, 39, 239, 119, 74, 280), 
derived_type_definition_0'Access, null);
-            Set_RHS (Prods (162), 1, (110, 39, 239, 156), 
derived_type_definition_1'Access, null);
-            Set_Production (Prods (163), 163, 1);
-            Set_RHS (Prods (163), 0, (1 => 104), null, null);
-            Set_RHS (Prods (163), 1, (1 => 105), null, null);
-            Set_Production (Prods (164), 164, 1);
-            Set_RHS (Prods (164), 0, (1 => 163), null, null);
-            Set_RHS (Prods (164), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (165), 165, 3);
-            Set_RHS (Prods (165), 0, (1 => 191), null, null);
-            Set_RHS (Prods (165), 1, (40, 41, 239), null, null);
-            Set_RHS (Prods (165), 2, (1 => 277), null, null);
-            Set_RHS (Prods (165), 3, (1 => 44), null, null);
-            Set_Production (Prods (166), 166, 2);
-            Set_RHS (Prods (166), 0, (166, 79, 165), null, null);
-            Set_RHS (Prods (166), 1, (1 => 165), null, null);
-            Set_RHS (Prods (166), 2, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (167), 167, 1);
-            Set_RHS (Prods (167), 0, (1 => 314), null, null);
-            Set_RHS (Prods (167), 1, (1 => 277), null, null);
-            Set_Production (Prods (168), 168, 1);
-            Set_RHS (Prods (168), 0, (168, 83, 167), null, null);
-            Set_RHS (Prods (168), 1, (1 => 167), null, null);
-            Set_Production (Prods (169), 169, 2);
-            Set_RHS (Prods (169), 0, (76, 80, 77), null, null);
-            Set_RHS (Prods (169), 1, (76, 171, 77), 
discriminant_part_opt_1'Access, null);
-            Set_RHS (Prods (169), 2, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (170), 170, 4);
-            Set_RHS (Prods (170), 0, (219, 81, 242, 82, 192), null, null);
-            Set_RHS (Prods (170), 1, (219, 81, 114, 82, 192), null, null);
-            Set_RHS (Prods (170), 2, (219, 81, 242), null, null);
-            Set_RHS (Prods (170), 3, (219, 81, 114), null, null);
-            Set_RHS (Prods (170), 4, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (171), 171, 1);
-            Set_RHS (Prods (171), 0, (171, 96, 170), null, null);
-            Set_RHS (Prods (171), 1, (1 => 170), null, null);
-            Set_Production (Prods (172), 172, 0);
-            Set_RHS (Prods (172), 0, (23, 192, 68, 192), 
elsif_expression_item_0'Access, null);
-            Set_Production (Prods (173), 173, 1);
-            Set_RHS (Prods (173), 0, (173, 172), null, null);
-            Set_RHS (Prods (173), 1, (1 => 172), null, null);
-            Set_Production (Prods (174), 174, 0);
-            Set_RHS (Prods (174), 0, (23, 192, 68, 300), 
elsif_statement_item_0'Access, null);
-            Set_Production (Prods (175), 175, 1);
-            Set_RHS (Prods (175), 0, (175, 174), null, null);
-            Set_RHS (Prods (175), 1, (1 => 174), null, null);
-            Set_Production (Prods (176), 176, 0);
-            Set_RHS (Prods (176), 0, (25, 104, 177, 72, 192, 35, 159, 13, 218, 
24, 220, 96), entry_body_0'Access,
-            entry_body_0_check'Access);
-            Set_Production (Prods (177), 177, 1);
-            Set_RHS (Prods (177), 0, (76, 28, 104, 33, 167, 77, 253), 
entry_body_formal_part_0'Access, null);
-            Set_RHS (Prods (177), 1, (1 => 253), null, null);
-            Set_Production (Prods (178), 178, 1);
-            Set_RHS (Prods (178), 0, (261, 300), null, null);
-            Set_RHS (Prods (178), 1, (239, 300), null, null);
-            Set_Production (Prods (179), 179, 1);
-            Set_RHS (Prods (179), 0, (246, 25, 104, 76, 167, 77, 253, 122, 
96), entry_declaration_0'Access, null);
-            Set_RHS (Prods (179), 1, (246, 25, 104, 253, 122, 96), 
entry_declaration_1'Access, null);
-            Set_Production (Prods (180), 180, 1);
-            Set_RHS (Prods (180), 0, (1 => 104), null, null);
-            Set_RHS (Prods (180), 1, (1 => 106), null, null);
-            Set_Production (Prods (181), 181, 1);
-            Set_RHS (Prods (181), 0, (181, 83, 180), null, null);
-            Set_RHS (Prods (181), 1, (1 => 180), null, null);
-            Set_Production (Prods (182), 182, 0);
-            Set_RHS (Prods (182), 0, (28, 239, 71, 117, 96), 
enumeration_representation_clause_0'Access, null);
-            Set_Production (Prods (183), 183, 0);
-            Set_RHS (Prods (183), 0, (76, 181, 77), 
enumeration_type_definition_0'Access, null);
-            Set_Production (Prods (184), 184, 1);
-            Set_RHS (Prods (184), 0, (1 => 239), null, null);
-            Set_RHS (Prods (184), 1, (1 => 44), null, null);
-            Set_Production (Prods (185), 185, 1);
-            Set_RHS (Prods (185), 0, (185, 79, 184), null, null);
-            Set_RHS (Prods (185), 1, (1 => 184), null, null);
-            Set_Production (Prods (186), 186, 0);
-            Set_RHS (Prods (186), 0, (219, 81, 26, 96), 
exception_declaration_0'Access, null);
-            Set_Production (Prods (187), 187, 1);
-            Set_RHS (Prods (187), 0, (72, 104, 81, 185, 87, 300), 
exception_handler_0'Access, null);
-            Set_RHS (Prods (187), 1, (72, 185, 87, 300), 
exception_handler_1'Access, null);
-            Set_Production (Prods (188), 188, 2);
-            Set_RHS (Prods (188), 0, (188, 187), null, null);
-            Set_RHS (Prods (188), 1, (1 => 187), null, null);
-            Set_RHS (Prods (188), 2, (1 => 257), null, null);
-            Set_Production (Prods (189), 189, 1);
-            Set_RHS (Prods (189), 0, (1 => 188), null, null);
-            Set_RHS (Prods (189), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (190), 190, 1);
-            Set_RHS (Prods (190), 0, (27, 220, 72, 192, 96), 
exit_statement_0'Access, null);
-            Set_RHS (Prods (190), 1, (27, 220, 96), exit_statement_1'Access, 
null);
-            Set_Production (Prods (191), 191, 5);
-            Set_RHS (Prods (191), 0, (1 => 287), null, null);
-            Set_RHS (Prods (191), 1, (1 => 282), null, null);
-            Set_RHS (Prods (191), 2, (1 => 283), null, null);
-            Set_RHS (Prods (191), 3, (1 => 284), null, null);
-            Set_RHS (Prods (191), 4, (1 => 285), null, null);
-            Set_RHS (Prods (191), 5, (1 => 286), null, null);
-            Set_Production (Prods (192), 192, 1);
-            Set_RHS (Prods (192), 0, (1 => 191), null, null);
-            Set_RHS (Prods (192), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (193), 193, 0);
-            Set_RHS (Prods (193), 0, (246, 207, 35, 256, 122, 96), 
expression_function_declaration_0'Access, null);
-            Set_Production (Prods (194), 194, 1);
-            Set_RHS (Prods (194), 0, (104, 81, 118, 154, 292, 82, 192), 
extended_return_object_declaration_0'Access,
-            null);
-            Set_RHS (Prods (194), 1, (104, 81, 118, 154, 292), 
extended_return_object_declaration_1'Access, null);
-            Set_Production (Prods (195), 195, 1);
-            Set_RHS (Prods (195), 0, (1 => 194), null, null);
-            Set_RHS (Prods (195), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (196), 196, 1);
-            Set_RHS (Prods (196), 0, (58, 195, 21, 218, 24, 58, 96), 
extended_return_statement_0'Access, null);
-            Set_RHS (Prods (196), 1, (58, 194, 96), 
extended_return_statement_1'Access, null);
-            Set_Production (Prods (197), 197, 3);
-            Set_RHS (Prods (197), 0, (258, 100, 258), null, null);
-            Set_RHS (Prods (197), 1, (1 => 258), null, null);
-            Set_RHS (Prods (197), 2, (3, 258), null, null);
-            Set_RHS (Prods (197), 3, (40, 258), null, null);
-            Set_Production (Prods (198), 198, 3);
-            Set_RHS (Prods (198), 0, (219, 81, 236, 241, 239, 82, 192, 122, 
96), formal_object_declaration_0'Access,
-            null);
-            Set_RHS (Prods (198), 1, (219, 81, 236, 114, 82, 192, 122, 96), 
formal_object_declaration_1'Access, null);
-            Set_RHS (Prods (198), 2, (219, 81, 236, 241, 239, 122, 96), 
formal_object_declaration_2'Access, null);
-            Set_RHS (Prods (198), 3, (219, 81, 236, 114, 122, 96), 
formal_object_declaration_3'Access, null);
-            Set_Production (Prods (199), 199, 0);
-            Set_RHS (Prods (199), 0, (76, 255, 77), formal_part_0'Access, 
null);
-            Set_Production (Prods (200), 200, 3);
-            Set_RHS (Prods (200), 0, (74, 312, 35, 6, 310, 122, 96), 
formal_subprogram_declaration_0'Access, null);
-            Set_RHS (Prods (200), 1, (74, 312, 35, 310, 122, 96), 
formal_subprogram_declaration_1'Access, null);
-            Set_RHS (Prods (200), 2, (74, 312, 35, 6, 122, 96), 
formal_subprogram_declaration_2'Access, null);
-            Set_RHS (Prods (200), 3, (74, 312, 122, 96), 
formal_subprogram_declaration_3'Access, null);
-            Set_Production (Prods (201), 201, 2);
-            Set_RHS (Prods (201), 0, (69, 104, 169, 35, 202, 122, 96), 
formal_type_declaration_0'Access, null);
-            Set_RHS (Prods (201), 1, (69, 104, 169, 35, 65, 122, 96), 
formal_type_declaration_1'Access, null);
-            Set_RHS (Prods (201), 2, (69, 104, 169, 122, 96), 
formal_type_declaration_2'Access, null);
-            Set_Production (Prods (202), 202, 10);
-            Set_RHS (Prods (202), 0, (111, 49), null, null);
-            Set_RHS (Prods (202), 1, (1 => 203), null, null);
-            Set_RHS (Prods (202), 2, (76, 80, 77), null, null);
-            Set_RHS (Prods (202), 3, (53, 80), null, null);
-            Set_RHS (Prods (202), 4, (38, 80), null, null);
-            Set_RHS (Prods (202), 5, (20, 80), null, null);
-            Set_RHS (Prods (202), 6, (19, 80, 20, 80), null, null);
-            Set_RHS (Prods (202), 7, (19, 80), null, null);
-            Set_RHS (Prods (202), 8, (1 => 120), null, null);
-            Set_RHS (Prods (202), 9, (1 => 114), null, null);
-            Set_RHS (Prods (202), 10, (1 => 228), null, null);
-            Set_Production (Prods (203), 203, 1);
-            Set_RHS (Prods (203), 0, (109, 39, 239, 119, 74, 49), 
formal_derived_type_definition_0'Access, null);
-            Set_RHS (Prods (203), 1, (109, 39, 239, 119), 
formal_derived_type_definition_1'Access, null);
-            Set_Production (Prods (204), 204, 0);
-            Set_RHS (Prods (204), 0, (74, 47, 239, 35, 39, 239, 205, 122, 96), 
formal_package_declaration_0'Access,
-            null);
-            Set_Production (Prods (205), 205, 1);
-            Set_RHS (Prods (205), 0, (76, 80, 77), null, null);
-            Set_RHS (Prods (205), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (206), 206, 2);
-            Set_RHS (Prods (206), 0, (69, 104, 169, 35, 326, 122, 96), 
full_type_declaration_0'Access, null);
-            Set_RHS (Prods (206), 1, (1 => 319), null, null);
-            Set_RHS (Prods (206), 2, (1 => 271), null, null);
-            Set_Production (Prods (207), 207, 0);
-            Set_RHS (Prods (207), 0, (29, 239, 252), 
function_specification_0'Access,
-            function_specification_0_check'Access);
-            Set_Production (Prods (208), 208, 2);
-            Set_RHS (Prods (208), 0, (1 => 9), null, null);
-            Set_RHS (Prods (208), 1, (1 => 16), null, null);
-            Set_RHS (Prods (208), 2, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (209), 209, 1);
-            Set_RHS (Prods (209), 0, (1 => 216), null, null);
-            Set_RHS (Prods (209), 1, (1 => 214), null, null);
-            Set_Production (Prods (210), 210, 1);
-            Set_RHS (Prods (210), 0, (30, 211), generic_formal_part_0'Access, 
null);
-            Set_RHS (Prods (210), 1, (1 => 30), generic_formal_part_1'Access, 
null);
-            Set_Production (Prods (211), 211, 1);
-            Set_RHS (Prods (211), 0, (211, 212), null, null);
-            Set_RHS (Prods (211), 1, (1 => 212), null, null);
-            Set_Production (Prods (212), 212, 5);
-            Set_RHS (Prods (212), 0, (1 => 198), null, null);
-            Set_RHS (Prods (212), 1, (1 => 201), null, null);
-            Set_RHS (Prods (212), 2, (1 => 200), null, null);
-            Set_RHS (Prods (212), 3, (1 => 204), null, null);
-            Set_RHS (Prods (212), 4, (1 => 257), null, null);
-            Set_RHS (Prods (212), 5, (1 => 331), null, null);
-            Set_Production (Prods (213), 213, 2);
-            Set_RHS (Prods (213), 0, (47, 239, 35, 39, 239, 122, 96), 
generic_instantiation_0'Access, null);
-            Set_RHS (Prods (213), 1, (246, 50, 239, 35, 39, 239, 122, 96), 
generic_instantiation_1'Access, null);
-            Set_RHS (Prods (213), 2, (246, 29, 239, 35, 39, 239, 122, 96), 
generic_instantiation_2'Access, null);
-            Set_Production (Prods (214), 214, 0);
-            Set_RHS (Prods (214), 0, (210, 251, 96), 
generic_package_declaration_0'Access, null);
-            Set_Production (Prods (215), 215, 2);
-            Set_RHS (Prods (215), 0, (30, 47, 239, 56, 239, 122, 96), 
generic_renaming_declaration_0'Access, null);
-            Set_RHS (Prods (215), 1, (30, 50, 239, 56, 239, 122, 96), 
generic_renaming_declaration_1'Access, null);
-            Set_RHS (Prods (215), 2, (30, 29, 239, 56, 239, 122, 96), 
generic_renaming_declaration_2'Access, null);
-            Set_Production (Prods (216), 216, 0);
-            Set_RHS (Prods (216), 0, (210, 312, 122, 96), 
generic_subprogram_declaration_0'Access, null);
-            Set_Production (Prods (217), 217, 0);
-            Set_RHS (Prods (217), 0, (93, 104, 90), goto_label_0'Access, null);
-            Set_Production (Prods (218), 218, 1);
-            Set_RHS (Prods (218), 0, (300, 26, 189), 
handled_sequence_of_statements_0'Access, null);
-            Set_RHS (Prods (218), 1, (1 => 300), null, null);
-            Set_Production (Prods (219), 219, 1);
-            Set_RHS (Prods (219), 0, (219, 83, 104), identifier_list_0'Access, 
null);
-            Set_RHS (Prods (219), 1, (1 => 104), null, null);
-            Set_Production (Prods (220), 220, 1);
-            Set_RHS (Prods (220), 0, (1 => 104), null, 
identifier_opt_0_check'Access);
-            Set_RHS (Prods (220), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (221), 221, 3);
-            Set_RHS (Prods (221), 0, (32, 192, 68, 192, 173, 22, 192), 
if_expression_0'Access, null);
-            Set_RHS (Prods (221), 1, (32, 192, 68, 192, 22, 192), 
if_expression_1'Access, null);
-            Set_RHS (Prods (221), 2, (32, 192, 68, 192, 173), 
if_expression_2'Access, null);
-            Set_RHS (Prods (221), 3, (32, 192, 68, 192), 
if_expression_3'Access, null);
-            Set_Production (Prods (222), 222, 3);
-            Set_RHS (Prods (222), 0, (32, 192, 68, 300, 175, 22, 300, 24, 32, 
96), if_statement_0'Access, null);
-            Set_RHS (Prods (222), 1, (32, 192, 68, 300, 22, 300, 24, 32, 96), 
if_statement_1'Access, null);
-            Set_RHS (Prods (222), 2, (32, 192, 68, 300, 175, 24, 32, 96), 
if_statement_2'Access, null);
-            Set_RHS (Prods (222), 3, (32, 192, 68, 300, 24, 32, 96), 
if_statement_3'Access, null);
-            Set_Production (Prods (223), 223, 1);
-            Set_RHS (Prods (223), 0, (69, 104, 169, 35, 65, 96), 
incomplete_type_declaration_0'Access, null);
-            Set_RHS (Prods (223), 1, (69, 104, 169, 96), 
incomplete_type_declaration_1'Access, null);
-            Set_Production (Prods (224), 224, 0);
-            Set_RHS (Prods (224), 0, (76, 168, 77), index_constraint_0'Access, 
null);
-            Set_Production (Prods (225), 225, 0);
-            Set_RHS (Prods (225), 0, (239, 53, 80), null, null);
-            Set_Production (Prods (226), 226, 1);
-            Set_RHS (Prods (226), 0, (226, 83, 225), null, null);
-            Set_RHS (Prods (226), 1, (1 => 225), null, null);
-            Set_Production (Prods (227), 227, 1);
-            Set_RHS (Prods (227), 0, (227, 10, 239), interface_list_0'Access, 
null);
-            Set_RHS (Prods (227), 1, (1 => 239), interface_list_1'Access, 
null);
-            Set_Production (Prods (228), 228, 8);
-            Set_RHS (Prods (228), 0, (36, 34, 10, 227), null, null);
-            Set_RHS (Prods (228), 1, (66, 34, 10, 227), null, null);
-            Set_RHS (Prods (228), 2, (51, 34, 10, 227), null, null);
-            Set_RHS (Prods (228), 3, (64, 34, 10, 227), null, null);
-            Set_RHS (Prods (228), 4, (36, 34), null, null);
-            Set_RHS (Prods (228), 5, (66, 34), null, null);
-            Set_RHS (Prods (228), 6, (51, 34), null, null);
-            Set_RHS (Prods (228), 7, (64, 34), null, null);
-            Set_RHS (Prods (228), 8, (1 => 34), null, null);
-            Set_Production (Prods (229), 229, 1);
-            Set_RHS (Prods (229), 0, (73, 192), iteration_scheme_0'Access, 
null);
-            Set_RHS (Prods (229), 1, (28, 231), iteration_scheme_1'Access, 
null);
-            Set_Production (Prods (230), 230, 5);
-            Set_RHS (Prods (230), 0, (104, 81, 314, 42, 59, 239), null, null);
-            Set_RHS (Prods (230), 1, (104, 81, 314, 42, 239), null, null);
-            Set_RHS (Prods (230), 2, (104, 33, 59, 167), 
iterator_specification_2'Access, null);
-            Set_RHS (Prods (230), 3, (104, 42, 59, 239), null, null);
-            Set_RHS (Prods (230), 4, (104, 42, 239), null, null);
-            Set_RHS (Prods (230), 5, (104, 33, 167), 
iterator_specification_5'Access, null);
-            Set_Production (Prods (231), 231, 1);
-            Set_RHS (Prods (231), 0, (1 => 230), null, null);
-            Set_RHS (Prods (231), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (232), 232, 1);
-            Set_RHS (Prods (232), 0, (132, 229, 37, 300, 24, 37, 220, 96), 
loop_statement_0'Access,
-            loop_statement_0_check'Access);
-            Set_RHS (Prods (232), 1, (132, 37, 300, 24, 37, 220, 96), 
loop_statement_1'Access,
-            loop_statement_1_check'Access);
-            Set_Production (Prods (233), 233, 1);
-            Set_RHS (Prods (233), 0, (233, 79, 234), null, null);
-            Set_RHS (Prods (233), 1, (1 => 234), null, null);
-            Set_Production (Prods (234), 234, 1);
-            Set_RHS (Prods (234), 0, (1 => 301), null, null);
-            Set_RHS (Prods (234), 1, (1 => 277), null, null);
-            Set_Production (Prods (235), 235, 1);
-            Set_RHS (Prods (235), 0, (12, 38, 192, 96), null, null);
-            Set_RHS (Prods (235), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (236), 236, 3);
-            Set_RHS (Prods (236), 0, (1 => 33), null, null);
-            Set_RHS (Prods (236), 1, (33, 45), null, null);
-            Set_RHS (Prods (236), 2, (1 => 45), null, null);
-            Set_RHS (Prods (236), 3, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (237), 237, 3);
-            Set_RHS (Prods (237), 0, (1 => 99), null, null);
-            Set_RHS (Prods (237), 1, (1 => 97), null, null);
-            Set_RHS (Prods (237), 2, (1 => 38), null, null);
-            Set_RHS (Prods (237), 3, (1 => 55), null, null);
-            Set_Production (Prods (238), 238, 1);
-            Set_RHS (Prods (238), 0, (238, 83, 239), null, null);
-            Set_RHS (Prods (238), 1, (1 => 239), null, null);
-            Set_Production (Prods (239), 239, 7);
-            Set_RHS (Prods (239), 0, (239, 76, 278, 77), name_0'Access, null);
-            Set_RHS (Prods (239), 1, (239, 115), name_1'Access, null);
-            Set_RHS (Prods (239), 2, (1 => 293), null, name_2_check'Access);
-            Set_RHS (Prods (239), 3, (1 => 128), null, null);
-            Set_RHS (Prods (239), 4, (1 => 272), null, null);
-            Set_RHS (Prods (239), 5, (1 => 104), name_5'Access, 
name_5_check'Access);
-            Set_RHS (Prods (239), 6, (1 => 106), null, null);
-            Set_RHS (Prods (239), 7, (1 => 105), null, name_7_check'Access);
-            Set_Production (Prods (240), 240, 1);
-            Set_RHS (Prods (240), 0, (1 => 239), null, 
name_opt_0_check'Access);
-            Set_RHS (Prods (240), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (241), 241, 1);
-            Set_RHS (Prods (241), 0, (40, 41), null, null);
-            Set_RHS (Prods (241), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (242), 242, 3);
-            Set_RHS (Prods (242), 0, (1 => 104), 
null_exclusion_opt_name_type_0'Access, null);
-            Set_RHS (Prods (242), 1, (1 => 293), 
null_exclusion_opt_name_type_1'Access, null);
-            Set_RHS (Prods (242), 2, (40, 41, 104), 
null_exclusion_opt_name_type_2'Access, null);
-            Set_RHS (Prods (242), 3, (40, 41, 293), 
null_exclusion_opt_name_type_3'Access, null);
-            Set_Production (Prods (243), 243, 0);
-            Set_RHS (Prods (243), 0, (246, 262, 35, 41, 122, 96), 
null_procedure_declaration_0'Access, null);
-            Set_Production (Prods (244), 244, 7);
-            Set_RHS (Prods (244), 0, (219, 81, 118, 154, 314, 82, 192, 122, 
96), object_declaration_0'Access, null);
-            Set_RHS (Prods (244), 1, (219, 81, 118, 154, 114, 82, 192, 122, 
96), object_declaration_1'Access, null);
-            Set_RHS (Prods (244), 2, (219, 81, 118, 154, 120, 82, 192, 122, 
96), object_declaration_2'Access, null);
-            Set_RHS (Prods (244), 3, (219, 81, 118, 154, 314, 122, 96), 
object_declaration_3'Access, null);
-            Set_RHS (Prods (244), 4, (219, 81, 118, 154, 114, 122, 96), 
object_declaration_4'Access, null);
-            Set_RHS (Prods (244), 5, (219, 81, 118, 154, 120, 122, 96), 
object_declaration_5'Access, null);
-            Set_RHS (Prods (244), 6, (1 => 305), null, null);
-            Set_RHS (Prods (244), 7, (1 => 304), null, null);
-            Set_Production (Prods (245), 245, 2);
-            Set_RHS (Prods (245), 0, (104, 81, 241, 239, 56, 239, 122, 96), 
object_renaming_declaration_0'Access,
-            null);
-            Set_RHS (Prods (245), 1, (104, 81, 114, 56, 239, 122, 96), 
object_renaming_declaration_1'Access, null);
-            Set_RHS (Prods (245), 2, (104, 81, 26, 56, 239, 122, 96), 
object_renaming_declaration_2'Access, null);
-            Set_Production (Prods (246), 246, 2);
-            Set_RHS (Prods (246), 0, (40, 46), 
overriding_indicator_opt_0'Access, null);
-            Set_RHS (Prods (246), 1, (1 => 46), 
overriding_indicator_opt_1'Access, null);
-            Set_RHS (Prods (246), 2, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (247), 247, 1);
-            Set_RHS (Prods (247), 0, (47, 14, 239, 122, 35, 159, 13, 218, 24, 
240, 96), package_body_0'Access,
-            package_body_0_check'Access);
-            Set_RHS (Prods (247), 1, (47, 14, 239, 122, 35, 159, 24, 240, 96), 
package_body_1'Access,
-            package_body_1_check'Access);
-            Set_Production (Prods (248), 248, 0);
-            Set_RHS (Prods (248), 0, (47, 14, 239, 35, 60, 122, 96), 
package_body_stub_0'Access, null);
-            Set_Production (Prods (249), 249, 0);
-            Set_RHS (Prods (249), 0, (251, 96), package_declaration_0'Access, 
null);
-            Set_Production (Prods (250), 250, 0);
-            Set_RHS (Prods (250), 0, (47, 239, 56, 239, 122, 96), 
package_renaming_declaration_0'Access, null);
-            Set_Production (Prods (251), 251, 1);
-            Set_RHS (Prods (251), 0, (47, 239, 122, 35, 159, 49, 159, 24, 
240), package_specification_0'Access,
-            package_specification_0_check'Access);
-            Set_RHS (Prods (251), 1, (47, 239, 122, 35, 159, 24, 240), 
package_specification_1'Access,
-            package_specification_1_check'Access);
-            Set_Production (Prods (252), 252, 1);
-            Set_RHS (Prods (252), 0, (199, 291), 
parameter_and_result_profile_0'Access, null);
-            Set_RHS (Prods (252), 1, (1 => 291), null, null);
-            Set_Production (Prods (253), 253, 1);
-            Set_RHS (Prods (253), 0, (1 => 199), null, null);
-            Set_RHS (Prods (253), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (254), 254, 4);
-            Set_RHS (Prods (254), 0, (219, 81, 118, 236, 241, 239, 82, 192), 
parameter_specification_0'Access, null);
-            Set_RHS (Prods (254), 1, (219, 81, 118, 236, 241, 239), 
parameter_specification_1'Access, null);
-            Set_RHS (Prods (254), 2, (219, 81, 118, 114, 82, 192), 
parameter_specification_2'Access, null);
-            Set_RHS (Prods (254), 3, (219, 81, 118, 114), 
parameter_specification_3'Access, null);
-            Set_RHS (Prods (254), 4, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (255), 255, 1);
-            Set_RHS (Prods (255), 0, (255, 96, 254), 
parameter_specification_list_0'Access, null);
-            Set_RHS (Prods (255), 1, (1 => 254), null, null);
-            Set_Production (Prods (256), 256, 2);
-            Set_RHS (Prods (256), 0, (76, 192, 77), paren_expression_0'Access, 
null);
-            Set_RHS (Prods (256), 1, (76, 125, 77), paren_expression_1'Access, 
null);
-            Set_RHS (Prods (256), 2, (76, 153, 77), paren_expression_2'Access, 
null);
-            Set_Production (Prods (257), 257, 2);
-            Set_RHS (Prods (257), 0, (48, 104, 76, 125, 77, 96), 
pragma_g_0'Access, null);
-            Set_RHS (Prods (257), 1, (48, 104, 76, 153, 77, 96), 
pragma_g_1'Access, null);
-            Set_RHS (Prods (257), 2, (48, 104, 96), pragma_g_2'Access, null);
-            Set_Production (Prods (258), 258, 4);
-            Set_RHS (Prods (258), 0, (1 => 103), primary_0'Access, null);
-            Set_RHS (Prods (258), 1, (1 => 41), null, null);
-            Set_RHS (Prods (258), 2, (1 => 117), primary_2'Access, null);
-            Set_RHS (Prods (258), 3, (1 => 239), null, null);
-            Set_RHS (Prods (258), 4, (39, 239), primary_4'Access, null);
-            Set_Production (Prods (259), 259, 0);
-            Set_RHS (Prods (259), 0, (69, 104, 169, 35, 109, 39, 314, 119, 74, 
49, 122, 96),
-            private_extension_declaration_0'Access, null);
-            Set_Production (Prods (260), 260, 0);
-            Set_RHS (Prods (260), 0, (69, 104, 169, 35, 111, 49, 122, 96), 
private_type_declaration_0'Access, null);
-            Set_Production (Prods (261), 261, 0);
-            Set_RHS (Prods (261), 0, (239, 96), 
procedure_call_statement_0'Access, null);
-            Set_Production (Prods (262), 262, 0);
-            Set_RHS (Prods (262), 0, (50, 239, 253), 
procedure_specification_0'Access,
-            procedure_specification_0_check'Access);
-            Set_Production (Prods (263), 263, 3);
-            Set_RHS (Prods (263), 0, (1 => 307), null, null);
-            Set_RHS (Prods (263), 1, (1 => 247), null, null);
-            Set_RHS (Prods (263), 2, (1 => 316), null, null);
-            Set_RHS (Prods (263), 3, (1 => 264), null, null);
-            Set_Production (Prods (264), 264, 0);
-            Set_RHS (Prods (264), 0, (51, 14, 104, 122, 35, 269, 24, 220, 96), 
protected_body_0'Access,
-            protected_body_0_check'Access);
-            Set_Production (Prods (265), 265, 0);
-            Set_RHS (Prods (265), 0, (51, 14, 104, 35, 60, 122, 96), 
protected_body_stub_0'Access, null);
-            Set_Production (Prods (266), 266, 1);
-            Set_RHS (Prods (266), 0, (159, 49, 159, 24, 220), 
protected_definition_0'Access,
-            protected_definition_0_check'Access);
-            Set_RHS (Prods (266), 1, (159, 24, 220), 
protected_definition_1'Access,
-            protected_definition_1_check'Access);
-            Set_Production (Prods (267), 267, 5);
-            Set_RHS (Prods (267), 0, (1 => 309), null, null);
-            Set_RHS (Prods (267), 1, (1 => 307), null, null);
-            Set_RHS (Prods (267), 2, (1 => 176), null, null);
-            Set_RHS (Prods (267), 3, (1 => 193), null, null);
-            Set_RHS (Prods (267), 4, (1 => 243), null, null);
-            Set_RHS (Prods (267), 5, (1 => 121), null, null);
-            Set_Production (Prods (268), 268, 1);
-            Set_RHS (Prods (268), 0, (268, 267), null, null);
-            Set_RHS (Prods (268), 1, (1 => 267), null, null);
-            Set_Production (Prods (269), 269, 1);
-            Set_RHS (Prods (269), 0, (1 => 268), null, null);
-            Set_RHS (Prods (269), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (270), 270, 1);
-            Set_RHS (Prods (270), 0, (1 => 51), null, null);
-            Set_RHS (Prods (270), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (271), 271, 1);
-            Set_RHS (Prods (271), 0, (51, 69, 104, 169, 122, 35, 39, 227, 74, 
266, 96),
-            protected_type_declaration_0'Access, 
protected_type_declaration_0_check'Access);
-            Set_RHS (Prods (271), 1, (51, 69, 104, 169, 122, 35, 266, 96), 
protected_type_declaration_1'Access,
-            protected_type_declaration_1_check'Access);
-            Set_Production (Prods (272), 272, 0);
-            Set_RHS (Prods (272), 0, (239, 322, 117), 
qualified_expression_0'Access, null);
-            Set_Production (Prods (273), 273, 0);
-            Set_RHS (Prods (273), 0, (28, 274, 230, 87, 192), 
quantified_expression_0'Access, null);
-            Set_Production (Prods (274), 274, 1);
-            Set_RHS (Prods (274), 0, (1 => 9), null, null);
-            Set_RHS (Prods (274), 1, (1 => 62), null, null);
-            Set_Production (Prods (275), 275, 1);
-            Set_RHS (Prods (275), 0, (52, 239, 74, 192), 
raise_expression_0'Access, null);
-            Set_RHS (Prods (275), 1, (52, 239), null, null);
-            Set_Production (Prods (276), 276, 2);
-            Set_RHS (Prods (276), 0, (52, 239, 74, 192, 96), 
raise_statement_0'Access, null);
-            Set_RHS (Prods (276), 1, (52, 239, 96), raise_statement_1'Access, 
null);
-            Set_RHS (Prods (276), 2, (52, 96), raise_statement_2'Access, null);
-            Set_Production (Prods (277), 277, 2);
-            Set_RHS (Prods (277), 0, (239, 322, 53, 76, 192, 77), 
range_g_0'Access, null);
-            Set_RHS (Prods (277), 1, (239, 322, 53), null, null);
-            Set_RHS (Prods (277), 2, (301, 85, 301), null, null);
-            Set_Production (Prods (278), 278, 1);
-            Set_RHS (Prods (278), 0, (278, 83, 277), null, null);
-            Set_RHS (Prods (278), 1, (1 => 277), null, null);
-            Set_Production (Prods (279), 279, 1);
-            Set_RHS (Prods (279), 0, (53, 301, 85, 301), null, null);
-            Set_RHS (Prods (279), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (280), 280, 1);
-            Set_RHS (Prods (280), 0, (54, 150, 24, 54), 
record_definition_0'Access, null);
-            Set_RHS (Prods (280), 1, (41, 54), null, null);
-            Set_Production (Prods (281), 281, 0);
-            Set_RHS (Prods (281), 0, (28, 239, 71, 54, 235, 145, 24, 54, 96), 
record_representation_clause_0'Access,
-            null);
-            Set_Production (Prods (282), 282, 1);
-            Set_RHS (Prods (282), 0, (282, 10, 287), null, null);
-            Set_RHS (Prods (282), 1, (287, 10, 287), null, null);
-            Set_Production (Prods (283), 283, 1);
-            Set_RHS (Prods (283), 0, (283, 10, 68, 287), null, null);
-            Set_RHS (Prods (283), 1, (287, 10, 68, 287), null, null);
-            Set_Production (Prods (284), 284, 1);
-            Set_RHS (Prods (284), 0, (284, 43, 287), null, null);
-            Set_RHS (Prods (284), 1, (287, 43, 287), null, null);
-            Set_Production (Prods (285), 285, 1);
-            Set_RHS (Prods (285), 0, (285, 43, 22, 287), null, null);
-            Set_RHS (Prods (285), 1, (287, 43, 22, 287), null, null);
-            Set_Production (Prods (286), 286, 1);
-            Set_RHS (Prods (286), 0, (286, 75, 287), null, null);
-            Set_RHS (Prods (286), 1, (287, 75, 287), null, null);
-            Set_Production (Prods (287), 287, 4);
-            Set_RHS (Prods (287), 0, (301, 40, 33, 233), null, null);
-            Set_RHS (Prods (287), 1, (301, 33, 233), null, null);
-            Set_RHS (Prods (287), 2, (301, 288, 301), null, null);
-            Set_RHS (Prods (287), 3, (1 => 301), null, null);
-            Set_RHS (Prods (287), 4, (1 => 275), null, null);
-            Set_Production (Prods (288), 288, 5);
-            Set_RHS (Prods (288), 0, (1 => 86), null, null);
-            Set_RHS (Prods (288), 1, (1 => 98), null, null);
-            Set_RHS (Prods (288), 2, (1 => 91), null, null);
-            Set_RHS (Prods (288), 3, (1 => 92), null, null);
-            Set_RHS (Prods (288), 4, (1 => 88), null, null);
-            Set_RHS (Prods (288), 5, (1 => 89), null, null);
-            Set_Production (Prods (289), 289, 3);
-            Set_RHS (Prods (289), 0, (1 => 245), null, null);
-            Set_RHS (Prods (289), 1, (1 => 250), null, null);
-            Set_RHS (Prods (289), 2, (1 => 311), null, null);
-            Set_RHS (Prods (289), 3, (1 => 215), null, null);
-            Set_Production (Prods (290), 290, 1);
-            Set_RHS (Prods (290), 0, (57, 239, 74, 5, 96), 
requeue_statement_0'Access, null);
-            Set_RHS (Prods (290), 1, (57, 239, 96), 
requeue_statement_1'Access, null);
-            Set_Production (Prods (291), 291, 1);
-            Set_RHS (Prods (291), 0, (58, 241, 240), result_profile_0'Access, 
null);
-            Set_RHS (Prods (291), 1, (58, 114), result_profile_1'Access, null);
-            Set_Production (Prods (292), 292, 1);
-            Set_RHS (Prods (292), 0, (1 => 314), null, null);
-            Set_RHS (Prods (292), 1, (1 => 114), null, null);
-            Set_Production (Prods (293), 293, 3);
-            Set_RHS (Prods (293), 0, (239, 84, 104), 
selected_component_0'Access, selected_component_0_check'Access);
-            Set_RHS (Prods (293), 1, (239, 84, 106), 
selected_component_1'Access, null);
-            Set_RHS (Prods (293), 2, (239, 84, 105), 
selected_component_2'Access, selected_component_2_check'Access);
-            Set_RHS (Prods (293), 3, (239, 84, 9), 
selected_component_3'Access, null);
-            Set_Production (Prods (294), 294, 1);
-            Set_RHS (Prods (294), 0, (61, 297, 22, 300, 24, 61, 96), 
selective_accept_0'Access, null);
-            Set_RHS (Prods (294), 1, (61, 297, 24, 61, 96), 
selective_accept_1'Access, null);
-            Set_Production (Prods (295), 295, 5);
-            Set_RHS (Prods (295), 0, (72, 192, 87, 113, 300), 
select_alternative_0'Access, null);
-            Set_RHS (Prods (295), 1, (72, 192, 87, 67, 96), 
select_alternative_1'Access, null);
-            Set_RHS (Prods (295), 2, (72, 192, 87, 160), 
select_alternative_2'Access, null);
-            Set_RHS (Prods (295), 3, (113, 300), null, null);
-            Set_RHS (Prods (295), 4, (67, 96), select_alternative_4'Access, 
null);
-            Set_RHS (Prods (295), 5, (1 => 160), null, null);
-            Set_Production (Prods (296), 296, 1);
-            Set_RHS (Prods (296), 0, (296, 43, 295), 
select_alternative_list_0'Access, null);
-            Set_RHS (Prods (296), 1, (1 => 295), 
select_alternative_list_1'Access, null);
-            Set_Production (Prods (297), 297, 1);
-            Set_RHS (Prods (297), 0, (1 => 296), null, null);
-            Set_RHS (Prods (297), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (298), 298, 3);
-            Set_RHS (Prods (298), 0, (1 => 294), null, null);
-            Set_RHS (Prods (298), 1, (1 => 323), null, null);
-            Set_RHS (Prods (298), 2, (1 => 152), null, null);
-            Set_RHS (Prods (298), 3, (1 => 126), null, null);
-            Set_Production (Prods (299), 299, 1);
-            Set_RHS (Prods (299), 0, (299, 306), null, null);
-            Set_RHS (Prods (299), 1, (1 => 306), null, null);
-            Set_Production (Prods (300), 300, 1);
-            Set_RHS (Prods (300), 0, (1 => 299), null, null);
-            Set_RHS (Prods (300), 1, (1 .. 0 => <>), null, null);
-            Set_Production (Prods (301), 301, 1);
-            Set_RHS (Prods (301), 0, (330, 321), null, null);
-            Set_RHS (Prods (301), 1, (1 => 321), null, null);
-            Set_Production (Prods (302), 302, 0);
-            Set_RHS (Prods (302), 0, (58, 192, 96), 
simple_return_statement_0'Access, null);
-            Set_Production (Prods (303), 303, 10);
-            Set_RHS (Prods (303), 0, (41, 96), simple_statement_0'Access, 
null);
-            Set_RHS (Prods (303), 1, (1 => 123), null, null);
-            Set_RHS (Prods (303), 2, (1 => 190), null, null);
-            Set_RHS (Prods (303), 3, (31, 104, 96), simple_statement_3'Access, 
null);
-            Set_RHS (Prods (303), 4, (1 => 261), null, null);
-            Set_RHS (Prods (303), 5, (1 => 302), null, null);
-            Set_RHS (Prods (303), 6, (1 => 290), null, null);
-            Set_RHS (Prods (303), 7, (1 => 161), null, null);
-            Set_RHS (Prods (303), 8, (5, 239, 96), simple_statement_8'Access, 
null);
-            Set_RHS (Prods (303), 9, (1 => 276), null, null);
-            Set_RHS (Prods (303), 10, (1 => 257), null, null);
-            Set_Production (Prods (304), 304, 1);
-            Set_RHS (Prods (304), 0, (51, 104, 122, 35, 39, 227, 74, 266, 96), 
single_protected_declaration_0'Access,
-            single_protected_declaration_0_check'Access);
-            Set_RHS (Prods (304), 1, (51, 104, 122, 35, 266, 96), 
single_protected_declaration_1'Access,
-            single_protected_declaration_1_check'Access);
-            Set_Production (Prods (305), 305, 2);
-            Set_RHS (Prods (305), 0, (66, 104, 122, 35, 39, 227, 74, 318, 24, 
220, 96),
-            single_task_declaration_0'Access, 
single_task_declaration_0_check'Access);
-            Set_RHS (Prods (305), 1, (66, 104, 122, 35, 318, 24, 220, 96), 
single_task_declaration_1'Access,
-            single_task_declaration_1_check'Access);
-            Set_RHS (Prods (305), 2, (66, 104, 122, 96), 
single_task_declaration_2'Access, null);
-            Set_Production (Prods (306), 306, 2);
-            Set_RHS (Prods (306), 0, (1 => 217), null, null);
-            Set_RHS (Prods (306), 1, (1 => 303), null, null);
-            Set_RHS (Prods (306), 2, (1 => 151), null, null);
-            Set_Production (Prods (307), 307, 0);
-            Set_RHS (Prods (307), 0, (246, 312, 122, 35, 159, 13, 218, 24, 
240, 96), subprogram_body_0'Access,
-            subprogram_body_0_check'Access);
-            Set_Production (Prods (308), 308, 0);
-            Set_RHS (Prods (308), 0, (246, 312, 35, 60, 122, 96), 
subprogram_body_stub_0'Access, null);
-            Set_Production (Prods (309), 309, 0);
-            Set_RHS (Prods (309), 0, (246, 312, 122, 96), 
subprogram_declaration_0'Access, null);
-            Set_Production (Prods (310), 310, 2);
-            Set_RHS (Prods (310), 0, (1 => 239), subprogram_default_0'Access, 
null);
-            Set_RHS (Prods (310), 1, (1 => 80), null, null);
-            Set_RHS (Prods (310), 2, (1 => 41), null, null);
-            Set_Production (Prods (311), 311, 0);
-            Set_RHS (Prods (311), 0, (246, 312, 56, 239, 122, 96), 
subprogram_renaming_declaration_0'Access, null);
-            Set_Production (Prods (312), 312, 1);
-            Set_RHS (Prods (312), 0, (1 => 262), null, 
subprogram_specification_0_check'Access);
-            Set_RHS (Prods (312), 1, (1 => 207), null, 
subprogram_specification_1_check'Access);
-            Set_Production (Prods (313), 313, 0);
-            Set_RHS (Prods (313), 0, (63, 104, 35, 314, 122, 96), 
subtype_declaration_0'Access, null);
-            Set_Production (Prods (314), 314, 3);
-            Set_RHS (Prods (314), 0, (40, 41, 239, 155), 
subtype_indication_0'Access, null);
-            Set_RHS (Prods (314), 1, (40, 41, 239), 
subtype_indication_1'Access, null);
-            Set_RHS (Prods (314), 2, (239, 155), subtype_indication_2'Access, 
null);
-            Set_RHS (Prods (314), 3, (1 => 239), subtype_indication_3'Access, 
null);
-            Set_Production (Prods (315), 315, 0);
-            Set_RHS (Prods (315), 0, (60, 76, 239, 77, 263), subunit_0'Access, 
null);
-            Set_Production (Prods (316), 316, 0);
-            Set_RHS (Prods (316), 0, (66, 14, 104, 122, 35, 159, 13, 218, 24, 
220, 96), task_body_0'Access,
-            task_body_0_check'Access);
-            Set_Production (Prods (317), 317, 0);
-            Set_RHS (Prods (317), 0, (66, 14, 104, 35, 60, 122, 96), 
task_body_stub_0'Access, null);
-            Set_Production (Prods (318), 318, 1);
-            Set_RHS (Prods (318), 0, (159, 49, 159), task_definition_0'Access, 
null);
-            Set_RHS (Prods (318), 1, (1 => 159), task_definition_1'Access, 
null);
-            Set_Production (Prods (319), 319, 2);
-            Set_RHS (Prods (319), 0, (66, 69, 104, 169, 122, 35, 39, 227, 74, 
318, 24, 220, 96),
-            task_type_declaration_0'Access, 
task_type_declaration_0_check'Access);
-            Set_RHS (Prods (319), 1, (66, 69, 104, 169, 122, 35, 318, 24, 220, 
96), task_type_declaration_1'Access,
-            task_type_declaration_1_check'Access);
-            Set_RHS (Prods (319), 2, (66, 69, 104, 169, 122, 96), 
task_type_declaration_2'Access, null);
-            Set_Production (Prods (320), 320, 1);
-            Set_RHS (Prods (320), 0, (320, 237, 197), null, null);
-            Set_RHS (Prods (320), 1, (1 => 197), null, null);
-            Set_Production (Prods (321), 321, 1);
-            Set_RHS (Prods (321), 0, (321, 130, 320), null, null);
-            Set_RHS (Prods (321), 1, (1 => 320), null, null);
-            Set_Production (Prods (322), 322, 1);
-            Set_RHS (Prods (322), 0, (1 => 101), null, null);
-            Set_RHS (Prods (322), 1, (1 => 102), null, null);
-            Set_Production (Prods (323), 323, 0);
-            Set_RHS (Prods (323), 0, (61, 178, 43, 160, 24, 61, 96), 
timed_entry_call_0'Access, null);
-            Set_Production (Prods (324), 324, 2);
-            Set_RHS (Prods (324), 0, (261, 300), null, null);
-            Set_RHS (Prods (324), 1, (239, 300), null, null);
-            Set_RHS (Prods (324), 2, (161, 300), null, null);
-            Set_Production (Prods (325), 325, 3);
-            Set_RHS (Prods (325), 0, (1 => 206), null, null);
-            Set_RHS (Prods (325), 1, (1 => 223), null, null);
-            Set_RHS (Prods (325), 2, (1 => 260), null, null);
-            Set_RHS (Prods (325), 3, (1 => 259), null, null);
-            Set_Production (Prods (326), 326, 10);
-            Set_RHS (Prods (326), 0, (1 => 183), null, null);
-            Set_RHS (Prods (326), 1, (53, 301, 85, 301), null, null);
-            Set_RHS (Prods (326), 2, (38, 192), null, null);
-            Set_RHS (Prods (326), 3, (20, 192, 279), null, null);
-            Set_RHS (Prods (326), 4, (19, 192, 20, 192, 279), null, null);
-            Set_RHS (Prods (326), 5, (19, 192, 279), null, null);
-            Set_RHS (Prods (326), 6, (1 => 120), null, null);
-            Set_RHS (Prods (326), 7, (111, 280), null, null);
-            Set_RHS (Prods (326), 8, (1 => 114), null, null);
-            Set_RHS (Prods (326), 9, (1 => 162), null, null);
-            Set_RHS (Prods (326), 10, (1 => 228), null, null);
-            Set_Production (Prods (327), 327, 0);
-            Set_RHS (Prods (327), 0, (15, 164, 35, 328, 24, 15, 96), 
variant_part_0'Access, null);
-            Set_Production (Prods (328), 328, 1);
-            Set_RHS (Prods (328), 0, (328, 329), null, null);
-            Set_RHS (Prods (328), 1, (1 => 329), null, null);
-            Set_Production (Prods (329), 329, 0);
-            Set_RHS (Prods (329), 0, (72, 166, 87, 150), variant_0'Access, 
null);
-            Set_Production (Prods (330), 330, 1);
-            Set_RHS (Prods (330), 0, (1 => 95), null, null);
-            Set_RHS (Prods (330), 1, (1 => 94), null, null);
-            Set_Production (Prods (331), 331, 2);
-            Set_RHS (Prods (331), 0, (71, 9, 69, 238, 96), 
use_clause_0'Access, null);
-            Set_RHS (Prods (331), 1, (71, 69, 238, 96), use_clause_1'Access, 
null);
-            Set_RHS (Prods (331), 2, (71, 238, 96), use_clause_2'Access, null);
-            Set_Production (Prods (332), 332, 3);
-            Set_RHS (Prods (332), 0, (36, 49, 74, 238, 96), 
with_clause_0'Access, null);
-            Set_RHS (Prods (332), 1, (36, 74, 238, 96), with_clause_1'Access, 
null);
-            Set_RHS (Prods (332), 2, (49, 74, 238, 96), with_clause_2'Access, 
null);
-            Set_RHS (Prods (332), 3, (74, 238, 96), with_clause_3'Access, 
null);
+         return Acts : WisiToken.Parse.LR.Semantic_Action_Array_Arrays.Vector 
do
+            Acts.Set_First_Last (108, 332);
+            Acts (112).Set_First_Last (0, 0);
+            Acts (112)(0) := (abstract_subprogram_declaration_0'Access, null);
+            Acts (113).Set_First_Last (0, 1);
+            Acts (113)(0) := (accept_statement_0'Access, 
accept_statement_0_check'Access);
+            Acts (113)(1) := (accept_statement_1'Access, null);
+            Acts (114).Set_First_Last (0, 2);
+            Acts (114)(0) := (access_definition_0'Access, null);
+            Acts (114)(1) := (access_definition_1'Access, null);
+            Acts (114)(2) := (access_definition_2'Access, null);
+            Acts (115).Set_First_Last (0, 1);
+            Acts (115)(0) := (actual_parameter_part_0'Access, null);
+            Acts (115)(1) := (actual_parameter_part_1'Access, null);
+            Acts (117).Set_First_Last (0, 4);
+            Acts (117)(0) := (aggregate_0'Access, null);
+            Acts (117)(1) := (aggregate_1'Access, null);
+            Acts (117)(3) := (aggregate_3'Access, null);
+            Acts (117)(4) := (aggregate_4'Access, null);
+            Acts (120).Set_First_Last (0, 1);
+            Acts (120)(0) := (array_type_definition_0'Access, null);
+            Acts (120)(1) := (array_type_definition_1'Access, null);
+            Acts (121).Set_First_Last (0, 3);
+            Acts (121)(0) := (aspect_clause_0'Access, null);
+            Acts (122).Set_First_Last (0, 1);
+            Acts (122)(0) := (aspect_specification_opt_0'Access, null);
+            Acts (123).Set_First_Last (0, 0);
+            Acts (123)(0) := (assignment_statement_0'Access, null);
+            Acts (124).Set_First_Last (0, 5);
+            Acts (124)(0) := (association_opt_0'Access, null);
+            Acts (124)(2) := (association_opt_2'Access, null);
+            Acts (124)(3) := (association_opt_3'Access, null);
+            Acts (124)(4) := (association_opt_4'Access, null);
+            Acts (126).Set_First_Last (0, 0);
+            Acts (126)(0) := (asynchronous_select_0'Access, null);
+            Acts (127).Set_First_Last (0, 0);
+            Acts (127)(0) := (at_clause_0'Access, null);
+            Acts (131).Set_First_Last (0, 0);
+            Acts (131)(0) := (block_label_0'Access, 
block_label_0_check'Access);
+            Acts (132).Set_First_Last (0, 1);
+            Acts (132)(0) := (null, block_label_opt_0_check'Access);
+            Acts (132)(1) := (null, null);
+            Acts (133).Set_First_Last (0, 1);
+            Acts (133)(0) := (block_statement_0'Access, 
block_statement_0_check'Access);
+            Acts (133)(1) := (block_statement_1'Access, 
block_statement_1_check'Access);
+            Acts (136).Set_First_Last (0, 0);
+            Acts (136)(0) := (case_expression_0'Access, null);
+            Acts (137).Set_First_Last (0, 0);
+            Acts (137)(0) := (case_expression_alternative_0'Access, null);
+            Acts (138).Set_First_Last (0, 1);
+            Acts (138)(0) := (case_expression_alternative_list_0'Access, null);
+            Acts (139).Set_First_Last (0, 0);
+            Acts (139)(0) := (case_statement_0'Access, null);
+            Acts (140).Set_First_Last (0, 0);
+            Acts (140)(0) := (case_statement_alternative_0'Access, null);
+            Acts (142).Set_First_Last (0, 4);
+            Acts (142)(2) := (compilation_unit_2'Access, null);
+            Acts (143).Set_First_Last (0, 1);
+            Acts (143)(0) := (compilation_unit_list_0'Access, null);
+            Acts (143)(1) := (compilation_unit_list_1'Access, 
compilation_unit_list_1_check'Access);
+            Acts (144).Set_First_Last (0, 0);
+            Acts (144)(0) := (component_clause_0'Access, null);
+            Acts (146).Set_First_Last (0, 1);
+            Acts (146)(0) := (component_declaration_0'Access, null);
+            Acts (146)(1) := (component_declaration_1'Access, null);
+            Acts (149).Set_First_Last (0, 4);
+            Acts (149)(4) := (component_list_4'Access, null);
+            Acts (152).Set_First_Last (0, 0);
+            Acts (152)(0) := (conditional_entry_call_0'Access, null);
+            Acts (157).Set_First_Last (0, 16);
+            Acts (157)(9) := (declaration_9'Access, null);
+            Acts (161).Set_First_Last (0, 1);
+            Acts (161)(0) := (delay_statement_0'Access, null);
+            Acts (161)(1) := (delay_statement_1'Access, null);
+            Acts (162).Set_First_Last (0, 1);
+            Acts (162)(0) := (derived_type_definition_0'Access, null);
+            Acts (162)(1) := (derived_type_definition_1'Access, null);
+            Acts (169).Set_First_Last (0, 2);
+            Acts (169)(1) := (discriminant_part_opt_1'Access, null);
+            Acts (172).Set_First_Last (0, 0);
+            Acts (172)(0) := (elsif_expression_item_0'Access, null);
+            Acts (174).Set_First_Last (0, 0);
+            Acts (174)(0) := (elsif_statement_item_0'Access, null);
+            Acts (176).Set_First_Last (0, 0);
+            Acts (176)(0) := (entry_body_0'Access, entry_body_0_check'Access);
+            Acts (177).Set_First_Last (0, 1);
+            Acts (177)(0) := (entry_body_formal_part_0'Access, null);
+            Acts (179).Set_First_Last (0, 1);
+            Acts (179)(0) := (entry_declaration_0'Access, null);
+            Acts (179)(1) := (entry_declaration_1'Access, null);
+            Acts (182).Set_First_Last (0, 0);
+            Acts (182)(0) := (enumeration_representation_clause_0'Access, 
null);
+            Acts (183).Set_First_Last (0, 0);
+            Acts (183)(0) := (enumeration_type_definition_0'Access, null);
+            Acts (186).Set_First_Last (0, 0);
+            Acts (186)(0) := (exception_declaration_0'Access, null);
+            Acts (187).Set_First_Last (0, 1);
+            Acts (187)(0) := (exception_handler_0'Access, null);
+            Acts (187)(1) := (exception_handler_1'Access, null);
+            Acts (190).Set_First_Last (0, 1);
+            Acts (190)(0) := (exit_statement_0'Access, null);
+            Acts (190)(1) := (exit_statement_1'Access, null);
+            Acts (193).Set_First_Last (0, 0);
+            Acts (193)(0) := (expression_function_declaration_0'Access, null);
+            Acts (194).Set_First_Last (0, 1);
+            Acts (194)(0) := (extended_return_object_declaration_0'Access, 
null);
+            Acts (194)(1) := (extended_return_object_declaration_1'Access, 
null);
+            Acts (196).Set_First_Last (0, 1);
+            Acts (196)(0) := (extended_return_statement_0'Access, null);
+            Acts (196)(1) := (extended_return_statement_1'Access, null);
+            Acts (198).Set_First_Last (0, 3);
+            Acts (198)(0) := (formal_object_declaration_0'Access, null);
+            Acts (198)(1) := (formal_object_declaration_1'Access, null);
+            Acts (198)(2) := (formal_object_declaration_2'Access, null);
+            Acts (198)(3) := (formal_object_declaration_3'Access, null);
+            Acts (199).Set_First_Last (0, 0);
+            Acts (199)(0) := (formal_part_0'Access, null);
+            Acts (200).Set_First_Last (0, 3);
+            Acts (200)(0) := (formal_subprogram_declaration_0'Access, null);
+            Acts (200)(1) := (formal_subprogram_declaration_1'Access, null);
+            Acts (200)(2) := (formal_subprogram_declaration_2'Access, null);
+            Acts (200)(3) := (formal_subprogram_declaration_3'Access, null);
+            Acts (201).Set_First_Last (0, 2);
+            Acts (201)(0) := (formal_type_declaration_0'Access, null);
+            Acts (201)(1) := (formal_type_declaration_1'Access, null);
+            Acts (201)(2) := (formal_type_declaration_2'Access, null);
+            Acts (203).Set_First_Last (0, 1);
+            Acts (203)(0) := (formal_derived_type_definition_0'Access, null);
+            Acts (203)(1) := (formal_derived_type_definition_1'Access, null);
+            Acts (204).Set_First_Last (0, 0);
+            Acts (204)(0) := (formal_package_declaration_0'Access, null);
+            Acts (206).Set_First_Last (0, 2);
+            Acts (206)(0) := (full_type_declaration_0'Access, null);
+            Acts (207).Set_First_Last (0, 0);
+            Acts (207)(0) := (function_specification_0'Access, 
function_specification_0_check'Access);
+            Acts (210).Set_First_Last (0, 1);
+            Acts (210)(0) := (generic_formal_part_0'Access, null);
+            Acts (210)(1) := (generic_formal_part_1'Access, null);
+            Acts (213).Set_First_Last (0, 2);
+            Acts (213)(0) := (generic_instantiation_0'Access, null);
+            Acts (213)(1) := (generic_instantiation_1'Access, null);
+            Acts (213)(2) := (generic_instantiation_2'Access, null);
+            Acts (214).Set_First_Last (0, 0);
+            Acts (214)(0) := (generic_package_declaration_0'Access, null);
+            Acts (215).Set_First_Last (0, 2);
+            Acts (215)(0) := (generic_renaming_declaration_0'Access, null);
+            Acts (215)(1) := (generic_renaming_declaration_1'Access, null);
+            Acts (215)(2) := (generic_renaming_declaration_2'Access, null);
+            Acts (216).Set_First_Last (0, 0);
+            Acts (216)(0) := (generic_subprogram_declaration_0'Access, null);
+            Acts (217).Set_First_Last (0, 0);
+            Acts (217)(0) := (goto_label_0'Access, null);
+            Acts (218).Set_First_Last (0, 1);
+            Acts (218)(0) := (handled_sequence_of_statements_0'Access, null);
+            Acts (219).Set_First_Last (0, 1);
+            Acts (219)(0) := (identifier_list_0'Access, null);
+            Acts (219)(1) := (identifier_list_1'Access, null);
+            Acts (220).Set_First_Last (0, 1);
+            Acts (220)(0) := (null, identifier_opt_0_check'Access);
+            Acts (220)(1) := (null, null);
+            Acts (221).Set_First_Last (0, 3);
+            Acts (221)(0) := (if_expression_0'Access, null);
+            Acts (221)(1) := (if_expression_1'Access, null);
+            Acts (221)(2) := (if_expression_2'Access, null);
+            Acts (221)(3) := (if_expression_3'Access, null);
+            Acts (222).Set_First_Last (0, 3);
+            Acts (222)(0) := (if_statement_0'Access, null);
+            Acts (222)(1) := (if_statement_1'Access, null);
+            Acts (222)(2) := (if_statement_2'Access, null);
+            Acts (222)(3) := (if_statement_3'Access, null);
+            Acts (223).Set_First_Last (0, 1);
+            Acts (223)(0) := (incomplete_type_declaration_0'Access, null);
+            Acts (223)(1) := (incomplete_type_declaration_1'Access, null);
+            Acts (224).Set_First_Last (0, 0);
+            Acts (224)(0) := (index_constraint_0'Access, null);
+            Acts (227).Set_First_Last (0, 1);
+            Acts (227)(0) := (interface_list_0'Access, null);
+            Acts (227)(1) := (interface_list_1'Access, null);
+            Acts (229).Set_First_Last (0, 1);
+            Acts (229)(0) := (iteration_scheme_0'Access, null);
+            Acts (229)(1) := (iteration_scheme_1'Access, null);
+            Acts (230).Set_First_Last (0, 5);
+            Acts (230)(2) := (iterator_specification_2'Access, null);
+            Acts (230)(5) := (iterator_specification_5'Access, null);
+            Acts (232).Set_First_Last (0, 1);
+            Acts (232)(0) := (loop_statement_0'Access, 
loop_statement_0_check'Access);
+            Acts (232)(1) := (loop_statement_1'Access, 
loop_statement_1_check'Access);
+            Acts (239).Set_First_Last (0, 7);
+            Acts (239)(0) := (name_0'Access, null);
+            Acts (239)(1) := (name_1'Access, null);
+            Acts (239)(2) := (null, name_2_check'Access);
+            Acts (239)(3) := (null, null);
+            Acts (239)(4) := (null, null);
+            Acts (239)(5) := (name_5'Access, name_5_check'Access);
+            Acts (239)(6) := (null, null);
+            Acts (239)(7) := (null, name_7_check'Access);
+            Acts (240).Set_First_Last (0, 1);
+            Acts (240)(0) := (null, name_opt_0_check'Access);
+            Acts (240)(1) := (null, null);
+            Acts (242).Set_First_Last (0, 3);
+            Acts (242)(0) := (null_exclusion_opt_name_type_0'Access, null);
+            Acts (242)(1) := (null_exclusion_opt_name_type_1'Access, null);
+            Acts (242)(2) := (null_exclusion_opt_name_type_2'Access, null);
+            Acts (242)(3) := (null_exclusion_opt_name_type_3'Access, null);
+            Acts (243).Set_First_Last (0, 0);
+            Acts (243)(0) := (null_procedure_declaration_0'Access, null);
+            Acts (244).Set_First_Last (0, 7);
+            Acts (244)(0) := (object_declaration_0'Access, null);
+            Acts (244)(1) := (object_declaration_1'Access, null);
+            Acts (244)(2) := (object_declaration_2'Access, null);
+            Acts (244)(3) := (object_declaration_3'Access, null);
+            Acts (244)(4) := (object_declaration_4'Access, null);
+            Acts (244)(5) := (object_declaration_5'Access, null);
+            Acts (245).Set_First_Last (0, 2);
+            Acts (245)(0) := (object_renaming_declaration_0'Access, null);
+            Acts (245)(1) := (object_renaming_declaration_1'Access, null);
+            Acts (245)(2) := (object_renaming_declaration_2'Access, null);
+            Acts (246).Set_First_Last (0, 2);
+            Acts (246)(0) := (overriding_indicator_opt_0'Access, null);
+            Acts (246)(1) := (overriding_indicator_opt_1'Access, null);
+            Acts (247).Set_First_Last (0, 1);
+            Acts (247)(0) := (package_body_0'Access, 
package_body_0_check'Access);
+            Acts (247)(1) := (package_body_1'Access, 
package_body_1_check'Access);
+            Acts (248).Set_First_Last (0, 0);
+            Acts (248)(0) := (package_body_stub_0'Access, null);
+            Acts (249).Set_First_Last (0, 0);
+            Acts (249)(0) := (package_declaration_0'Access, null);
+            Acts (250).Set_First_Last (0, 0);
+            Acts (250)(0) := (package_renaming_declaration_0'Access, null);
+            Acts (251).Set_First_Last (0, 1);
+            Acts (251)(0) := (package_specification_0'Access, 
package_specification_0_check'Access);
+            Acts (251)(1) := (package_specification_1'Access, 
package_specification_1_check'Access);
+            Acts (252).Set_First_Last (0, 1);
+            Acts (252)(0) := (parameter_and_result_profile_0'Access, null);
+            Acts (254).Set_First_Last (0, 4);
+            Acts (254)(0) := (parameter_specification_0'Access, null);
+            Acts (254)(1) := (parameter_specification_1'Access, null);
+            Acts (254)(2) := (parameter_specification_2'Access, null);
+            Acts (254)(3) := (parameter_specification_3'Access, null);
+            Acts (255).Set_First_Last (0, 1);
+            Acts (255)(0) := (parameter_specification_list_0'Access, null);
+            Acts (256).Set_First_Last (0, 2);
+            Acts (256)(0) := (paren_expression_0'Access, null);
+            Acts (256)(1) := (paren_expression_1'Access, null);
+            Acts (256)(2) := (paren_expression_2'Access, null);
+            Acts (257).Set_First_Last (0, 2);
+            Acts (257)(0) := (pragma_g_0'Access, null);
+            Acts (257)(1) := (pragma_g_1'Access, null);
+            Acts (257)(2) := (pragma_g_2'Access, null);
+            Acts (258).Set_First_Last (0, 4);
+            Acts (258)(0) := (primary_0'Access, null);
+            Acts (258)(2) := (primary_2'Access, null);
+            Acts (258)(4) := (primary_4'Access, null);
+            Acts (259).Set_First_Last (0, 0);
+            Acts (259)(0) := (private_extension_declaration_0'Access, null);
+            Acts (260).Set_First_Last (0, 0);
+            Acts (260)(0) := (private_type_declaration_0'Access, null);
+            Acts (261).Set_First_Last (0, 0);
+            Acts (261)(0) := (procedure_call_statement_0'Access, null);
+            Acts (262).Set_First_Last (0, 0);
+            Acts (262)(0) := (procedure_specification_0'Access, 
procedure_specification_0_check'Access);
+            Acts (264).Set_First_Last (0, 0);
+            Acts (264)(0) := (protected_body_0'Access, 
protected_body_0_check'Access);
+            Acts (265).Set_First_Last (0, 0);
+            Acts (265)(0) := (protected_body_stub_0'Access, null);
+            Acts (266).Set_First_Last (0, 1);
+            Acts (266)(0) := (protected_definition_0'Access, 
protected_definition_0_check'Access);
+            Acts (266)(1) := (protected_definition_1'Access, 
protected_definition_1_check'Access);
+            Acts (271).Set_First_Last (0, 1);
+            Acts (271)(0) := (protected_type_declaration_0'Access, 
protected_type_declaration_0_check'Access);
+            Acts (271)(1) := (protected_type_declaration_1'Access, 
protected_type_declaration_1_check'Access);
+            Acts (272).Set_First_Last (0, 0);
+            Acts (272)(0) := (qualified_expression_0'Access, null);
+            Acts (273).Set_First_Last (0, 0);
+            Acts (273)(0) := (quantified_expression_0'Access, null);
+            Acts (275).Set_First_Last (0, 1);
+            Acts (275)(0) := (raise_expression_0'Access, null);
+            Acts (276).Set_First_Last (0, 2);
+            Acts (276)(0) := (raise_statement_0'Access, null);
+            Acts (276)(1) := (raise_statement_1'Access, null);
+            Acts (276)(2) := (raise_statement_2'Access, null);
+            Acts (277).Set_First_Last (0, 2);
+            Acts (277)(0) := (range_g_0'Access, null);
+            Acts (280).Set_First_Last (0, 1);
+            Acts (280)(0) := (record_definition_0'Access, null);
+            Acts (281).Set_First_Last (0, 0);
+            Acts (281)(0) := (record_representation_clause_0'Access, null);
+            Acts (290).Set_First_Last (0, 1);
+            Acts (290)(0) := (requeue_statement_0'Access, null);
+            Acts (290)(1) := (requeue_statement_1'Access, null);
+            Acts (291).Set_First_Last (0, 1);
+            Acts (291)(0) := (result_profile_0'Access, null);
+            Acts (291)(1) := (result_profile_1'Access, null);
+            Acts (293).Set_First_Last (0, 3);
+            Acts (293)(0) := (selected_component_0'Access, 
selected_component_0_check'Access);
+            Acts (293)(1) := (selected_component_1'Access, null);
+            Acts (293)(2) := (selected_component_2'Access, 
selected_component_2_check'Access);
+            Acts (293)(3) := (selected_component_3'Access, null);
+            Acts (294).Set_First_Last (0, 1);
+            Acts (294)(0) := (selective_accept_0'Access, null);
+            Acts (294)(1) := (selective_accept_1'Access, null);
+            Acts (295).Set_First_Last (0, 5);
+            Acts (295)(0) := (select_alternative_0'Access, null);
+            Acts (295)(1) := (select_alternative_1'Access, null);
+            Acts (295)(2) := (select_alternative_2'Access, null);
+            Acts (295)(4) := (select_alternative_4'Access, null);
+            Acts (296).Set_First_Last (0, 1);
+            Acts (296)(0) := (select_alternative_list_0'Access, null);
+            Acts (296)(1) := (select_alternative_list_1'Access, null);
+            Acts (302).Set_First_Last (0, 0);
+            Acts (302)(0) := (simple_return_statement_0'Access, null);
+            Acts (303).Set_First_Last (0, 10);
+            Acts (303)(0) := (simple_statement_0'Access, null);
+            Acts (303)(3) := (simple_statement_3'Access, null);
+            Acts (303)(8) := (simple_statement_8'Access, null);
+            Acts (304).Set_First_Last (0, 1);
+            Acts (304)(0) := (single_protected_declaration_0'Access, 
single_protected_declaration_0_check'Access);
+            Acts (304)(1) := (single_protected_declaration_1'Access, 
single_protected_declaration_1_check'Access);
+            Acts (305).Set_First_Last (0, 2);
+            Acts (305)(0) := (single_task_declaration_0'Access, 
single_task_declaration_0_check'Access);
+            Acts (305)(1) := (single_task_declaration_1'Access, 
single_task_declaration_1_check'Access);
+            Acts (305)(2) := (single_task_declaration_2'Access, null);
+            Acts (307).Set_First_Last (0, 0);
+            Acts (307)(0) := (subprogram_body_0'Access, 
subprogram_body_0_check'Access);
+            Acts (308).Set_First_Last (0, 0);
+            Acts (308)(0) := (subprogram_body_stub_0'Access, null);
+            Acts (309).Set_First_Last (0, 0);
+            Acts (309)(0) := (subprogram_declaration_0'Access, null);
+            Acts (310).Set_First_Last (0, 2);
+            Acts (310)(0) := (subprogram_default_0'Access, null);
+            Acts (311).Set_First_Last (0, 0);
+            Acts (311)(0) := (subprogram_renaming_declaration_0'Access, null);
+            Acts (312).Set_First_Last (0, 1);
+            Acts (312)(0) := (null, subprogram_specification_0_check'Access);
+            Acts (312)(1) := (null, subprogram_specification_1_check'Access);
+            Acts (313).Set_First_Last (0, 0);
+            Acts (313)(0) := (subtype_declaration_0'Access, null);
+            Acts (314).Set_First_Last (0, 3);
+            Acts (314)(0) := (subtype_indication_0'Access, null);
+            Acts (314)(1) := (subtype_indication_1'Access, null);
+            Acts (314)(2) := (subtype_indication_2'Access, null);
+            Acts (314)(3) := (subtype_indication_3'Access, null);
+            Acts (315).Set_First_Last (0, 0);
+            Acts (315)(0) := (subunit_0'Access, null);
+            Acts (316).Set_First_Last (0, 0);
+            Acts (316)(0) := (task_body_0'Access, task_body_0_check'Access);
+            Acts (317).Set_First_Last (0, 0);
+            Acts (317)(0) := (task_body_stub_0'Access, null);
+            Acts (318).Set_First_Last (0, 1);
+            Acts (318)(0) := (task_definition_0'Access, null);
+            Acts (318)(1) := (task_definition_1'Access, null);
+            Acts (319).Set_First_Last (0, 2);
+            Acts (319)(0) := (task_type_declaration_0'Access, 
task_type_declaration_0_check'Access);
+            Acts (319)(1) := (task_type_declaration_1'Access, 
task_type_declaration_1_check'Access);
+            Acts (319)(2) := (task_type_declaration_2'Access, null);
+            Acts (323).Set_First_Last (0, 0);
+            Acts (323)(0) := (timed_entry_call_0'Access, null);
+            Acts (327).Set_First_Last (0, 0);
+            Acts (327)(0) := (variant_part_0'Access, null);
+            Acts (329).Set_First_Last (0, 0);
+            Acts (329)(0) := (variant_0'Access, null);
+            Acts (331).Set_First_Last (0, 2);
+            Acts (331)(0) := (use_clause_0'Access, null);
+            Acts (331)(1) := (use_clause_1'Access, null);
+            Acts (331)(2) := (use_clause_2'Access, null);
+            Acts (332).Set_First_Last (0, 3);
+            Acts (332)(0) := (with_clause_0'Access, null);
+            Acts (332)(1) := (with_clause_1'Access, null);
+            Acts (332)(2) := (with_clause_2'Access, null);
+            Acts (332)(3) := (with_clause_3'Access, null);
          end return;
-      end Productions;
+      end Actions;
 
       Table : constant Parse_Table_Ptr := Get_Text_Rep
-        (Text_Rep_File_Name, McKenzie_Param, Productions);
+        (Text_Rep_File_Name, McKenzie_Param, Actions);
    begin
       WisiToken.Parse.LR.Parser.New_Parser
         (Parser,
@@ -931,7 +463,7 @@ package body Ada_Process_LR1_Main is
          Lexer.New_Lexer (Trace.Descriptor),
          Table,
          Language_Fixes,
-         Language_Use_Minimal_Complete_Actions,
+         Language_Matching_Begin_Tokens,
          Language_String_ID_Set,
          User_Data,
          Max_Parallel         => 15,
diff --git a/packages/ada-mode/ada_process_lr1_main.ads 
b/packages/ada-mode/ada_process_lr1_main.ads
index 89b6616..99d14b2 100644
--- a/packages/ada-mode/ada_process_lr1_main.ads
+++ b/packages/ada-mode/ada_process_lr1_main.ads
@@ -22,11 +22,10 @@ with WisiToken.Parse.LR.Parser;
 package Ada_Process_LR1_Main is
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access;
       Text_Rep_File_Name : in String);
diff --git a/packages/ada-mode/ada_re2c.c b/packages/ada-mode/ada_re2c.c
index 8adaf85..e0a8890 100644
--- a/packages/ada-mode/ada_re2c.c
+++ b/packages/ada-mode/ada_re2c.c
@@ -157,16 +157,31 @@ int ada_next_token
        case '\r':      goto yy11;
        case '"':       goto yy12;
        case '#':       goto yy13;
-       case '&':       goto yy14;
-       case '\'':      goto yy16;
-       case '(':       goto yy18;
-       case ')':       goto yy20;
-       case '*':       goto yy22;
-       case '+':       goto yy24;
-       case ',':       goto yy26;
-       case '-':       goto yy28;
-       case '.':       goto yy30;
-       case '/':       goto yy32;
+       case '$':
+       case 'H':
+       case 'J':
+       case 'K':
+       case 'Q':
+       case 'V':
+       case 'Y':
+       case 'Z':
+       case 'h':
+       case 'j':
+       case 'k':
+       case 'q':
+       case 'v':
+       case 'y':
+       case 'z':       goto yy14;
+       case '&':       goto yy17;
+       case '\'':      goto yy19;
+       case '(':       goto yy21;
+       case ')':       goto yy23;
+       case '*':       goto yy25;
+       case '+':       goto yy27;
+       case ',':       goto yy29;
+       case '-':       goto yy31;
+       case '.':       goto yy33;
+       case '/':       goto yy35;
        case '0':
        case '1':
        case '2':
@@ -176,40 +191,26 @@ int ada_next_token
        case '6':
        case '7':
        case '8':
-       case '9':       goto yy34;
-       case ':':       goto yy37;
-       case ';':       goto yy39;
-       case '<':       goto yy41;
-       case '=':       goto yy43;
-       case '>':       goto yy45;
+       case '9':       goto yy37;
+       case ':':       goto yy40;
+       case ';':       goto yy42;
+       case '<':       goto yy44;
+       case '=':       goto yy46;
+       case '>':       goto yy48;
        case 'A':
-       case 'a':       goto yy47;
+       case 'a':       goto yy50;
        case 'B':
-       case 'b':       goto yy49;
+       case 'b':       goto yy51;
        case 'C':
-       case 'c':       goto yy50;
+       case 'c':       goto yy52;
        case 'D':
-       case 'd':       goto yy51;
+       case 'd':       goto yy53;
        case 'E':
-       case 'e':       goto yy52;
+       case 'e':       goto yy54;
        case 'F':
-       case 'f':       goto yy53;
+       case 'f':       goto yy55;
        case 'G':
-       case 'g':       goto yy54;
-       case 'H':
-       case 'J':
-       case 'K':
-       case 'Q':
-       case 'V':
-       case 'Y':
-       case 'Z':
-       case 'h':
-       case 'j':
-       case 'k':
-       case 'q':
-       case 'v':
-       case 'y':
-       case 'z':       goto yy55;
+       case 'g':       goto yy56;
        case 'I':
        case 'i':       goto yy57;
        case 'L':
@@ -297,14 +298,14 @@ yy3:
        YYDEBUG(3, YYPEEK ());
 #line 369 "../ada.re2c"
        {status = ERROR_unrecognized_character; continue;}
-#line 301 "../ada_re2c.c"
+#line 302 "../ada_re2c.c"
 yy4:
        YYDEBUG(4, YYPEEK ());
        YYSKIP ();
        YYDEBUG(5, YYPEEK ());
 #line 367 "../ada.re2c"
        {*id =  107; continue;}
-#line 308 "../ada_re2c.c"
+#line 309 "../ada_re2c.c"
 yy6:
        YYDEBUG(6, YYPEEK ());
        YYSKIP ();
@@ -325,14 +326,14 @@ yy8:
           else
              lexer->line_token_start = lexer->line;
           continue; }
-#line 329 "../ada_re2c.c"
+#line 330 "../ada_re2c.c"
 yy9:
        YYDEBUG(9, YYPEEK ());
        YYSKIP ();
        YYDEBUG(10, YYPEEK ());
 #line 261 "../ada.re2c"
        {*id =  1; continue;}
-#line 336 "../ada_re2c.c"
+#line 337 "../ada_re2c.c"
 yy11:
        YYDEBUG(11, YYPEEK ());
        YYSKIP ();
@@ -510,14 +511,145 @@ yy13:
        }
 yy14:
        YYDEBUG(14, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+yy15:
        YYDEBUG(15, YYPEEK ());
-#line 338 "../ada.re2c"
-       {*id =  78; continue;}
-#line 518 "../ada_re2c.c"
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy14;
+       case '[':       goto yy94;
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:      goto yy95;
+       case 0xE0:      goto yy96;
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:      goto yy97;
+       case 0xF0:      goto yy98;
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:      goto yy99;
+       case 0xF4:      goto yy100;
+       default:        goto yy16;
+       }
 yy16:
        YYDEBUG(16, YYPEEK ());
-       yyaccept = 1;
+#line 364 "../ada.re2c"
+       {*id =  104; continue;}
+#line 643 "../ada_re2c.c"
+yy17:
+       YYDEBUG(17, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(18, YYPEEK ());
+#line 338 "../ada.re2c"
+       {*id =  78; continue;}
+#line 650 "../ada_re2c.c"
+yy19:
+       YYDEBUG(19, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -615,11 +747,11 @@ yy16:
        case '|':
        case '}':
        case '~':
-       case 0x7F:      goto yy94;
+       case 0x7F:      goto yy101;
        case '(':
                YYBACKUPCTX ();
-               goto yy95;
-       case '[':       goto yy96;
+               goto yy102;
+       case '[':       goto yy103;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -649,8 +781,8 @@ yy16:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy97;
-       case 0xE0:      goto yy98;
+       case 0xDF:      goto yy104;
+       case 0xE0:      goto yy105;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -665,113 +797,113 @@ yy16:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy99;
-       case 0xF0:      goto yy100;
+       case 0xEF:      goto yy106;
+       case 0xF0:      goto yy107;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy101;
-       case 0xF4:      goto yy102;
-       default:        goto yy17;
+       case 0xF3:      goto yy108;
+       case 0xF4:      goto yy109;
+       default:        goto yy20;
        }
-yy17:
-       YYDEBUG(17, YYPEEK ());
+yy20:
+       YYDEBUG(20, YYPEEK ());
 #line 361 "../ada.re2c"
        {*id =  101; continue;}
-#line 681 "../ada_re2c.c"
-yy18:
-       YYDEBUG(18, YYPEEK ());
+#line 813 "../ada_re2c.c"
+yy21:
+       YYDEBUG(21, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(19, YYPEEK ());
+       YYDEBUG(22, YYPEEK ());
 #line 336 "../ada.re2c"
        {*id =  76; continue;}
-#line 688 "../ada_re2c.c"
-yy20:
-       YYDEBUG(20, YYPEEK ());
+#line 820 "../ada_re2c.c"
+yy23:
+       YYDEBUG(23, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(21, YYPEEK ());
+       YYDEBUG(24, YYPEEK ());
 #line 337 "../ada.re2c"
        {*id =  77; continue;}
-#line 695 "../ada_re2c.c"
-yy22:
-       YYDEBUG(22, YYPEEK ());
+#line 827 "../ada_re2c.c"
+yy25:
+       YYDEBUG(25, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '*':       goto yy103;
-       default:        goto yy23;
+       case '*':       goto yy110;
+       default:        goto yy26;
        }
-yy23:
-       YYDEBUG(23, YYPEEK ());
+yy26:
+       YYDEBUG(26, YYPEEK ());
 #line 359 "../ada.re2c"
        {*id =  99; continue;}
-#line 708 "../ada_re2c.c"
-yy24:
-       YYDEBUG(24, YYPEEK ());
+#line 840 "../ada_re2c.c"
+yy27:
+       YYDEBUG(27, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(25, YYPEEK ());
+       YYDEBUG(28, YYPEEK ());
 #line 355 "../ada.re2c"
        {*id =  95; continue;}
-#line 715 "../ada_re2c.c"
-yy26:
-       YYDEBUG(26, YYPEEK ());
+#line 847 "../ada_re2c.c"
+yy29:
+       YYDEBUG(29, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(27, YYPEEK ());
+       YYDEBUG(30, YYPEEK ());
 #line 343 "../ada.re2c"
        {*id =  83; continue;}
-#line 722 "../ada_re2c.c"
-yy28:
-       YYDEBUG(28, YYPEEK ());
+#line 854 "../ada_re2c.c"
+yy31:
+       YYDEBUG(31, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '-':       goto yy105;
-       default:        goto yy29;
+       case '-':       goto yy112;
+       default:        goto yy32;
        }
-yy29:
-       YYDEBUG(29, YYPEEK ());
+yy32:
+       YYDEBUG(32, YYPEEK ());
 #line 354 "../ada.re2c"
        {*id =  94; continue;}
-#line 735 "../ada_re2c.c"
-yy30:
-       YYDEBUG(30, YYPEEK ());
+#line 867 "../ada_re2c.c"
+yy33:
+       YYDEBUG(33, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '.':       goto yy108;
-       default:        goto yy31;
+       case '.':       goto yy115;
+       default:        goto yy34;
        }
-yy31:
-       YYDEBUG(31, YYPEEK ());
+yy34:
+       YYDEBUG(34, YYPEEK ());
 #line 344 "../ada.re2c"
        {*id =  84; continue;}
-#line 748 "../ada_re2c.c"
-yy32:
-       YYDEBUG(32, YYPEEK ());
+#line 880 "../ada_re2c.c"
+yy35:
+       YYDEBUG(35, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '=':       goto yy110;
-       default:        goto yy33;
+       case '=':       goto yy117;
+       default:        goto yy36;
        }
-yy33:
-       YYDEBUG(33, YYPEEK ());
+yy36:
+       YYDEBUG(36, YYPEEK ());
 #line 357 "../ada.re2c"
        {*id =  97; continue;}
-#line 761 "../ada_re2c.c"
-yy34:
-       YYDEBUG(34, YYPEEK ());
-       yyaccept = 2;
+#line 893 "../ada_re2c.c"
+yy37:
+       YYDEBUG(37, YYPEEK ());
+       yyaccept = 3;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
-       YYDEBUG(35, YYPEEK ());
+       YYDEBUG(38, YYPEEK ());
        switch (yych) {
-       case '#':       goto yy112;
+       case '#':       goto yy119;
        case '-':
        case '.':
        case 'E':
        case '_':
-       case 'e':       goto yy113;
+       case 'e':       goto yy120;
        case '0':
        case '1':
        case '2':
@@ -781,105 +913,100 @@ yy34:
        case '6':
        case '7':
        case '8':
-       case '9':       goto yy34;
-       default:        goto yy36;
+       case '9':       goto yy37;
+       default:        goto yy39;
        }
-yy36:
-       YYDEBUG(36, YYPEEK ());
+yy39:
+       YYDEBUG(39, YYPEEK ());
 #line 363 "../ada.re2c"
        {*id =  103; continue;}
-#line 792 "../ada_re2c.c"
-yy37:
-       YYDEBUG(37, YYPEEK ());
+#line 924 "../ada_re2c.c"
+yy40:
+       YYDEBUG(40, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '=':       goto yy115;
-       default:        goto yy38;
+       case '=':       goto yy122;
+       default:        goto yy41;
        }
-yy38:
-       YYDEBUG(38, YYPEEK ());
+yy41:
+       YYDEBUG(41, YYPEEK ());
 #line 341 "../ada.re2c"
        {*id =  81; continue;}
-#line 805 "../ada_re2c.c"
-yy39:
-       YYDEBUG(39, YYPEEK ());
+#line 937 "../ada_re2c.c"
+yy42:
+       YYDEBUG(42, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(40, YYPEEK ());
+       YYDEBUG(43, YYPEEK ());
 #line 356 "../ada.re2c"
        {*id =  96; continue;}
-#line 812 "../ada_re2c.c"
-yy41:
-       YYDEBUG(41, YYPEEK ());
+#line 944 "../ada_re2c.c"
+yy44:
+       YYDEBUG(44, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '<':       goto yy117;
-       case '=':       goto yy119;
-       case '>':       goto yy121;
-       default:        goto yy42;
+       case '<':       goto yy124;
+       case '=':       goto yy126;
+       case '>':       goto yy128;
+       default:        goto yy45;
        }
-yy42:
-       YYDEBUG(42, YYPEEK ());
+yy45:
+       YYDEBUG(45, YYPEEK ());
 #line 351 "../ada.re2c"
        {*id =  91; continue;}
-#line 827 "../ada_re2c.c"
-yy43:
-       YYDEBUG(43, YYPEEK ());
+#line 959 "../ada_re2c.c"
+yy46:
+       YYDEBUG(46, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '>':       goto yy123;
-       default:        goto yy44;
+       case '>':       goto yy130;
+       default:        goto yy47;
        }
-yy44:
-       YYDEBUG(44, YYPEEK ());
+yy47:
+       YYDEBUG(47, YYPEEK ());
 #line 346 "../ada.re2c"
        {*id =  86; continue;}
-#line 840 "../ada_re2c.c"
-yy45:
-       YYDEBUG(45, YYPEEK ());
+#line 972 "../ada_re2c.c"
+yy48:
+       YYDEBUG(48, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '=':       goto yy125;
-       case '>':       goto yy127;
-       default:        goto yy46;
+       case '=':       goto yy132;
+       case '>':       goto yy134;
+       default:        goto yy49;
        }
-yy46:
-       YYDEBUG(46, YYPEEK ());
+yy49:
+       YYDEBUG(49, YYPEEK ());
 #line 348 "../ada.re2c"
        {*id =  88; continue;}
-#line 854 "../ada_re2c.c"
-yy47:
-       YYDEBUG(47, YYPEEK ());
-       yyaccept = 3;
+#line 986 "../ada_re2c.c"
+yy50:
+       YYDEBUG(50, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'B':
-       case 'b':       goto yy129;
+       case 'b':       goto yy136;
        case 'C':
-       case 'c':       goto yy130;
+       case 'c':       goto yy137;
        case 'L':
-       case 'l':       goto yy131;
+       case 'l':       goto yy138;
        case 'N':
-       case 'n':       goto yy132;
+       case 'n':       goto yy139;
        case 'R':
-       case 'r':       goto yy133;
+       case 'r':       goto yy140;
        case 'T':
-       case 't':       goto yy134;
-       default:        goto yy56;
+       case 't':       goto yy141;
+       default:        goto yy15;
        }
-yy48:
-       YYDEBUG(48, YYPEEK ());
-#line 364 "../ada.re2c"
-       {*id =  104; continue;}
-#line 880 "../ada_re2c.c"
-yy49:
-       YYDEBUG(49, YYPEEK ());
-       yyaccept = 3;
+yy51:
+       YYDEBUG(51, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -888,11 +1015,11 @@ yy49:
        case 'e':       goto yy143;
        case 'O':
        case 'o':       goto yy144;
-       default:        goto yy56;
+       default:        goto yy15;
        }
-yy50:
-       YYDEBUG(50, YYPEEK ());
-       yyaccept = 3;
+yy52:
+       YYDEBUG(52, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -901,11 +1028,11 @@ yy50:
        case 'a':       goto yy145;
        case 'O':
        case 'o':       goto yy146;
-       default:        goto yy56;
+       default:        goto yy15;
        }
-yy51:
-       YYDEBUG(51, YYPEEK ());
-       yyaccept = 3;
+yy53:
+       YYDEBUG(53, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -916,11 +1043,11 @@ yy51:
        case 'i':       goto yy148;
        case 'O':
        case 'o':       goto yy149;
-       default:        goto yy56;
+       default:        goto yy15;
        }
-yy52:
-       YYDEBUG(52, YYPEEK ());
-       yyaccept = 3;
+yy54:
+       YYDEBUG(54, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -931,11 +1058,11 @@ yy52:
        case 'n':       goto yy152;
        case 'X':
        case 'x':       goto yy153;
-       default:        goto yy56;
+       default:        goto yy15;
        }
-yy53:
-       YYDEBUG(53, YYPEEK ());
-       yyaccept = 3;
+yy55:
+       YYDEBUG(55, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -944,11 +1071,11 @@ yy53:
        case 'o':       goto yy154;
        case 'U':
        case 'u':       goto yy155;
-       default:        goto yy56;
+       default:        goto yy15;
        }
-yy54:
-       YYDEBUG(54, YYPEEK ());
-       yyaccept = 3;
+yy56:
+       YYDEBUG(56, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -957,137 +1084,11 @@ yy54:
        case 'e':       goto yy156;
        case 'O':
        case 'o':       goto yy157;
-       default:        goto yy56;
-       }
-yy55:
-       YYDEBUG(55, YYPEEK ());
-       yyaccept = 3;
-       YYSKIP ();
-       YYBACKUP ();
-       yych = YYPEEK ();
-yy56:
-       YYDEBUG(56, YYPEEK ());
-       switch (yych) {
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':
-       case 'A':
-       case 'B':
-       case 'C':
-       case 'D':
-       case 'E':
-       case 'F':
-       case 'G':
-       case 'H':
-       case 'I':
-       case 'J':
-       case 'K':
-       case 'L':
-       case 'M':
-       case 'N':
-       case 'O':
-       case 'P':
-       case 'Q':
-       case 'R':
-       case 'S':
-       case 'T':
-       case 'U':
-       case 'V':
-       case 'W':
-       case 'X':
-       case 'Y':
-       case 'Z':
-       case '_':
-       case 'a':
-       case 'b':
-       case 'c':
-       case 'd':
-       case 'e':
-       case 'f':
-       case 'g':
-       case 'h':
-       case 'i':
-       case 'j':
-       case 'k':
-       case 'l':
-       case 'm':
-       case 'n':
-       case 'o':
-       case 'p':
-       case 'q':
-       case 'r':
-       case 's':
-       case 't':
-       case 'u':
-       case 'v':
-       case 'w':
-       case 'x':
-       case 'y':
-       case 'z':       goto yy55;
-       case '[':       goto yy136;
-       case 0xC2:
-       case 0xC3:
-       case 0xC4:
-       case 0xC5:
-       case 0xC6:
-       case 0xC7:
-       case 0xC8:
-       case 0xC9:
-       case 0xCA:
-       case 0xCB:
-       case 0xCC:
-       case 0xCD:
-       case 0xCE:
-       case 0xCF:
-       case 0xD0:
-       case 0xD1:
-       case 0xD2:
-       case 0xD3:
-       case 0xD4:
-       case 0xD5:
-       case 0xD6:
-       case 0xD7:
-       case 0xD8:
-       case 0xD9:
-       case 0xDA:
-       case 0xDB:
-       case 0xDC:
-       case 0xDD:
-       case 0xDE:
-       case 0xDF:      goto yy137;
-       case 0xE0:      goto yy138;
-       case 0xE1:
-       case 0xE2:
-       case 0xE3:
-       case 0xE4:
-       case 0xE5:
-       case 0xE6:
-       case 0xE7:
-       case 0xE8:
-       case 0xE9:
-       case 0xEA:
-       case 0xEB:
-       case 0xEC:
-       case 0xED:
-       case 0xEE:
-       case 0xEF:      goto yy139;
-       case 0xF0:      goto yy140;
-       case 0xF1:
-       case 0xF2:
-       case 0xF3:      goto yy141;
-       case 0xF4:      goto yy142;
-       default:        goto yy48;
+       default:        goto yy15;
        }
 yy57:
        YYDEBUG(57, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1098,11 +1099,11 @@ yy57:
        case 'n':       goto yy160;
        case 'S':
        case 's':       goto yy162;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy58:
        YYDEBUG(58, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1111,22 +1112,22 @@ yy58:
        case 'i':       goto yy164;
        case 'O':
        case 'o':       goto yy165;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy59:
        YYDEBUG(59, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy166;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy60:
        YYDEBUG(60, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1137,11 +1138,11 @@ yy60:
        case 'o':       goto yy168;
        case 'U':
        case 'u':       goto yy169;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy61:
        YYDEBUG(61, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1156,11 +1157,11 @@ yy61:
        case 'u':       goto yy175;
        case 'V':
        case 'v':       goto yy176;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy62:
        YYDEBUG(62, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1169,11 +1170,11 @@ yy62:
        case 'a':       goto yy177;
        case 'R':
        case 'r':       goto yy178;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy63:
        YYDEBUG(63, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1182,11 +1183,11 @@ yy63:
        case 'a':       goto yy179;
        case 'E':
        case 'e':       goto yy180;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy64:
        YYDEBUG(64, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1199,11 +1200,11 @@ yy64:
        case 'u':       goto yy183;
        case 'Y':
        case 'y':       goto yy184;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy65:
        YYDEBUG(65, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1216,11 +1217,11 @@ yy65:
        case 'h':       goto yy187;
        case 'Y':
        case 'y':       goto yy188;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy66:
        YYDEBUG(66, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1229,11 +1230,11 @@ yy66:
        case 'n':       goto yy189;
        case 'S':
        case 's':       goto yy190;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy67:
        YYDEBUG(67, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -1242,18 +1243,18 @@ yy67:
        case 'h':       goto yy191;
        case 'I':
        case 'i':       goto yy192;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy68:
        YYDEBUG(68, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy193;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy69:
        YYDEBUG(69, YYPEEK ());
@@ -1459,7 +1460,7 @@ yy71:
        YYDEBUG(72, YYPEEK ());
 #line 339 "../ada.re2c"
        {*id =  79; continue;}
-#line 1463 "../ada_re2c.c"
+#line 1464 "../ada_re2c.c"
 yy73:
        YYDEBUG(73, YYPEEK ());
        YYSKIP ();
@@ -1528,7 +1529,7 @@ yy73:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy55;
+       case 0xBF:      goto yy14;
        default:        goto yy3;
        }
 yy74:
@@ -1569,7 +1570,7 @@ yy74:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy137;
+       case 0xBF:      goto yy95;
        default:        goto yy3;
        }
 yy75:
@@ -1642,7 +1643,7 @@ yy75:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy137;
+       case 0xBF:      goto yy95;
        default:        goto yy3;
        }
 yy76:
@@ -1699,7 +1700,7 @@ yy76:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy139;
+       case 0xBF:      goto yy97;
        default:        goto yy3;
        }
 yy77:
@@ -1772,7 +1773,7 @@ yy77:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy139;
+       case 0xBF:      goto yy97;
        default:        goto yy3;
        }
 yy78:
@@ -1797,7 +1798,7 @@ yy78:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy139;
+       case 0x8F:      goto yy97;
        default:        goto yy3;
        }
 yy79:
@@ -1961,12 +1962,12 @@ yy81:
        YYRESTORE ();
        switch (yyaccept) {
        case 0:         goto yy3;
-       case 1:         goto yy17;
-       case 2:         goto yy36;
-       case 3:         goto yy48;
+       case 1:         goto yy16;
+       case 2:         goto yy20;
+       case 3:         goto yy39;
        case 4:         goto yy83;
-       case 5:         goto yy107;
-       case 6:         goto yy135;
+       case 5:         goto yy114;
+       case 6:         goto yy142;
        case 7:         goto yy150;
        case 8:         goto yy159;
        case 9:         goto yy161;
@@ -2055,7 +2056,7 @@ yy83:
        YYDEBUG(83, YYPEEK ());
 #line 365 "../ada.re2c"
        {*id =  105; continue;}
-#line 2059 "../ada_re2c.c"
+#line 2060 "../ada_re2c.c"
 yy84:
        YYDEBUG(84, YYPEEK ());
        YYSKIP ();
@@ -2555,7 +2556,7 @@ yy93:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'f':       goto yy105;
+       case 'f':       goto yy112;
        default:        goto yy81;
        }
 yy94:
@@ -2563,7 +2564,7 @@ yy94:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '\'':      goto yy207;
+       case '"':       goto yy194;
        default:        goto yy81;
        }
 yy95:
@@ -2571,23 +2572,6 @@ yy95:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '\'':      goto yy209;
-       default:        goto yy81;
-       }
-yy96:
-       YYDEBUG(96, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case '"':       goto yy210;
-       case '\'':      goto yy207;
-       default:        goto yy81;
-       }
-yy97:
-       YYDEBUG(97, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
        case 0x80:
        case 0x81:
        case 0x82:
@@ -2651,11 +2635,11 @@ yy97:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy94;
+       case 0xBF:      goto yy14;
        default:        goto yy81;
        }
-yy98:
-       YYDEBUG(98, YYPEEK ());
+yy96:
+       YYDEBUG(96, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2690,11 +2674,11 @@ yy98:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy97;
+       case 0xBF:      goto yy95;
        default:        goto yy81;
        }
-yy99:
-       YYDEBUG(99, YYPEEK ());
+yy97:
+       YYDEBUG(97, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2761,11 +2745,11 @@ yy99:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy97;
+       case 0xBF:      goto yy95;
        default:        goto yy81;
        }
-yy100:
-       YYDEBUG(100, YYPEEK ());
+yy98:
+       YYDEBUG(98, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2816,11 +2800,11 @@ yy100:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy99;
+       case 0xBF:      goto yy97;
        default:        goto yy81;
        }
-yy101:
-       YYDEBUG(101, YYPEEK ());
+yy99:
+       YYDEBUG(99, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2887,11 +2871,11 @@ yy101:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy99;
+       case 0xBF:      goto yy97;
        default:        goto yy81;
        }
-yy102:
-       YYDEBUG(102, YYPEEK ());
+yy100:
+       YYDEBUG(100, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2910,368 +2894,425 @@ yy102:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy99;
+       case 0x8F:      goto yy97;
        default:        goto yy81;
        }
-yy103:
-       YYDEBUG(103, YYPEEK ());
+yy101:
+       YYDEBUG(101, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(104, YYPEEK ());
-#line 360 "../ada.re2c"
-       {*id =  100; continue;}
-#line 2923 "../ada_re2c.c"
-yy105:
-       YYDEBUG(105, YYPEEK ());
-       yyaccept = 5;
+       yych = YYPEEK ();
+       switch (yych) {
+       case '\'':      goto yy207;
+       default:        goto yy81;
+       }
+yy102:
+       YYDEBUG(102, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
-       YYDEBUG(106, YYPEEK ());
        switch (yych) {
-       case 0x00:
-       case 0x01:
-       case 0x02:
-       case 0x03:
-       case 0x05:
-       case 0x06:
-       case 0x07:
-       case 0x08:
-       case '\t':
-       case '\v':
-       case '\f':
-       case '\r':
-       case 0x0E:
-       case 0x0F:
-       case 0x10:
-       case 0x11:
-       case 0x12:
-       case 0x13:
-       case 0x14:
-       case 0x15:
-       case 0x16:
-       case 0x17:
-       case 0x18:
-       case 0x19:
-       case 0x1A:
-       case 0x1B:
-       case 0x1C:
-       case 0x1D:
-       case 0x1E:
-       case 0x1F:
-       case ' ':
-       case '!':
-       case '"':
-       case '#':
-       case '$':
-       case '%':
-       case '&':
-       case '\'':
-       case '(':
-       case ')':
-       case '*':
-       case '+':
-       case ',':
-       case '-':
-       case '.':
-       case '/':
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':
-       case ':':
-       case ';':
-       case '<':
-       case '=':
-       case '>':
-       case '?':
-       case '@':
-       case 'A':
-       case 'B':
-       case 'C':
-       case 'D':
-       case 'E':
-       case 'F':
-       case 'G':
-       case 'H':
-       case 'I':
-       case 'J':
-       case 'K':
-       case 'L':
-       case 'M':
-       case 'N':
-       case 'O':
-       case 'P':
-       case 'Q':
-       case 'R':
-       case 'S':
-       case 'T':
-       case 'U':
-       case 'V':
-       case 'W':
-       case 'X':
-       case 'Y':
-       case 'Z':
-       case '[':
-       case '\\':
-       case ']':
-       case '^':
-       case '_':
-       case '`':
-       case 'a':
-       case 'b':
-       case 'c':
-       case 'd':
-       case 'e':
-       case 'f':
-       case 'g':
-       case 'h':
-       case 'i':
-       case 'j':
-       case 'k':
-       case 'l':
-       case 'm':
-       case 'n':
-       case 'o':
-       case 'p':
-       case 'q':
-       case 'r':
-       case 's':
-       case 't':
-       case 'u':
-       case 'v':
-       case 'w':
-       case 'x':
-       case 'y':
-       case 'z':
-       case '{':
-       case '|':
-       case '}':
-       case '~':
-       case 0x7F:      goto yy105;
-       case 0xC2:
-       case 0xC3:
-       case 0xC4:
-       case 0xC5:
-       case 0xC6:
-       case 0xC7:
-       case 0xC8:
-       case 0xC9:
-       case 0xCA:
-       case 0xCB:
-       case 0xCC:
-       case 0xCD:
-       case 0xCE:
-       case 0xCF:
-       case 0xD0:
-       case 0xD1:
-       case 0xD2:
-       case 0xD3:
-       case 0xD4:
-       case 0xD5:
-       case 0xD6:
-       case 0xD7:
-       case 0xD8:
-       case 0xD9:
-       case 0xDA:
-       case 0xDB:
-       case 0xDC:
-       case 0xDD:
-       case 0xDE:
-       case 0xDF:      goto yy211;
-       case 0xE0:      goto yy212;
-       case 0xE1:
-       case 0xE2:
-       case 0xE3:
-       case 0xE4:
-       case 0xE5:
-       case 0xE6:
-       case 0xE7:
-       case 0xE8:
-       case 0xE9:
-       case 0xEA:
-       case 0xEB:
-       case 0xEC:
-       case 0xED:
-       case 0xEE:
-       case 0xEF:      goto yy213;
-       case 0xF0:      goto yy214;
-       case 0xF1:
-       case 0xF2:
-       case 0xF3:      goto yy215;
-       case 0xF4:      goto yy216;
-       default:        goto yy107;
+       case '\'':      goto yy209;
+       default:        goto yy81;
        }
-yy107:
-       YYDEBUG(107, YYPEEK ());
-#line 262 "../ada.re2c"
-       {*id =  2; continue;}
-#line 3115 "../ada_re2c.c"
-yy108:
-       YYDEBUG(108, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(109, YYPEEK ());
-#line 345 "../ada.re2c"
-       {*id =  85; continue;}
-#line 3122 "../ada_re2c.c"
-yy110:
-       YYDEBUG(110, YYPEEK ());
+yy103:
+       YYDEBUG(103, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(111, YYPEEK ());
-#line 358 "../ada.re2c"
-       {*id =  98; continue;}
-#line 3129 "../ada_re2c.c"
-yy112:
-       YYDEBUG(112, YYPEEK ());
+       yych = YYPEEK ();
+       switch (yych) {
+       case '"':       goto yy210;
+       case '\'':      goto yy207;
+       default:        goto yy81;
+       }
+yy104:
+       YYDEBUG(104, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '#':       goto yy81;
-       default:        goto yy218;
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy101;
+       default:        goto yy81;
        }
-yy113:
-       YYDEBUG(113, YYPEEK ());
+yy105:
+       YYDEBUG(105, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
-       YYDEBUG(114, YYPEEK ());
        switch (yych) {
-       case '-':
-       case '.':
-       case 'E':
-       case '_':
-       case 'e':       goto yy113;
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':       goto yy219;
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy104;
        default:        goto yy81;
        }
-yy115:
-       YYDEBUG(115, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(116, YYPEEK ());
-#line 342 "../ada.re2c"
-       {*id =  82; continue;}
-#line 3167 "../ada_re2c.c"
-yy117:
-       YYDEBUG(117, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(118, YYPEEK ());
-#line 353 "../ada.re2c"
-       {*id =  93; continue;}
-#line 3174 "../ada_re2c.c"
-yy119:
-       YYDEBUG(119, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(120, YYPEEK ());
-#line 352 "../ada.re2c"
-       {*id =  92; continue;}
-#line 3181 "../ada_re2c.c"
-yy121:
-       YYDEBUG(121, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(122, YYPEEK ());
-#line 340 "../ada.re2c"
-       {*id =  80; continue;}
-#line 3188 "../ada_re2c.c"
-yy123:
-       YYDEBUG(123, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(124, YYPEEK ());
-#line 347 "../ada.re2c"
-       {*id =  87; continue;}
-#line 3195 "../ada_re2c.c"
-yy125:
-       YYDEBUG(125, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(126, YYPEEK ());
-#line 349 "../ada.re2c"
-       {*id =  89; continue;}
-#line 3202 "../ada_re2c.c"
-yy127:
-       YYDEBUG(127, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(128, YYPEEK ());
-#line 350 "../ada.re2c"
-       {*id =  90; continue;}
-#line 3209 "../ada_re2c.c"
-yy129:
-       YYDEBUG(129, YYPEEK ());
-       yyaccept = 3;
+yy106:
+       YYDEBUG(106, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'O':
-       case 'o':       goto yy221;
-       case 'S':
-       case 's':       goto yy222;
-       default:        goto yy56;
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy104;
+       default:        goto yy81;
        }
-yy130:
-       YYDEBUG(130, YYPEEK ());
-       yyaccept = 3;
+yy107:
+       YYDEBUG(107, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'C':
-       case 'c':       goto yy224;
-       default:        goto yy56;
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy106;
+       default:        goto yy81;
        }
-yy131:
-       YYDEBUG(131, YYPEEK ());
-       yyaccept = 3;
+yy108:
+       YYDEBUG(108, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'I':
-       case 'i':       goto yy225;
-       case 'L':
-       case 'l':       goto yy226;
-       default:        goto yy56;
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy106;
+       default:        goto yy81;
        }
-yy132:
-       YYDEBUG(132, YYPEEK ());
-       yyaccept = 3;
+yy109:
+       YYDEBUG(109, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'D':
-       case 'd':       goto yy228;
-       default:        goto yy56;
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:      goto yy106;
+       default:        goto yy81;
        }
-yy133:
-       YYDEBUG(133, YYPEEK ());
-       yyaccept = 3;
+yy110:
+       YYDEBUG(110, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'R':
-       case 'r':       goto yy230;
-       default:        goto yy56;
-       }
-yy134:
-       YYDEBUG(134, YYPEEK ());
-       yyaccept = 6;
+       YYDEBUG(111, YYPEEK ());
+#line 360 "../ada.re2c"
+       {*id =  100; continue;}
+#line 3262 "../ada_re2c.c"
+yy112:
+       YYDEBUG(112, YYPEEK ());
+       yyaccept = 5;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
+       YYDEBUG(113, YYPEEK ());
        switch (yych) {
+       case 0x00:
+       case 0x01:
+       case 0x02:
+       case 0x03:
+       case 0x05:
+       case 0x06:
+       case 0x07:
+       case 0x08:
+       case '\t':
+       case '\v':
+       case '\f':
+       case '\r':
+       case 0x0E:
+       case 0x0F:
+       case 0x10:
+       case 0x11:
+       case 0x12:
+       case 0x13:
+       case 0x14:
+       case 0x15:
+       case 0x16:
+       case 0x17:
+       case 0x18:
+       case 0x19:
+       case 0x1A:
+       case 0x1B:
+       case 0x1C:
+       case 0x1D:
+       case 0x1E:
+       case 0x1F:
+       case ' ':
+       case '!':
+       case '"':
+       case '#':
+       case '$':
+       case '%':
+       case '&':
+       case '\'':
+       case '(':
+       case ')':
+       case '*':
+       case '+':
+       case ',':
+       case '-':
+       case '.':
+       case '/':
        case '0':
        case '1':
        case '2':
@@ -3282,6 +3323,13 @@ yy134:
        case '7':
        case '8':
        case '9':
+       case ':':
+       case ';':
+       case '<':
+       case '=':
+       case '>':
+       case '?':
+       case '@':
        case 'A':
        case 'B':
        case 'C':
@@ -3309,7 +3357,11 @@ yy134:
        case 'Y':
        case 'Z':
        case '[':
+       case '\\':
+       case ']':
+       case '^':
        case '_':
+       case '`':
        case 'a':
        case 'b':
        case 'c':
@@ -3336,6 +3388,11 @@ yy134:
        case 'x':
        case 'y':
        case 'z':
+       case '{':
+       case '|':
+       case '}':
+       case '~':
+       case 0x7F:      goto yy112;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -3365,8 +3422,8 @@ yy134:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:
-       case 0xE0:
+       case 0xDF:      goto yy211;
+       case 0xE0:      goto yy212;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -3381,404 +3438,348 @@ yy134:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:
-       case 0xF0:
+       case 0xEF:      goto yy213;
+       case 0xF0:      goto yy214;
        case 0xF1:
        case 0xF2:
-       case 0xF3:
-       case 0xF4:      goto yy56;
-       default:        goto yy135;
+       case 0xF3:      goto yy215;
+       case 0xF4:      goto yy216;
+       default:        goto yy114;
+       }
+yy114:
+       YYDEBUG(114, YYPEEK ());
+#line 262 "../ada.re2c"
+       {*id =  2; continue;}
+#line 3454 "../ada_re2c.c"
+yy115:
+       YYDEBUG(115, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(116, YYPEEK ());
+#line 345 "../ada.re2c"
+       {*id =  85; continue;}
+#line 3461 "../ada_re2c.c"
+yy117:
+       YYDEBUG(117, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(118, YYPEEK ());
+#line 358 "../ada.re2c"
+       {*id =  98; continue;}
+#line 3468 "../ada_re2c.c"
+yy119:
+       YYDEBUG(119, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case '#':       goto yy81;
+       default:        goto yy218;
+       }
+yy120:
+       YYDEBUG(120, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       YYDEBUG(121, YYPEEK ());
+       switch (yych) {
+       case '-':
+       case '.':
+       case 'E':
+       case '_':
+       case 'e':       goto yy120;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       goto yy219;
+       default:        goto yy81;
        }
-yy135:
+yy122:
+       YYDEBUG(122, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(123, YYPEEK ());
+#line 342 "../ada.re2c"
+       {*id =  82; continue;}
+#line 3506 "../ada_re2c.c"
+yy124:
+       YYDEBUG(124, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(125, YYPEEK ());
+#line 353 "../ada.re2c"
+       {*id =  93; continue;}
+#line 3513 "../ada_re2c.c"
+yy126:
+       YYDEBUG(126, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(127, YYPEEK ());
+#line 352 "../ada.re2c"
+       {*id =  92; continue;}
+#line 3520 "../ada_re2c.c"
+yy128:
+       YYDEBUG(128, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(129, YYPEEK ());
+#line 340 "../ada.re2c"
+       {*id =  80; continue;}
+#line 3527 "../ada_re2c.c"
+yy130:
+       YYDEBUG(130, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(131, YYPEEK ());
+#line 347 "../ada.re2c"
+       {*id =  87; continue;}
+#line 3534 "../ada_re2c.c"
+yy132:
+       YYDEBUG(132, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(133, YYPEEK ());
+#line 349 "../ada.re2c"
+       {*id =  89; continue;}
+#line 3541 "../ada_re2c.c"
+yy134:
+       YYDEBUG(134, YYPEEK ());
+       YYSKIP ();
        YYDEBUG(135, YYPEEK ());
-#line 272 "../ada.re2c"
-       {*id =  12; continue;}
-#line 3397 "../ada_re2c.c"
+#line 350 "../ada.re2c"
+       {*id =  90; continue;}
+#line 3548 "../ada_re2c.c"
 yy136:
        YYDEBUG(136, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '"':       goto yy194;
-       default:        goto yy81;
+       case 'O':
+       case 'o':       goto yy221;
+       case 'S':
+       case 's':       goto yy222;
+       default:        goto yy15;
        }
 yy137:
        YYDEBUG(137, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
-       switch (yych) {
-       case 0x80:
-       case 0x81:
-       case 0x82:
-       case 0x83:
-       case 0x84:
-       case 0x85:
-       case 0x86:
-       case 0x87:
-       case 0x88:
-       case 0x89:
-       case 0x8A:
-       case 0x8B:
-       case 0x8C:
-       case 0x8D:
-       case 0x8E:
-       case 0x8F:
-       case 0x90:
-       case 0x91:
-       case 0x92:
-       case 0x93:
-       case 0x94:
-       case 0x95:
-       case 0x96:
-       case 0x97:
-       case 0x98:
-       case 0x99:
-       case 0x9A:
-       case 0x9B:
-       case 0x9C:
-       case 0x9D:
-       case 0x9E:
-       case 0x9F:
-       case 0xA0:
-       case 0xA1:
-       case 0xA2:
-       case 0xA3:
-       case 0xA4:
-       case 0xA5:
-       case 0xA6:
-       case 0xA7:
-       case 0xA8:
-       case 0xA9:
-       case 0xAA:
-       case 0xAB:
-       case 0xAC:
-       case 0xAD:
-       case 0xAE:
-       case 0xAF:
-       case 0xB0:
-       case 0xB1:
-       case 0xB2:
-       case 0xB3:
-       case 0xB4:
-       case 0xB5:
-       case 0xB6:
-       case 0xB7:
-       case 0xB8:
-       case 0xB9:
-       case 0xBA:
-       case 0xBB:
-       case 0xBC:
-       case 0xBD:
-       case 0xBE:
-       case 0xBF:      goto yy55;
-       default:        goto yy81;
+       switch (yych) {
+       case 'C':
+       case 'c':       goto yy224;
+       default:        goto yy15;
        }
 yy138:
        YYDEBUG(138, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 0xA0:
-       case 0xA1:
-       case 0xA2:
-       case 0xA3:
-       case 0xA4:
-       case 0xA5:
-       case 0xA6:
-       case 0xA7:
-       case 0xA8:
-       case 0xA9:
-       case 0xAA:
-       case 0xAB:
-       case 0xAC:
-       case 0xAD:
-       case 0xAE:
-       case 0xAF:
-       case 0xB0:
-       case 0xB1:
-       case 0xB2:
-       case 0xB3:
-       case 0xB4:
-       case 0xB5:
-       case 0xB6:
-       case 0xB7:
-       case 0xB8:
-       case 0xB9:
-       case 0xBA:
-       case 0xBB:
-       case 0xBC:
-       case 0xBD:
-       case 0xBE:
-       case 0xBF:      goto yy137;
-       default:        goto yy81;
+       case 'I':
+       case 'i':       goto yy225;
+       case 'L':
+       case 'l':       goto yy226;
+       default:        goto yy15;
        }
 yy139:
        YYDEBUG(139, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 0x80:
-       case 0x81:
-       case 0x82:
-       case 0x83:
-       case 0x84:
-       case 0x85:
-       case 0x86:
-       case 0x87:
-       case 0x88:
-       case 0x89:
-       case 0x8A:
-       case 0x8B:
-       case 0x8C:
-       case 0x8D:
-       case 0x8E:
-       case 0x8F:
-       case 0x90:
-       case 0x91:
-       case 0x92:
-       case 0x93:
-       case 0x94:
-       case 0x95:
-       case 0x96:
-       case 0x97:
-       case 0x98:
-       case 0x99:
-       case 0x9A:
-       case 0x9B:
-       case 0x9C:
-       case 0x9D:
-       case 0x9E:
-       case 0x9F:
-       case 0xA0:
-       case 0xA1:
-       case 0xA2:
-       case 0xA3:
-       case 0xA4:
-       case 0xA5:
-       case 0xA6:
-       case 0xA7:
-       case 0xA8:
-       case 0xA9:
-       case 0xAA:
-       case 0xAB:
-       case 0xAC:
-       case 0xAD:
-       case 0xAE:
-       case 0xAF:
-       case 0xB0:
-       case 0xB1:
-       case 0xB2:
-       case 0xB3:
-       case 0xB4:
-       case 0xB5:
-       case 0xB6:
-       case 0xB7:
-       case 0xB8:
-       case 0xB9:
-       case 0xBA:
-       case 0xBB:
-       case 0xBC:
-       case 0xBD:
-       case 0xBE:
-       case 0xBF:      goto yy137;
-       default:        goto yy81;
+       case 'D':
+       case 'd':       goto yy228;
+       default:        goto yy15;
        }
 yy140:
        YYDEBUG(140, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 0x90:
-       case 0x91:
-       case 0x92:
-       case 0x93:
-       case 0x94:
-       case 0x95:
-       case 0x96:
-       case 0x97:
-       case 0x98:
-       case 0x99:
-       case 0x9A:
-       case 0x9B:
-       case 0x9C:
-       case 0x9D:
-       case 0x9E:
-       case 0x9F:
-       case 0xA0:
-       case 0xA1:
-       case 0xA2:
-       case 0xA3:
-       case 0xA4:
-       case 0xA5:
-       case 0xA6:
-       case 0xA7:
-       case 0xA8:
-       case 0xA9:
-       case 0xAA:
-       case 0xAB:
-       case 0xAC:
-       case 0xAD:
-       case 0xAE:
-       case 0xAF:
-       case 0xB0:
-       case 0xB1:
-       case 0xB2:
-       case 0xB3:
-       case 0xB4:
-       case 0xB5:
-       case 0xB6:
-       case 0xB7:
-       case 0xB8:
-       case 0xB9:
-       case 0xBA:
-       case 0xBB:
-       case 0xBC:
-       case 0xBD:
-       case 0xBE:
-       case 0xBF:      goto yy139;
-       default:        goto yy81;
+       case 'R':
+       case 'r':       goto yy230;
+       default:        goto yy15;
        }
 yy141:
        YYDEBUG(141, YYPEEK ());
+       yyaccept = 6;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 0x80:
-       case 0x81:
-       case 0x82:
-       case 0x83:
-       case 0x84:
-       case 0x85:
-       case 0x86:
-       case 0x87:
-       case 0x88:
-       case 0x89:
-       case 0x8A:
-       case 0x8B:
-       case 0x8C:
-       case 0x8D:
-       case 0x8E:
-       case 0x8F:
-       case 0x90:
-       case 0x91:
-       case 0x92:
-       case 0x93:
-       case 0x94:
-       case 0x95:
-       case 0x96:
-       case 0x97:
-       case 0x98:
-       case 0x99:
-       case 0x9A:
-       case 0x9B:
-       case 0x9C:
-       case 0x9D:
-       case 0x9E:
-       case 0x9F:
-       case 0xA0:
-       case 0xA1:
-       case 0xA2:
-       case 0xA3:
-       case 0xA4:
-       case 0xA5:
-       case 0xA6:
-       case 0xA7:
-       case 0xA8:
-       case 0xA9:
-       case 0xAA:
-       case 0xAB:
-       case 0xAC:
-       case 0xAD:
-       case 0xAE:
-       case 0xAF:
-       case 0xB0:
-       case 0xB1:
-       case 0xB2:
-       case 0xB3:
-       case 0xB4:
-       case 0xB5:
-       case 0xB6:
-       case 0xB7:
-       case 0xB8:
-       case 0xB9:
-       case 0xBA:
-       case 0xBB:
-       case 0xBC:
-       case 0xBD:
-       case 0xBE:
-       case 0xBF:      goto yy139;
-       default:        goto yy81;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '[':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy15;
+       default:        goto yy142;
        }
 yy142:
        YYDEBUG(142, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 0x80:
-       case 0x81:
-       case 0x82:
-       case 0x83:
-       case 0x84:
-       case 0x85:
-       case 0x86:
-       case 0x87:
-       case 0x88:
-       case 0x89:
-       case 0x8A:
-       case 0x8B:
-       case 0x8C:
-       case 0x8D:
-       case 0x8E:
-       case 0x8F:      goto yy139;
-       default:        goto yy81;
-       }
+#line 272 "../ada.re2c"
+       {*id =  12; continue;}
+#line 3736 "../ada_re2c.c"
 yy143:
        YYDEBUG(143, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy231;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy144:
        YYDEBUG(144, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy232;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy145:
        YYDEBUG(145, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy233;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy146:
        YYDEBUG(146, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy234;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy147:
        YYDEBUG(147, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3787,18 +3788,18 @@ yy147:
        case 'c':       goto yy235;
        case 'L':
        case 'l':       goto yy236;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy148:
        YYDEBUG(148, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy237;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy149:
        YYDEBUG(149, YYPEEK ());
@@ -3921,28 +3922,28 @@ yy149:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy150;
        }
 yy150:
        YYDEBUG(150, YYPEEK ());
 #line 281 "../ada.re2c"
        {*id =  21; continue;}
-#line 3932 "../ada_re2c.c"
+#line 3933 "../ada_re2c.c"
 yy151:
        YYDEBUG(151, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy238;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy152:
        YYDEBUG(152, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3951,11 +3952,11 @@ yy152:
        case 'd':       goto yy239;
        case 'T':
        case 't':       goto yy241;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy153:
        YYDEBUG(153, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3964,51 +3965,51 @@ yy153:
        case 'c':       goto yy242;
        case 'I':
        case 'i':       goto yy243;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy154:
        YYDEBUG(154, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy244;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy155:
        YYDEBUG(155, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy246;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy156:
        YYDEBUG(156, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy247;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy157:
        YYDEBUG(157, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy248;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy158:
        YYDEBUG(158, YYPEEK ());
@@ -4131,14 +4132,14 @@ yy158:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy159;
        }
 yy159:
        YYDEBUG(159, YYPEEK ());
 #line 292 "../ada.re2c"
        {*id =  32; continue;}
-#line 4142 "../ada_re2c.c"
+#line 4143 "../ada_re2c.c"
 yy160:
        YYDEBUG(160, YYPEEK ());
        yyaccept = 9;
@@ -4258,7 +4259,7 @@ yy160:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        case 'T':
        case 't':       goto yy249;
        default:        goto yy161;
@@ -4267,7 +4268,7 @@ yy161:
        YYDEBUG(161, YYPEEK ());
 #line 293 "../ada.re2c"
        {*id =  33; continue;}
-#line 4271 "../ada_re2c.c"
+#line 4272 "../ada_re2c.c"
 yy162:
        YYDEBUG(162, YYPEEK ());
        yyaccept = 10;
@@ -4389,79 +4390,79 @@ yy162:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy163;
        }
 yy163:
        YYDEBUG(163, YYPEEK ());
 #line 295 "../ada.re2c"
        {*id =  35; continue;}
-#line 4400 "../ada_re2c.c"
+#line 4401 "../ada_re2c.c"
 yy164:
        YYDEBUG(164, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
        case 'm':       goto yy250;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy165:
        YYDEBUG(165, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy251;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy166:
        YYDEBUG(166, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy252;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy167:
        YYDEBUG(167, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'W':
        case 'w':       goto yy254;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy168:
        YYDEBUG(168, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy256;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy169:
        YYDEBUG(169, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
        case 'l':       goto yy258;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy170:
        YYDEBUG(170, YYPEEK ());
@@ -4584,14 +4585,14 @@ yy170:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy171;
        }
 yy171:
        YYDEBUG(171, YYPEEK ());
 #line 302 "../ada.re2c"
        {*id =  42; continue;}
-#line 4595 "../ada_re2c.c"
+#line 4596 "../ada_re2c.c"
 yy172:
        YYDEBUG(172, YYPEEK ());
        yyaccept = 12;
@@ -4713,61 +4714,61 @@ yy172:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy173;
        }
 yy173:
        YYDEBUG(173, YYPEEK ());
 #line 303 "../ada.re2c"
        {*id =  43; continue;}
-#line 4724 "../ada_re2c.c"
+#line 4725 "../ada_re2c.c"
 yy174:
        YYDEBUG(174, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
        case 'h':       goto yy259;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy175:
        YYDEBUG(175, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy260;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy176:
        YYDEBUG(176, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy262;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy177:
        YYDEBUG(177, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy263;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy178:
        YYDEBUG(178, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4778,11 +4779,11 @@ yy178:
        case 'i':       goto yy265;
        case 'O':
        case 'o':       goto yy266;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy179:
        YYDEBUG(179, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4791,11 +4792,11 @@ yy179:
        case 'i':       goto yy267;
        case 'N':
        case 'n':       goto yy268;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy180:
        YYDEBUG(180, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4812,11 +4813,11 @@ yy180:
        case 't':       goto yy274;
        case 'V':
        case 'v':       goto yy275;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy181:
        YYDEBUG(181, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4825,44 +4826,44 @@ yy181:
        case 'l':       goto yy276;
        case 'P':
        case 'p':       goto yy277;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy182:
        YYDEBUG(182, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
        case 'm':       goto yy278;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy183:
        YYDEBUG(183, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'B':
        case 'b':       goto yy279;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy184:
        YYDEBUG(184, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy280;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy185:
        YYDEBUG(185, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4871,66 +4872,66 @@ yy185:
        case 'g':       goto yy281;
        case 'S':
        case 's':       goto yy282;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy186:
        YYDEBUG(186, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy283;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy187:
        YYDEBUG(187, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy284;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy188:
        YYDEBUG(188, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'P':
        case 'p':       goto yy285;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy189:
        YYDEBUG(189, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy286;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy190:
        YYDEBUG(190, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy287;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy191:
        YYDEBUG(191, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4939,29 +4940,29 @@ yy191:
        case 'e':       goto yy289;
        case 'I':
        case 'i':       goto yy290;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy192:
        YYDEBUG(192, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy291;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy193:
        YYDEBUG(193, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy292;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy194:
        YYDEBUG(194, YYPEEK ());
@@ -5183,7 +5184,7 @@ yy196:
 yy197:
        YYDEBUG(197, YYPEEK ());
        YYSKIP ();
-       goto yy107;
+       goto yy114;
 yy198:
        YYDEBUG(198, YYPEEK ());
        YYSKIP ();
@@ -5559,7 +5560,7 @@ yy206:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'd':       goto yy105;
+       case 'd':       goto yy112;
        default:        goto yy81;
        }
 yy207:
@@ -5569,7 +5570,7 @@ yy208:
        YYDEBUG(208, YYPEEK ());
 #line 366 "../ada.re2c"
        {*id =  106; continue;}
-#line 5573 "../ada_re2c.c"
+#line 5574 "../ada_re2c.c"
 yy209:
        YYDEBUG(209, YYPEEK ());
        yyaccept = 13;
@@ -5802,7 +5803,7 @@ yy211:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy105;
+       case 0xBF:      goto yy112;
        default:        goto yy81;
        }
 yy212:
@@ -6101,7 +6102,7 @@ yy218:
        }
 yy219:
        YYDEBUG(219, YYPEEK ());
-       yyaccept = 2;
+       yyaccept = 3;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -6111,7 +6112,7 @@ yy219:
        case '.':
        case 'E':
        case '_':
-       case 'e':       goto yy113;
+       case 'e':       goto yy120;
        case '0':
        case '1':
        case '2':
@@ -6122,18 +6123,18 @@ yy219:
        case '7':
        case '8':
        case '9':       goto yy219;
-       default:        goto yy36;
+       default:        goto yy39;
        }
 yy221:
        YYDEBUG(221, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy310;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy222:
        YYDEBUG(222, YYPEEK ());
@@ -6254,7 +6255,7 @@ yy222:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        case 'T':
        case 't':       goto yy311;
        default:        goto yy223;
@@ -6263,28 +6264,28 @@ yy223:
        YYDEBUG(223, YYPEEK ());
 #line 263 "../ada.re2c"
        {*id =  3; continue;}
-#line 6267 "../ada_re2c.c"
+#line 6268 "../ada_re2c.c"
 yy224:
        YYDEBUG(224, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy312;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy225:
        YYDEBUG(225, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy313;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy226:
        YYDEBUG(226, YYPEEK ());
@@ -6407,14 +6408,14 @@ yy226:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy227;
        }
 yy227:
        YYDEBUG(227, YYPEEK ());
 #line 269 "../ada.re2c"
        {*id =  9; continue;}
-#line 6418 "../ada_re2c.c"
+#line 6419 "../ada_re2c.c"
 yy228:
        YYDEBUG(228, YYPEEK ());
        yyaccept = 16;
@@ -6536,83 +6537,83 @@ yy228:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy229;
        }
 yy229:
        YYDEBUG(229, YYPEEK ());
 #line 270 "../ada.re2c"
        {*id =  10; continue;}
-#line 6547 "../ada_re2c.c"
+#line 6548 "../ada_re2c.c"
 yy230:
        YYDEBUG(230, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy314;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy231:
        YYDEBUG(231, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy315;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy232:
        YYDEBUG(232, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
        case 'y':       goto yy316;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy233:
        YYDEBUG(233, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy318;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy234:
        YYDEBUG(234, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy320;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy235:
        YYDEBUG(235, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
        case 'l':       goto yy321;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy236:
        YYDEBUG(236, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -6621,22 +6622,22 @@ yy236:
        case 'a':       goto yy322;
        case 'T':
        case 't':       goto yy323;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy237:
        YYDEBUG(237, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy324;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy238:
        YYDEBUG(238, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -6645,7 +6646,7 @@ yy238:
        case 'e':       goto yy325;
        case 'I':
        case 'i':       goto yy327;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy239:
        YYDEBUG(239, YYPEEK ());
@@ -6768,46 +6769,46 @@ yy239:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy240;
        }
 yy240:
        YYDEBUG(240, YYPEEK ());
 #line 284 "../ada.re2c"
        {*id =  24; continue;}
-#line 6779 "../ada_re2c.c"
+#line 6780 "../ada_re2c.c"
 yy241:
        YYDEBUG(241, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy328;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy242:
        YYDEBUG(242, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy329;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy243:
        YYDEBUG(243, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy330;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy244:
        YYDEBUG(244, YYPEEK ());
@@ -6930,79 +6931,79 @@ yy244:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy245;
        }
 yy245:
        YYDEBUG(245, YYPEEK ());
 #line 288 "../ada.re2c"
        {*id =  28; continue;}
-#line 6941 "../ada_re2c.c"
+#line 6942 "../ada_re2c.c"
 yy246:
        YYDEBUG(246, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy332;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy247:
        YYDEBUG(247, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy333;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy248:
        YYDEBUG(248, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy334;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy249:
        YYDEBUG(249, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy336;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy250:
        YYDEBUG(250, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy337;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy251:
        YYDEBUG(251, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'P':
        case 'p':       goto yy338;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy252:
        YYDEBUG(252, YYPEEK ());
@@ -7125,14 +7126,14 @@ yy252:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy253;
        }
 yy253:
        YYDEBUG(253, YYPEEK ());
 #line 298 "../ada.re2c"
        {*id =  38; continue;}
-#line 7136 "../ada_re2c.c"
+#line 7137 "../ada_re2c.c"
 yy254:
        YYDEBUG(254, YYPEEK ());
        yyaccept = 20;
@@ -7254,14 +7255,14 @@ yy254:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy255;
        }
 yy255:
        YYDEBUG(255, YYPEEK ());
 #line 299 "../ada.re2c"
        {*id =  39; continue;}
-#line 7265 "../ada_re2c.c"
+#line 7266 "../ada_re2c.c"
 yy256:
        YYDEBUG(256, YYPEEK ());
        yyaccept = 21;
@@ -7383,35 +7384,35 @@ yy256:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy257;
        }
 yy257:
        YYDEBUG(257, YYPEEK ());
 #line 300 "../ada.re2c"
        {*id =  40; continue;}
-#line 7394 "../ada_re2c.c"
+#line 7395 "../ada_re2c.c"
 yy258:
        YYDEBUG(258, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
        case 'l':       goto yy340;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy259:
        YYDEBUG(259, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy342;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy260:
        YYDEBUG(260, YYPEEK ());
@@ -7534,61 +7535,61 @@ yy260:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy261;
        }
 yy261:
        YYDEBUG(261, YYPEEK ());
 #line 305 "../ada.re2c"
        {*id =  45; continue;}
-#line 7545 "../ada_re2c.c"
+#line 7546 "../ada_re2c.c"
 yy262:
        YYDEBUG(262, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy343;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy263:
        YYDEBUG(263, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'K':
        case 'k':       goto yy344;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy264:
        YYDEBUG(264, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy345;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy265:
        YYDEBUG(265, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'V':
        case 'v':       goto yy346;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy266:
        YYDEBUG(266, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -7597,40 +7598,40 @@ yy266:
        case 'c':       goto yy347;
        case 'T':
        case 't':       goto yy348;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy267:
        YYDEBUG(267, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy349;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy268:
        YYDEBUG(268, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy350;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy269:
        YYDEBUG(269, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy351;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy270:
        YYDEBUG(270, YYPEEK ());
@@ -7753,178 +7754,178 @@ yy270:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy271;
        }
 yy271:
        YYDEBUG(271, YYPEEK ());
 #line 315 "../ada.re2c"
        {*id =  55; continue;}
-#line 7764 "../ada_re2c.c"
+#line 7765 "../ada_re2c.c"
 yy272:
        YYDEBUG(272, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy352;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy273:
        YYDEBUG(273, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
        case 'u':       goto yy353;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy274:
        YYDEBUG(274, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
        case 'u':       goto yy354;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy275:
        YYDEBUG(275, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy355;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy276:
        YYDEBUG(276, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy356;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy277:
        YYDEBUG(277, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy357;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy278:
        YYDEBUG(278, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy358;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy279:
        YYDEBUG(279, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy360;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy280:
        YYDEBUG(280, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy361;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy281:
        YYDEBUG(281, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy362;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy282:
        YYDEBUG(282, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'K':
        case 'k':       goto yy363;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy283:
        YYDEBUG(283, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
        case 'm':       goto yy365;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy284:
        YYDEBUG(284, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy366;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy285:
        YYDEBUG(285, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy368;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy286:
        YYDEBUG(286, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy370;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy287:
        YYDEBUG(287, YYPEEK ());
@@ -8047,46 +8048,46 @@ yy287:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy288;
        }
 yy288:
        YYDEBUG(288, YYPEEK ());
 #line 331 "../ada.re2c"
        {*id =  71; continue;}
-#line 8058 "../ada_re2c.c"
+#line 8059 "../ada_re2c.c"
 yy289:
        YYDEBUG(289, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy371;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy290:
        YYDEBUG(290, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
        case 'l':       goto yy373;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy291:
        YYDEBUG(291, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
        case 'h':       goto yy374;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy292:
        YYDEBUG(292, YYPEEK ());
@@ -8209,14 +8210,14 @@ yy292:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy293;
        }
 yy293:
        YYDEBUG(293, YYPEEK ());
 #line 335 "../ada.re2c"
        {*id =  75; continue;}
-#line 8220 "../ada_re2c.c"
+#line 8221 "../ada_re2c.c"
 yy294:
        YYDEBUG(294, YYPEEK ());
        YYSKIP ();
@@ -8284,7 +8285,7 @@ yy298:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'e':       goto yy105;
+       case 'e':       goto yy112;
        case 'i':       goto yy93;
        default:        goto yy81;
        }
@@ -8670,32 +8671,32 @@ yy308:
 yy309:
        YYDEBUG(309, YYPEEK ());
        YYSKIP ();
-       goto yy36;
+       goto yy39;
 yy310:
        YYDEBUG(310, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy382;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy311:
        YYDEBUG(311, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy384;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy312:
        YYDEBUG(312, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -8704,40 +8705,40 @@ yy312:
        case 'p':       goto yy385;
        case 'S':
        case 's':       goto yy386;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy313:
        YYDEBUG(313, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy387;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy314:
        YYDEBUG(314, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
        case 'y':       goto yy388;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy315:
        YYDEBUG(315, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy390;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy316:
        YYDEBUG(316, YYPEEK ());
@@ -8860,14 +8861,14 @@ yy316:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy317;
        }
 yy317:
        YYDEBUG(317, YYPEEK ());
 #line 274 "../ada.re2c"
        {*id =  14; continue;}
-#line 8871 "../ada_re2c.c"
+#line 8872 "../ada_re2c.c"
 yy318:
        YYDEBUG(318, YYPEEK ());
        yyaccept = 27;
@@ -8989,68 +8990,68 @@ yy318:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy319;
        }
 yy319:
        YYDEBUG(319, YYPEEK ());
 #line 275 "../ada.re2c"
        {*id =  15; continue;}
-#line 9000 "../ada_re2c.c"
+#line 9001 "../ada_re2c.c"
 yy320:
        YYDEBUG(320, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy392;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy321:
        YYDEBUG(321, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy393;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy322:
        YYDEBUG(322, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
        case 'y':       goto yy394;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy323:
        YYDEBUG(323, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy396;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy324:
        YYDEBUG(324, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy398;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy325:
        YYDEBUG(325, YYPEEK ());
@@ -9173,46 +9174,46 @@ yy325:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy326;
        }
 yy326:
        YYDEBUG(326, YYPEEK ());
 #line 282 "../ada.re2c"
        {*id =  22; continue;}
-#line 9184 "../ada_re2c.c"
+#line 9185 "../ada_re2c.c"
 yy327:
        YYDEBUG(327, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'F':
        case 'f':       goto yy399;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy328:
        YYDEBUG(328, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
        case 'y':       goto yy401;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy329:
        YYDEBUG(329, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'P':
        case 'p':       goto yy403;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy330:
        YYDEBUG(330, YYPEEK ());
@@ -9335,35 +9336,35 @@ yy330:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy331;
        }
 yy331:
        YYDEBUG(331, YYPEEK ());
 #line 287 "../ada.re2c"
        {*id =  27; continue;}
-#line 9346 "../ada_re2c.c"
+#line 9347 "../ada_re2c.c"
 yy332:
        YYDEBUG(332, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy404;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy333:
        YYDEBUG(333, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy405;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy334:
        YYDEBUG(334, YYPEEK ());
@@ -9486,35 +9487,35 @@ yy334:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy335;
        }
 yy335:
        YYDEBUG(335, YYPEEK ());
 #line 291 "../ada.re2c"
        {*id =  31; continue;}
-#line 9497 "../ada_re2c.c"
+#line 9498 "../ada_re2c.c"
 yy336:
        YYDEBUG(336, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy406;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy337:
        YYDEBUG(337, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy407;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy338:
        YYDEBUG(338, YYPEEK ());
@@ -9637,14 +9638,14 @@ yy338:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy339;
        }
 yy339:
        YYDEBUG(339, YYPEEK ());
 #line 297 "../ada.re2c"
        {*id =  37; continue;}
-#line 9648 "../ada_re2c.c"
+#line 9649 "../ada_re2c.c"
 yy340:
        YYDEBUG(340, YYPEEK ());
        yyaccept = 32;
@@ -9766,189 +9767,189 @@ yy340:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy341;
        }
 yy341:
        YYDEBUG(341, YYPEEK ());
 #line 301 "../ada.re2c"
        {*id =  41; continue;}
-#line 9777 "../ada_re2c.c"
+#line 9778 "../ada_re2c.c"
 yy342:
        YYDEBUG(342, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy408;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy343:
        YYDEBUG(343, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy409;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy344:
        YYDEBUG(344, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy410;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy345:
        YYDEBUG(345, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
        case 'm':       goto yy411;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy346:
        YYDEBUG(346, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy412;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy347:
        YYDEBUG(347, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy413;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy348:
        YYDEBUG(348, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy414;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy349:
        YYDEBUG(349, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy415;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy350:
        YYDEBUG(350, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy417;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy351:
        YYDEBUG(351, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy419;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy352:
        YYDEBUG(352, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
        case 'm':       goto yy420;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy353:
        YYDEBUG(353, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy421;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy354:
        YYDEBUG(354, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy422;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy355:
        YYDEBUG(355, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy423;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy356:
        YYDEBUG(356, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy424;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy357:
        YYDEBUG(357, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy425;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy358:
        YYDEBUG(358, YYPEEK ());
@@ -10071,46 +10072,46 @@ yy358:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy359;
        }
 yy359:
        YYDEBUG(359, YYPEEK ());
 #line 322 "../ada.re2c"
        {*id =  62; continue;}
-#line 10082 "../ada_re2c.c"
+#line 10083 "../ada_re2c.c"
 yy360:
        YYDEBUG(360, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
        case 'y':       goto yy426;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy361:
        YYDEBUG(361, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
        case 'h':       goto yy427;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy362:
        YYDEBUG(362, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy428;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy363:
        YYDEBUG(363, YYPEEK ());
@@ -10233,24 +10234,24 @@ yy363:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy364;
        }
 yy364:
        YYDEBUG(364, YYPEEK ());
 #line 326 "../ada.re2c"
        {*id =  66; continue;}
-#line 10244 "../ada_re2c.c"
+#line 10245 "../ada_re2c.c"
 yy365:
        YYDEBUG(365, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy429;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy366:
        YYDEBUG(366, YYPEEK ());
@@ -10373,14 +10374,14 @@ yy366:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy367;
        }
 yy367:
        YYDEBUG(367, YYPEEK ());
 #line 328 "../ada.re2c"
        {*id =  68; continue;}
-#line 10384 "../ada_re2c.c"
+#line 10385 "../ada_re2c.c"
 yy368:
        YYDEBUG(368, YYPEEK ());
        yyaccept = 36;
@@ -10502,24 +10503,24 @@ yy368:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy369;
        }
 yy369:
        YYDEBUG(369, YYPEEK ());
 #line 329 "../ada.re2c"
        {*id =  69; continue;}
-#line 10513 "../ada_re2c.c"
+#line 10514 "../ada_re2c.c"
 yy370:
        YYDEBUG(370, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
        case 'l':       goto yy430;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy371:
        YYDEBUG(371, YYPEEK ());
@@ -10642,24 +10643,24 @@ yy371:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy372;
        }
 yy372:
        YYDEBUG(372, YYPEEK ());
 #line 332 "../ada.re2c"
        {*id =  72; continue;}
-#line 10653 "../ada_re2c.c"
+#line 10654 "../ada_re2c.c"
 yy373:
        YYDEBUG(373, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy432;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy374:
        YYDEBUG(374, YYPEEK ());
@@ -10782,20 +10783,20 @@ yy374:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy375;
        }
 yy375:
        YYDEBUG(375, YYPEEK ());
 #line 334 "../ada.re2c"
        {*id =  74; continue;}
-#line 10793 "../ada_re2c.c"
+#line 10794 "../ada_re2c.c"
 yy376:
        YYDEBUG(376, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case ']':       goto yy55;
+       case ']':       goto yy14;
        default:        goto yy81;
        }
 yy377:
@@ -10813,7 +10814,7 @@ yy378:
        YYRESTORECTX ();
 #line 362 "../ada.re2c"
        {*id =  102; continue;}
-#line 10817 "../ada_re2c.c"
+#line 10818 "../ada_re2c.c"
 yy380:
        YYDEBUG(380, YYPEEK ());
        YYSKIP ();
@@ -10827,7 +10828,7 @@ yy381:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case ']':       goto yy94;
+       case ']':       goto yy101;
        default:        goto yy81;
        }
 yy382:
@@ -10951,57 +10952,57 @@ yy382:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy383;
        }
 yy383:
        YYDEBUG(383, YYPEEK ());
 #line 265 "../ada.re2c"
        {*id =  5; continue;}
-#line 10962 "../ada_re2c.c"
+#line 10963 "../ada_re2c.c"
 yy384:
        YYDEBUG(384, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy436;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy385:
        YYDEBUG(385, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy437;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy386:
        YYDEBUG(386, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy439;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy387:
        YYDEBUG(387, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy441;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy388:
        YYDEBUG(388, YYPEEK ());
@@ -11124,14 +11125,14 @@ yy388:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy389;
        }
 yy389:
        YYDEBUG(389, YYPEEK ());
 #line 271 "../ada.re2c"
        {*id =  11; continue;}
-#line 11135 "../ada_re2c.c"
+#line 11136 "../ada_re2c.c"
 yy390:
        YYDEBUG(390, YYPEEK ());
        yyaccept = 41;
@@ -11253,35 +11254,35 @@ yy390:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy391;
        }
 yy391:
        YYDEBUG(391, YYPEEK ());
 #line 273 "../ada.re2c"
        {*id =  13; continue;}
-#line 11264 "../ada_re2c.c"
+#line 11265 "../ada_re2c.c"
 yy392:
        YYDEBUG(392, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy442;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy393:
        YYDEBUG(393, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy443;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy394:
        YYDEBUG(394, YYPEEK ());
@@ -11404,14 +11405,14 @@ yy394:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy395;
        }
 yy395:
        YYDEBUG(395, YYPEEK ());
 #line 278 "../ada.re2c"
        {*id =  18; continue;}
-#line 11415 "../ada_re2c.c"
+#line 11416 "../ada_re2c.c"
 yy396:
        YYDEBUG(396, YYPEEK ());
        yyaccept = 43;
@@ -11533,24 +11534,24 @@ yy396:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy397;
        }
 yy397:
        YYDEBUG(397, YYPEEK ());
 #line 279 "../ada.re2c"
        {*id =  19; continue;}
-#line 11544 "../ada_re2c.c"
+#line 11545 "../ada_re2c.c"
 yy398:
        YYDEBUG(398, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy444;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy399:
        YYDEBUG(399, YYPEEK ());
@@ -11673,14 +11674,14 @@ yy399:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy400;
        }
 yy400:
        YYDEBUG(400, YYPEEK ());
 #line 283 "../ada.re2c"
        {*id =  23; continue;}
-#line 11684 "../ada_re2c.c"
+#line 11685 "../ada_re2c.c"
 yy401:
        YYDEBUG(401, YYPEEK ());
        yyaccept = 45;
@@ -11802,145 +11803,145 @@ yy401:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy402;
        }
 yy402:
        YYDEBUG(402, YYPEEK ());
 #line 285 "../ada.re2c"
        {*id =  25; continue;}
-#line 11813 "../ada_re2c.c"
+#line 11814 "../ada_re2c.c"
 yy403:
        YYDEBUG(403, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy446;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy404:
        YYDEBUG(404, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy447;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy405:
        YYDEBUG(405, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy448;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy406:
        YYDEBUG(406, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'F':
        case 'f':       goto yy449;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy407:
        YYDEBUG(407, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy450;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy408:
        YYDEBUG(408, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy451;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy409:
        YYDEBUG(409, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy453;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy410:
        YYDEBUG(410, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy454;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy411:
        YYDEBUG(411, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy455;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy412:
        YYDEBUG(412, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy457;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy413:
        YYDEBUG(413, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy458;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy414:
        YYDEBUG(414, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy459;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy415:
        YYDEBUG(415, YYPEEK ());
@@ -12063,14 +12064,14 @@ yy415:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy416;
        }
 yy416:
        YYDEBUG(416, YYPEEK ());
 #line 312 "../ada.re2c"
        {*id =  52; continue;}
-#line 12074 "../ada_re2c.c"
+#line 12075 "../ada_re2c.c"
 yy417:
        YYDEBUG(417, YYPEEK ());
        yyaccept = 47;
@@ -12192,134 +12193,134 @@ yy417:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy418;
        }
 yy418:
        YYDEBUG(418, YYPEEK ());
 #line 313 "../ada.re2c"
        {*id =  53; continue;}
-#line 12203 "../ada_re2c.c"
+#line 12204 "../ada_re2c.c"
 yy419:
        YYDEBUG(419, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy460;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy420:
        YYDEBUG(420, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy462;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy421:
        YYDEBUG(421, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
        case 'u':       goto yy463;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy422:
        YYDEBUG(422, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy464;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy423:
        YYDEBUG(423, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy466;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy424:
        YYDEBUG(424, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy467;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy425:
        YYDEBUG(425, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy469;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy426:
        YYDEBUG(426, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'P':
        case 'p':       goto yy470;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy427:
        YYDEBUG(427, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy471;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy428:
        YYDEBUG(428, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy472;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy429:
        YYDEBUG(429, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy474;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy430:
        YYDEBUG(430, YYPEEK ());
@@ -12442,14 +12443,14 @@ yy430:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy431;
        }
 yy431:
        YYDEBUG(431, YYPEEK ());
 #line 330 "../ada.re2c"
        {*id =  70; continue;}
-#line 12453 "../ada_re2c.c"
+#line 12454 "../ada_re2c.c"
 yy432:
        YYDEBUG(432, YYPEEK ());
        yyaccept = 49;
@@ -12571,14 +12572,14 @@ yy432:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy433;
        }
 yy433:
        YYDEBUG(433, YYPEEK ());
 #line 333 "../ada.re2c"
        {*id =  73; continue;}
-#line 12582 "../ada_re2c.c"
+#line 12583 "../ada_re2c.c"
 yy434:
        YYDEBUG(434, YYPEEK ());
        YYSKIP ();
@@ -12613,14 +12614,14 @@ yy435:
        }
 yy436:
        YYDEBUG(436, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy476;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy437:
        YYDEBUG(437, YYPEEK ());
@@ -12743,14 +12744,14 @@ yy437:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy438;
        }
 yy438:
        YYDEBUG(438, YYPEEK ());
 #line 264 "../ada.re2c"
        {*id =  4; continue;}
-#line 12754 "../ada_re2c.c"
+#line 12755 "../ada_re2c.c"
 yy439:
        YYDEBUG(439, YYPEEK ());
        yyaccept = 51;
@@ -12872,46 +12873,46 @@ yy439:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy440;
        }
 yy440:
        YYDEBUG(440, YYPEEK ());
 #line 267 "../ada.re2c"
        {*id =  7; continue;}
-#line 12883 "../ada_re2c.c"
+#line 12884 "../ada_re2c.c"
 yy441:
        YYDEBUG(441, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy477;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy442:
        YYDEBUG(442, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy479;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy443:
        YYDEBUG(443, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy480;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy444:
        YYDEBUG(444, YYPEEK ());
@@ -13034,68 +13035,68 @@ yy444:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy445;
        }
 yy445:
        YYDEBUG(445, YYPEEK ());
 #line 280 "../ada.re2c"
        {*id =  20; continue;}
-#line 13045 "../ada_re2c.c"
+#line 13046 "../ada_re2c.c"
 yy446:
        YYDEBUG(446, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy482;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy447:
        YYDEBUG(447, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy483;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy448:
        YYDEBUG(448, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy484;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy449:
        YYDEBUG(449, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy486;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy450:
        YYDEBUG(450, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy487;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy451:
        YYDEBUG(451, YYPEEK ());
@@ -13218,35 +13219,35 @@ yy451:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy452;
        }
 yy452:
        YYDEBUG(452, YYPEEK ());
 #line 304 "../ada.re2c"
        {*id =  44; continue;}
-#line 13229 "../ada_re2c.c"
+#line 13230 "../ada_re2c.c"
 yy453:
        YYDEBUG(453, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy489;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy454:
        YYDEBUG(454, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy490;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy455:
        YYDEBUG(455, YYPEEK ());
@@ -13369,46 +13370,46 @@ yy455:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy456;
        }
 yy456:
        YYDEBUG(456, YYPEEK ());
 #line 308 "../ada.re2c"
        {*id =  48; continue;}
-#line 13380 "../ada_re2c.c"
+#line 13381 "../ada_re2c.c"
 yy457:
        YYDEBUG(457, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy492;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy458:
        YYDEBUG(458, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
        case 'u':       goto yy494;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy459:
        YYDEBUG(459, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy495;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy460:
        YYDEBUG(460, YYPEEK ());
@@ -13531,35 +13532,35 @@ yy460:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy461;
        }
 yy461:
        YYDEBUG(461, YYPEEK ());
 #line 314 "../ada.re2c"
        {*id =  54; continue;}
-#line 13542 "../ada_re2c.c"
+#line 13543 "../ada_re2c.c"
 yy462:
        YYDEBUG(462, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
        case 's':       goto yy496;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy463:
        YYDEBUG(463, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy498;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy464:
        YYDEBUG(464, YYPEEK ());
@@ -13682,24 +13683,24 @@ yy464:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy465;
        }
 yy465:
        YYDEBUG(465, YYPEEK ());
 #line 318 "../ada.re2c"
        {*id =  58; continue;}
-#line 13693 "../ada_re2c.c"
+#line 13694 "../ada_re2c.c"
 yy466:
        YYDEBUG(466, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy500;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy467:
        YYDEBUG(467, YYPEEK ());
@@ -13822,46 +13823,46 @@ yy467:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy468;
        }
 yy468:
        YYDEBUG(468, YYPEEK ());
 #line 321 "../ada.re2c"
        {*id =  61; continue;}
-#line 13833 "../ada_re2c.c"
+#line 13834 "../ada_re2c.c"
 yy469:
        YYDEBUG(469, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy502;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy470:
        YYDEBUG(470, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy503;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy471:
        YYDEBUG(471, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy505;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy472:
        YYDEBUG(472, YYPEEK ());
@@ -13984,24 +13985,24 @@ yy472:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy473;
        }
 yy473:
        YYDEBUG(473, YYPEEK ());
 #line 325 "../ada.re2c"
        {*id =  65; continue;}
-#line 13995 "../ada_re2c.c"
+#line 13996 "../ada_re2c.c"
 yy474:
        YYDEBUG(474, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
        case 'a':       goto yy506;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy475:
        YYDEBUG(475, YYPEEK ());
@@ -14013,14 +14014,14 @@ yy475:
        }
 yy476:
        YYDEBUG(476, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy507;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy477:
        YYDEBUG(477, YYPEEK ());
@@ -14143,24 +14144,24 @@ yy477:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy478;
        }
 yy478:
        YYDEBUG(478, YYPEEK ());
 #line 268 "../ada.re2c"
        {*id =  8; continue;}
-#line 14154 "../ada_re2c.c"
+#line 14155 "../ada_re2c.c"
 yy479:
        YYDEBUG(479, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy509;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy480:
        YYDEBUG(480, YYPEEK ());
@@ -14283,35 +14284,35 @@ yy480:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy481;
        }
 yy481:
        YYDEBUG(481, YYPEEK ());
 #line 277 "../ada.re2c"
        {*id =  17; continue;}
-#line 14294 "../ada_re2c.c"
+#line 14295 "../ada_re2c.c"
 yy482:
        YYDEBUG(482, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
        case 'o':       goto yy511;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy483:
        YYDEBUG(483, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy512;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy484:
        YYDEBUG(484, YYPEEK ());
@@ -14434,24 +14435,24 @@ yy484:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy485;
        }
 yy485:
        YYDEBUG(485, YYPEEK ());
 #line 290 "../ada.re2c"
        {*id =  30; continue;}
-#line 14445 "../ada_re2c.c"
+#line 14446 "../ada_re2c.c"
 yy486:
        YYDEBUG(486, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
        case 'c':       goto yy514;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy487:
        YYDEBUG(487, YYPEEK ());
@@ -14574,24 +14575,24 @@ yy487:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy488;
        }
 yy488:
        YYDEBUG(488, YYPEEK ());
 #line 296 "../ada.re2c"
        {*id =  36; continue;}
-#line 14585 "../ada_re2c.c"
+#line 14586 "../ada_re2c.c"
 yy489:
        YYDEBUG(489, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy515;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy490:
        YYDEBUG(490, YYPEEK ());
@@ -14714,14 +14715,14 @@ yy490:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy491;
        }
 yy491:
        YYDEBUG(491, YYPEEK ());
 #line 307 "../ada.re2c"
        {*id =  47; continue;}
-#line 14725 "../ada_re2c.c"
+#line 14726 "../ada_re2c.c"
 yy492:
        YYDEBUG(492, YYPEEK ());
        yyaccept = 64;
@@ -14843,35 +14844,35 @@ yy492:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy493;
        }
 yy493:
        YYDEBUG(493, YYPEEK ());
 #line 309 "../ada.re2c"
        {*id =  49; continue;}
-#line 14854 "../ada_re2c.c"
+#line 14855 "../ada_re2c.c"
 yy494:
        YYDEBUG(494, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
        case 'r':       goto yy516;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy495:
        YYDEBUG(495, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy517;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy496:
        YYDEBUG(496, YYPEEK ());
@@ -14994,14 +14995,14 @@ yy496:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy497;
        }
 yy497:
        YYDEBUG(497, YYPEEK ());
 #line 316 "../ada.re2c"
        {*id =  56; continue;}
-#line 15005 "../ada_re2c.c"
+#line 15006 "../ada_re2c.c"
 yy498:
        YYDEBUG(498, YYPEEK ());
        yyaccept = 66;
@@ -15123,14 +15124,14 @@ yy498:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy499;
        }
 yy499:
        YYDEBUG(499, YYPEEK ());
 #line 317 "../ada.re2c"
        {*id =  57; continue;}
-#line 15134 "../ada_re2c.c"
+#line 15135 "../ada_re2c.c"
 yy500:
        YYDEBUG(500, YYPEEK ());
        yyaccept = 67;
@@ -15252,24 +15253,24 @@ yy500:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy501;
        }
 yy501:
        YYDEBUG(501, YYPEEK ());
 #line 319 "../ada.re2c"
        {*id =  59; continue;}
-#line 15263 "../ada_re2c.c"
+#line 15264 "../ada_re2c.c"
 yy502:
        YYDEBUG(502, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy518;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy503:
        YYDEBUG(503, YYPEEK ());
@@ -15392,35 +15393,35 @@ yy503:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy504;
        }
 yy504:
        YYDEBUG(504, YYPEEK ());
 #line 323 "../ada.re2c"
        {*id =  63; continue;}
-#line 15403 "../ada_re2c.c"
+#line 15404 "../ada_re2c.c"
 yy505:
        YYDEBUG(505, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy520;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy506:
        YYDEBUG(506, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
        case 't':       goto yy521;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy507:
        YYDEBUG(507, YYPEEK ());
@@ -15543,14 +15544,14 @@ yy507:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy508;
        }
 yy508:
        YYDEBUG(508, YYPEEK ());
 #line 266 "../ada.re2c"
        {*id =  6; continue;}
-#line 15554 "../ada_re2c.c"
+#line 15555 "../ada_re2c.c"
 yy509:
        YYDEBUG(509, YYPEEK ());
        yyaccept = 70;
@@ -15672,24 +15673,24 @@ yy509:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy510;
        }
 yy510:
        YYDEBUG(510, YYPEEK ());
 #line 276 "../ada.re2c"
        {*id =  16; continue;}
-#line 15683 "../ada_re2c.c"
+#line 15684 "../ada_re2c.c"
 yy511:
        YYDEBUG(511, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy522;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy512:
        YYDEBUG(512, YYPEEK ());
@@ -15812,57 +15813,57 @@ yy512:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy513;
        }
 yy513:
        YYDEBUG(513, YYPEEK ());
 #line 289 "../ada.re2c"
        {*id =  29; continue;}
-#line 15823 "../ada_re2c.c"
+#line 15824 "../ada_re2c.c"
 yy514:
        YYDEBUG(514, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy524;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy515:
        YYDEBUG(515, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
        case 'n':       goto yy526;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy516:
        YYDEBUG(516, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy527;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy517:
        YYDEBUG(517, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy529;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy518:
        YYDEBUG(518, YYPEEK ());
@@ -15985,35 +15986,35 @@ yy518:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy519;
        }
 yy519:
        YYDEBUG(519, YYPEEK ());
 #line 320 "../ada.re2c"
        {*id =  60; continue;}
-#line 15996 "../ada_re2c.c"
+#line 15997 "../ada_re2c.c"
 yy520:
        YYDEBUG(520, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
        case 'i':       goto yy531;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy521:
        YYDEBUG(521, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy532;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy522:
        YYDEBUG(522, YYPEEK ());
@@ -16136,14 +16137,14 @@ yy522:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy523;
        }
 yy523:
        YYDEBUG(523, YYPEEK ());
 #line 286 "../ada.re2c"
        {*id =  26; continue;}
-#line 16147 "../ada_re2c.c"
+#line 16148 "../ada_re2c.c"
 yy524:
        YYDEBUG(524, YYPEEK ());
        yyaccept = 74;
@@ -16265,24 +16266,24 @@ yy524:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy525;
        }
 yy525:
        YYDEBUG(525, YYPEEK ());
 #line 294 "../ada.re2c"
        {*id =  34; continue;}
-#line 16276 "../ada_re2c.c"
+#line 16277 "../ada_re2c.c"
 yy526:
        YYDEBUG(526, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
        case 'g':       goto yy534;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy527:
        YYDEBUG(527, YYPEEK ());
@@ -16405,14 +16406,14 @@ yy527:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy528;
        }
 yy528:
        YYDEBUG(528, YYPEEK ());
 #line 310 "../ada.re2c"
        {*id =  50; continue;}
-#line 16416 "../ada_re2c.c"
+#line 16417 "../ada_re2c.c"
 yy529:
        YYDEBUG(529, YYPEEK ());
        yyaccept = 76;
@@ -16534,24 +16535,24 @@ yy529:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy530;
        }
 yy530:
        YYDEBUG(530, YYPEEK ());
 #line 311 "../ada.re2c"
        {*id =  51; continue;}
-#line 16545 "../ada_re2c.c"
+#line 16546 "../ada_re2c.c"
 yy531:
        YYDEBUG(531, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Z':
        case 'z':       goto yy536;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy532:
        YYDEBUG(532, YYPEEK ());
@@ -16674,14 +16675,14 @@ yy532:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy533;
        }
 yy533:
        YYDEBUG(533, YYPEEK ());
 #line 327 "../ada.re2c"
        {*id =  67; continue;}
-#line 16685 "../ada_re2c.c"
+#line 16686 "../ada_re2c.c"
 yy534:
        YYDEBUG(534, YYPEEK ());
        yyaccept = 78;
@@ -16803,35 +16804,35 @@ yy534:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy535;
        }
 yy535:
        YYDEBUG(535, YYPEEK ());
 #line 306 "../ada.re2c"
        {*id =  46; continue;}
-#line 16814 "../ada_re2c.c"
+#line 16815 "../ada_re2c.c"
 yy536:
        YYDEBUG(536, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
        case 'e':       goto yy537;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy537:
        YYDEBUG(537, YYPEEK ());
-       yyaccept = 3;
+       yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
        case 'd':       goto yy538;
-       default:        goto yy56;
+       default:        goto yy15;
        }
 yy538:
        YYDEBUG(538, YYPEEK ());
@@ -16954,14 +16955,14 @@ yy538:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy15;
        default:        goto yy539;
        }
 yy539:
        YYDEBUG(539, YYPEEK ());
 #line 324 "../ada.re2c"
        {*id =  64; continue;}
-#line 16965 "../ada_re2c.c"
+#line 16966 "../ada_re2c.c"
 }
 #line 370 "../ada.re2c"
 
diff --git a/packages/ada-mode/build.sh b/packages/ada-mode/build.sh
index 8b5099a..6979a35 100755
--- a/packages/ada-mode/build.sh
+++ b/packages/ada-mode/build.sh
@@ -18,7 +18,7 @@ gnatprep -DHAVE_GNATCOLL_XREF=$HAVE_GNATCOLL_XREF 
gpr_query.gpr.gp gpr_query.gpr
 # support for libadalang is still experimental
 gnatprep -DHAVE_LIBADALANG="no" ada_mode_wisi_parse.gpr.gp 
ada_mode_wisi_parse.gpr
 
-export GPR_PROJECT_PATH="../wisi-2.1.0"
+export GPR_PROJECT_PATH="../wisi-2.1.1"
 
 gprbuild -p -P gpr_query.gpr
 gprinstall -f -p -P gpr_query.gpr --install-name=gpr_query
diff --git a/packages/ada-mode/emacs_wisi_common_parse.adb 
b/packages/ada-mode/emacs_wisi_common_parse.adb
index 7a2716e..e7b7666 100644
--- a/packages/ada-mode/emacs_wisi_common_parse.adb
+++ b/packages/ada-mode/emacs_wisi_common_parse.adb
@@ -165,6 +165,7 @@ package body Emacs_Wisi_Common_Parse is
    begin
       return Result : Parse_Params do
          --  We don't use an aggregate, to enforce execution order.
+         --  Match wisi-process-parse.el wisi-process--send-parse
 
          Result.Post_Parse_Action    := Wisi.Post_Parse_Action_Type'Val 
(Get_Integer (Command_Line, Last));
          Result.Source_File_Name     := +Get_String (Command_Line, Last);
@@ -185,20 +186,21 @@ package body Emacs_Wisi_Common_Parse is
          Result.Action_Verbosity     := Get_Integer (Command_Line, Last);
          Result.McKenzie_Disable     := Get_Integer (Command_Line, Last);
          Result.Task_Count           := Get_Integer (Command_Line, Last);
-         Result.Cost_Limit           := Get_Integer (Command_Line, Last);
          Result.Check_Limit          := Get_Integer (Command_Line, Last);
          Result.Enqueue_Limit        := Get_Integer (Command_Line, Last);
+         Result.Max_Parallel         := Get_Integer (Command_Line, Last);
          Result.Byte_Count           := Get_Integer (Command_Line, Last);
       end return;
    end Get_Parse_Params;
 
    procedure Parse_Stream
-     (Name                 : in     String;
-      Partial_Parse_Active : in out Boolean;
-      Params               : in     Process_Start_Params;
-      Parser               : in out WisiToken.Parse.LR.Parser.Parser;
-      Parse_Data           : in out Wisi.Parse_Data_Type'Class;
-      Descriptor           : in     WisiToken.Descriptor)
+     (Name                      : in     String;
+      Language_Protocol_Version : in     String;
+      Partial_Parse_Active      : in out Boolean;
+      Params                    : in     Process_Start_Params;
+      Parser                    : in out WisiToken.Parse.LR.Parser.Parser;
+      Parse_Data                : in out Wisi.Parse_Data_Type'Class;
+      Descriptor                : in     WisiToken.Descriptor)
    is
       use Ada.Text_IO;
       use WisiToken; -- "+", "-" Unbounded_string
@@ -229,7 +231,8 @@ package body Emacs_Wisi_Common_Parse is
 
       Parser.Trace.Set_Prefix (";; "); -- so debug messages don't confuse 
Emacs.
 
-      Put_Line (Name & " " & Version & ", protocol version " & 
Protocol_Version);
+      Put_Line
+        (Name & " protocol: process version " & Protocol_Version & " language 
version " & Language_Protocol_Version);
 
       --  Read commands and tokens from standard_input via GNAT.OS_Lib,
       --  send results to standard_output.
@@ -276,9 +279,6 @@ package body Emacs_Wisi_Common_Parse is
                   end Clean_Up;
 
                begin
-                  --  Computing Line_Count in elisp allows parsing in parallel 
with
-                  --  sending source text.
-
                   Trace_Parse    := Params.Parse_Verbosity;
                   Trace_McKenzie := Params.McKenzie_Verbosity;
                   Trace_Action   := Params.Action_Verbosity;
@@ -305,9 +305,6 @@ package body Emacs_Wisi_Common_Parse is
                   if Params.Task_Count > 0 then
                      Parser.Table.McKenzie_Param.Task_Count := 
System.Multiprocessors.CPU_Range (Params.Task_Count);
                   end if;
-                  if Params.Cost_Limit > 0 then
-                     Parser.Table.McKenzie_Param.Cost_Limit := 
Params.Cost_Limit;
-                  end if;
                   if Params.Check_Limit > 0 then
                      Parser.Table.McKenzie_Param.Check_Limit := 
Base_Token_Index (Params.Check_Limit);
                   end if;
@@ -315,6 +312,10 @@ package body Emacs_Wisi_Common_Parse is
                      Parser.Table.McKenzie_Param.Enqueue_Limit := 
Params.Enqueue_Limit;
                   end if;
 
+                  if Params.Max_Parallel > 0 then
+                     Parser.Max_Parallel := SAL.Base_Peek_Type 
(Params.Max_Parallel);
+                  end if;
+
                   Buffer := new String (Params.Begin_Byte_Pos .. 
Params.End_Byte_Pos);
 
                   Read_Input (Buffer (Params.Begin_Byte_Pos)'Address, 
Params.Byte_Count);
diff --git a/packages/ada-mode/emacs_wisi_common_parse.ads 
b/packages/ada-mode/emacs_wisi_common_parse.ads
index b6da3b4..a5d0604 100644
--- a/packages/ada-mode/emacs_wisi_common_parse.ads
+++ b/packages/ada-mode/emacs_wisi_common_parse.ads
@@ -24,8 +24,20 @@ with Wisi;
 with WisiToken.Parse.LR.Parser;
 package Emacs_Wisi_Common_Parse is
 
-   Protocol_Version : constant String := "2";
-   Version          : constant String := "2.0";
+   Protocol_Version : constant String := "3";
+   --  Protocol_Version defines the data sent between elisp and the
+   --  background process, except for the language-specific parameters,
+   --  which are defined by the Language_Protocol_Version parameter to
+   --  Parse_Stream, below.
+   --
+   --  This value must match wisi-process-parse.el
+   --  wisi-process-parse-protocol-version.
+   --
+   --  See wisi-process-parse.el functions, and this package body, for
+   --  the implementation of the protocol.
+   --
+   --  Only changes once per wisi release. Increment as soon as required,
+   --  record new version in NEWS-wisi.text.
 
    Prompt : constant String := ";;> ";
 
@@ -88,9 +100,9 @@ package Emacs_Wisi_Common_Parse is
       Action_Verbosity     : Integer;
       McKenzie_Disable     : Integer;
       Task_Count           : Integer;
-      Cost_Limit           : Integer;
       Check_Limit          : Integer;
       Enqueue_Limit        : Integer;
+      Max_Parallel         : Integer;
       Byte_Count           : Integer;
       --  Count of bytes of source file sent.
    end record;
@@ -98,11 +110,12 @@ package Emacs_Wisi_Common_Parse is
    function Get_Parse_Params (Command_Line : in String; Last : in out Integer) 
return Parse_Params;
 
    procedure Parse_Stream
-     (Name                 : in     String;
-      Partial_Parse_Active : in out Boolean;
-      Params               : in     Process_Start_Params;
-      Parser               : in out WisiToken.Parse.LR.Parser.Parser;
-      Parse_Data           : in out Wisi.Parse_Data_Type'Class;
-      Descriptor           : in     WisiToken.Descriptor);
+     (Name                      : in     String;
+      Language_Protocol_Version : in     String;
+      Partial_Parse_Active      : in out Boolean;
+      Params                    : in     Process_Start_Params;
+      Parser                    : in out WisiToken.Parse.LR.Parser.Parser;
+      Parse_Data                : in out Wisi.Parse_Data_Type'Class;
+      Descriptor                : in     WisiToken.Descriptor);
 
 end Emacs_Wisi_Common_Parse;
diff --git a/packages/ada-mode/gen_emacs_wisi_lr_parse.adb 
b/packages/ada-mode/gen_emacs_wisi_lr_parse.adb
index caf4049..c823679 100644
--- a/packages/ada-mode/gen_emacs_wisi_lr_parse.adb
+++ b/packages/ada-mode/gen_emacs_wisi_lr_parse.adb
@@ -30,10 +30,10 @@ is
    Params : constant Process_Start_Params := Get_Process_Start_Params;
 begin
    Create_Parser
-     (Parser, Language_Fixes, Language_Use_Minimal_Complete_Actions, 
Language_String_ID_Set,
+     (Parser, Language_Fixes, Language_Matching_Begin_Tokens, 
Language_String_ID_Set,
       Trace'Unrestricted_Access,
       Parse_Data'Unchecked_Access);
 
-   Parse_Stream (Name, Partial_Parse_Active, Params, Parser, Parse_Data, 
Descriptor);
+   Parse_Stream (Name, Language_Protocol_Version, Partial_Parse_Active, 
Params, Parser, Parse_Data, Descriptor);
 
 end Gen_Emacs_Wisi_LR_Parse;
diff --git a/packages/ada-mode/gen_emacs_wisi_lr_parse.ads 
b/packages/ada-mode/gen_emacs_wisi_lr_parse.ads
index 1e8eb2d..02eac21 100644
--- a/packages/ada-mode/gen_emacs_wisi_lr_parse.ads
+++ b/packages/ada-mode/gen_emacs_wisi_lr_parse.ads
@@ -36,20 +36,20 @@ with Wisi;
 generic
    type Parse_Data_Type  is new Wisi.Parse_Data_Type with private;
 
-   Name                                  : in String; --  for Usage, error 
messages.
-   Descriptor                            : in WisiToken.Descriptor;
-   Partial_Parse_Active                  : in out Boolean;
-   Language_Fixes                        : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-   Language_Use_Minimal_Complete_Actions : in 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-   Language_String_ID_Set                : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+   Name                           : in String; --  for Usage, error messages.
+   Language_Protocol_Version      : in String; --  Defines language-specific 
parse parameters.
+   Descriptor                     : in WisiToken.Descriptor;
+   Partial_Parse_Active           : in out Boolean;
+   Language_Fixes                 : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+   Language_Matching_Begin_Tokens : in 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+   Language_String_ID_Set         : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
 
    with procedure Create_Parser
-     (Parser                       :    out          
WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-        WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-      Trace                        : not null access WisiToken.Trace'Class;
-      User_Data                    : in              
WisiToken.Syntax_Trees.User_Data_Access);
+     (Parser                         :    out          
WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+      Trace                          : not null access WisiToken.Trace'Class;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access);
 
 procedure Gen_Emacs_Wisi_LR_Parse;
diff --git a/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.adb 
b/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.adb
index 43d7403..7296695 100644
--- a/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.adb
+++ b/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.adb
@@ -34,11 +34,11 @@ is
    Params : constant Process_Start_Params := Get_Process_Start_Params;
 begin
    Create_Parser
-     (Parser, Language_Fixes, Language_Use_Minimal_Complete_Actions, 
Language_String_ID_Set,
+     (Parser, Language_Fixes, Language_Matching_Begin_Tokens, 
Language_String_ID_Set,
       Trace'Unrestricted_Access,
       Parse_Data'Unchecked_Access,
       Ada.Directories.Containing_Directory (Ada.Command_Line.Command_Name) & 
"/" & Text_Rep_File_Name);
 
-   Parse_Stream (Name, Partial_Parse_Active, Params, Parser, Parse_Data, 
Descriptor);
+   Parse_Stream (Name, Language_Protocol_Version, Partial_Parse_Active, 
Params, Parser, Parse_Data, Descriptor);
 
 end Gen_Emacs_Wisi_LR_Text_Rep_Parse;
diff --git a/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.ads 
b/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.ads
index fe97433..f9ff468 100644
--- a/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.ads
+++ b/packages/ada-mode/gen_emacs_wisi_lr_text_rep_parse.ads
@@ -29,22 +29,22 @@ with Wisi;
 generic
    type Parse_Data_Type  is new Wisi.Parse_Data_Type with private;
 
-   Name                                  : in String; --  for Usage, error 
messages. "_wisi_parse" will be appended
-   Descriptor                            : in WisiToken.Descriptor;
-   Partial_Parse_Active                  : in out Boolean;
-   Language_Fixes                        : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-   Language_Use_Minimal_Complete_Actions : in 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-   Language_String_ID_Set                : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-   Text_Rep_File_Name                    : in String;
+   Name                           : in String; --  for Usage, error messages. 
"_wisi_parse" will be appended
+   Language_Protocol_Version      : in String; --  Defines language-specific 
parse parameters.
+   Descriptor                     : in WisiToken.Descriptor;
+   Partial_Parse_Active           : in out Boolean;
+   Language_Fixes                 : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+   Language_Matching_Begin_Tokens : in 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+   Language_String_ID_Set         : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+   Text_Rep_File_Name             : in String;
 
    with procedure Create_Parser
-     (Parser                       :    out          
WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-        WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-      Trace                        : not null access WisiToken.Trace'Class;
-      User_Data                    : in              
WisiToken.Syntax_Trees.User_Data_Access;
-      Text_Rep_File_Name           : in              String);
+     (Parser                         :    out          
WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+      Trace                          : not null access WisiToken.Trace'Class;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access;
+      Text_Rep_File_Name             : in              String);
 
 procedure Gen_Emacs_Wisi_LR_Text_Rep_Parse;
diff --git a/packages/ada-mode/gen_run_wisi_lr_parse.adb 
b/packages/ada-mode/gen_run_wisi_lr_parse.adb
index 63fd7ec..ee63c77 100644
--- a/packages/ada-mode/gen_run_wisi_lr_parse.adb
+++ b/packages/ada-mode/gen_run_wisi_lr_parse.adb
@@ -29,7 +29,7 @@ begin
    --  Create parser first so Put_Usage has defaults from Parser.Table,
    --  and Get_CL_Params can override them.
    Create_Parser
-     (Parser, Language_Fixes, Language_Use_Minimal_Complete_Actions, 
Language_String_ID_Set,
+     (Parser, Language_Fixes, Language_Matching_Begin_Tokens, 
Language_String_ID_Set,
       Trace'Unrestricted_Access, Parse_Data'Unchecked_Access);
 
    Run_Wisi_Common_Parse.Parse_File (Parser, Parse_Data, Descriptor);
diff --git a/packages/ada-mode/gen_run_wisi_lr_parse.ads 
b/packages/ada-mode/gen_run_wisi_lr_parse.ads
index 2f9ba23..34fbd3c 100644
--- a/packages/ada-mode/gen_run_wisi_lr_parse.ads
+++ b/packages/ada-mode/gen_run_wisi_lr_parse.ads
@@ -4,7 +4,7 @@
 --
 --  See gen_emacs_wisi_lr_parse.ads for the Emacs background process.
 --
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -26,18 +26,17 @@ with Wisi;
 generic
    type Parse_Data_Type is new Wisi.Parse_Data_Type with private;
 
-   Descriptor                            : in WisiToken.Descriptor;
-   Language_Fixes                        : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-   Language_Use_Minimal_Complete_Actions : in 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-   Language_String_ID_Set                : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+   Descriptor                     : in WisiToken.Descriptor;
+   Language_Fixes                 : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+   Language_Matching_Begin_Tokens : in 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+   Language_String_ID_Set         : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
 
    with procedure Create_Parser
-     (Parser                       :    out          
WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-        WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-      Trace                        : not null access WisiToken.Trace'Class;
-      User_Data                    : in              
WisiToken.Syntax_Trees.User_Data_Access);
+     (Parser                         :    out          
WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+      Trace                          : not null access WisiToken.Trace'Class;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access);
 
 procedure Gen_Run_Wisi_LR_Parse;
diff --git a/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.adb 
b/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.adb
index f95a395..09efefd 100644
--- a/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.adb
+++ b/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.adb
@@ -35,7 +35,7 @@ begin
    begin
       --  text_rep file is in same directory as exectuable.
       Create_Parser
-        (Parser, Language_Fixes, Language_Use_Minimal_Complete_Actions, 
Language_String_ID_Set,
+        (Parser, Language_Fixes, Language_Matching_Begin_Tokens, 
Language_String_ID_Set,
          Trace'Unrestricted_Access, Parse_Data'Unchecked_Access,
          Ada.Directories.Containing_Directory (Command_Name) & "/" & 
Text_Rep_File_Name);
 
diff --git a/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.ads 
b/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.ads
index 4b82cbf..dd45d16 100644
--- a/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.ads
+++ b/packages/ada-mode/gen_run_wisi_lr_text_rep_parse.ads
@@ -4,7 +4,7 @@
 --
 --  See gen_emacs_wisi_*_parse.ads for the Emacs background process.
 --
---  Copyright (C) 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -26,20 +26,19 @@ with Wisi;
 generic
    type Parse_Data_Type is new Wisi.Parse_Data_Type with private;
 
-   Descriptor                            : in WisiToken.Descriptor;
-   Language_Fixes                        : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-   Language_Use_Minimal_Complete_Actions : in 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-   Language_String_ID_Set                : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-   Text_Rep_File_Name                    : in String;
+   Descriptor                     : in WisiToken.Descriptor;
+   Language_Fixes                 : in 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+   Language_Matching_Begin_Tokens : in 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+   Language_String_ID_Set         : in 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+   Text_Rep_File_Name             : in String;
 
    with procedure Create_Parser
-     (Parser                       :    out          
WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-        WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-      Trace                        : not null access WisiToken.Trace'Class;
-      User_Data                    : in              
WisiToken.Syntax_Trees.User_Data_Access;
-      Text_Rep_File_Name           : in              String);
+     (Parser                         :    out          
WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in              
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+      Trace                          : not null access WisiToken.Trace'Class;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access;
+      Text_Rep_File_Name             : in              String);
 
 procedure Gen_Run_Wisi_LR_Text_Rep_Parse;
diff --git a/packages/ada-mode/gnat-core.el b/packages/ada-mode/gnat-core.el
index 2569ef9..43de9b1 100644
--- a/packages/ada-mode/gnat-core.el
+++ b/packages/ada-mode/gnat-core.el
@@ -443,6 +443,7 @@ list."
     ("a-direct" . "Ada.Directories")
     ("a-except" . "Ada.Exceptions")
     ("a-ioexce" . "Ada.IO_Exceptions")
+    ("a-finali" . "Ada.Finalization")
     ("a-numeri" . "Ada.Numerics")
     ("a-stream" . "Ada.Streams")
     ("a-string" . "Ada.Strings")
diff --git a/packages/ada-mode/gpr-lalr-elisp.el 
b/packages/ada-mode/gpr-lalr-elisp.el
index 6873bc8..217d385 100644
--- a/packages/ada-mode/gpr-lalr-elisp.el
+++ b/packages/ada-mode/gpr-lalr-elisp.el
@@ -23,6 +23,7 @@
 (defconst gpr-lalr-elisp-keyword-table-raw
   '(
    ("abstract" . ABSTRACT)
+   ("at" . AT)
    ("aggregate" . AGGREGATE)
    ("case" . CASE)
    ("configuration" . CONFIGURATION)
@@ -60,6 +61,9 @@
     (SEMICOLON . ";")
     (VERTICAL_BAR . "|")
     )
+   ("number"
+    (NUMERIC_LITERAL ada-wisi-number-p)
+    )
    ("symbol"
     (IDENTIFIER . "")
     )
@@ -85,6 +89,12 @@
       (wisi-face-apply-action [2 nil font-lock-function-name-face])
       (wisi-indent-action [0 gpr-indent-broken (- gpr-indent-broken 1) 
gpr-indent-broken (- gpr-indent-broken 1) 0
                              gpr-indent-broken 0])))
+       ((FOR IDENTIFIER LEFT_PAREN discrete_choice RIGHT_PAREN USE expression 
AT NUMERIC_LITERAL SEMICOLON )
+        (progn
+      (wisi-statement-action [1 statement-start 10 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken (- gpr-indent-broken 1) 
gpr-indent-broken (- gpr-indent-broken 1) 0
+                             gpr-indent-broken 0 0 0])))
        ((FOR EXTERNAL LEFT_PAREN STRING_LITERAL RIGHT_PAREN USE expression 
SEMICOLON )
         (progn
       (wisi-statement-action [1 statement-start 8 statement-end])
@@ -245,34 +255,34 @@
       ((default . error) (Wisi_EOI . (project_declaration_opt . 1)))
       ((default . error) (ABSTRACT . (context_clause . 0)) (AGGREGATE . 
(context_clause . 0)) (CONFIGURATION . (context_clause . 0)) (LIBRARY . 
(context_clause . 0)) (PROJECT . (context_clause . 0)) (STANDARD . 
(context_clause . 0)) (WITH . (context_clause . 0)) (Wisi_EOI . (context_clause 
. 0)))
       ((default . error) (PROJECT . (project_qualifier_opt . 4)) (Wisi_EOI . 
(project_qualifier_opt . 4)))
-      ((default . error) (EXTENDS . (identifier_opt . 1)) (IS . 
(identifier_opt . 1)) (RENAMES . (identifier_opt . 1)) (RIGHT_PAREN . 
(identifier_opt . 1)) (AMPERSAND . (identifier_opt . 1)) (COMMA . 
(identifier_opt . 1)) (DOT . (identifier_opt . 1)) (QUOTE . (identifier_opt . 
1)) (SEMICOLON . (identifier_opt . 1)))
+      ((default . error) (AT . (identifier_opt . 1)) (EXTENDS . 
(identifier_opt . 1)) (IS . (identifier_opt . 1)) (RENAMES . (identifier_opt . 
1)) (RIGHT_PAREN . (identifier_opt . 1)) (AMPERSAND . (identifier_opt . 1)) 
(COMMA . (identifier_opt . 1)) (DOT . (identifier_opt . 1)) (QUOTE . 
(identifier_opt . 1)) (SEMICOLON . (identifier_opt . 1)))
       ((default . error) (EXTENDS .  34) (IS .  35))
       ((default . error) (LEFT_PAREN .  36))
       ((default . error) (LEFT_PAREN .  36))
       ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (RIGHT_PAREN . ( 39 (identifier_opt . 0))) (AMPERSAND . 
(identifier_opt . 0)) (COMMA . (identifier_opt . 0)) (DOT . (identifier_opt . 
0)) (QUOTE . (identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  21))
       ((default . error) (QUOTE . (attribute_prefix . 0)))
-      ((default . error) (RIGHT_PAREN . (string_primary . 0)) (AMPERSAND . 
(string_primary . 0)) (COMMA . (string_primary . 0)) (SEMICOLON . 
(string_primary . 0)))
-      ((default . error) (RIGHT_PAREN . (term . 2)) (AMPERSAND . (term . 2)) 
(COMMA . (term . 2)) (SEMICOLON . (term . 2)))
+      ((default . error) (AT . (string_primary . 0)) (RIGHT_PAREN . 
(string_primary . 0)) (AMPERSAND . (string_primary . 0)) (COMMA . 
(string_primary . 0)) (SEMICOLON . (string_primary . 0)))
+      ((default . error) (AT . (term . 2)) (RIGHT_PAREN . (term . 2)) 
(AMPERSAND . (term . 2)) (COMMA . (term . 2)) (SEMICOLON . (term . 2)))
       ((default . error) (QUOTE .  41))
-      ((default . error) (RIGHT_PAREN . (string_primary . 3)) (AMPERSAND . 
(string_primary . 3)) (COMMA . (string_primary . 3)) (SEMICOLON . 
(string_primary . 3)))
+      ((default . error) (AT . (string_primary . 3)) (RIGHT_PAREN . 
(string_primary . 3)) (AMPERSAND . (string_primary . 3)) (COMMA . 
(string_primary . 3)) (SEMICOLON . (string_primary . 3)))
       ((default . error) (RIGHT_PAREN . (string_list . 0)) (AMPERSAND .  42) 
(COMMA . (string_list . 0)) (SEMICOLON . (string_list . 0)))
-      ((default . error) (RIGHT_PAREN . (string_primary . 2)) (AMPERSAND . 
(string_primary . 2)) (COMMA . (string_primary . 2)) (SEMICOLON . 
(string_primary . 2)))
-      ((default . error) (IS . (name . 0)) (RIGHT_PAREN . (name . 0)) 
(AMPERSAND . (name . 0)) (COMMA . (name . 0)) (DOT . (name . 0)) (QUOTE . (name 
. 0)) (SEMICOLON . (name . 0)))
-      ((default . error) (RIGHT_PAREN . (string_primary . 1)) (AMPERSAND . 
(string_primary . 1)) (COMMA . (string_primary . 1)) (DOT .  43) (QUOTE . 
(attribute_prefix . 1)) (SEMICOLON . (string_primary . 1)))
-      ((default . error) (RIGHT_PAREN . (term . 0)) (AMPERSAND . (term . 0)) 
(COMMA . (term . 0)) (SEMICOLON . (term . 0)))
+      ((default . error) (AT . (string_primary . 2)) (RIGHT_PAREN . 
(string_primary . 2)) (AMPERSAND . (string_primary . 2)) (COMMA . 
(string_primary . 2)) (SEMICOLON . (string_primary . 2)))
+      ((default . error) (AT . (name . 0)) (IS . (name . 0)) (RIGHT_PAREN . 
(name . 0)) (AMPERSAND . (name . 0)) (COMMA . (name . 0)) (DOT . (name . 0)) 
(QUOTE . (name . 0)) (SEMICOLON . (name . 0)))
+      ((default . error) (AT . (string_primary . 1)) (RIGHT_PAREN . 
(string_primary . 1)) (AMPERSAND . (string_primary . 1)) (COMMA . 
(string_primary . 1)) (DOT .  43) (QUOTE . (attribute_prefix . 1)) (SEMICOLON . 
(string_primary . 1)))
+      ((default . error) (AT . (term . 0)) (RIGHT_PAREN . (term . 0)) 
(AMPERSAND . (term . 0)) (COMMA . (term . 0)) (SEMICOLON . (term . 0)))
       ((default . error) (COMMA .  44) (SEMICOLON .  45))
-      ((default . error) (RIGHT_PAREN . (expression . 0)) (AMPERSAND . 
(expression . 0)) (COMMA . (expression . 0)) (SEMICOLON . (expression . 0)))
+      ((default . error) (AT . (expression . 0)) (RIGHT_PAREN . (expression . 
0)) (AMPERSAND . (expression . 0)) (COMMA . (expression . 0)) (SEMICOLON . 
(expression . 0)))
       ((default . error) (ABSTRACT . (context_clause . 1)) (AGGREGATE . 
(context_clause . 1)) (CONFIGURATION . (context_clause . 1)) (LIBRARY . 
(context_clause . 1)) (PROJECT . (context_clause . 1)) (STANDARD . 
(context_clause . 1)) (WITH . (context_clause . 1)) (Wisi_EOI . (context_clause 
. 1)))
       ((default . error) (PROJECT .  5) (Wisi_EOI . (project_declaration_opt . 
0)))
       ((default . error) (STRING_LITERAL .  47))
       ((default . error) (CASE .  48) (END . (declarative_items_opt . 0)) (FOR 
.  49) (NULL .  50) (PACKAGE .  51) (TYPE .  52) (IDENTIFIER .  53))
       ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (RIGHT_PAREN . (identifier_opt . 0)) (AMPERSAND . 
(identifier_opt . 0)) (COMMA . (identifier_opt . 0)) (DOT . (identifier_opt . 
0)) (QUOTE . (identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  21))
-      ((default . error) (RIGHT_PAREN . (external_value . 0)) (AMPERSAND . 
(external_value . 0)) (COMMA . (external_value . 0)) (SEMICOLON . 
(external_value . 0)))
-      ((default . error) (RIGHT_PAREN . (external_value . 1)) (AMPERSAND . 
(external_value . 1)) (COMMA . (external_value . 1)) (SEMICOLON . 
(external_value . 1)))
-      ((default . error) (RIGHT_PAREN . (term . 1)) (AMPERSAND . (term . 1)) 
(COMMA . (term . 1)) (SEMICOLON . (term . 1)))
+      ((default . error) (AT . (external_value . 0)) (RIGHT_PAREN . 
(external_value . 0)) (AMPERSAND . (external_value . 0)) (COMMA . 
(external_value . 0)) (SEMICOLON . (external_value . 0)))
+      ((default . error) (AT . (external_value . 1)) (RIGHT_PAREN . 
(external_value . 1)) (AMPERSAND . (external_value . 1)) (COMMA . 
(external_value . 1)) (SEMICOLON . (external_value . 1)))
+      ((default . error) (AT . (term . 1)) (RIGHT_PAREN . (term . 1)) 
(AMPERSAND . (term . 1)) (COMMA . (term . 1)) (SEMICOLON . (term . 1)))
       ((default . error) (RIGHT_PAREN .  65) (COMMA .  44))
       ((default . error) (IDENTIFIER .  66))
-      ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (RIGHT_PAREN . (identifier_opt . 0)) (AMPERSAND . 
(identifier_opt . 0)) (COMMA . (identifier_opt . 0)) (DOT . (identifier_opt . 
0)) (QUOTE . (identifier_opt . 0)) (SEMICOLON . (identifier_opt . 0)) 
(IDENTIFIER .  15) (STRING_LITERAL .  21))
+      ((default . error) (AT . (identifier_opt . 0)) (EXTERNAL .  17) 
(EXTERNAL_AS_LIST .  18) (LEFT_PAREN .  19) (PROJECT .  20) (RIGHT_PAREN . 
(identifier_opt . 0)) (AMPERSAND . (identifier_opt . 0)) (COMMA . 
(identifier_opt . 0)) (DOT . (identifier_opt . 0)) (QUOTE . (identifier_opt . 
0)) (SEMICOLON . (identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  
21))
       ((default . error) (IDENTIFIER .  68))
       ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (RIGHT_PAREN . (identifier_opt . 0)) (AMPERSAND . 
(identifier_opt . 0)) (COMMA . (identifier_opt . 0)) (DOT . (identifier_opt . 
0)) (QUOTE . (identifier_opt . 0)) (SEMICOLON . (identifier_opt . 0)) 
(IDENTIFIER .  15) (STRING_LITERAL .  21))
       ((default . error) (ABSTRACT . (with_clause . 0)) (AGGREGATE . 
(with_clause . 0)) (CONFIGURATION . (with_clause . 0)) (LIBRARY . (with_clause 
. 0)) (PROJECT . (with_clause . 0)) (STANDARD . (with_clause . 0)) (WITH . 
(with_clause . 0)) (Wisi_EOI . (with_clause . 0)))
@@ -295,10 +305,10 @@
       ((default . error) (CASE . (package_declaration . 2)) (END . 
(package_declaration . 2)) (FOR . (package_declaration . 2)) (NULL . 
(package_declaration . 2)) (PACKAGE . (package_declaration . 2)) (TYPE . 
(package_declaration . 2)) (WHEN . (package_declaration . 2)) (IDENTIFIER . 
(package_declaration . 2)))
       ((default . error) (CASE . (declarative_item . 0)) (END . 
(declarative_item . 0)) (FOR . (declarative_item . 0)) (NULL . 
(declarative_item . 0)) (PACKAGE . (declarative_item . 0)) (TYPE . 
(declarative_item . 0)) (WHEN . (declarative_item . 0)) (IDENTIFIER . 
(declarative_item . 0)))
       ((default . error) (CASE . (declarative_item . 1)) (END . 
(declarative_item . 1)) (FOR . (declarative_item . 1)) (NULL . 
(declarative_item . 1)) (PACKAGE . (declarative_item . 1)) (TYPE . 
(declarative_item . 1)) (WHEN . (declarative_item . 1)) (IDENTIFIER . 
(declarative_item . 1)))
-      ((default . error) (RIGHT_PAREN . (aggregate_g . 0)) (AMPERSAND . 
(aggregate_g . 0)) (COMMA . (aggregate_g . 0)) (SEMICOLON . (aggregate_g . 0)))
-      ((default . error) (LEFT_PAREN .  81) (RIGHT_PAREN . 
(attribute_reference . 0)) (AMPERSAND . (attribute_reference . 0)) (COMMA . 
(attribute_reference . 0)) (SEMICOLON . (attribute_reference . 0)))
-      ((default . error) (RIGHT_PAREN . (expression . 1)) (AMPERSAND . 
(expression . 1)) (COMMA . (expression . 1)) (SEMICOLON . (expression . 1)))
-      ((default . error) (IS . (name . 1)) (RIGHT_PAREN . (name . 1)) 
(AMPERSAND . (name . 1)) (COMMA . (name . 1)) (DOT . (name . 1)) (QUOTE . (name 
. 1)) (SEMICOLON . (name . 1)))
+      ((default . error) (AT . (aggregate_g . 0)) (RIGHT_PAREN . (aggregate_g 
. 0)) (AMPERSAND . (aggregate_g . 0)) (COMMA . (aggregate_g . 0)) (SEMICOLON . 
(aggregate_g . 0)))
+      ((default . error) (AT . (attribute_reference . 0)) (LEFT_PAREN .  81) 
(RIGHT_PAREN . (attribute_reference . 0)) (AMPERSAND . (attribute_reference . 
0)) (COMMA . (attribute_reference . 0)) (SEMICOLON . (attribute_reference . 0)))
+      ((default . error) (AT . (expression . 1)) (RIGHT_PAREN . (expression . 
1)) (AMPERSAND . (expression . 1)) (COMMA . (expression . 1)) (SEMICOLON . 
(expression . 1)))
+      ((default . error) (AT . (name . 1)) (IS . (name . 1)) (RIGHT_PAREN . 
(name . 1)) (AMPERSAND . (name . 1)) (COMMA . (name . 1)) (DOT . (name . 1)) 
(QUOTE . (name . 1)) (SEMICOLON . (name . 1)))
       ((default . error) (RIGHT_PAREN . (string_list . 1)) (AMPERSAND .  42) 
(COMMA . (string_list . 1)) (SEMICOLON . (string_list . 1)))
       ((default . error) (CASE .  48) (END . (declarative_items_opt . 0)) (FOR 
.  49) (NULL .  50) (PACKAGE .  51) (TYPE .  52) (IDENTIFIER .  53))
       ((default . error) (IS .  83) (DOT .  43))
@@ -341,7 +351,7 @@
       ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (AMPERSAND . (identifier_opt . 0)) (DOT . 
(identifier_opt . 0)) (QUOTE . (identifier_opt . 0)) (SEMICOLON . 
(identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  21))
       ((default . error) (CASE . (simple_declarative_item . 0)) (END . 
(simple_declarative_item . 0)) (FOR . (simple_declarative_item . 0)) (NULL . 
(simple_declarative_item . 0)) (PACKAGE . (simple_declarative_item . 0)) (TYPE 
. (simple_declarative_item . 0)) (WHEN . (simple_declarative_item . 0)) 
(IDENTIFIER . (simple_declarative_item . 0)))
       ((default . error) (Wisi_EOI . (simple_project_declaration . 0)))
-      ((default . error) (RIGHT_PAREN . (attribute_reference . 1)) (AMPERSAND 
. (attribute_reference . 1)) (COMMA . (attribute_reference . 1)) (SEMICOLON . 
(attribute_reference . 1)))
+      ((default . error) (AT . (attribute_reference . 1)) (RIGHT_PAREN . 
(attribute_reference . 1)) (AMPERSAND . (attribute_reference . 1)) (COMMA . 
(attribute_reference . 1)) (SEMICOLON . (attribute_reference . 1)))
       ((default . error) (SEMICOLON .  125))
       ((default . error) (EQUAL_GREATER . (discrete_choice_list . 0)) 
(VERTICAL_BAR . (discrete_choice_list . 0)))
       ((default . error) (EQUAL_GREATER .  126) (VERTICAL_BAR .  127))
@@ -360,7 +370,7 @@
       ((default . error) (OTHERS .  100) (EQUAL_GREATER . (discrete_choice . 
0)) (VERTICAL_BAR . (discrete_choice . 0)) (STRING_LITERAL .  101))
       ((default . error) (SEMICOLON .  136))
       ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (AMPERSAND . (identifier_opt . 0)) (DOT . 
(identifier_opt . 0)) (QUOTE . (identifier_opt . 0)) (SEMICOLON . 
(identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  21))
-      ((default . error) (EXTERNAL .  17) (EXTERNAL_AS_LIST .  18) (LEFT_PAREN 
.  19) (PROJECT .  20) (AMPERSAND . (identifier_opt . 0)) (DOT . 
(identifier_opt . 0)) (QUOTE . (identifier_opt . 0)) (SEMICOLON . 
(identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  21))
+      ((default . error) (AT . (identifier_opt . 0)) (EXTERNAL .  17) 
(EXTERNAL_AS_LIST .  18) (LEFT_PAREN .  19) (PROJECT .  20) (AMPERSAND . 
(identifier_opt . 0)) (DOT . (identifier_opt . 0)) (QUOTE . (identifier_opt . 
0)) (SEMICOLON . (identifier_opt . 0)) (IDENTIFIER .  15) (STRING_LITERAL .  
21))
       ((default . error) (END .  139))
       ((default . error) (SEMICOLON .  140))
       ((default . error) (CASE . (simple_declarative_item . 1)) (END . 
(simple_declarative_item . 1)) (FOR . (simple_declarative_item . 1)) (NULL . 
(simple_declarative_item . 1)) (PACKAGE . (simple_declarative_item . 1)) (TYPE 
. (simple_declarative_item . 1)) (WHEN . (simple_declarative_item . 1)) 
(IDENTIFIER . (simple_declarative_item . 1)))
@@ -368,13 +378,16 @@
       ((default . error) (EQUAL_GREATER . (discrete_choice_list . 1)) 
(VERTICAL_BAR . (discrete_choice_list . 1)))
       ((default . error) (CASE . (case_statement . 0)) (END . (case_statement 
. 0)) (FOR . (case_statement . 0)) (NULL . (case_statement . 0)) (PACKAGE . 
(case_statement . 0)) (TYPE . (case_statement . 0)) (WHEN . (case_statement . 
0)) (IDENTIFIER . (case_statement . 0)))
       ((default . error) (AMPERSAND .  42) (SEMICOLON .  141))
-      ((default . error) (AMPERSAND .  42) (SEMICOLON .  142))
+      ((default . error) (AT .  142) (AMPERSAND .  42) (SEMICOLON .  143))
       ((default . error) (SEMICOLON . (identifier_opt . 0)) (IDENTIFIER .  15))
       ((default . error) (CASE . (package_spec . 0)) (END . (package_spec . 
0)) (FOR . (package_spec . 0)) (NULL . (package_spec . 0)) (PACKAGE . 
(package_spec . 0)) (TYPE . (package_spec . 0)) (WHEN . (package_spec . 0)) 
(IDENTIFIER . (package_spec . 0)))
-      ((default . error) (CASE . (attribute_declaration . 2)) (END . 
(attribute_declaration . 2)) (FOR . (attribute_declaration . 2)) (NULL . 
(attribute_declaration . 2)) (PACKAGE . (attribute_declaration . 2)) (TYPE . 
(attribute_declaration . 2)) (WHEN . (attribute_declaration . 2)) (IDENTIFIER . 
(attribute_declaration . 2)))
+      ((default . error) (CASE . (attribute_declaration . 3)) (END . 
(attribute_declaration . 3)) (FOR . (attribute_declaration . 3)) (NULL . 
(attribute_declaration . 3)) (PACKAGE . (attribute_declaration . 3)) (TYPE . 
(attribute_declaration . 3)) (WHEN . (attribute_declaration . 3)) (IDENTIFIER . 
(attribute_declaration . 3)))
+      ((default . error) (NUMERIC_LITERAL .  145))
       ((default . error) (CASE . (attribute_declaration . 1)) (END . 
(attribute_declaration . 1)) (FOR . (attribute_declaration . 1)) (NULL . 
(attribute_declaration . 1)) (PACKAGE . (attribute_declaration . 1)) (TYPE . 
(attribute_declaration . 1)) (WHEN . (attribute_declaration . 1)) (IDENTIFIER . 
(attribute_declaration . 1)))
-      ((default . error) (SEMICOLON .  144))
-      ((default . error) (CASE . (package_extension . 0)) (END . 
(package_extension . 0)) (FOR . (package_extension . 0)) (NULL . 
(package_extension . 0)) (PACKAGE . (package_extension . 0)) (TYPE . 
(package_extension . 0)) (WHEN . (package_extension . 0)) (IDENTIFIER . 
(package_extension . 0)))]
+      ((default . error) (SEMICOLON .  146))
+      ((default . error) (SEMICOLON .  147))
+      ((default . error) (CASE . (package_extension . 0)) (END . 
(package_extension . 0)) (FOR . (package_extension . 0)) (NULL . 
(package_extension . 0)) (PACKAGE . (package_extension . 0)) (TYPE . 
(package_extension . 0)) (WHEN . (package_extension . 0)) (IDENTIFIER . 
(package_extension . 0)))
+      ((default . error) (CASE . (attribute_declaration . 2)) (END . 
(attribute_declaration . 2)) (FOR . (attribute_declaration . 2)) (NULL . 
(attribute_declaration . 2)) (PACKAGE . (attribute_declaration . 2)) (TYPE . 
(attribute_declaration . 2)) (WHEN . (attribute_declaration . 2)) (IDENTIFIER . 
(attribute_declaration . 2)))]
      [((compilation_unit . 8)(context_clause . 9)(context_clause_opt . 
10)(project_extension . 11)(simple_project_declaration . 12)(with_clause . 13))
       nil
       nil
@@ -514,7 +527,10 @@
       nil
       nil
       nil
-      ((identifier_opt . 143))
+      ((identifier_opt . 144))
+      nil
+      nil
+      nil
       nil
       nil
       nil
diff --git a/packages/ada-mode/gpr-mode.el b/packages/ada-mode/gpr-mode.el
index 64f62cc..0f0d698 100644
--- a/packages/ada-mode/gpr-mode.el
+++ b/packages/ada-mode/gpr-mode.el
@@ -1,6 +1,6 @@
 ;; gpr-mode --- Major mode for editing GNAT project files  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2004, 2007, 2008, 2012-2015, 2017, 2018  Free Software 
Foundation, Inc.
+;; Copyright (C) 2004, 2007, 2008, 2012-2015, 2017, 2018, 2019  Free Software 
Foundation, Inc.
 
 ;; Author: Stephen Leake <address@hidden>
 ;; Maintainer: Stephen Leake <address@hidden>
@@ -142,6 +142,7 @@ Function is called with no arguments.")
   '(
     "abstract"
     "aggregate"
+    "at"
     "case"
     "configuration"
     "end"
diff --git a/packages/ada-mode/gpr-process.el b/packages/ada-mode/gpr-process.el
index 0030835..ee6ac18 100644
--- a/packages/ada-mode/gpr-process.el
+++ b/packages/ada-mode/gpr-process.el
@@ -23,6 +23,7 @@
    NEW_LINE
    COMMENT
    ABSTRACT
+   AT
    AGGREGATE
    CASE
    CONFIGURATION
@@ -54,6 +55,7 @@
    QUOTE
    SEMICOLON
    VERTICAL_BAR
+   NUMERIC_LITERAL
    IDENTIFIER
    STRING_LITERAL
    Wisi_EOI
@@ -99,4 +101,56 @@
    nil
    ])
 
+(defconst gpr-elisp-keyword-table-raw
+  '(
+   ("abstract" . ABSTRACT)
+   ("at" . AT)
+   ("aggregate" . AGGREGATE)
+   ("case" . CASE)
+   ("configuration" . CONFIGURATION)
+   ("end" . END)
+   ("extends" . EXTENDS)
+   ("external" . EXTERNAL)
+   ("external_as_list" . EXTERNAL_AS_LIST)
+   ("for" . FOR)
+   ("is" . IS)
+   ("(" . LEFT_PAREN)
+   ("library" . LIBRARY)
+   ("null" . NULL)
+   ("others" . OTHERS)
+   ("package" . PACKAGE)
+   ("project" . PROJECT)
+   ("renames" . RENAMES)
+   (")" . RIGHT_PAREN)
+   ("standard" . STANDARD)
+   ("type" . TYPE)
+   ("use" . USE)
+   ("when" . WHEN)
+   ("with" . WITH)
+   ))
+
+(defconst gpr-elisp-token-table-raw
+  '(
+   ("punctuation"
+    (AMPERSAND . "&")
+    (COLON . ":")
+    (COLON_EQUALS . ":=")
+    (COMMA . ",")
+    (DOT . ".")
+    (EQUAL_GREATER . "=>")
+    (QUOTE . "'")
+    (SEMICOLON . ";")
+    (VERTICAL_BAR . "|")
+    )
+   ("number"
+    (NUMERIC_LITERAL ada-wisi-number-p)
+    )
+   ("symbol"
+    (IDENTIFIER . "")
+    )
+   ("string-double"
+    (STRING_LITERAL . "")
+    )
+   ))
+
 (provide 'gpr-process)
diff --git a/packages/ada-mode/gpr-query.el b/packages/ada-mode/gpr-query.el
index 105500c..7047bf1 100644
--- a/packages/ada-mode/gpr-query.el
+++ b/packages/ada-mode/gpr-query.el
@@ -3,7 +3,7 @@
 ;; gpr-query supports Ada and any gcc language that supports the
 ;; AdaCore -fdump-xref switch (which includes C, C++).
 ;;
-;; Copyright (C) 2013 - 2018  Free Software Foundation, Inc.
+;; Copyright (C) 2013 - 2019  Free Software Foundation, Inc.
 
 ;; Author: Stephen Leake <address@hidden>
 ;; Maintainer: Stephen Leake <address@hidden>
@@ -440,7 +440,7 @@ Enable mode if ARG is positive."
 
 (defun gpr-query-refresh (delete-files)
   "For `ada-xref-refresh-function', using gpr_query."
-  (interactive)
+  (interactive "P")
   ;; Kill the current session and delete the database, to get changed
   ;; env vars etc when it restarts.
   ;;
diff --git a/packages/ada-mode/gpr-wisi.el b/packages/ada-mode/gpr-wisi.el
index 8e46bf1..a5056ed 100644
--- a/packages/ada-mode/gpr-wisi.el
+++ b/packages/ada-mode/gpr-wisi.el
@@ -31,6 +31,10 @@
 (require 'wisi-elisp-lexer)
 (require 'wisi-process-parse)
 
+(defconst gpr-wisi-language-protocol-version "1"
+  "Defines language-specific parser parameters.
+Must match wisi-gpr.ads Language_Protocol_Version.")
+
 (defun gpr-wisi-which-function ()
   "For `gpr-which-function'."
   (wisi-validate-cache (point-min) (point) nil 'navigate)
@@ -118,6 +122,7 @@
      (wisi-process-parse-get
       (make-gpr-wisi-parser
       :label "gpr"
+      :language-protocol-version gpr-wisi-language-protocol-version
       :exec-file gpr-process-parse-exec
       :face-table gpr-process-face-table
       :token-table gpr-process-token-table
diff --git a/packages/ada-mode/gpr.wy b/packages/ada-mode/gpr.wy
new file mode 100644
index 0000000..335b38d
--- /dev/null
+++ b/packages/ada-mode/gpr.wy
@@ -0,0 +1,369 @@
+;;; WisiToken grammar for GNAT project files
+;;
+;; Author: Stephen Leake <address@hidden>
+;; Maintainer: Stephen Leake <address@hidden>
+;; Created: Jan 2013
+;; Keywords: syntax
+
+%code copyright_license %{
+;;  Copyright (C) 2013 - 2019 Free Software Foundation, Inc.
+
+;;  This program is free software; you can redistribute it and/or
+;;  modify it under the terms of the GNU General Public License as
+;;  published by the Free Software Foundation; either version 3, or (at
+;;  your option) any later version.
+;;
+;;  This software is distributed in the hope that it will be useful,
+;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;  General Public License for more details.
+;;
+;;  You should have received a copy of the GNU General Public License
+;;  along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+}%
+
+%code actions spec post %{
+   Partial_Parse_Active : Boolean := False;
+}%
+
+;;; Commentary:
+;;
+;; This is a wisi grammar file for the gpr language. It is derived
+;; from the gprbuild user guide, with the following substitutions:
+;;
+;; simple_name -> IDENTIFIER
+;;
+;; and some simplifications. Repeating constructs are implemented with
+;; extra productions. Optional constructs are implemented by repeated
+;; productions
+
+;; GNAT GPL 2017 (info "(gprbuild_ug) Configuration File Reference")
+
+%token <punctuation> AMPERSAND "&"
+%token <punctuation> COLON ":"
+%token <punctuation> COLON_EQUALS ":="
+%token <punctuation> COMMA ","
+%token <punctuation> DOT "."
+%token <punctuation> EQUAL_GREATER "=>"
+%token <punctuation> QUOTE "'"
+%token <punctuation> SEMICOLON ";"
+%token <punctuation> VERTICAL_BAR "|"
+
+%case_insensitive
+
+%keyword ABSTRACT "abstract"
+%keyword AT "at"
+%keyword AGGREGATE "aggregate"
+%keyword CASE "case"
+%keyword CONFIGURATION "configuration"
+%keyword END "end"
+%keyword EXTENDS "extends"
+%keyword EXTERNAL "external"
+%keyword EXTERNAL_AS_LIST "external_as_list"
+%keyword FOR "for"
+%keyword IS "is"
+%keyword LEFT_PAREN "("
+%keyword LIBRARY "library"
+%keyword NULL "null"
+%keyword OTHERS "others"
+%keyword PACKAGE "package"
+%keyword PROJECT "project"
+%keyword RENAMES "renames"
+%keyword RIGHT_PAREN ")"
+%keyword STANDARD "standard"
+%keyword TYPE "type"
+%keyword USE "use"
+%keyword WHEN "when"
+%keyword WITH "with"
+
+%non_grammar <non-reporting> WHITESPACE %[ [ \t] ]%
+
+;; handle DOS or Unix newline
+%non_grammar <new-line> NEW_LINE %[ [\x0a]|[\x0d][\x0a] ]%
+
+%non_grammar <comment> COMMENT %[ "--"[^\n]* ]%
+
+%if lexer = elisp
+%token <number> NUMERIC_LITERAL ada-wisi-number-p
+%end if
+%if lexer = re2c
+%token <number> NUMERIC_LITERAL %[ [0-9]+ ]%
+%end if
+%token <symbol> IDENTIFIER %[ 
[a-zA-Z\x80-\U0010FFFF][0-9a-zA-Z_\x80-\U0010FFFF]* ]%
+%token <string-double> STRING_LITERAL %[ (["][\x20-\x21\x23-\U0010FFFF]*["])+ 
]%
+
+%start compilation_unit
+
+%generate LALR elisp elisp
+%generate LR1 Ada_Emacs re2c Process
+;; LR1 gives better error correction performance.
+
+%elisp_face font-lock-function-name-face
+%elisp_face nil
+
+%mckenzie_cost_default 4 4 2 2
+%mckenzie_enqueue_limit 10_000
+%mckenzie_check_limit 3
+%mckenzie_check_delta_limit 200
+
+%end_names_optional_option End_Names_Optional
+
+%conflict SHIFT/REDUCE in state aggregate_g, aggregate_g  on token RIGHT_PAREN
+%conflict SHIFT/REDUCE in state case_statement, case_statement  on token WHEN
+
+;; grammar rules, non-terminal alphabetical order
+
+aggregate_g
+  : LEFT_PAREN string_list RIGHT_PAREN
+    %((wisi-indent-action [0 (wisi-anchored 1 1) (wisi-anchored 1 0)]))%
+  ;
+
+attribute_declaration
+  : FOR IDENTIFIER USE expression SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken 0 gpr-indent-broken 0])))%
+  | FOR IDENTIFIER LEFT_PAREN discrete_choice RIGHT_PAREN USE expression 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken (- gpr-indent-broken 1) 
gpr-indent-broken (- gpr-indent-broken 1) 0
+                             gpr-indent-broken 0])))%
+  | FOR IDENTIFIER LEFT_PAREN discrete_choice RIGHT_PAREN USE expression AT 
NUMERIC_LITERAL SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 10 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken (- gpr-indent-broken 1) 
gpr-indent-broken (- gpr-indent-broken 1) 0
+                             gpr-indent-broken 0 0 0])))%
+  | FOR EXTERNAL LEFT_PAREN STRING_LITERAL RIGHT_PAREN USE expression SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 8 statement-end])
+      (wisi-indent-action [0 gpr-indent-broken (- gpr-indent-broken 1) 
gpr-indent-broken (- gpr-indent-broken 1) 0
+                             gpr-indent-broken 0])))%
+  ;
+
+;; (info "(gprbuild_ug)Attributes")
+attribute_prefix
+  : PROJECT
+  | name
+  ;
+
+attribute_reference
+  : attribute_prefix QUOTE IDENTIFIER
+  | attribute_prefix QUOTE IDENTIFIER LEFT_PAREN STRING_LITERAL RIGHT_PAREN
+  ;
+
+;; (info "(gprbuild_ug)Case Statements")
+case_statement
+  : CASE name IS case_items END CASE SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 4);; for gpr-which-function
+      (wisi-indent-action [0 gpr-indent-broken 0 [gpr-indent-when 
gpr-indent-when] 0 0 0])))%
+  ;
+
+;; declarations allowed in a case statement are a subset of
+;; declarative_items, but this simplifies the grammar.
+case_item
+  : WHEN discrete_choice_list EQUAL_GREATER declarative_items_opt
+    %((progn
+      (wisi-statement-action [1 motion])
+      (wisi-indent-action [0 gpr-indent-broken gpr-indent gpr-indent])))%
+  ;
+
+case_items
+  : ;; empty
+  | case_item
+  | case_items case_item
+  ;
+
+;; Compute indent for trailing comments.
+compilation_unit
+  : context_clause_opt project_qualifier_opt project_declaration_opt
+    %((wisi-indent-action [0 0 [0 0]]))%
+  ;
+
+context_clause
+  : with_clause
+  | context_clause with_clause
+  ;
+
+context_clause_opt
+  : ;; empty
+  | context_clause
+  ;
+
+;; (info "(gprbuild_ug)Declarations")
+declarative_item
+  : simple_declarative_item
+  | typed_string_declaration
+  | package_declaration
+  ;
+
+declarative_items
+  : declarative_item
+  | declarative_items declarative_item
+  ;
+
+declarative_items_opt
+  : ;; empty
+  | declarative_items
+  ;
+
+discrete_choice
+  : ;; empty
+  | STRING_LITERAL
+  | OTHERS
+  ;
+
+discrete_choice_list
+  : discrete_choice
+  | discrete_choice_list VERTICAL_BAR discrete_choice
+  ;
+
+;; (info "(gprbuild_ug)Expressions")
+expression
+  : term
+  | expression AMPERSAND term
+  ;
+
+external_value
+  : EXTERNAL aggregate_g
+  | EXTERNAL_AS_LIST aggregate_g
+  ;
+
+identifier_opt
+  : ;; empty
+  | IDENTIFIER
+    %()%
+    %((wisi-propagate-name 1))%
+  ;
+
+name
+  : identifier_opt
+  | name DOT IDENTIFIER
+  ;
+
+;; (info "(gprbuild_ug)Packages")
+package_declaration
+  : package_spec
+  | package_extension
+  | package_renaming
+  ;
+
+package_spec
+  : PACKAGE identifier_opt IS declarative_items_opt END identifier_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 6 nil 
font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken 0 [gpr-indent gpr-indent] 0 0 
0])))%
+    %((wisi-match-names 2 6))%
+  ;
+
+package_extension
+  : PACKAGE identifier_opt EXTENDS name IS declarative_items_opt END 
identifier_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 6)
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 8 nil 
font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken 0 gpr-indent-broken 0 
[gpr-indent gpr-indent] 0 0 0])))%
+    %((wisi-match-names 2 8))%
+  ;
+
+package_renaming
+  : PACKAGE identifier_opt RENAMES name SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 4 nil 
font-lock-function-name-face])))%
+  ;
+
+project_declaration_opt
+  : ;; empty
+  | simple_project_declaration
+  | project_extension
+  ;
+
+project_extension
+  : PROJECT identifier_opt EXTENDS STRING_LITERAL IS declarative_items_opt END 
identifier_opt SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 9 statement-end])
+      (wisi-containing-action 1 6)
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 8 nil 
font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken 0 gpr-indent-broken 0 
[gpr-indent gpr-indent] 0 0 0])))%
+    %((wisi-match-names 2 8))%
+  ;
+
+;; (info "(gprbuild_ug)Qualified Projects")
+project_qualifier_opt
+  : ;; empty
+  | ABSTRACT
+  | STANDARD
+  | AGGREGATE
+  | AGGREGATE LIBRARY
+  | LIBRARY
+  | CONFIGURATION
+  ;
+
+;; (info "(gprbuild_ug)Declarations" "*info gpr*")
+simple_declarative_item
+  : IDENTIFIER COLON_EQUALS expression SEMICOLON ;; variable_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 4 statement-end])
+      (wisi-indent-action [0 gpr-indent-broken gpr-indent-broken 0])))%
+  | IDENTIFIER COLON IDENTIFIER COLON_EQUALS expression SEMICOLON ;; 
typed_variable_declaration
+    %((progn
+      (wisi-statement-action [1 statement-start 6 statement-end])
+      (wisi-indent-action [0 gpr-indent-broken gpr-indent-broken 
gpr-indent-broken gpr-indent-broken 0])))%
+  | attribute_declaration
+  | case_statement
+  | NULL SEMICOLON
+    %((wisi-statement-action [1 statement-start 2 statement-end]))%
+  ;
+
+simple_project_declaration
+  : PROJECT identifier_opt IS declarative_items_opt END identifier_opt 
SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 7 statement-end])
+      (wisi-containing-action 1 4)
+      (wisi-face-apply-action [2 nil font-lock-function-name-face 6 nil 
font-lock-function-name-face])
+      (wisi-indent-action [0 gpr-indent-broken 0 [gpr-indent gpr-indent] 0 0 
0])))%
+    %((wisi-match-names 2 6))%
+  ;
+
+;; (info "(gprbuild_ug)Expressions")
+string_primary
+  : STRING_LITERAL
+  | name;; variable_name
+  | external_value
+  | attribute_reference
+  ;
+
+;; (info "(gprbuild_ug)Expressions")
+;; we merge that string_list into term, and use 'string_list' for 
'string_expression {, string_expression}'
+string_list
+  : expression
+  | string_list COMMA expression
+  ;
+
+;; see string_list for info reference
+;; string_variable_name covered by string_primary
+term
+  : string_primary
+  | LEFT_PAREN RIGHT_PAREN
+  | aggregate_g
+  ;
+
+typed_string_declaration
+  : TYPE IDENTIFIER IS aggregate_g SEMICOLON
+    %((progn
+      (wisi-statement-action [1 statement-start 5 statement-end])
+      (wisi-indent-action [0 gpr-indent-broken gpr-indent-broken 
gpr-indent-broken 0])))%
+  ;
+
+with_clause
+  : WITH string_list SEMICOLON
+  ;
+
+;;; end of file
diff --git a/packages/ada-mode/gpr_mode_wisi_parse.ads 
b/packages/ada-mode/gpr_mode_wisi_parse.ads
index e384473..4aed022 100644
--- a/packages/ada-mode/gpr_mode_wisi_parse.ads
+++ b/packages/ada-mode/gpr_mode_wisi_parse.ads
@@ -23,11 +23,12 @@ with Gpr_Process_Actions;
 with Gpr_Process_LR1_Main;
 with Wisi.Gpr;
 procedure Gpr_Mode_Wisi_Parse is new Gen_Emacs_Wisi_LR_Parse
-  (Parse_Data_Type                       => Wisi.Gpr.Parse_Data_Type,
-   Name                                  => "gpr_mode_wisi_parse",
-   Descriptor                            => Gpr_Process_Actions.Descriptor,
-   Partial_Parse_Active                  => 
Gpr_Process_Actions.Partial_Parse_Active,
-   Language_Fixes                        => null,
-   Language_Use_Minimal_Complete_Actions => null,
-   Language_String_ID_Set                => null,
-   Create_Parser                         => 
Gpr_Process_LR1_Main.Create_Parser);
+  (Parse_Data_Type                => Wisi.Gpr.Parse_Data_Type,
+   Language_Protocol_Version      => Wisi.Gpr.Language_Protocol_Version,
+   Name                           => "gpr_mode_wisi_parse",
+   Descriptor                     => Gpr_Process_Actions.Descriptor,
+   Partial_Parse_Active           => Gpr_Process_Actions.Partial_Parse_Active,
+   Language_Fixes                 => null,
+   Language_Matching_Begin_Tokens => null,
+   Language_String_ID_Set         => null,
+   Create_Parser                  => Gpr_Process_LR1_Main.Create_Parser);
diff --git a/packages/ada-mode/gpr_process_actions.adb 
b/packages/ada-mode/gpr_process_actions.adb
index 6b63d40..c050e7e 100644
--- a/packages/ada-mode/gpr_process_actions.adb
+++ b/packages/ada-mode/gpr_process_actions.adb
@@ -93,6 +93,28 @@ package body Gpr_Process_Actions is
    begin
       case Parse_Data.Post_Parse_Action is
       when Navigate =>
+         Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (10, Statement_End)));
+      when Face =>
+         Face_Apply_Action (Parse_Data, Tree, Nonterm, Tokens, (1 => (2, 1, 
0)));
+      when Indent =>
+         Indent_Action_0 (Parse_Data, Tree, Nonterm, Tokens, ((False, (Simple, 
(Int, 0))), (False, (Simple, (Int,
+         Gpr_Indent_Broken))), (False, (Simple, (Int, Gpr_Indent_Broken - 
1))), (False, (Simple, (Int,
+         Gpr_Indent_Broken))), (False, (Simple, (Int, Gpr_Indent_Broken - 
1))), (False, (Simple, (Int, 0))), (False,
+         (Simple, (Int, Gpr_Indent_Broken))), (False, (Simple, (Int, 0))), 
(False, (Simple, (Int, 0))), (False,
+         (Simple, (Int, 0)))));
+      end case;
+   end attribute_declaration_2;
+
+   procedure attribute_declaration_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      Parse_Data : Wisi.Parse_Data_Type renames Wisi.Parse_Data_Type 
(User_Data);
+   begin
+      case Parse_Data.Post_Parse_Action is
+      when Navigate =>
          Statement_Action (Parse_Data, Tree, Nonterm, Tokens, ((1, 
Statement_Start), (8, Statement_End)));
       when Face =>
          null;
@@ -102,7 +124,7 @@ package body Gpr_Process_Actions is
          Gpr_Indent_Broken))), (False, (Simple, (Int, Gpr_Indent_Broken - 
1))), (False, (Simple, (Int, 0))), (False,
          (Simple, (Int, Gpr_Indent_Broken))), (False, (Simple, (Int, 0)))));
       end case;
-   end attribute_declaration_2;
+   end attribute_declaration_3;
 
    procedure case_statement_0
     (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
@@ -170,8 +192,7 @@ package body Gpr_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Lexer);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Lexer, Recover_Active);
    begin
       return Propagate_Name (Nonterm, Tokens, 1);
    end identifier_opt_1_check;
@@ -204,8 +225,7 @@ package body Gpr_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 6, End_Names_Optional);
    end package_spec_0_check;
@@ -239,8 +259,7 @@ package body Gpr_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 8, End_Names_Optional);
    end package_extension_0_check;
@@ -292,8 +311,7 @@ package body Gpr_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 8, End_Names_Optional);
    end project_extension_0_check;
@@ -383,8 +401,7 @@ package body Gpr_Process_Actions is
      Recover_Active : in     Boolean)
     return WisiToken.Semantic_Checks.Check_Status
    is
-      pragma Unreferenced (Nonterm);
-      pragma Unreferenced (Recover_Active);
+      pragma Unreferenced (Nonterm, Recover_Active);
    begin
       return Match_Names (Lexer, Descriptor, Tokens, 2, 6, End_Names_Optional);
    end simple_project_declaration_0_check;
diff --git a/packages/ada-mode/gpr_process_actions.ads 
b/packages/ada-mode/gpr_process_actions.ads
index bc33358..853c7e2 100644
--- a/packages/ada-mode/gpr_process_actions.ads
+++ b/packages/ada-mode/gpr_process_actions.ads
@@ -23,25 +23,22 @@ with WisiToken.Semantic_Checks;
 package Gpr_Process_Actions is
 
    Descriptor : aliased WisiToken.Descriptor :=
-     (First_Terminal                => 3,
-      Last_Terminal                 => 37,
-      First_Nonterminal             => 38,
-      Last_Nonterminal              => 71,
-      EOI_ID                        => 37,
-      Accept_ID                     => 38,
-      Case_Insensitive              => True,
-      New_Line_ID                   => 1,
-      Comment_ID                    => 2,
-      Left_Paren_ID                 => 2147483647,
-      Right_Paren_ID                => 2147483647,
-      String_1_ID                   => 2147483647,
-      String_2_ID                   => 36,
-      Embedded_Quote_Escape_Doubled => False,
-      Image                         =>
+     (First_Terminal    => 3,
+      Last_Terminal     => 39,
+      First_Nonterminal => 40,
+      Last_Nonterminal  => 73,
+      EOI_ID            => 39,
+      Accept_ID         => 40,
+      Case_Insensitive  => True,
+      New_Line_ID       => 1,
+      String_1_ID       => 2147483647,
+      String_2_ID       => 38,
+      Image             =>
         (new String'("WHITESPACE"),
          new String'("NEW_LINE"),
          new String'("COMMENT"),
          new String'("ABSTRACT"),
+         new String'("AT"),
          new String'("AGGREGATE"),
          new String'("CASE"),
          new String'("CONFIGURATION"),
@@ -73,6 +70,7 @@ package Gpr_Process_Actions is
          new String'("QUOTE"),
          new String'("SEMICOLON"),
          new String'("VERTICAL_BAR"),
+         new String'("NUMERIC_LITERAL"),
          new String'("IDENTIFIER"),
          new String'("STRING_LITERAL"),
          new String'("Wisi_EOI"),
@@ -112,13 +110,14 @@ package Gpr_Process_Actions is
          new String'("with_clause")),
       Terminal_Image_Width => 16,
       Image_Width          => 26,
-      Last_Lookahead       => 37);
+      Last_Lookahead       => 39);
 
    type Token_Enum_ID is
      (WHITESPACE_ID,
       NEW_LINE_ID,
       COMMENT_ID,
       ABSTRACT_ID,
+      AT_ID,
       AGGREGATE_ID,
       CASE_ID,
       CONFIGURATION_ID,
@@ -150,6 +149,7 @@ package Gpr_Process_Actions is
       QUOTE_ID,
       SEMICOLON_ID,
       VERTICAL_BAR_ID,
+      NUMERIC_LITERAL_ID,
       IDENTIFIER_ID,
       STRING_LITERAL_ID,
       Wisi_EOI_ID,
@@ -216,6 +216,11 @@ package Gpr_Process_Actions is
      Tree      : in out WisiToken.Syntax_Trees.Tree;
      Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
      Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure attribute_declaration_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
    procedure case_statement_0
     (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
      Tree      : in out WisiToken.Syntax_Trees.Tree;
diff --git a/packages/ada-mode/gpr_process_lr1_main.adb 
b/packages/ada-mode/gpr_process_lr1_main.adb
index af03240..2beca49 100644
--- a/packages/ada-mode/gpr_process_lr1_main.adb
+++ b/packages/ada-mode/gpr_process_lr1_main.adb
@@ -29,10 +29,9 @@ package body Gpr_Process_LR1_Main is
       gpr_re2c_c.Next_Token);
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
       Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access)
@@ -40,1851 +39,2087 @@ package body Gpr_Process_LR1_Main is
       use WisiToken.Parse.LR;
       McKenzie_Param : constant McKenzie_Param_Type :=
         (First_Terminal    => 3,
-         Last_Terminal     => 37,
-         First_Nonterminal => 38,
-         Last_Nonterminal  => 71,
+         Last_Terminal     => 39,
+         First_Nonterminal => 40,
+         Last_Nonterminal  => 73,
          Insert =>
-           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4),
          Delete =>
-           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
+           (4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+            4),
          Push_Back =>
            (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
+            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
+         Undo_Reduce =>
+           (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
+         Minimal_Complete_Cost_Delta => -1,
+         Fast_Forward =>  0,
+         Matching_Begin =>  0,
          Ignore_Check_Fail  => 2,
          Task_Count  => 0,
-         Cost_Limit  => 20,
          Check_Limit => 3,
          Check_Delta_Limit => 200,
          Enqueue_Limit => 10000);
 
       Table : constant Parse_Table_Ptr := new Parse_Table
         (State_First       => 0,
-         State_Last        => 288,
+         State_Last        => 322,
          First_Terminal    => 3,
-         Last_Terminal     => 37,
-         First_Nonterminal => 38,
-         Last_Nonterminal  => 71);
+         Last_Terminal     => 39,
+         First_Nonterminal => 40,
+         Last_Nonterminal  => 73);
    begin
       Table.McKenzie_Param := McKenzie_Param;
       declare
          procedure Subr_1
          is begin
-            Table.States (0).Productions := WisiToken.To_Vector ((1 => (38, 
0)));
-            Add_Action (Table.States (0), 3, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 4, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 6, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 14, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 18, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 21, Reduce, (48, 0), 0, null, null);
-            Add_Action (Table.States (0), 25, 1);
-            Add_Action (Table.States (0), 37, Reduce, (48, 0), 0, null, null);
+            Add_Action (Table.States (0), 3, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 5, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 7, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 15, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 19, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 22, Reduce, (50, 0), 0, null, null);
+            Add_Action (Table.States (0), 26, 1);
+            Add_Action (Table.States (0), 39, Reduce, (50, 0), 0, null, null);
             Add_Error (Table.States (0));
-            Add_Goto (Table.States (0), 46, 2);
-            Add_Goto (Table.States (0), 47, 3);
-            Add_Goto (Table.States (0), 48, 4);
-            Add_Goto (Table.States (0), 71, 5);
-            Table.States (0).Minimal_Complete_Action := (Reduce, 46, 0);
-            Table.States (1).Productions := WisiToken.To_Vector ((1 => (71, 
0)));
-            Add_Action (Table.States (1), 9, 6);
-            Add_Action (Table.States (1), 10, 7);
-            Add_Action (Table.States (1), 13, 8);
-            Add_Action (Table.States (1), 18, 9);
-            Add_Action (Table.States (1), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (1), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (1), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (1), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (1), 33, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (1), 35, 10);
-            Add_Action (Table.States (1), 36, 11);
+            Add_Goto (Table.States (0), 48, 2);
+            Add_Goto (Table.States (0), 49, 3);
+            Add_Goto (Table.States (0), 50, 4);
+            Add_Goto (Table.States (0), 73, 5);
+            Table.States (0).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 48, 0)));
+            Add_Action (Table.States (1), 10, 6);
+            Add_Action (Table.States (1), 11, 7);
+            Add_Action (Table.States (1), 14, 8);
+            Add_Action (Table.States (1), 19, 9);
+            Add_Action (Table.States (1), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (1), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (1), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (1), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (1), 34, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (1), 37, 10);
+            Add_Action (Table.States (1), 38, 11);
             Add_Error (Table.States (1));
-            Add_Goto (Table.States (1), 39, 12);
-            Add_Goto (Table.States (1), 41, 13);
-            Add_Goto (Table.States (1), 42, 14);
-            Add_Goto (Table.States (1), 54, 15);
-            Add_Goto (Table.States (1), 55, 16);
-            Add_Goto (Table.States (1), 56, 17);
-            Add_Goto (Table.States (1), 57, 18);
-            Add_Goto (Table.States (1), 67, 19);
-            Add_Goto (Table.States (1), 68, 20);
-            Add_Goto (Table.States (1), 69, 21);
-            Table.States (1).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (2).Productions := WisiToken.To_Vector ((1 => (38, 
0)));
-            Add_Action (Table.States (2), 37, Accept_It, (38, 0), 1, null, 
null);
+            Add_Goto (Table.States (1), 41, 12);
+            Add_Goto (Table.States (1), 43, 13);
+            Add_Goto (Table.States (1), 44, 14);
+            Add_Goto (Table.States (1), 56, 15);
+            Add_Goto (Table.States (1), 57, 16);
+            Add_Goto (Table.States (1), 58, 17);
+            Add_Goto (Table.States (1), 59, 18);
+            Add_Goto (Table.States (1), 69, 19);
+            Add_Goto (Table.States (1), 70, 20);
+            Add_Goto (Table.States (1), 71, 21);
+            Table.States (1).Kernel := To_Vector ((0 => (73, 26, 1, False)));
+            Table.States (1).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (2), 39, Accept_It, (40, 0), 1, null, 
null);
             Add_Error (Table.States (2));
-            Table.States (3).Productions := WisiToken.To_Vector (((47, 1), 
(48, 1)));
-            Add_Action (Table.States (3), 3, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 4, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 6, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 14, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 18, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 21, Reduce, (48, 1), 1, null, null);
-            Add_Action (Table.States (3), 25, 1);
-            Add_Action (Table.States (3), 37, Reduce, (48, 1), 1, null, null);
+            Table.States (2).Kernel := To_Vector ((0 => (40, 48, 1, False)));
+            Add_Action (Table.States (3), 3, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 5, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 7, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 15, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 19, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 22, Reduce, (50, 1), 1, null, null);
+            Add_Action (Table.States (3), 26, 1);
+            Add_Action (Table.States (3), 39, Reduce, (50, 1), 1, null, null);
             Add_Error (Table.States (3));
-            Add_Goto (Table.States (3), 71, 22);
-            Table.States (3).Minimal_Complete_Action := (Reduce, 48, 1);
-            Table.States (4).Productions := WisiToken.To_Vector ((1 => (46, 
0)));
+            Add_Goto (Table.States (3), 73, 22);
+            Table.States (3).Kernel := To_Vector (((49, 49, 2, True), (50, 49, 
0, False)));
+            Table.States (3).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 50, 1)));
             Add_Action (Table.States (4), 3, 23);
-            Add_Action (Table.States (4), 4, 24);
-            Add_Action (Table.States (4), 6, 25);
-            Add_Action (Table.States (4), 14, 26);
-            Add_Action (Table.States (4), 18, Reduce, (64, 0), 0, null, null);
-            Add_Action (Table.States (4), 21, 27);
-            Add_Action (Table.States (4), 37, Reduce, (64, 0), 0, null, null);
+            Add_Action (Table.States (4), 5, 24);
+            Add_Action (Table.States (4), 7, 25);
+            Add_Action (Table.States (4), 15, 26);
+            Add_Action (Table.States (4), 19, Reduce, (66, 0), 0, null, null);
+            Add_Action (Table.States (4), 22, 27);
+            Add_Action (Table.States (4), 39, Reduce, (66, 0), 0, null, null);
             Add_Error (Table.States (4));
-            Add_Goto (Table.States (4), 64, 28);
-            Table.States (4).Minimal_Complete_Action := (Reduce, 64, 0);
-            Table.States (5).Productions := WisiToken.To_Vector ((1 => (47, 
0)));
-            Add_Action (Table.States (5), (3, 4, 6, 14, 18, 21, 25, 37), (47, 
0), 1, null, null);
-            Table.States (5).Minimal_Complete_Action := (Reduce, 47, 1);
-            Table.States (6).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (6), 13, 29);
+            Add_Goto (Table.States (4), 66, 28);
+            Table.States (4).Kernel := To_Vector ((0 => (48, 50, 0, False)));
+            Table.States (4).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 0)));
+            Add_Action (Table.States (5), (3, 5, 7, 15, 19, 22, 26, 39), (49, 
0), 1, null, null);
+            Table.States (5).Kernel := To_Vector ((0 => (49, 73, 0, False)));
+            Table.States (5).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 49, 1)));
+            Add_Action (Table.States (6), 14, 29);
             Add_Error (Table.States (6));
-            Add_Goto (Table.States (6), 39, 30);
-            Table.States (6).Minimal_Complete_Action := (Shift, 13, 29);
-            Table.States (7).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (7), 13, 29);
+            Add_Goto (Table.States (6), 41, 30);
+            Table.States (6).Kernel := To_Vector ((0 => (57, 10, 2, False)));
+            Table.States (6).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 29)));
+            Add_Action (Table.States (7), 14, 29);
             Add_Error (Table.States (7));
-            Add_Goto (Table.States (7), 39, 31);
-            Table.States (7).Minimal_Complete_Action := (Shift, 13, 29);
-            Table.States (8).Productions := WisiToken.To_Vector (((39, 0), 
(69, 1)));
-            Add_Action (Table.States (8), 9, 32);
-            Add_Action (Table.States (8), 10, 33);
-            Add_Action (Table.States (8), 13, 34);
-            Add_Action (Table.States (8), 18, 9);
-            Add_Action (Table.States (8), 20, 35, (56, 0), 0, null, null);
-            Add_Action (Table.States (8), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (8), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (8), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (8), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (8), 35, 36);
-            Add_Action (Table.States (8), 36, 37);
+            Add_Goto (Table.States (7), 41, 31);
+            Table.States (7).Kernel := To_Vector ((0 => (57, 11, 2, False)));
+            Table.States (7).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 29)));
+            Add_Action (Table.States (8), 10, 32);
+            Add_Action (Table.States (8), 11, 33);
+            Add_Action (Table.States (8), 14, 34);
+            Add_Action (Table.States (8), 19, 9);
+            Add_Action (Table.States (8), 21, 35);
+            Add_Conflict (Table.States (8), 21, (58, 0), 0, null, null);
+            Add_Action (Table.States (8), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (8), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (8), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (8), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (8), 37, 36);
+            Add_Action (Table.States (8), 38, 37);
             Add_Error (Table.States (8));
-            Add_Goto (Table.States (8), 39, 38);
-            Add_Goto (Table.States (8), 41, 39);
-            Add_Goto (Table.States (8), 42, 40);
-            Add_Goto (Table.States (8), 54, 41);
-            Add_Goto (Table.States (8), 55, 42);
-            Add_Goto (Table.States (8), 56, 43);
-            Add_Goto (Table.States (8), 57, 44);
-            Add_Goto (Table.States (8), 67, 45);
-            Add_Goto (Table.States (8), 68, 46);
-            Add_Goto (Table.States (8), 69, 47);
-            Table.States (8).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (9).Productions := WisiToken.To_Vector ((1 => (41, 
0)));
-            Add_Action (Table.States (9), (1 =>  32), (41, 0), 1, null, null);
-            Table.States (9).Minimal_Complete_Action := (Reduce, 41, 1);
-            Table.States (10).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (10), (26, 29, 30, 32, 33), (56, 1), 1, 
null, identifier_opt_1_check'Access);
-            Table.States (10).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (11).Productions := WisiToken.To_Vector ((1 => (67, 
0)));
-            Add_Action (Table.States (11), (26, 29, 33), (67, 0), 1, null, 
null);
-            Table.States (11).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (12).Productions := WisiToken.To_Vector ((1 => (69, 
2)));
-            Add_Action (Table.States (12), (26, 29, 33), (69, 2), 1, null, 
null);
-            Table.States (12).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (13).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (13), 32, 48);
+            Add_Goto (Table.States (8), 41, 38);
+            Add_Goto (Table.States (8), 43, 39);
+            Add_Goto (Table.States (8), 44, 40);
+            Add_Goto (Table.States (8), 56, 41);
+            Add_Goto (Table.States (8), 57, 42);
+            Add_Goto (Table.States (8), 58, 43);
+            Add_Goto (Table.States (8), 59, 44);
+            Add_Goto (Table.States (8), 69, 45);
+            Add_Goto (Table.States (8), 70, 46);
+            Add_Goto (Table.States (8), 71, 47);
+            Table.States (8).Kernel := To_Vector (((41, 14, 1, False), (71, 
14, 1, False)));
+            Table.States (8).Minimal_Complete_Actions := To_Vector (((Reduce, 
70, 0), (Shift, 21, 35)));
+            Add_Action (Table.States (9), (1 =>  33), (43, 0), 1, null, null);
+            Table.States (9).Kernel := To_Vector ((0 => (43, 19, 0, False)));
+            Table.States (9).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 43, 1)));
+            Add_Action (Table.States (10), (27, 30, 31, 33, 34), (58, 1), 1, 
null, identifier_opt_1_check'Access);
+            Table.States (10).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (10).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (11), (27, 30, 34), (69, 0), 1, null, 
null);
+            Table.States (11).Kernel := To_Vector ((0 => (69, 38, 0, False)));
+            Table.States (11).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (12), (27, 30, 34), (71, 2), 1, null, 
null);
+            Table.States (12).Kernel := To_Vector ((0 => (71, 41, 0, False)));
+            Table.States (12).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (13), 33, 48);
             Add_Error (Table.States (13));
-            Table.States (13).Minimal_Complete_Action := (Shift, 32, 48);
-            Table.States (14).Productions := WisiToken.To_Vector ((1 => (67, 
3)));
-            Add_Action (Table.States (14), (26, 29, 33), (67, 3), 1, null, 
null);
-            Table.States (14).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (15).Productions := WisiToken.To_Vector (((54, 1), 
(68, 0)));
-            Add_Action (Table.States (15), 26, 49);
-            Add_Action (Table.States (15), 29, Reduce, (68, 0), 1, null, null);
-            Add_Action (Table.States (15), 33, Reduce, (68, 0), 1, null, null);
+            Table.States (13).Kernel := To_Vector (((44, 43, 2, False), (44, 
43, 5, False)));
+            Table.States (13).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 48)));
+            Add_Action (Table.States (14), (27, 30, 34), (69, 3), 1, null, 
null);
+            Table.States (14).Kernel := To_Vector ((0 => (69, 44, 0, False)));
+            Table.States (14).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (15), 27, 49);
+            Add_Action (Table.States (15), 30, Reduce, (70, 0), 1, null, null);
+            Add_Action (Table.States (15), 34, Reduce, (70, 0), 1, null, null);
             Add_Error (Table.States (15));
-            Table.States (15).Minimal_Complete_Action := (Reduce, 68, 1);
-            Table.States (16).Productions := WisiToken.To_Vector ((1 => (67, 
2)));
-            Add_Action (Table.States (16), (26, 29, 33), (67, 2), 1, null, 
null);
-            Table.States (16).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (17).Productions := WisiToken.To_Vector ((1 => (57, 
0)));
-            Add_Action (Table.States (17), (26, 29, 30, 32, 33), (57, 0), 1, 
null, null);
-            Table.States (17).Minimal_Complete_Action := (Reduce, 57, 1);
-            Table.States (18).Productions := WisiToken.To_Vector (((41, 1), 
(57, 1), (67, 1)));
-            Add_Action (Table.States (18), 26, Reduce, (67, 1), 1, null, null);
-            Add_Action (Table.States (18), 29, Reduce, (67, 1), 1, null, null);
-            Add_Action (Table.States (18), 30, 50);
-            Add_Action (Table.States (18), 32, Reduce, (41, 1), 1, null, null);
-            Add_Action (Table.States (18), 33, Reduce, (67, 1), 1, null, null);
+            Table.States (15).Kernel := To_Vector (((56, 56, 1, True), (70, 
56, 0, False)));
+            Table.States (15).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 1)));
+            Add_Action (Table.States (16), (27, 30, 34), (69, 2), 1, null, 
null);
+            Table.States (16).Kernel := To_Vector ((0 => (69, 57, 0, False)));
+            Table.States (16).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (17), (27, 30, 31, 33, 34), (59, 0), 1, 
null, null);
+            Table.States (17).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (17).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (18), 27, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (18), 30, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (18), 31, 50);
+            Add_Action (Table.States (18), 33, Reduce, (43, 1), 1, null, null);
+            Add_Action (Table.States (18), 34, Reduce, (69, 1), 1, null, null);
             Add_Error (Table.States (18));
-            Table.States (18).Minimal_Complete_Action := (Reduce, 41, 1);
-            Table.States (19).Productions := WisiToken.To_Vector ((1 => (69, 
0)));
-            Add_Action (Table.States (19), (26, 29, 33), (69, 0), 1, null, 
null);
-            Table.States (19).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (20).Productions := WisiToken.To_Vector (((68, 1), 
(71, 0)));
-            Add_Action (Table.States (20), 29, 51);
-            Add_Action (Table.States (20), 33, 52);
+            Table.States (18).Kernel := To_Vector (((43, 59, 0, False), (59, 
59, 2, True), (69, 59, 0, False)));
+            Table.States (18).Minimal_Complete_Actions := To_Vector (((Reduce, 
43, 1), (Reduce, 69, 1)));
+            Add_Action (Table.States (19), (27, 30, 34), (71, 0), 1, null, 
null);
+            Table.States (19).Kernel := To_Vector ((0 => (71, 69, 0, False)));
+            Table.States (19).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (20), 30, 51);
+            Add_Action (Table.States (20), 34, 52);
             Add_Error (Table.States (20));
-            Table.States (20).Minimal_Complete_Action := (Shift, 33, 52);
-            Table.States (21).Productions := WisiToken.To_Vector ((1 => (54, 
0)));
-            Add_Action (Table.States (21), (26, 29, 33), (54, 0), 1, null, 
null);
-            Table.States (21).Minimal_Complete_Action := (Reduce, 54, 1);
-            Table.States (22).Productions := WisiToken.To_Vector ((1 => (47, 
1)));
-            Add_Action (Table.States (22), (3, 4, 6, 14, 18, 21, 25, 37), (47, 
1), 2, null, null);
-            Table.States (22).Minimal_Complete_Action := (Reduce, 47, 2);
-            Table.States (23).Productions := WisiToken.To_Vector ((1 => (64, 
1)));
-            Add_Action (Table.States (23), (18, 37), (64, 1), 1, null, null);
-            Table.States (23).Minimal_Complete_Action := (Reduce, 64, 1);
-            Table.States (24).Productions := WisiToken.To_Vector (((64, 3), 
(64, 4)));
-            Add_Action (Table.States (24), 14, 53);
-            Add_Action (Table.States (24), 18, Reduce, (64, 3), 1, null, null);
-            Add_Action (Table.States (24), 37, Reduce, (64, 3), 1, null, null);
+            Table.States (20).Kernel := To_Vector (((70, 70, 1, True), (73, 
70, 1, False)));
+            Table.States (20).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 52)));
+            Add_Action (Table.States (21), (27, 30, 34), (56, 0), 1, null, 
null);
+            Table.States (21).Kernel := To_Vector ((0 => (56, 71, 0, False)));
+            Table.States (21).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 1)));
+            Add_Action (Table.States (22), (3, 5, 7, 15, 19, 22, 26, 39), (49, 
1), 2, null, null);
+            Table.States (22).Kernel := To_Vector ((0 => (49, 73, 0, True)));
+            Table.States (22).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 49, 2)));
+            Table.States (22).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (23), (19, 39), (66, 1), 1, null, null);
+            Table.States (23).Kernel := To_Vector ((0 => (66, 3, 0, False)));
+            Table.States (23).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 1)));
+            Add_Action (Table.States (24), 15, 53);
+            Add_Action (Table.States (24), 19, Reduce, (66, 3), 1, null, null);
+            Add_Action (Table.States (24), 39, Reduce, (66, 3), 1, null, null);
             Add_Error (Table.States (24));
-            Table.States (24).Minimal_Complete_Action := (Reduce, 64, 1);
-            Table.States (25).Productions := WisiToken.To_Vector ((1 => (64, 
6)));
-            Add_Action (Table.States (25), (18, 37), (64, 6), 1, null, null);
-            Table.States (25).Minimal_Complete_Action := (Reduce, 64, 1);
-            Table.States (26).Productions := WisiToken.To_Vector ((1 => (64, 
5)));
-            Add_Action (Table.States (26), (18, 37), (64, 5), 1, null, null);
-            Table.States (26).Minimal_Complete_Action := (Reduce, 64, 1);
-            Table.States (27).Productions := WisiToken.To_Vector ((1 => (64, 
2)));
-            Add_Action (Table.States (27), (18, 37), (64, 2), 1, null, null);
-            Table.States (27).Minimal_Complete_Action := (Reduce, 64, 1);
-            Table.States (28).Productions := WisiToken.To_Vector ((1 => (46, 
0)));
-            Add_Action (Table.States (28), 18, 54);
-            Add_Action (Table.States (28), 37, Reduce, (62, 0), 0, null, null);
+            Table.States (24).Kernel := To_Vector (((66, 5, 0, False), (66, 5, 
1, False)));
+            Table.States (24).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 1)));
+            Add_Action (Table.States (25), (19, 39), (66, 6), 1, null, null);
+            Table.States (25).Kernel := To_Vector ((0 => (66, 7, 0, False)));
+            Table.States (25).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 1)));
+            Add_Action (Table.States (26), (19, 39), (66, 5), 1, null, null);
+            Table.States (26).Kernel := To_Vector ((0 => (66, 15, 0, False)));
+            Table.States (26).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 1)));
+            Add_Action (Table.States (27), (19, 39), (66, 2), 1, null, null);
+            Table.States (27).Kernel := To_Vector ((0 => (66, 22, 0, False)));
+            Table.States (27).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 1)));
+            Add_Action (Table.States (28), 19, 54);
+            Add_Action (Table.States (28), 39, Reduce, (64, 0), 0, null, null);
             Add_Error (Table.States (28));
-            Add_Goto (Table.States (28), 62, 55);
-            Add_Goto (Table.States (28), 63, 56);
-            Add_Goto (Table.States (28), 66, 57);
-            Table.States (28).Minimal_Complete_Action := (Reduce, 62, 0);
-            Table.States (29).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (29), 9, 32);
-            Add_Action (Table.States (29), 10, 33);
-            Add_Action (Table.States (29), 13, 34);
-            Add_Action (Table.States (29), 18, 9);
-            Add_Action (Table.States (29), 20, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (29), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (29), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (29), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (29), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (29), 35, 36);
-            Add_Action (Table.States (29), 36, 37);
+            Add_Goto (Table.States (28), 64, 55);
+            Add_Goto (Table.States (28), 65, 56);
+            Add_Goto (Table.States (28), 68, 57);
+            Table.States (28).Kernel := To_Vector ((0 => (48, 66, 0, False)));
+            Table.States (28).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 64, 0)));
+            Add_Action (Table.States (29), 10, 32);
+            Add_Action (Table.States (29), 11, 33);
+            Add_Action (Table.States (29), 14, 34);
+            Add_Action (Table.States (29), 19, 9);
+            Add_Action (Table.States (29), 21, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (29), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (29), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (29), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (29), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (29), 37, 36);
+            Add_Action (Table.States (29), 38, 37);
             Add_Error (Table.States (29));
-            Add_Goto (Table.States (29), 39, 38);
-            Add_Goto (Table.States (29), 41, 39);
-            Add_Goto (Table.States (29), 42, 40);
-            Add_Goto (Table.States (29), 54, 41);
-            Add_Goto (Table.States (29), 55, 42);
-            Add_Goto (Table.States (29), 56, 43);
-            Add_Goto (Table.States (29), 57, 44);
-            Add_Goto (Table.States (29), 67, 45);
-            Add_Goto (Table.States (29), 68, 46);
-            Add_Goto (Table.States (29), 69, 47);
-            Table.States (29).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (30).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (30), (26, 29, 33), (55, 0), 2, null, 
null);
-            Table.States (30).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (31).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (31), (26, 29, 33), (55, 1), 2, null, 
null);
-            Table.States (31).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (32).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (32), 13, 58);
+            Add_Goto (Table.States (29), 41, 38);
+            Add_Goto (Table.States (29), 43, 39);
+            Add_Goto (Table.States (29), 44, 40);
+            Add_Goto (Table.States (29), 56, 41);
+            Add_Goto (Table.States (29), 57, 42);
+            Add_Goto (Table.States (29), 58, 43);
+            Add_Goto (Table.States (29), 59, 44);
+            Add_Goto (Table.States (29), 69, 45);
+            Add_Goto (Table.States (29), 70, 46);
+            Add_Goto (Table.States (29), 71, 47);
+            Table.States (29).Kernel := To_Vector ((0 => (41, 14, 1, False)));
+            Table.States (29).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (30), (27, 30, 34), (57, 0), 2, null, 
null);
+            Table.States (30).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (30).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (31), (27, 30, 34), (57, 1), 2, null, 
null);
+            Table.States (31).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (31).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (32), 14, 58);
             Add_Error (Table.States (32));
-            Add_Goto (Table.States (32), 39, 59);
-            Table.States (32).Minimal_Complete_Action := (Shift, 13, 58);
-            Table.States (33).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (33), 13, 58);
+            Add_Goto (Table.States (32), 41, 59);
+            Table.States (32).Kernel := To_Vector ((0 => (57, 10, 2, False)));
+            Table.States (32).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 58)));
+            Add_Action (Table.States (33), 14, 58);
             Add_Error (Table.States (33));
-            Add_Goto (Table.States (33), 39, 60);
-            Table.States (33).Minimal_Complete_Action := (Shift, 13, 58);
-            Table.States (34).Productions := WisiToken.To_Vector (((39, 0), 
(69, 1)));
-            Add_Action (Table.States (34), 9, 32);
-            Add_Action (Table.States (34), 10, 33);
-            Add_Action (Table.States (34), 13, 34);
-            Add_Action (Table.States (34), 18, 9);
-            Add_Action (Table.States (34), 20, 61, (56, 0), 0, null, null);
-            Add_Action (Table.States (34), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (34), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (34), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (34), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (34), 35, 36);
-            Add_Action (Table.States (34), 36, 37);
+            Add_Goto (Table.States (33), 41, 60);
+            Table.States (33).Kernel := To_Vector ((0 => (57, 11, 2, False)));
+            Table.States (33).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 58)));
+            Add_Action (Table.States (34), 10, 32);
+            Add_Action (Table.States (34), 11, 33);
+            Add_Action (Table.States (34), 14, 34);
+            Add_Action (Table.States (34), 19, 9);
+            Add_Action (Table.States (34), 21, 61);
+            Add_Conflict (Table.States (34), 21, (58, 0), 0, null, null);
+            Add_Action (Table.States (34), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (34), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (34), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (34), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (34), 37, 36);
+            Add_Action (Table.States (34), 38, 37);
             Add_Error (Table.States (34));
-            Add_Goto (Table.States (34), 39, 38);
-            Add_Goto (Table.States (34), 41, 39);
-            Add_Goto (Table.States (34), 42, 40);
-            Add_Goto (Table.States (34), 54, 41);
-            Add_Goto (Table.States (34), 55, 42);
-            Add_Goto (Table.States (34), 56, 43);
-            Add_Goto (Table.States (34), 57, 44);
-            Add_Goto (Table.States (34), 67, 45);
-            Add_Goto (Table.States (34), 68, 62);
-            Add_Goto (Table.States (34), 69, 47);
-            Table.States (34).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (35).Productions := WisiToken.To_Vector ((1 => (69, 
1)));
-            Add_Action (Table.States (35), (26, 29, 33), (69, 1), 2, null, 
null);
-            Table.States (35).Minimal_Complete_Action := (Reduce, 69, 2);
-            Table.States (36).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (36), (20, 26, 29, 30, 32), (56, 1), 1, 
null, identifier_opt_1_check'Access);
-            Table.States (36).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (37).Productions := WisiToken.To_Vector ((1 => (67, 
0)));
-            Add_Action (Table.States (37), (20, 26, 29), (67, 0), 1, null, 
null);
-            Table.States (37).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (38).Productions := WisiToken.To_Vector ((1 => (69, 
2)));
-            Add_Action (Table.States (38), (20, 26, 29), (69, 2), 1, null, 
null);
-            Table.States (38).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (39).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (39), 32, 63);
+            Add_Goto (Table.States (34), 41, 38);
+            Add_Goto (Table.States (34), 43, 39);
+            Add_Goto (Table.States (34), 44, 40);
+            Add_Goto (Table.States (34), 56, 41);
+            Add_Goto (Table.States (34), 57, 42);
+            Add_Goto (Table.States (34), 58, 43);
+            Add_Goto (Table.States (34), 59, 44);
+            Add_Goto (Table.States (34), 69, 45);
+            Add_Goto (Table.States (34), 70, 62);
+            Add_Goto (Table.States (34), 71, 47);
+            Table.States (34).Kernel := To_Vector (((41, 14, 1, False), (71, 
14, 1, False)));
+            Table.States (34).Minimal_Complete_Actions := To_Vector (((Reduce, 
70, 0), (Shift, 21, 61)));
+            Add_Action (Table.States (35), (27, 30, 34), (71, 1), 2, null, 
null);
+            Table.States (35).Kernel := To_Vector ((0 => (71, 21, 0, False)));
+            Table.States (35).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 2)));
+            Add_Action (Table.States (36), (21, 27, 30, 31, 33), (58, 1), 1, 
null, identifier_opt_1_check'Access);
+            Table.States (36).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (36).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (37), (21, 27, 30), (69, 0), 1, null, 
null);
+            Table.States (37).Kernel := To_Vector ((0 => (69, 38, 0, False)));
+            Table.States (37).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (38), (21, 27, 30), (71, 2), 1, null, 
null);
+            Table.States (38).Kernel := To_Vector ((0 => (71, 41, 0, False)));
+            Table.States (38).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (39), 33, 63);
             Add_Error (Table.States (39));
-            Table.States (39).Minimal_Complete_Action := (Shift, 32, 63);
-            Table.States (40).Productions := WisiToken.To_Vector ((1 => (67, 
3)));
-            Add_Action (Table.States (40), (20, 26, 29), (67, 3), 1, null, 
null);
-            Table.States (40).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (41).Productions := WisiToken.To_Vector (((54, 1), 
(68, 0)));
-            Add_Action (Table.States (41), 20, Reduce, (68, 0), 1, null, null);
-            Add_Action (Table.States (41), 26, 64);
-            Add_Action (Table.States (41), 29, Reduce, (68, 0), 1, null, null);
+            Table.States (39).Kernel := To_Vector (((44, 43, 2, False), (44, 
43, 5, False)));
+            Table.States (39).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 63)));
+            Add_Action (Table.States (40), (21, 27, 30), (69, 3), 1, null, 
null);
+            Table.States (40).Kernel := To_Vector ((0 => (69, 44, 0, False)));
+            Table.States (40).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (41), 21, Reduce, (70, 0), 1, null, null);
+            Add_Action (Table.States (41), 27, 64);
+            Add_Action (Table.States (41), 30, Reduce, (70, 0), 1, null, null);
             Add_Error (Table.States (41));
-            Table.States (41).Minimal_Complete_Action := (Reduce, 68, 1);
-            Table.States (42).Productions := WisiToken.To_Vector ((1 => (67, 
2)));
-            Add_Action (Table.States (42), (20, 26, 29), (67, 2), 1, null, 
null);
-            Table.States (42).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (43).Productions := WisiToken.To_Vector ((1 => (57, 
0)));
-            Add_Action (Table.States (43), (20, 26, 29, 30, 32), (57, 0), 1, 
null, null);
-            Table.States (43).Minimal_Complete_Action := (Reduce, 57, 1);
-            Table.States (44).Productions := WisiToken.To_Vector (((41, 1), 
(57, 1), (67, 1)));
-            Add_Action (Table.States (44), 20, Reduce, (67, 1), 1, null, null);
-            Add_Action (Table.States (44), 26, Reduce, (67, 1), 1, null, null);
-            Add_Action (Table.States (44), 29, Reduce, (67, 1), 1, null, null);
-            Add_Action (Table.States (44), 30, 65);
-            Add_Action (Table.States (44), 32, Reduce, (41, 1), 1, null, null);
+            Table.States (41).Kernel := To_Vector (((56, 56, 1, True), (70, 
56, 0, False)));
+            Table.States (41).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 1)));
+            Add_Action (Table.States (42), (21, 27, 30), (69, 2), 1, null, 
null);
+            Table.States (42).Kernel := To_Vector ((0 => (69, 57, 0, False)));
+            Table.States (42).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (43), (21, 27, 30, 31, 33), (59, 0), 1, 
null, null);
+            Table.States (43).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (43).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (44), 21, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (44), 27, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (44), 30, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (44), 31, 65);
+            Add_Action (Table.States (44), 33, Reduce, (43, 1), 1, null, null);
             Add_Error (Table.States (44));
-            Table.States (44).Minimal_Complete_Action := (Reduce, 41, 1);
-            Table.States (45).Productions := WisiToken.To_Vector ((1 => (69, 
0)));
-            Add_Action (Table.States (45), (20, 26, 29), (69, 0), 1, null, 
null);
-            Table.States (45).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (46).Productions := WisiToken.To_Vector (((39, 0), 
(68, 1)));
-            Add_Action (Table.States (46), 20, 66);
-            Add_Action (Table.States (46), 29, 67);
+            Table.States (44).Kernel := To_Vector (((43, 59, 0, False), (59, 
59, 2, True), (69, 59, 0, False)));
+            Table.States (44).Minimal_Complete_Actions := To_Vector (((Reduce, 
43, 1), (Reduce, 69, 1)));
+            Add_Action (Table.States (45), (21, 27, 30), (71, 0), 1, null, 
null);
+            Table.States (45).Kernel := To_Vector ((0 => (71, 69, 0, False)));
+            Table.States (45).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (46), 21, 66);
+            Add_Action (Table.States (46), 30, 67);
             Add_Error (Table.States (46));
-            Table.States (46).Minimal_Complete_Action := (Shift, 20, 66);
-            Table.States (47).Productions := WisiToken.To_Vector ((1 => (54, 
0)));
-            Add_Action (Table.States (47), (20, 26, 29), (54, 0), 1, null, 
null);
-            Table.States (47).Minimal_Complete_Action := (Reduce, 54, 1);
-            Table.States (48).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (48), 35, 68);
+            Table.States (46).Kernel := To_Vector (((41, 70, 1, False), (70, 
70, 1, True)));
+            Table.States (46).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 66)));
+            Add_Action (Table.States (47), (21, 27, 30), (56, 0), 1, null, 
null);
+            Table.States (47).Kernel := To_Vector ((0 => (56, 71, 0, False)));
+            Table.States (47).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 1)));
+            Add_Action (Table.States (48), 37, 68);
             Add_Error (Table.States (48));
-            Table.States (48).Minimal_Complete_Action := (Shift, 35, 68);
-            Table.States (49).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (49), 9, 6);
-            Add_Action (Table.States (49), 10, 7);
-            Add_Action (Table.States (49), 13, 8);
-            Add_Action (Table.States (49), 18, 9);
-            Add_Action (Table.States (49), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (49), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (49), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (49), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (49), 33, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (49), 35, 10);
-            Add_Action (Table.States (49), 36, 11);
+            Table.States (48).Kernel := To_Vector (((44, 33, 1, False), (44, 
33, 4, False)));
+            Table.States (48).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 68)));
+            Add_Action (Table.States (49), 10, 6);
+            Add_Action (Table.States (49), 11, 7);
+            Add_Action (Table.States (49), 14, 8);
+            Add_Action (Table.States (49), 19, 9);
+            Add_Action (Table.States (49), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (49), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (49), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (49), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (49), 34, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (49), 37, 10);
+            Add_Action (Table.States (49), 38, 11);
             Add_Error (Table.States (49));
-            Add_Goto (Table.States (49), 39, 12);
-            Add_Goto (Table.States (49), 41, 13);
-            Add_Goto (Table.States (49), 42, 14);
-            Add_Goto (Table.States (49), 55, 16);
-            Add_Goto (Table.States (49), 56, 17);
-            Add_Goto (Table.States (49), 57, 18);
-            Add_Goto (Table.States (49), 67, 19);
-            Add_Goto (Table.States (49), 69, 69);
-            Table.States (49).Minimal_Complete_Action := (Reduce, 69, 0);
-            Table.States (50).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (50), 35, 70);
+            Add_Goto (Table.States (49), 41, 12);
+            Add_Goto (Table.States (49), 43, 13);
+            Add_Goto (Table.States (49), 44, 14);
+            Add_Goto (Table.States (49), 57, 16);
+            Add_Goto (Table.States (49), 58, 17);
+            Add_Goto (Table.States (49), 59, 18);
+            Add_Goto (Table.States (49), 69, 19);
+            Add_Goto (Table.States (49), 71, 69);
+            Table.States (49).Kernel := To_Vector ((0 => (56, 27, 0, True)));
+            Table.States (49).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 0)));
+            Table.States (49).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (50), 37, 70);
             Add_Error (Table.States (50));
-            Table.States (50).Minimal_Complete_Action := (Shift, 35, 70);
-            Table.States (51).Productions := WisiToken.To_Vector ((1 => (68, 
1)));
-            Add_Action (Table.States (51), 9, 6);
-            Add_Action (Table.States (51), 10, 7);
-            Add_Action (Table.States (51), 13, 8);
-            Add_Action (Table.States (51), 18, 9);
-            Add_Action (Table.States (51), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (51), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (51), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (51), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (51), 33, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (51), 35, 10);
-            Add_Action (Table.States (51), 36, 11);
+            Table.States (50).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (50).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 70)));
+            Table.States (50).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (51), 10, 6);
+            Add_Action (Table.States (51), 11, 7);
+            Add_Action (Table.States (51), 14, 8);
+            Add_Action (Table.States (51), 19, 9);
+            Add_Action (Table.States (51), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (51), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (51), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (51), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (51), 34, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (51), 37, 10);
+            Add_Action (Table.States (51), 38, 11);
             Add_Error (Table.States (51));
-            Add_Goto (Table.States (51), 39, 12);
-            Add_Goto (Table.States (51), 41, 13);
-            Add_Goto (Table.States (51), 42, 14);
-            Add_Goto (Table.States (51), 54, 71);
-            Add_Goto (Table.States (51), 55, 16);
-            Add_Goto (Table.States (51), 56, 17);
-            Add_Goto (Table.States (51), 57, 18);
-            Add_Goto (Table.States (51), 67, 19);
-            Add_Goto (Table.States (51), 69, 21);
-            Table.States (51).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (52).Productions := WisiToken.To_Vector ((1 => (71, 
0)));
-            Add_Action (Table.States (52), (3, 4, 6, 14, 18, 21, 25, 37), (71, 
0), 3, null, null);
-            Table.States (52).Minimal_Complete_Action := (Reduce, 71, 3);
-            Table.States (53).Productions := WisiToken.To_Vector ((1 => (64, 
4)));
-            Add_Action (Table.States (53), (18, 37), (64, 4), 2, null, null);
-            Table.States (53).Minimal_Complete_Action := (Reduce, 64, 2);
-            Table.States (54).Productions := WisiToken.To_Vector (((63, 0), 
(66, 0)));
-            Add_Action (Table.States (54), 8, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (54), 12, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (54), 35, 72);
+            Add_Goto (Table.States (51), 41, 12);
+            Add_Goto (Table.States (51), 43, 13);
+            Add_Goto (Table.States (51), 44, 14);
+            Add_Goto (Table.States (51), 56, 71);
+            Add_Goto (Table.States (51), 57, 16);
+            Add_Goto (Table.States (51), 58, 17);
+            Add_Goto (Table.States (51), 59, 18);
+            Add_Goto (Table.States (51), 69, 19);
+            Add_Goto (Table.States (51), 71, 21);
+            Table.States (51).Kernel := To_Vector ((0 => (70, 30, 0, True)));
+            Table.States (51).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Table.States (51).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (52), (3, 5, 7, 15, 19, 22, 26, 39), (73, 
0), 3, null, null);
+            Table.States (52).Kernel := To_Vector ((0 => (73, 34, 0, False)));
+            Table.States (52).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 73, 3)));
+            Add_Action (Table.States (53), (19, 39), (66, 4), 2, null, null);
+            Table.States (53).Kernel := To_Vector ((0 => (66, 15, 0, False)));
+            Table.States (53).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 66, 2)));
+            Add_Action (Table.States (54), 9, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (54), 13, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (54), 37, 72);
             Add_Error (Table.States (54));
-            Add_Goto (Table.States (54), 56, 73);
-            Table.States (54).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (55).Productions := WisiToken.To_Vector ((1 => (46, 
0)));
-            Add_Action (Table.States (55), (1 =>  37), (46, 0), 3, 
compilation_unit_0'Access, null);
-            Table.States (55).Minimal_Complete_Action := (Reduce, 46, 3);
-            Table.States (56).Productions := WisiToken.To_Vector ((1 => (62, 
2)));
-            Add_Action (Table.States (56), (1 =>  37), (62, 2), 1, null, null);
-            Table.States (56).Minimal_Complete_Action := (Reduce, 62, 1);
-            Table.States (57).Productions := WisiToken.To_Vector ((1 => (62, 
1)));
-            Add_Action (Table.States (57), (1 =>  37), (62, 1), 1, null, null);
-            Table.States (57).Minimal_Complete_Action := (Reduce, 62, 1);
-            Table.States (58).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (58), 9, 32);
-            Add_Action (Table.States (58), 10, 33);
-            Add_Action (Table.States (58), 13, 34);
-            Add_Action (Table.States (58), 18, 9);
-            Add_Action (Table.States (58), 20, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (58), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (58), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (58), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (58), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (58), 35, 36);
-            Add_Action (Table.States (58), 36, 37);
+            Add_Goto (Table.States (54), 58, 73);
+            Table.States (54).Kernel := To_Vector (((65, 19, 5, False), (68, 
19, 3, False)));
+            Table.States (54).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (55), (1 =>  39), (48, 0), 3, 
compilation_unit_0'Access, null);
+            Table.States (55).Kernel := To_Vector ((0 => (48, 64, 0, False)));
+            Table.States (55).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 48, 3)));
+            Add_Action (Table.States (56), (1 =>  39), (64, 2), 1, null, null);
+            Table.States (56).Kernel := To_Vector ((0 => (64, 65, 0, False)));
+            Table.States (56).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 64, 1)));
+            Add_Action (Table.States (57), (1 =>  39), (64, 1), 1, null, null);
+            Table.States (57).Kernel := To_Vector ((0 => (64, 68, 0, False)));
+            Table.States (57).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 64, 1)));
+            Add_Action (Table.States (58), 10, 32);
+            Add_Action (Table.States (58), 11, 33);
+            Add_Action (Table.States (58), 14, 34);
+            Add_Action (Table.States (58), 19, 9);
+            Add_Action (Table.States (58), 21, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (58), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (58), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (58), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (58), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (58), 37, 36);
+            Add_Action (Table.States (58), 38, 37);
             Add_Error (Table.States (58));
-            Add_Goto (Table.States (58), 39, 38);
-            Add_Goto (Table.States (58), 41, 39);
-            Add_Goto (Table.States (58), 42, 40);
-            Add_Goto (Table.States (58), 54, 41);
-            Add_Goto (Table.States (58), 55, 42);
-            Add_Goto (Table.States (58), 56, 43);
-            Add_Goto (Table.States (58), 57, 44);
-            Add_Goto (Table.States (58), 67, 45);
-            Add_Goto (Table.States (58), 68, 62);
-            Add_Goto (Table.States (58), 69, 47);
-            Table.States (58).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (59).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (59), (20, 26, 29), (55, 0), 2, null, 
null);
-            Table.States (59).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (60).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (60), (20, 26, 29), (55, 1), 2, null, 
null);
-            Table.States (60).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (61).Productions := WisiToken.To_Vector ((1 => (69, 
1)));
-            Add_Action (Table.States (61), (20, 26, 29), (69, 1), 2, null, 
null);
-            Table.States (61).Minimal_Complete_Action := (Reduce, 69, 2);
-            Table.States (62).Productions := WisiToken.To_Vector (((39, 0), 
(68, 1)));
-            Add_Action (Table.States (62), 20, 74);
-            Add_Action (Table.States (62), 29, 67);
+            Add_Goto (Table.States (58), 41, 38);
+            Add_Goto (Table.States (58), 43, 39);
+            Add_Goto (Table.States (58), 44, 40);
+            Add_Goto (Table.States (58), 56, 41);
+            Add_Goto (Table.States (58), 57, 42);
+            Add_Goto (Table.States (58), 58, 43);
+            Add_Goto (Table.States (58), 59, 44);
+            Add_Goto (Table.States (58), 69, 45);
+            Add_Goto (Table.States (58), 70, 62);
+            Add_Goto (Table.States (58), 71, 47);
+            Table.States (58).Kernel := To_Vector ((0 => (41, 14, 1, False)));
+            Table.States (58).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (59), (21, 27, 30), (57, 0), 2, null, 
null);
+            Table.States (59).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (59).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (60), (21, 27, 30), (57, 1), 2, null, 
null);
+            Table.States (60).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (60).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (61), (21, 27, 30), (71, 1), 2, null, 
null);
+            Table.States (61).Kernel := To_Vector ((0 => (71, 21, 0, False)));
+            Table.States (61).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 2)));
+            Add_Action (Table.States (62), 21, 74);
+            Add_Action (Table.States (62), 30, 67);
             Add_Error (Table.States (62));
-            Table.States (62).Minimal_Complete_Action := (Shift, 20, 74);
-            Table.States (63).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (63), 35, 75);
+            Table.States (62).Kernel := To_Vector (((41, 70, 1, False), (70, 
70, 1, True)));
+            Table.States (62).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 74)));
+            Add_Action (Table.States (63), 37, 75);
             Add_Error (Table.States (63));
-            Table.States (63).Minimal_Complete_Action := (Shift, 35, 75);
-            Table.States (64).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (64), 9, 32);
-            Add_Action (Table.States (64), 10, 33);
-            Add_Action (Table.States (64), 13, 34);
-            Add_Action (Table.States (64), 18, 9);
-            Add_Action (Table.States (64), 20, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (64), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (64), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (64), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (64), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (64), 35, 36);
-            Add_Action (Table.States (64), 36, 37);
+            Table.States (63).Kernel := To_Vector (((44, 33, 1, False), (44, 
33, 4, False)));
+            Table.States (63).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 75)));
+            Add_Action (Table.States (64), 10, 32);
+            Add_Action (Table.States (64), 11, 33);
+            Add_Action (Table.States (64), 14, 34);
+            Add_Action (Table.States (64), 19, 9);
+            Add_Action (Table.States (64), 21, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (64), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (64), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (64), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (64), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (64), 37, 36);
+            Add_Action (Table.States (64), 38, 37);
             Add_Error (Table.States (64));
-            Add_Goto (Table.States (64), 39, 38);
-            Add_Goto (Table.States (64), 41, 39);
-            Add_Goto (Table.States (64), 42, 40);
-            Add_Goto (Table.States (64), 55, 42);
-            Add_Goto (Table.States (64), 56, 43);
-            Add_Goto (Table.States (64), 57, 44);
-            Add_Goto (Table.States (64), 67, 45);
-            Add_Goto (Table.States (64), 69, 76);
-            Table.States (64).Minimal_Complete_Action := (Reduce, 69, 0);
-            Table.States (65).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (65), 35, 77);
+            Add_Goto (Table.States (64), 41, 38);
+            Add_Goto (Table.States (64), 43, 39);
+            Add_Goto (Table.States (64), 44, 40);
+            Add_Goto (Table.States (64), 57, 42);
+            Add_Goto (Table.States (64), 58, 43);
+            Add_Goto (Table.States (64), 59, 44);
+            Add_Goto (Table.States (64), 69, 45);
+            Add_Goto (Table.States (64), 71, 76);
+            Table.States (64).Kernel := To_Vector ((0 => (56, 27, 0, True)));
+            Table.States (64).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 0)));
+            Table.States (64).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (65), 37, 77);
             Add_Error (Table.States (65));
-            Table.States (65).Minimal_Complete_Action := (Shift, 35, 77);
-            Table.States (66).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (66), (26, 29, 33), (39, 0), 3, 
aggregate_g_0'Access, null);
-            Table.States (66).Minimal_Complete_Action := (Reduce, 39, 3);
-            Table.States (67).Productions := WisiToken.To_Vector ((1 => (68, 
1)));
-            Add_Action (Table.States (67), 9, 32);
-            Add_Action (Table.States (67), 10, 33);
-            Add_Action (Table.States (67), 13, 34);
-            Add_Action (Table.States (67), 18, 9);
-            Add_Action (Table.States (67), 20, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (67), 26, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (67), 29, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (67), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (67), 32, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (67), 35, 36);
-            Add_Action (Table.States (67), 36, 37);
+            Table.States (65).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (65).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 77)));
+            Table.States (65).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (66), (27, 30, 34), (41, 0), 3, 
aggregate_g_0'Access, null);
+            Table.States (66).Kernel := To_Vector ((0 => (41, 21, 0, False)));
+            Table.States (66).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 41, 3)));
+            Add_Action (Table.States (67), 10, 32);
+            Add_Action (Table.States (67), 11, 33);
+            Add_Action (Table.States (67), 14, 34);
+            Add_Action (Table.States (67), 19, 9);
+            Add_Action (Table.States (67), 21, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (67), 27, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (67), 30, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (67), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (67), 33, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (67), 37, 36);
+            Add_Action (Table.States (67), 38, 37);
             Add_Error (Table.States (67));
-            Add_Goto (Table.States (67), 39, 38);
-            Add_Goto (Table.States (67), 41, 39);
-            Add_Goto (Table.States (67), 42, 40);
-            Add_Goto (Table.States (67), 54, 78);
-            Add_Goto (Table.States (67), 55, 42);
-            Add_Goto (Table.States (67), 56, 43);
-            Add_Goto (Table.States (67), 57, 44);
-            Add_Goto (Table.States (67), 67, 45);
-            Add_Goto (Table.States (67), 69, 47);
-            Table.States (67).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (68).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (68), 13, 79);
-            Add_Action (Table.States (68), 26, Reduce, (42, 0), 3, null, null);
-            Add_Action (Table.States (68), 29, Reduce, (42, 0), 3, null, null);
-            Add_Action (Table.States (68), 33, Reduce, (42, 0), 3, null, null);
+            Add_Goto (Table.States (67), 41, 38);
+            Add_Goto (Table.States (67), 43, 39);
+            Add_Goto (Table.States (67), 44, 40);
+            Add_Goto (Table.States (67), 56, 78);
+            Add_Goto (Table.States (67), 57, 42);
+            Add_Goto (Table.States (67), 58, 43);
+            Add_Goto (Table.States (67), 59, 44);
+            Add_Goto (Table.States (67), 69, 45);
+            Add_Goto (Table.States (67), 71, 47);
+            Table.States (67).Kernel := To_Vector ((0 => (70, 30, 0, True)));
+            Table.States (67).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Table.States (67).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (68), 14, 79);
+            Add_Action (Table.States (68), 27, Reduce, (44, 0), 3, null, null);
+            Add_Action (Table.States (68), 30, Reduce, (44, 0), 3, null, null);
+            Add_Action (Table.States (68), 34, Reduce, (44, 0), 3, null, null);
             Add_Error (Table.States (68));
-            Table.States (68).Minimal_Complete_Action := (Reduce, 42, 3);
-            Table.States (69).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (69), (26, 29, 33), (54, 1), 3, null, 
null);
-            Table.States (69).Minimal_Complete_Action := (Reduce, 54, 3);
-            Table.States (70).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (70), (26, 29, 30, 32, 33), (57, 1), 3, 
null, null);
-            Table.States (70).Minimal_Complete_Action := (Reduce, 57, 3);
-            Table.States (71).Productions := WisiToken.To_Vector (((54, 1), 
(68, 1)));
-            Add_Action (Table.States (71), 26, 49);
-            Add_Action (Table.States (71), 29, Reduce, (68, 1), 3, null, null);
-            Add_Action (Table.States (71), 33, Reduce, (68, 1), 3, null, null);
+            Table.States (68).Kernel := To_Vector (((44, 37, 0, False), (44, 
37, 3, False)));
+            Table.States (68).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 3)));
+            Add_Action (Table.States (69), (27, 30, 34), (56, 1), 3, null, 
null);
+            Table.States (69).Kernel := To_Vector ((0 => (56, 71, 0, True)));
+            Table.States (69).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 3)));
+            Table.States (69).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (70), (27, 30, 31, 33, 34), (59, 1), 3, 
null, null);
+            Table.States (70).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (70).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (70).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (71), 27, 49);
+            Add_Action (Table.States (71), 30, Reduce, (70, 1), 3, null, null);
+            Add_Action (Table.States (71), 34, Reduce, (70, 1), 3, null, null);
             Add_Error (Table.States (71));
-            Table.States (71).Minimal_Complete_Action := (Reduce, 68, 3);
-            Table.States (72).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (72), (8, 12), (56, 1), 1, null, 
identifier_opt_1_check'Access);
-            Table.States (72).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (73).Productions := WisiToken.To_Vector (((63, 0), 
(66, 0)));
-            Add_Action (Table.States (73), 8, 80);
-            Add_Action (Table.States (73), 12, 81);
+            Table.States (71).Kernel := To_Vector (((56, 56, 1, True), (70, 
56, 0, True)));
+            Table.States (71).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 3)));
+            Table.States (71).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (72), (9, 13), (58, 1), 1, null, 
identifier_opt_1_check'Access);
+            Table.States (72).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (72).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (73), 9, 80);
+            Add_Action (Table.States (73), 13, 81);
             Add_Error (Table.States (73));
-            Table.States (73).Minimal_Complete_Action := (Shift, 12, 81);
-            Table.States (74).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (74), (20, 26, 29), (39, 0), 3, 
aggregate_g_0'Access, null);
-            Table.States (74).Minimal_Complete_Action := (Reduce, 39, 3);
-            Table.States (75).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (75), 13, 82);
-            Add_Action (Table.States (75), 20, Reduce, (42, 0), 3, null, null);
-            Add_Action (Table.States (75), 26, Reduce, (42, 0), 3, null, null);
-            Add_Action (Table.States (75), 29, Reduce, (42, 0), 3, null, null);
+            Table.States (73).Kernel := To_Vector (((65, 58, 5, False), (68, 
58, 3, False)));
+            Table.States (73).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 81)));
+            Add_Action (Table.States (74), (21, 27, 30), (41, 0), 3, 
aggregate_g_0'Access, null);
+            Table.States (74).Kernel := To_Vector ((0 => (41, 21, 0, False)));
+            Table.States (74).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 41, 3)));
+            Add_Action (Table.States (75), 14, 82);
+            Add_Action (Table.States (75), 21, Reduce, (44, 0), 3, null, null);
+            Add_Action (Table.States (75), 27, Reduce, (44, 0), 3, null, null);
+            Add_Action (Table.States (75), 30, Reduce, (44, 0), 3, null, null);
             Add_Error (Table.States (75));
-            Table.States (75).Minimal_Complete_Action := (Reduce, 42, 3);
-            Table.States (76).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (76), (20, 26, 29), (54, 1), 3, null, 
null);
-            Table.States (76).Minimal_Complete_Action := (Reduce, 54, 3);
-            Table.States (77).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (77), (20, 26, 29, 30, 32), (57, 1), 3, 
null, null);
-            Table.States (77).Minimal_Complete_Action := (Reduce, 57, 3);
-            Table.States (78).Productions := WisiToken.To_Vector (((54, 1), 
(68, 1)));
-            Add_Action (Table.States (78), 20, Reduce, (68, 1), 3, null, null);
-            Add_Action (Table.States (78), 26, 64);
-            Add_Action (Table.States (78), 29, Reduce, (68, 1), 3, null, null);
+            Table.States (75).Kernel := To_Vector (((44, 37, 0, False), (44, 
37, 3, False)));
+            Table.States (75).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 3)));
+            Add_Action (Table.States (76), (21, 27, 30), (56, 1), 3, null, 
null);
+            Table.States (76).Kernel := To_Vector ((0 => (56, 71, 0, True)));
+            Table.States (76).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 3)));
+            Table.States (76).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (77), (21, 27, 30, 31, 33), (59, 1), 3, 
null, null);
+            Table.States (77).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (77).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (77).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (78), 21, Reduce, (70, 1), 3, null, null);
+            Add_Action (Table.States (78), 27, 64);
+            Add_Action (Table.States (78), 30, Reduce, (70, 1), 3, null, null);
             Add_Error (Table.States (78));
-            Table.States (78).Minimal_Complete_Action := (Reduce, 68, 3);
-            Table.States (79).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (79), 36, 83);
+            Table.States (78).Kernel := To_Vector (((56, 56, 1, True), (70, 
56, 0, True)));
+            Table.States (78).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 3)));
+            Table.States (78).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (79), 38, 83);
             Add_Error (Table.States (79));
-            Table.States (79).Minimal_Complete_Action := (Shift, 36, 83);
-            Table.States (80).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (80), 36, 84);
+            Table.States (79).Kernel := To_Vector ((0 => (44, 14, 2, False)));
+            Table.States (79).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 83)));
+            Add_Action (Table.States (80), 38, 84);
             Add_Error (Table.States (80));
-            Table.States (80).Minimal_Complete_Action := (Shift, 36, 84);
-            Table.States (81).Productions := WisiToken.To_Vector ((1 => (66, 
0)));
-            Add_Action (Table.States (81), 5, 85);
-            Add_Action (Table.States (81), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (81), 11, 86);
-            Add_Action (Table.States (81), 15, 87);
-            Add_Action (Table.States (81), 17, 88);
-            Add_Action (Table.States (81), 22, 89);
-            Add_Action (Table.States (81), 35, 90);
+            Table.States (80).Kernel := To_Vector ((0 => (65, 9, 4, False)));
+            Table.States (80).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 84)));
+            Add_Action (Table.States (81), 6, 85);
+            Add_Action (Table.States (81), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (81), 12, 86);
+            Add_Action (Table.States (81), 16, 87);
+            Add_Action (Table.States (81), 18, 88);
+            Add_Action (Table.States (81), 23, 89);
+            Add_Action (Table.States (81), 37, 90);
             Add_Error (Table.States (81));
-            Add_Goto (Table.States (81), 40, 91);
-            Add_Goto (Table.States (81), 43, 92);
-            Add_Goto (Table.States (81), 49, 93);
-            Add_Goto (Table.States (81), 50, 94);
-            Add_Goto (Table.States (81), 51, 95);
-            Add_Goto (Table.States (81), 58, 96);
-            Add_Goto (Table.States (81), 59, 97);
-            Add_Goto (Table.States (81), 60, 98);
-            Add_Goto (Table.States (81), 61, 99);
-            Add_Goto (Table.States (81), 65, 100);
-            Add_Goto (Table.States (81), 70, 101);
-            Table.States (81).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (82).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (82), 36, 102);
+            Add_Goto (Table.States (81), 42, 91);
+            Add_Goto (Table.States (81), 45, 92);
+            Add_Goto (Table.States (81), 51, 93);
+            Add_Goto (Table.States (81), 52, 94);
+            Add_Goto (Table.States (81), 53, 95);
+            Add_Goto (Table.States (81), 60, 96);
+            Add_Goto (Table.States (81), 61, 97);
+            Add_Goto (Table.States (81), 62, 98);
+            Add_Goto (Table.States (81), 63, 99);
+            Add_Goto (Table.States (81), 67, 100);
+            Add_Goto (Table.States (81), 72, 101);
+            Table.States (81).Kernel := To_Vector ((0 => (68, 13, 2, False)));
+            Table.States (81).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (82), 38, 102);
             Add_Error (Table.States (82));
-            Table.States (82).Minimal_Complete_Action := (Shift, 36, 102);
-            Table.States (83).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (83), 20, 103);
+            Table.States (82).Kernel := To_Vector ((0 => (44, 14, 2, False)));
+            Table.States (82).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 102)));
+            Add_Action (Table.States (83), 21, 103);
             Add_Error (Table.States (83));
-            Table.States (83).Minimal_Complete_Action := (Shift, 20, 103);
-            Table.States (84).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (84), 12, 104);
+            Table.States (83).Kernel := To_Vector ((0 => (44, 38, 1, False)));
+            Table.States (83).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 103)));
+            Add_Action (Table.States (84), 13, 104);
             Add_Error (Table.States (84));
-            Table.States (84).Minimal_Complete_Action := (Shift, 12, 104);
-            Table.States (85).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (85), 12, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (85), 30, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (85), 35, 105);
+            Table.States (84).Kernel := To_Vector ((0 => (65, 38, 3, False)));
+            Table.States (84).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 104)));
+            Add_Action (Table.States (85), 13, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (85), 31, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (85), 37, 105);
             Add_Error (Table.States (85));
-            Add_Goto (Table.States (85), 56, 106);
-            Add_Goto (Table.States (85), 57, 107);
-            Table.States (85).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (86).Productions := WisiToken.To_Vector (((40, 0), 
(40, 1), (40, 2)));
-            Add_Action (Table.States (86), 9, 108);
-            Add_Action (Table.States (86), 35, 109);
+            Add_Goto (Table.States (85), 58, 106);
+            Add_Goto (Table.States (85), 59, 107);
+            Table.States (85).Kernel := To_Vector ((0 => (45, 6, 4, False)));
+            Table.States (85).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (86), 10, 108);
+            Add_Action (Table.States (86), 37, 109);
             Add_Error (Table.States (86));
-            Table.States (86).Minimal_Complete_Action := (Shift, 35, 109);
-            Table.States (87).Productions := WisiToken.To_Vector ((1 => (65, 
4)));
-            Add_Action (Table.States (87), 33, 110);
+            Table.States (86).Kernel := To_Vector (((42, 12, 3, False), (42, 
12, 5, False), (42, 12, 7, False), (42,
+            12, 6, False)));
+            Table.States (86).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 109)));
+            Add_Action (Table.States (87), 34, 110);
             Add_Error (Table.States (87));
-            Table.States (87).Minimal_Complete_Action := (Shift, 33, 110);
-            Table.States (88).Productions := WisiToken.To_Vector (((59, 0), 
(60, 0), (61, 0)));
-            Add_Action (Table.States (88), 8, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (88), 12, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (88), 19, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (88), 35, 111);
+            Table.States (87).Kernel := To_Vector ((0 => (67, 16, 1, False)));
+            Table.States (87).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 110)));
+            Add_Action (Table.States (88), 9, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (88), 13, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (88), 20, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (88), 37, 111);
             Add_Error (Table.States (88));
-            Add_Goto (Table.States (88), 56, 112);
-            Table.States (88).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (89).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (89), 35, 113);
+            Add_Goto (Table.States (88), 58, 112);
+            Table.States (88).Kernel := To_Vector (((61, 18, 3, False), (62, 
18, 4, False), (63, 18, 2, False)));
+            Table.States (88).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (89), 37, 113);
             Add_Error (Table.States (89));
-            Table.States (89).Minimal_Complete_Action := (Shift, 35, 113);
-            Table.States (90).Productions := WisiToken.To_Vector (((65, 0), 
(65, 1)));
-            Add_Action (Table.States (90), 27, 114);
-            Add_Action (Table.States (90), 28, 115);
+            Table.States (89).Kernel := To_Vector ((0 => (72, 23, 5, False)));
+            Table.States (89).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 113)));
+            Add_Action (Table.States (90), 28, 114);
+            Add_Action (Table.States (90), 29, 115);
             Add_Error (Table.States (90));
-            Table.States (90).Minimal_Complete_Action := (Shift, 28, 115);
-            Table.States (91).Productions := WisiToken.To_Vector ((1 => (65, 
2)));
-            Add_Action (Table.States (91), (5, 7, 11, 15, 17, 22, 35), (65, 
2), 1, null, null);
-            Table.States (91).Minimal_Complete_Action := (Reduce, 65, 1);
-            Table.States (92).Productions := WisiToken.To_Vector ((1 => (65, 
3)));
-            Add_Action (Table.States (92), (5, 7, 11, 15, 17, 22, 35), (65, 
3), 1, null, null);
-            Table.States (92).Minimal_Complete_Action := (Reduce, 65, 1);
-            Table.States (93).Productions := WisiToken.To_Vector ((1 => (50, 
0)));
-            Add_Action (Table.States (93), (5, 7, 11, 15, 17, 22, 35), (50, 
0), 1, null, null);
-            Table.States (93).Minimal_Complete_Action := (Reduce, 50, 1);
-            Table.States (94).Productions := WisiToken.To_Vector (((50, 1), 
(51, 1)));
-            Add_Action (Table.States (94), 5, 85);
-            Add_Action (Table.States (94), 7, Reduce, (51, 1), 1, null, null);
-            Add_Action (Table.States (94), 11, 86);
-            Add_Action (Table.States (94), 15, 87);
-            Add_Action (Table.States (94), 17, 88);
-            Add_Action (Table.States (94), 22, 89);
-            Add_Action (Table.States (94), 35, 90);
+            Table.States (90).Kernel := To_Vector (((67, 37, 2, False), (67, 
37, 4, False)));
+            Table.States (90).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 29, 115)));
+            Add_Action (Table.States (91), (6, 8, 12, 16, 18, 23, 37), (67, 
2), 1, null, null);
+            Table.States (91).Kernel := To_Vector ((0 => (67, 42, 0, False)));
+            Table.States (91).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 1)));
+            Add_Action (Table.States (92), (6, 8, 12, 16, 18, 23, 37), (67, 
3), 1, null, null);
+            Table.States (92).Kernel := To_Vector ((0 => (67, 45, 0, False)));
+            Table.States (92).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 1)));
+            Add_Action (Table.States (93), (6, 8, 12, 16, 18, 23, 37), (52, 
0), 1, null, null);
+            Table.States (93).Kernel := To_Vector ((0 => (52, 51, 0, False)));
+            Table.States (93).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 52, 1)));
+            Add_Action (Table.States (94), 6, 85);
+            Add_Action (Table.States (94), 8, Reduce, (53, 1), 1, null, null);
+            Add_Action (Table.States (94), 12, 86);
+            Add_Action (Table.States (94), 16, 87);
+            Add_Action (Table.States (94), 18, 88);
+            Add_Action (Table.States (94), 23, 89);
+            Add_Action (Table.States (94), 37, 90);
             Add_Error (Table.States (94));
-            Add_Goto (Table.States (94), 40, 91);
-            Add_Goto (Table.States (94), 43, 92);
-            Add_Goto (Table.States (94), 49, 116);
-            Add_Goto (Table.States (94), 58, 96);
-            Add_Goto (Table.States (94), 59, 97);
-            Add_Goto (Table.States (94), 60, 98);
-            Add_Goto (Table.States (94), 61, 99);
-            Add_Goto (Table.States (94), 65, 100);
-            Add_Goto (Table.States (94), 70, 101);
-            Table.States (94).Minimal_Complete_Action := (Reduce, 51, 1);
-            Table.States (95).Productions := WisiToken.To_Vector ((1 => (66, 
0)));
-            Add_Action (Table.States (95), 7, 117);
+            Add_Goto (Table.States (94), 42, 91);
+            Add_Goto (Table.States (94), 45, 92);
+            Add_Goto (Table.States (94), 51, 116);
+            Add_Goto (Table.States (94), 60, 96);
+            Add_Goto (Table.States (94), 61, 97);
+            Add_Goto (Table.States (94), 62, 98);
+            Add_Goto (Table.States (94), 63, 99);
+            Add_Goto (Table.States (94), 67, 100);
+            Add_Goto (Table.States (94), 72, 101);
+            Table.States (94).Kernel := To_Vector (((52, 52, 2, True), (53, 
52, 0, False)));
+            Table.States (94).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 1)));
+            Add_Action (Table.States (95), 8, 117);
             Add_Error (Table.States (95));
-            Table.States (95).Minimal_Complete_Action := (Shift, 7, 117);
-            Table.States (96).Productions := WisiToken.To_Vector ((1 => (49, 
2)));
-            Add_Action (Table.States (96), (5, 7, 11, 15, 17, 22, 35), (49, 
2), 1, null, null);
-            Table.States (96).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (97).Productions := WisiToken.To_Vector ((1 => (58, 
0)));
-            Add_Action (Table.States (97), (5, 7, 11, 15, 17, 22, 35), (58, 
0), 1, null, null);
-            Table.States (97).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (98).Productions := WisiToken.To_Vector ((1 => (58, 
1)));
-            Add_Action (Table.States (98), (5, 7, 11, 15, 17, 22, 35), (58, 
1), 1, null, null);
-            Table.States (98).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (99).Productions := WisiToken.To_Vector ((1 => (58, 
2)));
-            Add_Action (Table.States (99), (5, 7, 11, 15, 17, 22, 35), (58, 
2), 1, null, null);
-            Table.States (99).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (100).Productions := WisiToken.To_Vector ((1 => (49, 
0)));
-            Add_Action (Table.States (100), (5, 7, 11, 15, 17, 22, 35), (49, 
0), 1, null, null);
-            Table.States (100).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (101).Productions := WisiToken.To_Vector ((1 => (49, 
1)));
-            Add_Action (Table.States (101), (5, 7, 11, 15, 17, 22, 35), (49, 
1), 1, null, null);
-            Table.States (101).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (102).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (102), 20, 118);
+            Table.States (95).Kernel := To_Vector ((0 => (68, 53, 2, False)));
+            Table.States (95).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 117)));
+            Add_Action (Table.States (96), (6, 8, 12, 16, 18, 23, 37), (51, 
2), 1, null, null);
+            Table.States (96).Kernel := To_Vector ((0 => (51, 60, 0, False)));
+            Table.States (96).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (97), (6, 8, 12, 16, 18, 23, 37), (60, 
0), 1, null, null);
+            Table.States (97).Kernel := To_Vector ((0 => (60, 61, 0, False)));
+            Table.States (97).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (98), (6, 8, 12, 16, 18, 23, 37), (60, 
1), 1, null, null);
+            Table.States (98).Kernel := To_Vector ((0 => (60, 62, 0, False)));
+            Table.States (98).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (99), (6, 8, 12, 16, 18, 23, 37), (60, 
2), 1, null, null);
+            Table.States (99).Kernel := To_Vector ((0 => (60, 63, 0, False)));
+            Table.States (99).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (100), (6, 8, 12, 16, 18, 23, 37), (51, 
0), 1, null, null);
+            Table.States (100).Kernel := To_Vector ((0 => (51, 67, 0, False)));
+            Table.States (100).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (101), (6, 8, 12, 16, 18, 23, 37), (51, 
1), 1, null, null);
+            Table.States (101).Kernel := To_Vector ((0 => (51, 72, 0, False)));
+            Table.States (101).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (102), 21, 118);
             Add_Error (Table.States (102));
-            Table.States (102).Minimal_Complete_Action := (Shift, 20, 118);
-            Table.States (103).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (103), (26, 29, 33), (42, 1), 6, null, 
null);
-            Table.States (103).Minimal_Complete_Action := (Reduce, 42, 6);
-            Table.States (104).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (104), 5, 85);
-            Add_Action (Table.States (104), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (104), 11, 86);
-            Add_Action (Table.States (104), 15, 87);
-            Add_Action (Table.States (104), 17, 88);
-            Add_Action (Table.States (104), 22, 89);
-            Add_Action (Table.States (104), 35, 90);
+            Table.States (102).Kernel := To_Vector ((0 => (44, 38, 1, False)));
+            Table.States (102).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 118)));
+            Add_Action (Table.States (103), (27, 30, 34), (44, 1), 6, null, 
null);
+            Table.States (103).Kernel := To_Vector ((0 => (44, 21, 0, False)));
+            Table.States (103).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 6)));
+            Add_Action (Table.States (104), 6, 85);
+            Add_Action (Table.States (104), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (104), 12, 86);
+            Add_Action (Table.States (104), 16, 87);
+            Add_Action (Table.States (104), 18, 88);
+            Add_Action (Table.States (104), 23, 89);
+            Add_Action (Table.States (104), 37, 90);
             Add_Error (Table.States (104));
-            Add_Goto (Table.States (104), 40, 91);
-            Add_Goto (Table.States (104), 43, 92);
-            Add_Goto (Table.States (104), 49, 93);
-            Add_Goto (Table.States (104), 50, 94);
-            Add_Goto (Table.States (104), 51, 119);
-            Add_Goto (Table.States (104), 58, 96);
-            Add_Goto (Table.States (104), 59, 97);
-            Add_Goto (Table.States (104), 60, 98);
-            Add_Goto (Table.States (104), 61, 99);
-            Add_Goto (Table.States (104), 65, 100);
-            Add_Goto (Table.States (104), 70, 101);
-            Table.States (104).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (105).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (105), (12, 30), (56, 1), 1, null, 
identifier_opt_1_check'Access);
-            Table.States (105).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (106).Productions := WisiToken.To_Vector ((1 => (57, 
0)));
-            Add_Action (Table.States (106), (12, 30), (57, 0), 1, null, null);
-            Table.States (106).Minimal_Complete_Action := (Reduce, 57, 1);
-            Table.States (107).Productions := WisiToken.To_Vector (((43, 0), 
(57, 1)));
-            Add_Action (Table.States (107), 12, 120);
-            Add_Action (Table.States (107), 30, 121);
-            Add_Error (Table.States (107));
-            Table.States (107).Minimal_Complete_Action := (Shift, 12, 120);
+            Add_Goto (Table.States (104), 42, 91);
+            Add_Goto (Table.States (104), 45, 92);
+            Add_Goto (Table.States (104), 51, 93);
+            Add_Goto (Table.States (104), 52, 94);
+            Add_Goto (Table.States (104), 53, 119);
+            Add_Goto (Table.States (104), 60, 96);
+            Add_Goto (Table.States (104), 61, 97);
+            Add_Goto (Table.States (104), 62, 98);
+            Add_Goto (Table.States (104), 63, 99);
+            Add_Goto (Table.States (104), 67, 100);
+            Add_Goto (Table.States (104), 72, 101);
+            Table.States (104).Kernel := To_Vector ((0 => (65, 13, 2, False)));
+            Table.States (104).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
          end Subr_1;
          procedure Subr_2
          is begin
-            Table.States (108).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (108), 13, 122);
+            Add_Action (Table.States (105), (13, 31), (58, 1), 1, null, 
identifier_opt_1_check'Access);
+            Table.States (105).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (105).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (106), (13, 31), (59, 0), 1, null, null);
+            Table.States (106).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (106).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (107), 13, 120);
+            Add_Action (Table.States (107), 31, 121);
+            Add_Error (Table.States (107));
+            Table.States (107).Kernel := To_Vector (((45, 59, 4, False), (59, 
59, 2, True)));
+            Table.States (107).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 120)));
+            Add_Action (Table.States (108), 14, 122);
             Add_Error (Table.States (108));
-            Table.States (108).Minimal_Complete_Action := (Shift, 13, 122);
-            Table.States (109).Productions := WisiToken.To_Vector (((40, 0), 
(40, 1)));
-            Add_Action (Table.States (109), 13, 123);
-            Add_Action (Table.States (109), 23, 124);
+            Table.States (108).Kernel := To_Vector ((0 => (42, 10, 5, False)));
+            Table.States (108).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 122)));
+            Add_Action (Table.States (109), 14, 123);
+            Add_Action (Table.States (109), 24, 124);
             Add_Error (Table.States (109));
-            Table.States (109).Minimal_Complete_Action := (Shift, 23, 124);
-            Table.States (110).Productions := WisiToken.To_Vector ((1 => (65, 
4)));
-            Add_Action (Table.States (110), (5, 7, 11, 15, 17, 22, 35), (65, 
4), 2, simple_declarative_item_4'Access,
+            Table.States (109).Kernel := To_Vector (((42, 37, 2, False), (42, 
37, 4, False), (42, 37, 6, False)));
+            Table.States (109).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 124)));
+            Add_Action (Table.States (110), (6, 8, 12, 16, 18, 23, 37), (67, 
4), 2, simple_declarative_item_4'Access,
             null);
-            Table.States (110).Minimal_Complete_Action := (Reduce, 65, 2);
-            Table.States (111).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (111), (8, 12, 19), (56, 1), 1, null, 
identifier_opt_1_check'Access);
-            Table.States (111).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (112).Productions := WisiToken.To_Vector (((59, 0), 
(60, 0), (61, 0)));
-            Add_Action (Table.States (112), 8, 125);
-            Add_Action (Table.States (112), 12, 126);
-            Add_Action (Table.States (112), 19, 127);
+            Table.States (110).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (110).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 2)));
+            Add_Action (Table.States (111), (9, 13, 20), (58, 1), 1, null, 
identifier_opt_1_check'Access);
+            Table.States (111).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (111).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (112), 9, 125);
+            Add_Action (Table.States (112), 13, 126);
+            Add_Action (Table.States (112), 20, 127);
             Add_Error (Table.States (112));
-            Table.States (112).Minimal_Complete_Action := (Shift, 19, 127);
-            Table.States (113).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (113), 12, 128);
+            Table.States (112).Kernel := To_Vector (((61, 58, 3, False), (62, 
58, 4, False), (63, 58, 2, False)));
+            Table.States (112).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 20, 127)));
+            Add_Action (Table.States (113), 13, 128);
             Add_Error (Table.States (113));
-            Table.States (113).Minimal_Complete_Action := (Shift, 12, 128);
-            Table.States (114).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (114), 35, 129);
+            Table.States (113).Kernel := To_Vector ((0 => (72, 37, 4, False)));
+            Table.States (113).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 128)));
+            Add_Action (Table.States (114), 37, 129);
             Add_Error (Table.States (114));
-            Table.States (114).Minimal_Complete_Action := (Shift, 35, 129);
-            Table.States (115).Productions := WisiToken.To_Vector ((1 => (65, 
0)));
-            Add_Action (Table.States (115), 9, 130);
-            Add_Action (Table.States (115), 10, 131);
-            Add_Action (Table.States (115), 13, 132);
-            Add_Action (Table.States (115), 18, 9);
-            Add_Action (Table.States (115), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (115), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (115), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (115), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (115), 35, 133);
-            Add_Action (Table.States (115), 36, 134);
+            Table.States (114).Kernel := To_Vector ((0 => (67, 28, 3, False)));
+            Table.States (114).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 129)));
+            Add_Action (Table.States (115), 10, 130);
+            Add_Action (Table.States (115), 11, 131);
+            Add_Action (Table.States (115), 14, 132);
+            Add_Action (Table.States (115), 19, 9);
+            Add_Action (Table.States (115), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (115), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (115), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (115), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (115), 37, 133);
+            Add_Action (Table.States (115), 38, 134);
             Add_Error (Table.States (115));
-            Add_Goto (Table.States (115), 39, 135);
-            Add_Goto (Table.States (115), 41, 136);
-            Add_Goto (Table.States (115), 42, 137);
-            Add_Goto (Table.States (115), 54, 138);
-            Add_Goto (Table.States (115), 55, 139);
-            Add_Goto (Table.States (115), 56, 140);
-            Add_Goto (Table.States (115), 57, 141);
-            Add_Goto (Table.States (115), 67, 142);
-            Add_Goto (Table.States (115), 69, 143);
-            Table.States (115).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (116).Productions := WisiToken.To_Vector ((1 => (50, 
1)));
-            Add_Action (Table.States (116), (5, 7, 11, 15, 17, 22, 35), (50, 
1), 2, null, null);
-            Table.States (116).Minimal_Complete_Action := (Reduce, 50, 2);
-            Table.States (117).Productions := WisiToken.To_Vector ((1 => (66, 
0)));
-            Add_Action (Table.States (117), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (117), 35, 144);
+            Add_Goto (Table.States (115), 41, 135);
+            Add_Goto (Table.States (115), 43, 136);
+            Add_Goto (Table.States (115), 44, 137);
+            Add_Goto (Table.States (115), 56, 138);
+            Add_Goto (Table.States (115), 57, 139);
+            Add_Goto (Table.States (115), 58, 140);
+            Add_Goto (Table.States (115), 59, 141);
+            Add_Goto (Table.States (115), 69, 142);
+            Add_Goto (Table.States (115), 71, 143);
+            Table.States (115).Kernel := To_Vector ((0 => (67, 29, 1, False)));
+            Table.States (115).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (116), (6, 8, 12, 16, 18, 23, 37), (52, 
1), 2, null, null);
+            Table.States (116).Kernel := To_Vector ((0 => (52, 51, 0, True)));
+            Table.States (116).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 52, 2)));
+            Table.States (116).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (117), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (117), 37, 144);
             Add_Error (Table.States (117));
-            Add_Goto (Table.States (117), 56, 145);
-            Table.States (117).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (118).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (118), (20, 26, 29), (42, 1), 6, null, 
null);
-            Table.States (118).Minimal_Complete_Action := (Reduce, 42, 6);
-            Table.States (119).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (119), 7, 146);
+            Add_Goto (Table.States (117), 58, 145);
+            Table.States (117).Kernel := To_Vector ((0 => (68, 8, 1, False)));
+            Table.States (117).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (118), (21, 27, 30), (44, 1), 6, null, 
null);
+            Table.States (118).Kernel := To_Vector ((0 => (44, 21, 0, False)));
+            Table.States (118).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 6)));
+            Add_Action (Table.States (119), 8, 146);
             Add_Error (Table.States (119));
-            Table.States (119).Minimal_Complete_Action := (Shift, 7, 146);
-            Table.States (120).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (120), 7, Reduce, (45, 0), 0, null, null);
-            Add_Action (Table.States (120), 24, 147, (45, 0), 0, null, null);
+            Table.States (119).Kernel := To_Vector ((0 => (65, 53, 2, False)));
+            Table.States (119).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 146)));
+            Add_Action (Table.States (120), 8, Reduce, (47, 0), 0, null, null);
+            Add_Action (Table.States (120), 25, 147);
+            Add_Conflict (Table.States (120), 25, (47, 0), 0, null, null);
             Add_Error (Table.States (120));
-            Add_Goto (Table.States (120), 44, 148);
-            Add_Goto (Table.States (120), 45, 149);
-            Table.States (120).Minimal_Complete_Action := (Reduce, 45, 0);
-            Table.States (121).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (121), 35, 150);
+            Add_Goto (Table.States (120), 46, 148);
+            Add_Goto (Table.States (120), 47, 149);
+            Table.States (120).Kernel := To_Vector ((0 => (45, 13, 3, False)));
+            Table.States (120).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 47, 0)));
+            Add_Action (Table.States (121), 37, 150);
             Add_Error (Table.States (121));
-            Table.States (121).Minimal_Complete_Action := (Shift, 35, 150);
-            Table.States (122).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (122), 36, 151);
+            Table.States (121).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (121).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 150)));
+            Table.States (121).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (122), 38, 151);
             Add_Error (Table.States (122));
-            Table.States (122).Minimal_Complete_Action := (Shift, 36, 151);
-            Table.States (123).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (123), 16, 152);
-            Add_Action (Table.States (123), 20, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (123), 36, 153);
+            Table.States (122).Kernel := To_Vector ((0 => (42, 14, 4, False)));
+            Table.States (122).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 151)));
+            Add_Action (Table.States (123), 17, 152);
+            Add_Action (Table.States (123), 21, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (123), 38, 153);
             Add_Error (Table.States (123));
-            Add_Goto (Table.States (123), 52, 154);
-            Table.States (123).Minimal_Complete_Action := (Reduce, 52, 0);
-            Table.States (124).Productions := WisiToken.To_Vector ((1 => (40, 
0)));
-            Add_Action (Table.States (124), 9, 130);
-            Add_Action (Table.States (124), 10, 131);
-            Add_Action (Table.States (124), 13, 132);
-            Add_Action (Table.States (124), 18, 9);
-            Add_Action (Table.States (124), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (124), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (124), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (124), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (124), 35, 133);
-            Add_Action (Table.States (124), 36, 134);
+            Add_Goto (Table.States (123), 54, 154);
+            Table.States (123).Kernel := To_Vector (((42, 14, 3, False), (42, 
14, 5, False)));
+            Table.States (123).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 0)));
+            Add_Action (Table.States (124), 10, 130);
+            Add_Action (Table.States (124), 11, 131);
+            Add_Action (Table.States (124), 14, 132);
+            Add_Action (Table.States (124), 19, 9);
+            Add_Action (Table.States (124), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (124), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (124), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (124), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (124), 37, 133);
+            Add_Action (Table.States (124), 38, 134);
             Add_Error (Table.States (124));
-            Add_Goto (Table.States (124), 39, 135);
-            Add_Goto (Table.States (124), 41, 136);
-            Add_Goto (Table.States (124), 42, 137);
-            Add_Goto (Table.States (124), 54, 155);
-            Add_Goto (Table.States (124), 55, 139);
-            Add_Goto (Table.States (124), 56, 140);
-            Add_Goto (Table.States (124), 57, 141);
-            Add_Goto (Table.States (124), 67, 142);
-            Add_Goto (Table.States (124), 69, 143);
-            Table.States (124).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (125).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (125), 12, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (125), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (125), 35, 105);
+            Add_Goto (Table.States (124), 41, 135);
+            Add_Goto (Table.States (124), 43, 136);
+            Add_Goto (Table.States (124), 44, 137);
+            Add_Goto (Table.States (124), 56, 155);
+            Add_Goto (Table.States (124), 57, 139);
+            Add_Goto (Table.States (124), 58, 140);
+            Add_Goto (Table.States (124), 59, 141);
+            Add_Goto (Table.States (124), 69, 142);
+            Add_Goto (Table.States (124), 71, 143);
+            Table.States (124).Kernel := To_Vector ((0 => (42, 24, 1, False)));
+            Table.States (124).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (125), 13, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (125), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (125), 37, 105);
             Add_Error (Table.States (125));
-            Add_Goto (Table.States (125), 56, 106);
-            Add_Goto (Table.States (125), 57, 156);
-            Table.States (125).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (126).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (126), 5, 85);
-            Add_Action (Table.States (126), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (126), 11, 86);
-            Add_Action (Table.States (126), 15, 87);
-            Add_Action (Table.States (126), 17, 88);
-            Add_Action (Table.States (126), 22, 89);
-            Add_Action (Table.States (126), 35, 90);
+            Add_Goto (Table.States (125), 58, 106);
+            Add_Goto (Table.States (125), 59, 156);
+            Table.States (125).Kernel := To_Vector ((0 => (62, 9, 3, False)));
+            Table.States (125).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (126), 6, 85);
+            Add_Action (Table.States (126), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (126), 12, 86);
+            Add_Action (Table.States (126), 16, 87);
+            Add_Action (Table.States (126), 18, 88);
+            Add_Action (Table.States (126), 23, 89);
+            Add_Action (Table.States (126), 37, 90);
             Add_Error (Table.States (126));
-            Add_Goto (Table.States (126), 40, 91);
-            Add_Goto (Table.States (126), 43, 92);
-            Add_Goto (Table.States (126), 49, 93);
-            Add_Goto (Table.States (126), 50, 94);
-            Add_Goto (Table.States (126), 51, 157);
-            Add_Goto (Table.States (126), 58, 96);
-            Add_Goto (Table.States (126), 59, 97);
-            Add_Goto (Table.States (126), 60, 98);
-            Add_Goto (Table.States (126), 61, 99);
-            Add_Goto (Table.States (126), 65, 100);
-            Add_Goto (Table.States (126), 70, 101);
-            Table.States (126).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (127).Productions := WisiToken.To_Vector ((1 => (61, 
0)));
-            Add_Action (Table.States (127), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (127), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (127), 35, 158);
+            Add_Goto (Table.States (126), 42, 91);
+            Add_Goto (Table.States (126), 45, 92);
+            Add_Goto (Table.States (126), 51, 93);
+            Add_Goto (Table.States (126), 52, 94);
+            Add_Goto (Table.States (126), 53, 157);
+            Add_Goto (Table.States (126), 60, 96);
+            Add_Goto (Table.States (126), 61, 97);
+            Add_Goto (Table.States (126), 62, 98);
+            Add_Goto (Table.States (126), 63, 99);
+            Add_Goto (Table.States (126), 67, 100);
+            Add_Goto (Table.States (126), 72, 101);
+            Table.States (126).Kernel := To_Vector ((0 => (61, 13, 2, False)));
+            Table.States (126).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (127), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (127), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (127), 37, 158);
             Add_Error (Table.States (127));
-            Add_Goto (Table.States (127), 56, 159);
-            Add_Goto (Table.States (127), 57, 160);
-            Table.States (127).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (128).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (128), 13, 161);
+            Add_Goto (Table.States (127), 58, 159);
+            Add_Goto (Table.States (127), 59, 160);
+            Table.States (127).Kernel := To_Vector ((0 => (63, 20, 1, False)));
+            Table.States (127).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (128), 14, 161);
             Add_Error (Table.States (128));
-            Add_Goto (Table.States (128), 39, 162);
-            Table.States (128).Minimal_Complete_Action := (Shift, 13, 161);
-            Table.States (129).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (129), 28, 163);
+            Add_Goto (Table.States (128), 41, 162);
+            Table.States (128).Kernel := To_Vector ((0 => (72, 13, 3, False)));
+            Table.States (128).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 161)));
+            Add_Action (Table.States (129), 29, 163);
             Add_Error (Table.States (129));
-            Table.States (129).Minimal_Complete_Action := (Shift, 28, 163);
-            Table.States (130).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (130), 13, 164);
+            Table.States (129).Kernel := To_Vector ((0 => (67, 37, 2, False)));
+            Table.States (129).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 29, 163)));
+            Add_Action (Table.States (130), 14, 164);
             Add_Error (Table.States (130));
-            Add_Goto (Table.States (130), 39, 165);
-            Table.States (130).Minimal_Complete_Action := (Shift, 13, 164);
-            Table.States (131).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (131), 13, 164);
+            Add_Goto (Table.States (130), 41, 165);
+            Table.States (130).Kernel := To_Vector ((0 => (57, 10, 2, False)));
+            Table.States (130).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 164)));
+            Add_Action (Table.States (131), 14, 164);
             Add_Error (Table.States (131));
-            Add_Goto (Table.States (131), 39, 166);
-            Table.States (131).Minimal_Complete_Action := (Shift, 13, 164);
-            Table.States (132).Productions := WisiToken.To_Vector (((39, 0), 
(69, 1)));
-            Add_Action (Table.States (132), 9, 32);
-            Add_Action (Table.States (132), 10, 33);
-            Add_Action (Table.States (132), 13, 34);
-            Add_Action (Table.States (132), 18, 9);
-            Add_Action (Table.States (132), 20, 167, (56, 0), 0, null, null);
-            Add_Action (Table.States (132), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (132), 29, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (132), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (132), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (132), 35, 36);
-            Add_Action (Table.States (132), 36, 37);
+            Add_Goto (Table.States (131), 41, 166);
+            Table.States (131).Kernel := To_Vector ((0 => (57, 11, 2, False)));
+            Table.States (131).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 164)));
+            Add_Action (Table.States (132), 10, 32);
+            Add_Action (Table.States (132), 11, 33);
+            Add_Action (Table.States (132), 14, 34);
+            Add_Action (Table.States (132), 19, 9);
+            Add_Action (Table.States (132), 21, 167);
+            Add_Conflict (Table.States (132), 21, (58, 0), 0, null, null);
+            Add_Action (Table.States (132), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (132), 30, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (132), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (132), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (132), 37, 36);
+            Add_Action (Table.States (132), 38, 37);
             Add_Error (Table.States (132));
-            Add_Goto (Table.States (132), 39, 38);
-            Add_Goto (Table.States (132), 41, 39);
-            Add_Goto (Table.States (132), 42, 40);
-            Add_Goto (Table.States (132), 54, 41);
-            Add_Goto (Table.States (132), 55, 42);
-            Add_Goto (Table.States (132), 56, 43);
-            Add_Goto (Table.States (132), 57, 44);
-            Add_Goto (Table.States (132), 67, 45);
-            Add_Goto (Table.States (132), 68, 168);
-            Add_Goto (Table.States (132), 69, 47);
-            Table.States (132).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (133).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (133), (26, 30, 32, 33), (56, 1), 1, 
null, identifier_opt_1_check'Access);
-            Table.States (133).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (134).Productions := WisiToken.To_Vector ((1 => (67, 
0)));
-            Add_Action (Table.States (134), (26, 33), (67, 0), 1, null, null);
-            Table.States (134).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (135).Productions := WisiToken.To_Vector ((1 => (69, 
2)));
-            Add_Action (Table.States (135), (26, 33), (69, 2), 1, null, null);
-            Table.States (135).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (136).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (136), 32, 169);
+            Add_Goto (Table.States (132), 41, 38);
+            Add_Goto (Table.States (132), 43, 39);
+            Add_Goto (Table.States (132), 44, 40);
+            Add_Goto (Table.States (132), 56, 41);
+            Add_Goto (Table.States (132), 57, 42);
+            Add_Goto (Table.States (132), 58, 43);
+            Add_Goto (Table.States (132), 59, 44);
+            Add_Goto (Table.States (132), 69, 45);
+            Add_Goto (Table.States (132), 70, 168);
+            Add_Goto (Table.States (132), 71, 47);
+            Table.States (132).Kernel := To_Vector (((41, 14, 1, False), (71, 
14, 1, False)));
+            Table.States (132).Minimal_Complete_Actions := To_Vector 
(((Reduce, 70, 0), (Shift, 21, 167)));
+            Add_Action (Table.States (133), (27, 31, 33, 34), (58, 1), 1, 
null, identifier_opt_1_check'Access);
+            Table.States (133).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (133).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (134), (27, 34), (69, 0), 1, null, null);
+            Table.States (134).Kernel := To_Vector ((0 => (69, 38, 0, False)));
+            Table.States (134).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (135), (27, 34), (71, 2), 1, null, null);
+            Table.States (135).Kernel := To_Vector ((0 => (71, 41, 0, False)));
+            Table.States (135).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (136), 33, 169);
             Add_Error (Table.States (136));
-            Table.States (136).Minimal_Complete_Action := (Shift, 32, 169);
-            Table.States (137).Productions := WisiToken.To_Vector ((1 => (67, 
3)));
-            Add_Action (Table.States (137), (26, 33), (67, 3), 1, null, null);
-            Table.States (137).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (138).Productions := WisiToken.To_Vector (((54, 1), 
(65, 0)));
-            Add_Action (Table.States (138), 26, 170);
-            Add_Action (Table.States (138), 33, 171);
+            Table.States (136).Kernel := To_Vector (((44, 43, 2, False), (44, 
43, 5, False)));
+            Table.States (136).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 169)));
+            Add_Action (Table.States (137), (27, 34), (69, 3), 1, null, null);
+            Table.States (137).Kernel := To_Vector ((0 => (69, 44, 0, False)));
+            Table.States (137).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (138), 27, 170);
+            Add_Action (Table.States (138), 34, 171);
             Add_Error (Table.States (138));
-            Table.States (138).Minimal_Complete_Action := (Shift, 33, 171);
-            Table.States (139).Productions := WisiToken.To_Vector ((1 => (67, 
2)));
-            Add_Action (Table.States (139), (26, 33), (67, 2), 1, null, null);
-            Table.States (139).Minimal_Complete_Action := (Reduce, 67, 1);
-            Table.States (140).Productions := WisiToken.To_Vector ((1 => (57, 
0)));
-            Add_Action (Table.States (140), (26, 30, 32, 33), (57, 0), 1, 
null, null);
-            Table.States (140).Minimal_Complete_Action := (Reduce, 57, 1);
-            Table.States (141).Productions := WisiToken.To_Vector (((41, 1), 
(57, 1), (67, 1)));
-            Add_Action (Table.States (141), 26, Reduce, (67, 1), 1, null, 
null);
-            Add_Action (Table.States (141), 30, 172);
-            Add_Action (Table.States (141), 32, Reduce, (41, 1), 1, null, 
null);
-            Add_Action (Table.States (141), 33, Reduce, (67, 1), 1, null, 
null);
+            Table.States (138).Kernel := To_Vector (((56, 56, 1, True), (67, 
56, 1, False)));
+            Table.States (138).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 171)));
+            Add_Action (Table.States (139), (27, 34), (69, 2), 1, null, null);
+            Table.States (139).Kernel := To_Vector ((0 => (69, 57, 0, False)));
+            Table.States (139).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (140), (27, 31, 33, 34), (59, 0), 1, 
null, null);
+            Table.States (140).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (140).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (141), 27, Reduce, (69, 1), 1, null, 
null);
+            Add_Action (Table.States (141), 31, 172);
+            Add_Action (Table.States (141), 33, Reduce, (43, 1), 1, null, 
null);
+            Add_Action (Table.States (141), 34, Reduce, (69, 1), 1, null, 
null);
             Add_Error (Table.States (141));
-            Table.States (141).Minimal_Complete_Action := (Reduce, 41, 1);
-            Table.States (142).Productions := WisiToken.To_Vector ((1 => (69, 
0)));
-            Add_Action (Table.States (142), (26, 33), (69, 0), 1, null, null);
-            Table.States (142).Minimal_Complete_Action := (Reduce, 69, 1);
-            Table.States (143).Productions := WisiToken.To_Vector ((1 => (54, 
0)));
-            Add_Action (Table.States (143), (26, 33), (54, 0), 1, null, null);
-            Table.States (143).Minimal_Complete_Action := (Reduce, 54, 1);
-            Table.States (144).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (144), (1 =>  33), (56, 1), 1, null, 
identifier_opt_1_check'Access);
-            Table.States (144).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (145).Productions := WisiToken.To_Vector ((1 => (66, 
0)));
-            Add_Action (Table.States (145), 33, 173);
+            Table.States (141).Kernel := To_Vector (((43, 59, 0, False), (59, 
59, 2, True), (69, 59, 0, False)));
+            Table.States (141).Minimal_Complete_Actions := To_Vector 
(((Reduce, 43, 1), (Reduce, 69, 1)));
+            Add_Action (Table.States (142), (27, 34), (71, 0), 1, null, null);
+            Table.States (142).Kernel := To_Vector ((0 => (71, 69, 0, False)));
+            Table.States (142).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (143), (27, 34), (56, 0), 1, null, null);
+            Table.States (143).Kernel := To_Vector ((0 => (56, 71, 0, False)));
+            Table.States (143).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 1)));
+            Add_Action (Table.States (144), (1 =>  34), (58, 1), 1, null, 
identifier_opt_1_check'Access);
+            Table.States (144).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (144).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (145), 34, 173);
             Add_Error (Table.States (145));
-            Table.States (145).Minimal_Complete_Action := (Shift, 33, 173);
-            Table.States (146).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (146), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (146), 35, 144);
+            Table.States (145).Kernel := To_Vector ((0 => (68, 58, 1, False)));
+            Table.States (145).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 173)));
+            Add_Action (Table.States (146), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (146), 37, 144);
             Add_Error (Table.States (146));
-            Add_Goto (Table.States (146), 56, 174);
-            Table.States (146).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (147).Productions := WisiToken.To_Vector ((1 => (44, 
0)));
-            Add_Action (Table.States (147), 16, 175);
-            Add_Action (Table.States (147), 31, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (147), 34, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (147), 36, 176);
+            Add_Goto (Table.States (146), 58, 174);
+            Table.States (146).Kernel := To_Vector ((0 => (65, 8, 1, False)));
+            Table.States (146).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (147), 17, 175);
+            Add_Action (Table.States (147), 32, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (147), 35, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (147), 38, 176);
             Add_Error (Table.States (147));
-            Add_Goto (Table.States (147), 52, 177);
-            Add_Goto (Table.States (147), 53, 178);
-            Table.States (147).Minimal_Complete_Action := (Reduce, 53, 0);
-            Table.States (148).Productions := WisiToken.To_Vector ((1 => (45, 
1)));
-            Add_Action (Table.States (148), (7, 24), (45, 1), 1, null, null);
-            Table.States (148).Minimal_Complete_Action := (Reduce, 45, 1);
-            Table.States (149).Productions := WisiToken.To_Vector (((43, 0), 
(45, 2)));
-            Add_Action (Table.States (149), 7, 179);
-            Add_Action (Table.States (149), 24, 147);
+            Add_Goto (Table.States (147), 54, 177);
+            Add_Goto (Table.States (147), 55, 178);
+            Table.States (147).Kernel := To_Vector ((0 => (46, 25, 1, False)));
+            Table.States (147).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 55, 0)));
+            Add_Action (Table.States (148), (8, 25), (47, 1), 1, null, null);
+            Table.States (148).Kernel := To_Vector ((0 => (47, 46, 0, False)));
+            Table.States (148).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 47, 1)));
+            Add_Action (Table.States (149), 8, 179);
+            Add_Action (Table.States (149), 25, 147);
             Add_Error (Table.States (149));
-            Add_Goto (Table.States (149), 44, 180);
-            Table.States (149).Minimal_Complete_Action := (Shift, 7, 179);
-            Table.States (150).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (150), (12, 30), (57, 1), 3, null, null);
-            Table.States (150).Minimal_Complete_Action := (Reduce, 57, 3);
-            Table.States (151).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (151), 20, 181);
+            Add_Goto (Table.States (149), 46, 180);
+            Table.States (149).Kernel := To_Vector (((45, 47, 3, False), (47, 
47, 2, True)));
+            Table.States (149).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 179)));
+            Add_Action (Table.States (150), (13, 31), (59, 1), 3, null, null);
+            Table.States (150).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (150).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (150).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (151), 21, 181);
             Add_Error (Table.States (151));
-            Table.States (151).Minimal_Complete_Action := (Shift, 20, 181);
-            Table.States (152).Productions := WisiToken.To_Vector ((1 => (52, 
2)));
-            Add_Action (Table.States (152), (1 =>  20), (52, 2), 1, null, 
null);
-            Table.States (152).Minimal_Complete_Action := (Reduce, 52, 1);
-            Table.States (153).Productions := WisiToken.To_Vector ((1 => (52, 
1)));
-            Add_Action (Table.States (153), (1 =>  20), (52, 1), 1, null, 
null);
-            Table.States (153).Minimal_Complete_Action := (Reduce, 52, 1);
-            Table.States (154).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (154), 20, 182);
+            Table.States (151).Kernel := To_Vector ((0 => (42, 38, 3, False)));
+            Table.States (151).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 181)));
+            Add_Action (Table.States (152), (1 =>  21), (54, 2), 1, null, 
null);
+            Table.States (152).Kernel := To_Vector ((0 => (54, 17, 0, False)));
+            Table.States (152).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 1)));
+            Add_Action (Table.States (153), (1 =>  21), (54, 1), 1, null, 
null);
+            Table.States (153).Kernel := To_Vector ((0 => (54, 38, 0, False)));
+            Table.States (153).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 1)));
+            Add_Action (Table.States (154), 21, 182);
             Add_Error (Table.States (154));
-            Table.States (154).Minimal_Complete_Action := (Shift, 20, 182);
-            Table.States (155).Productions := WisiToken.To_Vector (((40, 0), 
(54, 1)));
-            Add_Action (Table.States (155), 26, 170);
-            Add_Action (Table.States (155), 33, 183);
+            Table.States (154).Kernel := To_Vector (((42, 54, 3, False), (42, 
54, 5, False)));
+            Table.States (154).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 182)));
+            Add_Action (Table.States (155), 27, 170);
+            Add_Action (Table.States (155), 34, 183);
             Add_Error (Table.States (155));
-            Table.States (155).Minimal_Complete_Action := (Shift, 33, 183);
-            Table.States (156).Productions := WisiToken.To_Vector (((57, 1), 
(60, 0)));
-            Add_Action (Table.States (156), 12, 184);
-            Add_Action (Table.States (156), 30, 121);
+            Table.States (155).Kernel := To_Vector (((42, 56, 1, False), (56, 
56, 1, True)));
+            Table.States (155).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 183)));
+            Add_Action (Table.States (156), 13, 184);
+            Add_Action (Table.States (156), 31, 121);
             Add_Error (Table.States (156));
-            Table.States (156).Minimal_Complete_Action := (Shift, 12, 184);
-            Table.States (157).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (157), 7, 185);
+            Table.States (156).Kernel := To_Vector (((59, 59, 2, True), (62, 
59, 3, False)));
+            Table.States (156).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 184)));
+            Add_Action (Table.States (157), 8, 185);
             Add_Error (Table.States (157));
-            Table.States (157).Minimal_Complete_Action := (Shift, 7, 185);
-            Table.States (158).Productions := WisiToken.To_Vector ((1 => (56, 
1)));
-            Add_Action (Table.States (158), (30, 33), (56, 1), 1, null, 
identifier_opt_1_check'Access);
-            Table.States (158).Minimal_Complete_Action := (Reduce, 56, 1);
-            Table.States (159).Productions := WisiToken.To_Vector ((1 => (57, 
0)));
-            Add_Action (Table.States (159), (30, 33), (57, 0), 1, null, null);
-            Table.States (159).Minimal_Complete_Action := (Reduce, 57, 1);
-            Table.States (160).Productions := WisiToken.To_Vector (((57, 1), 
(61, 0)));
-            Add_Action (Table.States (160), 30, 186);
-            Add_Action (Table.States (160), 33, 187);
+            Table.States (157).Kernel := To_Vector ((0 => (61, 53, 2, False)));
+            Table.States (157).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 185)));
+            Add_Action (Table.States (158), (31, 34), (58, 1), 1, null, 
identifier_opt_1_check'Access);
+            Table.States (158).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (158).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (159), (31, 34), (59, 0), 1, null, null);
+            Table.States (159).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (159).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (160), 31, 186);
+            Add_Action (Table.States (160), 34, 187);
             Add_Error (Table.States (160));
-            Table.States (160).Minimal_Complete_Action := (Shift, 33, 187);
-            Table.States (161).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (161), 9, 32);
-            Add_Action (Table.States (161), 10, 33);
-            Add_Action (Table.States (161), 13, 34);
-            Add_Action (Table.States (161), 18, 9);
-            Add_Action (Table.States (161), 20, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (161), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (161), 29, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (161), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (161), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (161), 35, 36);
-            Add_Action (Table.States (161), 36, 37);
+            Table.States (160).Kernel := To_Vector (((59, 59, 2, True), (63, 
59, 1, False)));
+            Table.States (160).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 187)));
+            Add_Action (Table.States (161), 10, 32);
+            Add_Action (Table.States (161), 11, 33);
+            Add_Action (Table.States (161), 14, 34);
+            Add_Action (Table.States (161), 19, 9);
+            Add_Action (Table.States (161), 21, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (161), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (161), 30, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (161), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (161), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (161), 37, 36);
+            Add_Action (Table.States (161), 38, 37);
             Add_Error (Table.States (161));
-            Add_Goto (Table.States (161), 39, 38);
-            Add_Goto (Table.States (161), 41, 39);
-            Add_Goto (Table.States (161), 42, 40);
-            Add_Goto (Table.States (161), 54, 41);
-            Add_Goto (Table.States (161), 55, 42);
-            Add_Goto (Table.States (161), 56, 43);
-            Add_Goto (Table.States (161), 57, 44);
-            Add_Goto (Table.States (161), 67, 45);
-            Add_Goto (Table.States (161), 68, 188);
-            Add_Goto (Table.States (161), 69, 47);
-            Table.States (161).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (162).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (162), 33, 189);
+            Add_Goto (Table.States (161), 41, 38);
+            Add_Goto (Table.States (161), 43, 39);
+            Add_Goto (Table.States (161), 44, 40);
+            Add_Goto (Table.States (161), 56, 41);
+            Add_Goto (Table.States (161), 57, 42);
+            Add_Goto (Table.States (161), 58, 43);
+            Add_Goto (Table.States (161), 59, 44);
+            Add_Goto (Table.States (161), 69, 45);
+            Add_Goto (Table.States (161), 70, 188);
+            Add_Goto (Table.States (161), 71, 47);
+            Table.States (161).Kernel := To_Vector ((0 => (41, 14, 1, False)));
+            Table.States (161).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (162), 34, 189);
             Add_Error (Table.States (162));
-            Table.States (162).Minimal_Complete_Action := (Shift, 33, 189);
-            Table.States (163).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (163), 9, 130);
-            Add_Action (Table.States (163), 10, 131);
-            Add_Action (Table.States (163), 13, 132);
-            Add_Action (Table.States (163), 18, 9);
-            Add_Action (Table.States (163), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (163), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (163), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (163), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (163), 35, 133);
-            Add_Action (Table.States (163), 36, 134);
+            Table.States (162).Kernel := To_Vector ((0 => (72, 41, 1, False)));
+            Table.States (162).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 189)));
+            Add_Action (Table.States (163), 10, 130);
+            Add_Action (Table.States (163), 11, 131);
+            Add_Action (Table.States (163), 14, 132);
+            Add_Action (Table.States (163), 19, 9);
+            Add_Action (Table.States (163), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (163), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (163), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (163), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (163), 37, 133);
+            Add_Action (Table.States (163), 38, 134);
             Add_Error (Table.States (163));
-            Add_Goto (Table.States (163), 39, 135);
-            Add_Goto (Table.States (163), 41, 136);
-            Add_Goto (Table.States (163), 42, 137);
-            Add_Goto (Table.States (163), 54, 190);
-            Add_Goto (Table.States (163), 55, 139);
-            Add_Goto (Table.States (163), 56, 140);
-            Add_Goto (Table.States (163), 57, 141);
-            Add_Goto (Table.States (163), 67, 142);
-            Add_Goto (Table.States (163), 69, 143);
-            Table.States (163).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (164).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (164), 9, 32);
-            Add_Action (Table.States (164), 10, 33);
-            Add_Action (Table.States (164), 13, 34);
-            Add_Action (Table.States (164), 18, 9);
-            Add_Action (Table.States (164), 20, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (164), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (164), 29, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (164), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (164), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (164), 35, 36);
-            Add_Action (Table.States (164), 36, 37);
+            Add_Goto (Table.States (163), 41, 135);
+            Add_Goto (Table.States (163), 43, 136);
+            Add_Goto (Table.States (163), 44, 137);
+            Add_Goto (Table.States (163), 56, 190);
+            Add_Goto (Table.States (163), 57, 139);
+            Add_Goto (Table.States (163), 58, 140);
+            Add_Goto (Table.States (163), 59, 141);
+            Add_Goto (Table.States (163), 69, 142);
+            Add_Goto (Table.States (163), 71, 143);
+            Table.States (163).Kernel := To_Vector ((0 => (67, 29, 1, False)));
+            Table.States (163).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (164), 10, 32);
+            Add_Action (Table.States (164), 11, 33);
+            Add_Action (Table.States (164), 14, 34);
+            Add_Action (Table.States (164), 19, 9);
+            Add_Action (Table.States (164), 21, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (164), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (164), 30, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (164), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (164), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (164), 37, 36);
+            Add_Action (Table.States (164), 38, 37);
             Add_Error (Table.States (164));
-            Add_Goto (Table.States (164), 39, 38);
-            Add_Goto (Table.States (164), 41, 39);
-            Add_Goto (Table.States (164), 42, 40);
-            Add_Goto (Table.States (164), 54, 41);
-            Add_Goto (Table.States (164), 55, 42);
-            Add_Goto (Table.States (164), 56, 43);
-            Add_Goto (Table.States (164), 57, 44);
-            Add_Goto (Table.States (164), 67, 45);
-            Add_Goto (Table.States (164), 68, 168);
-            Add_Goto (Table.States (164), 69, 47);
-            Table.States (164).Minimal_Complete_Action := (Reduce, 68, 0);
-            Table.States (165).Productions := WisiToken.To_Vector ((1 => (55, 
0)));
-            Add_Action (Table.States (165), (26, 33), (55, 0), 2, null, null);
-            Table.States (165).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (166).Productions := WisiToken.To_Vector ((1 => (55, 
1)));
-            Add_Action (Table.States (166), (26, 33), (55, 1), 2, null, null);
-            Table.States (166).Minimal_Complete_Action := (Reduce, 55, 2);
-            Table.States (167).Productions := WisiToken.To_Vector ((1 => (69, 
1)));
-            Add_Action (Table.States (167), (26, 33), (69, 1), 2, null, null);
-            Table.States (167).Minimal_Complete_Action := (Reduce, 69, 2);
-            Table.States (168).Productions := WisiToken.To_Vector (((39, 0), 
(68, 1)));
-            Add_Action (Table.States (168), 20, 191);
-            Add_Action (Table.States (168), 29, 67);
+            Add_Goto (Table.States (164), 41, 38);
+            Add_Goto (Table.States (164), 43, 39);
+            Add_Goto (Table.States (164), 44, 40);
+            Add_Goto (Table.States (164), 56, 41);
+            Add_Goto (Table.States (164), 57, 42);
+            Add_Goto (Table.States (164), 58, 43);
+            Add_Goto (Table.States (164), 59, 44);
+            Add_Goto (Table.States (164), 69, 45);
+            Add_Goto (Table.States (164), 70, 168);
+            Add_Goto (Table.States (164), 71, 47);
+            Table.States (164).Kernel := To_Vector ((0 => (41, 14, 1, False)));
+            Table.States (164).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (165), (27, 34), (57, 0), 2, null, null);
+            Table.States (165).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (165).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (166), (27, 34), (57, 1), 2, null, null);
+            Table.States (166).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (166).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (167), (27, 34), (71, 1), 2, null, null);
+            Table.States (167).Kernel := To_Vector ((0 => (71, 21, 0, False)));
+            Table.States (167).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 2)));
+            Add_Action (Table.States (168), 21, 191);
+            Add_Action (Table.States (168), 30, 67);
             Add_Error (Table.States (168));
-            Table.States (168).Minimal_Complete_Action := (Shift, 20, 191);
-            Table.States (169).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (169), 35, 192);
+            Table.States (168).Kernel := To_Vector (((41, 70, 1, False), (70, 
70, 1, True)));
+            Table.States (168).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 191)));
+            Add_Action (Table.States (169), 37, 192);
             Add_Error (Table.States (169));
-            Table.States (169).Minimal_Complete_Action := (Shift, 35, 192);
-            Table.States (170).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (170), 9, 130);
-            Add_Action (Table.States (170), 10, 131);
-            Add_Action (Table.States (170), 13, 132);
-            Add_Action (Table.States (170), 18, 9);
-            Add_Action (Table.States (170), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (170), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (170), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (170), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (170), 35, 133);
-            Add_Action (Table.States (170), 36, 134);
+            Table.States (169).Kernel := To_Vector (((44, 33, 1, False), (44, 
33, 4, False)));
+            Table.States (169).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 192)));
+            Add_Action (Table.States (170), 10, 130);
+            Add_Action (Table.States (170), 11, 131);
+            Add_Action (Table.States (170), 14, 132);
+            Add_Action (Table.States (170), 19, 9);
+            Add_Action (Table.States (170), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (170), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (170), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (170), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (170), 37, 133);
+            Add_Action (Table.States (170), 38, 134);
             Add_Error (Table.States (170));
-            Add_Goto (Table.States (170), 39, 135);
-            Add_Goto (Table.States (170), 41, 136);
-            Add_Goto (Table.States (170), 42, 137);
-            Add_Goto (Table.States (170), 55, 139);
-            Add_Goto (Table.States (170), 56, 140);
-            Add_Goto (Table.States (170), 57, 141);
-            Add_Goto (Table.States (170), 67, 142);
-            Add_Goto (Table.States (170), 69, 193);
-            Table.States (170).Minimal_Complete_Action := (Reduce, 69, 0);
-            Table.States (171).Productions := WisiToken.To_Vector ((1 => (65, 
0)));
-            Add_Action (Table.States (171), (5, 7, 11, 15, 17, 22, 35), (65, 
0), 4, simple_declarative_item_0'Access,
+            Add_Goto (Table.States (170), 41, 135);
+            Add_Goto (Table.States (170), 43, 136);
+            Add_Goto (Table.States (170), 44, 137);
+            Add_Goto (Table.States (170), 57, 139);
+            Add_Goto (Table.States (170), 58, 140);
+            Add_Goto (Table.States (170), 59, 141);
+            Add_Goto (Table.States (170), 69, 142);
+            Add_Goto (Table.States (170), 71, 193);
+            Table.States (170).Kernel := To_Vector ((0 => (56, 27, 0, True)));
+            Table.States (170).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 0)));
+            Table.States (170).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (171), (6, 8, 12, 16, 18, 23, 37), (67, 
0), 4, simple_declarative_item_0'Access,
             null);
-            Table.States (171).Minimal_Complete_Action := (Reduce, 65, 4);
-            Table.States (172).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (172), 35, 194);
+            Table.States (171).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (171).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 4)));
+            Add_Action (Table.States (172), 37, 194);
             Add_Error (Table.States (172));
-            Table.States (172).Minimal_Complete_Action := (Shift, 35, 194);
-            Table.States (173).Productions := WisiToken.To_Vector ((1 => (66, 
0)));
-            Add_Action (Table.States (173), (1 =>  37), (66, 0), 7, 
simple_project_declaration_0'Access,
+            Table.States (172).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (172).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 194)));
+            Table.States (172).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (173), (1 =>  39), (68, 0), 7, 
simple_project_declaration_0'Access,
             simple_project_declaration_0_check'Access);
-            Table.States (173).Minimal_Complete_Action := (Reduce, 66, 7);
-            Table.States (174).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (174), 33, 195);
+            Table.States (173).Kernel := To_Vector ((0 => (68, 34, 0, False)));
+            Table.States (173).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 68, 7)));
+            Add_Action (Table.States (174), 34, 195);
             Add_Error (Table.States (174));
-            Table.States (174).Minimal_Complete_Action := (Shift, 33, 195);
-            Table.States (175).Productions := WisiToken.To_Vector ((1 => (52, 
2)));
-            Add_Action (Table.States (175), (31, 34), (52, 2), 1, null, null);
-            Table.States (175).Minimal_Complete_Action := (Reduce, 52, 1);
-            Table.States (176).Productions := WisiToken.To_Vector ((1 => (52, 
1)));
-            Add_Action (Table.States (176), (31, 34), (52, 1), 1, null, null);
-            Table.States (176).Minimal_Complete_Action := (Reduce, 52, 1);
-            Table.States (177).Productions := WisiToken.To_Vector ((1 => (53, 
0)));
-            Add_Action (Table.States (177), (31, 34), (53, 0), 1, null, null);
-            Table.States (177).Minimal_Complete_Action := (Reduce, 53, 1);
-            Table.States (178).Productions := WisiToken.To_Vector (((44, 0), 
(53, 1)));
-            Add_Action (Table.States (178), 31, 196);
-            Add_Action (Table.States (178), 34, 197);
+            Table.States (174).Kernel := To_Vector ((0 => (65, 58, 1, False)));
+            Table.States (174).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 195)));
+            Add_Action (Table.States (175), (32, 35), (54, 2), 1, null, null);
+            Table.States (175).Kernel := To_Vector ((0 => (54, 17, 0, False)));
+            Table.States (175).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 1)));
+            Add_Action (Table.States (176), (32, 35), (54, 1), 1, null, null);
+            Table.States (176).Kernel := To_Vector ((0 => (54, 38, 0, False)));
+            Table.States (176).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 1)));
+            Add_Action (Table.States (177), (32, 35), (55, 0), 1, null, null);
+            Table.States (177).Kernel := To_Vector ((0 => (55, 54, 0, False)));
+            Table.States (177).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 55, 1)));
+            Add_Action (Table.States (178), 32, 196);
+            Add_Action (Table.States (178), 35, 197);
             Add_Error (Table.States (178));
-            Table.States (178).Minimal_Complete_Action := (Shift, 31, 196);
-            Table.States (179).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (179), 5, 198);
+            Table.States (178).Kernel := To_Vector (((46, 55, 1, False), (55, 
55, 1, True)));
+            Table.States (178).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 32, 196)));
+            Add_Action (Table.States (179), 6, 198);
             Add_Error (Table.States (179));
-            Table.States (179).Minimal_Complete_Action := (Shift, 5, 198);
-            Table.States (180).Productions := WisiToken.To_Vector ((1 => (45, 
2)));
-            Add_Action (Table.States (180), (7, 24), (45, 2), 2, null, null);
-            Table.States (180).Minimal_Complete_Action := (Reduce, 45, 2);
-            Table.States (181).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (181), 23, 199);
+            Table.States (179).Kernel := To_Vector ((0 => (45, 8, 2, False)));
+            Table.States (179).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 6, 198)));
+            Add_Action (Table.States (180), (8, 25), (47, 2), 2, null, null);
+            Table.States (180).Kernel := To_Vector ((0 => (47, 46, 0, True)));
+            Table.States (180).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 47, 2)));
+            Table.States (180).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (181), 24, 199);
             Add_Error (Table.States (181));
-            Table.States (181).Minimal_Complete_Action := (Shift, 23, 199);
-            Table.States (182).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (182), 23, 200);
+            Table.States (181).Kernel := To_Vector ((0 => (42, 21, 2, False)));
+            Table.States (181).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 199)));
+            Add_Action (Table.States (182), 24, 200);
             Add_Error (Table.States (182));
-            Table.States (182).Minimal_Complete_Action := (Shift, 23, 200);
-            Table.States (183).Productions := WisiToken.To_Vector ((1 => (40, 
0)));
-            Add_Action (Table.States (183), (5, 7, 11, 15, 17, 22, 35), (40, 
0), 5, attribute_declaration_0'Access,
+            Table.States (182).Kernel := To_Vector (((42, 21, 2, False), (42, 
21, 4, False)));
+            Table.States (182).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 200)));
+            Add_Action (Table.States (183), (6, 8, 12, 16, 18, 23, 37), (42, 
0), 5, attribute_declaration_0'Access,
             null);
-            Table.States (183).Minimal_Complete_Action := (Reduce, 40, 5);
-            Table.States (184).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (184), 5, 85);
-            Add_Action (Table.States (184), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (184), 11, 86);
-            Add_Action (Table.States (184), 15, 87);
-            Add_Action (Table.States (184), 17, 88);
-            Add_Action (Table.States (184), 22, 89);
-            Add_Action (Table.States (184), 35, 90);
+            Table.States (183).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (183).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 5)));
+            Add_Action (Table.States (184), 6, 85);
+            Add_Action (Table.States (184), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (184), 12, 86);
+            Add_Action (Table.States (184), 16, 87);
+            Add_Action (Table.States (184), 18, 88);
+            Add_Action (Table.States (184), 23, 89);
+            Add_Action (Table.States (184), 37, 90);
             Add_Error (Table.States (184));
-            Add_Goto (Table.States (184), 40, 91);
-            Add_Goto (Table.States (184), 43, 92);
-            Add_Goto (Table.States (184), 49, 93);
-            Add_Goto (Table.States (184), 50, 94);
-            Add_Goto (Table.States (184), 51, 201);
-            Add_Goto (Table.States (184), 58, 96);
-            Add_Goto (Table.States (184), 59, 97);
-            Add_Goto (Table.States (184), 60, 98);
-            Add_Goto (Table.States (184), 61, 99);
-            Add_Goto (Table.States (184), 65, 100);
-            Add_Goto (Table.States (184), 70, 101);
-            Table.States (184).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (185).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (185), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (185), 35, 144);
+            Add_Goto (Table.States (184), 42, 91);
+            Add_Goto (Table.States (184), 45, 92);
+            Add_Goto (Table.States (184), 51, 93);
+            Add_Goto (Table.States (184), 52, 94);
+            Add_Goto (Table.States (184), 53, 201);
+            Add_Goto (Table.States (184), 60, 96);
+            Add_Goto (Table.States (184), 61, 97);
+            Add_Goto (Table.States (184), 62, 98);
+            Add_Goto (Table.States (184), 63, 99);
+            Add_Goto (Table.States (184), 67, 100);
+            Add_Goto (Table.States (184), 72, 101);
+            Table.States (184).Kernel := To_Vector ((0 => (62, 13, 2, False)));
+            Table.States (184).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (185), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (185), 37, 144);
             Add_Error (Table.States (185));
-            Add_Goto (Table.States (185), 56, 202);
-            Table.States (185).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (186).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (186), 35, 203);
+            Add_Goto (Table.States (185), 58, 202);
+            Table.States (185).Kernel := To_Vector ((0 => (61, 8, 1, False)));
+            Table.States (185).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (186), 37, 203);
             Add_Error (Table.States (186));
-            Table.States (186).Minimal_Complete_Action := (Shift, 35, 203);
-            Table.States (187).Productions := WisiToken.To_Vector ((1 => (61, 
0)));
-            Add_Action (Table.States (187), (5, 7, 11, 15, 17, 22, 35), (61, 
0), 5, package_renaming_0'Access, null);
-            Table.States (187).Minimal_Complete_Action := (Reduce, 61, 5);
-            Table.States (188).Productions := WisiToken.To_Vector (((39, 0), 
(68, 1)));
-            Add_Action (Table.States (188), 20, 204);
-            Add_Action (Table.States (188), 29, 67);
+            Table.States (186).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (186).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 203)));
+            Table.States (186).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (187), (6, 8, 12, 16, 18, 23, 37), (63, 
0), 5, package_renaming_0'Access, null);
+            Table.States (187).Kernel := To_Vector ((0 => (63, 34, 0, False)));
+            Table.States (187).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 63, 5)));
+            Add_Action (Table.States (188), 21, 204);
+            Add_Action (Table.States (188), 30, 67);
             Add_Error (Table.States (188));
-            Table.States (188).Minimal_Complete_Action := (Shift, 20, 204);
-            Table.States (189).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (189), (5, 7, 11, 15, 17, 22, 35), (70, 
0), 5, typed_string_declaration_0'Access,
+            Table.States (188).Kernel := To_Vector (((41, 70, 1, False), (70, 
70, 1, True)));
+            Table.States (188).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 204)));
+            Add_Action (Table.States (189), (6, 8, 12, 16, 18, 23, 37), (72, 
0), 5, typed_string_declaration_0'Access,
             null);
-            Table.States (189).Minimal_Complete_Action := (Reduce, 70, 5);
-            Table.States (190).Productions := WisiToken.To_Vector (((54, 1), 
(65, 1)));
-            Add_Action (Table.States (190), 26, 170);
-            Add_Action (Table.States (190), 33, 205);
+            Table.States (189).Kernel := To_Vector ((0 => (72, 34, 0, False)));
+            Table.States (189).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 72, 5)));
+            Add_Action (Table.States (190), 27, 170);
+            Add_Action (Table.States (190), 34, 205);
             Add_Error (Table.States (190));
-            Table.States (190).Minimal_Complete_Action := (Shift, 33, 205);
-            Table.States (191).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (191), (26, 33), (39, 0), 3, 
aggregate_g_0'Access, null);
-            Table.States (191).Minimal_Complete_Action := (Reduce, 39, 3);
-            Table.States (192).Productions := WisiToken.To_Vector (((42, 0), 
(42, 1)));
-            Add_Action (Table.States (192), 13, 206);
-            Add_Action (Table.States (192), 26, Reduce, (42, 0), 3, null, 
null);
-            Add_Action (Table.States (192), 33, Reduce, (42, 0), 3, null, 
null);
+            Table.States (190).Kernel := To_Vector (((56, 56, 1, True), (67, 
56, 1, False)));
+            Table.States (190).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 205)));
+            Add_Action (Table.States (191), (27, 34), (41, 0), 3, 
aggregate_g_0'Access, null);
+            Table.States (191).Kernel := To_Vector ((0 => (41, 21, 0, False)));
+            Table.States (191).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 41, 3)));
+            Add_Action (Table.States (192), 14, 206);
+            Add_Action (Table.States (192), 27, Reduce, (44, 0), 3, null, 
null);
+            Add_Action (Table.States (192), 34, Reduce, (44, 0), 3, null, 
null);
             Add_Error (Table.States (192));
-            Table.States (192).Minimal_Complete_Action := (Reduce, 42, 3);
-            Table.States (193).Productions := WisiToken.To_Vector ((1 => (54, 
1)));
-            Add_Action (Table.States (193), (26, 33), (54, 1), 3, null, null);
-            Table.States (193).Minimal_Complete_Action := (Reduce, 54, 3);
-            Table.States (194).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (194), (26, 30, 32, 33), (57, 1), 3, 
null, null);
-            Table.States (194).Minimal_Complete_Action := (Reduce, 57, 3);
-            Table.States (195).Productions := WisiToken.To_Vector ((1 => (63, 
0)));
-            Add_Action (Table.States (195), (1 =>  37), (63, 0), 9, 
project_extension_0'Access,
+            Table.States (192).Kernel := To_Vector (((44, 37, 0, False), (44, 
37, 3, False)));
+            Table.States (192).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 3)));
+            Add_Action (Table.States (193), (27, 34), (56, 1), 3, null, null);
+            Table.States (193).Kernel := To_Vector ((0 => (56, 71, 0, True)));
+            Table.States (193).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 3)));
+            Table.States (193).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (194), (27, 31, 33, 34), (59, 1), 3, 
null, null);
+            Table.States (194).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (194).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (194).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (195), (1 =>  39), (65, 0), 9, 
project_extension_0'Access,
             project_extension_0_check'Access);
-            Table.States (195).Minimal_Complete_Action := (Reduce, 63, 9);
-            Table.States (196).Productions := WisiToken.To_Vector ((1 => (44, 
0)));
-            Add_Action (Table.States (196), 5, 207);
-            Add_Action (Table.States (196), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (196), 11, 208);
-            Add_Action (Table.States (196), 15, 209);
-            Add_Action (Table.States (196), 17, 210);
-            Add_Action (Table.States (196), 22, 211);
-            Add_Action (Table.States (196), 24, Reduce, (51, 0), 0, null, 
null);
-            Add_Action (Table.States (196), 35, 212);
+            Table.States (195).Kernel := To_Vector ((0 => (65, 34, 0, False)));
+            Table.States (195).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 65, 9)));
+            Add_Action (Table.States (196), 6, 207);
+            Add_Action (Table.States (196), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (196), 12, 208);
+            Add_Action (Table.States (196), 16, 209);
+            Add_Action (Table.States (196), 18, 210);
+            Add_Action (Table.States (196), 23, 211);
+            Add_Action (Table.States (196), 25, Reduce, (53, 0), 0, null, 
null);
+            Add_Action (Table.States (196), 37, 212);
             Add_Error (Table.States (196));
-            Add_Goto (Table.States (196), 40, 213);
-            Add_Goto (Table.States (196), 43, 214);
-            Add_Goto (Table.States (196), 49, 215);
-            Add_Goto (Table.States (196), 50, 216);
-            Add_Goto (Table.States (196), 51, 217);
-            Add_Goto (Table.States (196), 58, 218);
-            Add_Goto (Table.States (196), 59, 219);
-            Add_Goto (Table.States (196), 60, 220);
-            Add_Goto (Table.States (196), 61, 221);
-            Add_Goto (Table.States (196), 65, 222);
-            Add_Goto (Table.States (196), 70, 223);
-            Table.States (196).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (197).Productions := WisiToken.To_Vector ((1 => (53, 
1)));
-            Add_Action (Table.States (197), 16, 175);
-            Add_Action (Table.States (197), 31, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (197), 34, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (197), 36, 176);
+            Add_Goto (Table.States (196), 42, 213);
+            Add_Goto (Table.States (196), 45, 214);
+            Add_Goto (Table.States (196), 51, 215);
+            Add_Goto (Table.States (196), 52, 216);
+            Add_Goto (Table.States (196), 53, 217);
+            Add_Goto (Table.States (196), 60, 218);
+            Add_Goto (Table.States (196), 61, 219);
+            Add_Goto (Table.States (196), 62, 220);
+            Add_Goto (Table.States (196), 63, 221);
+            Add_Goto (Table.States (196), 67, 222);
+            Add_Goto (Table.States (196), 72, 223);
+            Table.States (196).Kernel := To_Vector ((0 => (46, 32, 0, False)));
+            Table.States (196).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (197), 17, 175);
+            Add_Action (Table.States (197), 32, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (197), 35, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (197), 38, 176);
             Add_Error (Table.States (197));
-            Add_Goto (Table.States (197), 52, 224);
-            Table.States (197).Minimal_Complete_Action := (Reduce, 52, 0);
-            Table.States (198).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (198), 33, 225);
+            Add_Goto (Table.States (197), 54, 224);
+            Table.States (197).Kernel := To_Vector ((0 => (55, 35, 0, True)));
+            Table.States (197).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 0)));
+            Table.States (197).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (198), 34, 225);
             Add_Error (Table.States (198));
-            Table.States (198).Minimal_Complete_Action := (Shift, 33, 225);
-            Table.States (199).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (199), 9, 130);
-            Add_Action (Table.States (199), 10, 131);
-            Add_Action (Table.States (199), 13, 132);
-            Add_Action (Table.States (199), 18, 9);
-            Add_Action (Table.States (199), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (199), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (199), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (199), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (199), 35, 133);
-            Add_Action (Table.States (199), 36, 134);
+            Table.States (198).Kernel := To_Vector ((0 => (45, 6, 1, False)));
+            Table.States (198).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 225)));
+            Add_Action (Table.States (199), 10, 130);
+            Add_Action (Table.States (199), 11, 131);
+            Add_Action (Table.States (199), 14, 132);
+            Add_Action (Table.States (199), 19, 9);
+            Add_Action (Table.States (199), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (199), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (199), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (199), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (199), 37, 133);
+            Add_Action (Table.States (199), 38, 134);
             Add_Error (Table.States (199));
-            Add_Goto (Table.States (199), 39, 135);
-            Add_Goto (Table.States (199), 41, 136);
-            Add_Goto (Table.States (199), 42, 137);
-            Add_Goto (Table.States (199), 54, 226);
-            Add_Goto (Table.States (199), 55, 139);
-            Add_Goto (Table.States (199), 56, 140);
-            Add_Goto (Table.States (199), 57, 141);
-            Add_Goto (Table.States (199), 67, 142);
-            Add_Goto (Table.States (199), 69, 143);
-            Table.States (199).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (200).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (200), 9, 130);
-            Add_Action (Table.States (200), 10, 131);
-            Add_Action (Table.States (200), 13, 132);
-            Add_Action (Table.States (200), 18, 9);
-            Add_Action (Table.States (200), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (200), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (200), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (200), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (200), 35, 133);
-            Add_Action (Table.States (200), 36, 134);
+            Add_Goto (Table.States (199), 41, 135);
+            Add_Goto (Table.States (199), 43, 136);
+            Add_Goto (Table.States (199), 44, 137);
+            Add_Goto (Table.States (199), 56, 226);
+            Add_Goto (Table.States (199), 57, 139);
+            Add_Goto (Table.States (199), 58, 140);
+            Add_Goto (Table.States (199), 59, 141);
+            Add_Goto (Table.States (199), 69, 142);
+            Add_Goto (Table.States (199), 71, 143);
+            Table.States (199).Kernel := To_Vector ((0 => (42, 24, 1, False)));
+            Table.States (199).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (200), 4, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (200), 10, 227);
+            Add_Action (Table.States (200), 11, 228);
+            Add_Action (Table.States (200), 14, 229);
+            Add_Action (Table.States (200), 19, 9);
+            Add_Action (Table.States (200), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (200), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (200), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (200), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (200), 37, 230);
+            Add_Action (Table.States (200), 38, 231);
             Add_Error (Table.States (200));
-            Add_Goto (Table.States (200), 39, 135);
-            Add_Goto (Table.States (200), 41, 136);
-            Add_Goto (Table.States (200), 42, 137);
-            Add_Goto (Table.States (200), 54, 227);
-            Add_Goto (Table.States (200), 55, 139);
-            Add_Goto (Table.States (200), 56, 140);
-            Add_Goto (Table.States (200), 57, 141);
-            Add_Goto (Table.States (200), 67, 142);
-            Add_Goto (Table.States (200), 69, 143);
-            Table.States (200).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (201).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (201), 7, 228);
+            Add_Goto (Table.States (200), 41, 232);
+            Add_Goto (Table.States (200), 43, 233);
+            Add_Goto (Table.States (200), 44, 234);
+            Add_Goto (Table.States (200), 56, 235);
+            Add_Goto (Table.States (200), 57, 236);
+            Add_Goto (Table.States (200), 58, 237);
+            Add_Goto (Table.States (200), 59, 238);
+            Add_Goto (Table.States (200), 69, 239);
+            Add_Goto (Table.States (200), 71, 240);
+            Table.States (200).Kernel := To_Vector (((42, 24, 1, False), (42, 
24, 3, False)));
+            Table.States (200).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (201), 8, 241);
             Add_Error (Table.States (201));
-            Table.States (201).Minimal_Complete_Action := (Shift, 7, 228);
-            Table.States (202).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (202), 33, 229);
+            Table.States (201).Kernel := To_Vector ((0 => (62, 53, 2, False)));
+            Table.States (201).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 241)));
+            Add_Action (Table.States (202), 34, 242);
             Add_Error (Table.States (202));
-            Table.States (202).Minimal_Complete_Action := (Shift, 33, 229);
-            Table.States (203).Productions := WisiToken.To_Vector ((1 => (57, 
1)));
-            Add_Action (Table.States (203), (30, 33), (57, 1), 3, null, null);
-            Table.States (203).Minimal_Complete_Action := (Reduce, 57, 3);
-            Table.States (204).Productions := WisiToken.To_Vector ((1 => (39, 
0)));
-            Add_Action (Table.States (204), (1 =>  33), (39, 0), 3, 
aggregate_g_0'Access, null);
-            Table.States (204).Minimal_Complete_Action := (Reduce, 39, 3);
-            Table.States (205).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (205), (5, 7, 11, 15, 17, 22, 35), (65, 
1), 6, simple_declarative_item_1'Access,
+            Table.States (202).Kernel := To_Vector ((0 => (61, 58, 1, False)));
+            Table.States (202).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 242)));
+            Add_Action (Table.States (203), (31, 34), (59, 1), 3, null, null);
+            Table.States (203).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (203).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (203).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (204), (1 =>  34), (41, 0), 3, 
aggregate_g_0'Access, null);
+            Table.States (204).Kernel := To_Vector ((0 => (41, 21, 0, False)));
+            Table.States (204).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 41, 3)));
+            Add_Action (Table.States (205), (6, 8, 12, 16, 18, 23, 37), (67, 
1), 6, simple_declarative_item_1'Access,
             null);
-            Table.States (205).Minimal_Complete_Action := (Reduce, 65, 6);
-            Table.States (206).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (206), 36, 230);
+            Table.States (205).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (205).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 6)));
+            Add_Action (Table.States (206), 38, 243);
             Add_Error (Table.States (206));
-            Table.States (206).Minimal_Complete_Action := (Shift, 36, 230);
-            Table.States (207).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (207), 12, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (207), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (207), 35, 105);
+            Table.States (206).Kernel := To_Vector ((0 => (44, 14, 2, False)));
+            Table.States (206).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 243)));
+            Add_Action (Table.States (207), 13, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (207), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (207), 37, 105);
             Add_Error (Table.States (207));
-            Add_Goto (Table.States (207), 56, 106);
-            Add_Goto (Table.States (207), 57, 231);
-            Table.States (207).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (208).Productions := WisiToken.To_Vector (((40, 0), 
(40, 1), (40, 2)));
-            Add_Action (Table.States (208), 9, 232);
-            Add_Action (Table.States (208), 35, 233);
+            Add_Goto (Table.States (207), 58, 106);
+            Add_Goto (Table.States (207), 59, 244);
+            Table.States (207).Kernel := To_Vector ((0 => (45, 6, 4, False)));
+            Table.States (207).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (208), 10, 245);
+            Add_Action (Table.States (208), 37, 246);
             Add_Error (Table.States (208));
-            Table.States (208).Minimal_Complete_Action := (Shift, 35, 233);
-            Table.States (209).Productions := WisiToken.To_Vector ((1 => (65, 
4)));
-            Add_Action (Table.States (209), 33, 234);
+            Table.States (208).Kernel := To_Vector (((42, 12, 3, False), (42, 
12, 5, False), (42, 12, 7, False), (42,
+            12, 6, False)));
+            Table.States (208).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 246)));
+            Add_Action (Table.States (209), 34, 247);
             Add_Error (Table.States (209));
-            Table.States (209).Minimal_Complete_Action := (Shift, 33, 234);
-            Table.States (210).Productions := WisiToken.To_Vector (((59, 0), 
(60, 0), (61, 0)));
-            Add_Action (Table.States (210), 8, Reduce, (56, 0), 0, null, null);
-            Add_Action (Table.States (210), 12, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (210), 19, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (210), 35, 111);
+            Table.States (209).Kernel := To_Vector ((0 => (67, 16, 1, False)));
+            Table.States (209).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 247)));
+            Add_Action (Table.States (210), 9, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (210), 13, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (210), 20, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (210), 37, 111);
             Add_Error (Table.States (210));
-            Add_Goto (Table.States (210), 56, 235);
-            Table.States (210).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (211).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (211), 35, 236);
-            Add_Error (Table.States (211));
-            Table.States (211).Minimal_Complete_Action := (Shift, 35, 236);
-            Table.States (212).Productions := WisiToken.To_Vector (((65, 0), 
(65, 1)));
-            Add_Action (Table.States (212), 27, 237);
-            Add_Action (Table.States (212), 28, 238);
-            Add_Error (Table.States (212));
-            Table.States (212).Minimal_Complete_Action := (Shift, 28, 238);
-            Table.States (213).Productions := WisiToken.To_Vector ((1 => (65, 
2)));
-            Add_Action (Table.States (213), (5, 7, 11, 15, 17, 22, 24, 35), 
(65, 2), 1, null, null);
-            Table.States (213).Minimal_Complete_Action := (Reduce, 65, 1);
-            Table.States (214).Productions := WisiToken.To_Vector ((1 => (65, 
3)));
-            Add_Action (Table.States (214), (5, 7, 11, 15, 17, 22, 24, 35), 
(65, 3), 1, null, null);
-            Table.States (214).Minimal_Complete_Action := (Reduce, 65, 1);
-            Table.States (215).Productions := WisiToken.To_Vector ((1 => (50, 
0)));
-            Add_Action (Table.States (215), (5, 7, 11, 15, 17, 22, 24, 35), 
(50, 0), 1, null, null);
-            Table.States (215).Minimal_Complete_Action := (Reduce, 50, 1);
-            Table.States (216).Productions := WisiToken.To_Vector (((50, 1), 
(51, 1)));
-            Add_Action (Table.States (216), 5, 207);
-            Add_Action (Table.States (216), 7, Reduce, (51, 1), 1, null, null);
-            Add_Action (Table.States (216), 11, 208);
-            Add_Action (Table.States (216), 15, 209);
-            Add_Action (Table.States (216), 17, 210);
-            Add_Action (Table.States (216), 22, 211);
-            Add_Action (Table.States (216), 24, Reduce, (51, 1), 1, null, 
null);
-            Add_Action (Table.States (216), 35, 212);
-            Add_Error (Table.States (216));
-            Add_Goto (Table.States (216), 40, 213);
-            Add_Goto (Table.States (216), 43, 214);
-            Add_Goto (Table.States (216), 49, 239);
-            Add_Goto (Table.States (216), 58, 218);
-            Add_Goto (Table.States (216), 59, 219);
-            Add_Goto (Table.States (216), 60, 220);
-            Add_Goto (Table.States (216), 61, 221);
-            Add_Goto (Table.States (216), 65, 222);
-            Add_Goto (Table.States (216), 70, 223);
-            Table.States (216).Minimal_Complete_Action := (Reduce, 51, 1);
+            Add_Goto (Table.States (210), 58, 248);
+            Table.States (210).Kernel := To_Vector (((61, 18, 3, False), (62, 
18, 4, False), (63, 18, 2, False)));
+            Table.States (210).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
          end Subr_2;
          procedure Subr_3
          is begin
-            Table.States (217).Productions := WisiToken.To_Vector ((1 => (44, 
0)));
-            Add_Action (Table.States (217), (7, 24), (44, 0), 4, 
case_item_0'Access, null);
-            Table.States (217).Minimal_Complete_Action := (Reduce, 44, 4);
-            Table.States (218).Productions := WisiToken.To_Vector ((1 => (49, 
2)));
-            Add_Action (Table.States (218), (5, 7, 11, 15, 17, 22, 24, 35), 
(49, 2), 1, null, null);
-            Table.States (218).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (219).Productions := WisiToken.To_Vector ((1 => (58, 
0)));
-            Add_Action (Table.States (219), (5, 7, 11, 15, 17, 22, 24, 35), 
(58, 0), 1, null, null);
-            Table.States (219).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (220).Productions := WisiToken.To_Vector ((1 => (58, 
1)));
-            Add_Action (Table.States (220), (5, 7, 11, 15, 17, 22, 24, 35), 
(58, 1), 1, null, null);
-            Table.States (220).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (221).Productions := WisiToken.To_Vector ((1 => (58, 
2)));
-            Add_Action (Table.States (221), (5, 7, 11, 15, 17, 22, 24, 35), 
(58, 2), 1, null, null);
-            Table.States (221).Minimal_Complete_Action := (Reduce, 58, 1);
-            Table.States (222).Productions := WisiToken.To_Vector ((1 => (49, 
0)));
-            Add_Action (Table.States (222), (5, 7, 11, 15, 17, 22, 24, 35), 
(49, 0), 1, null, null);
-            Table.States (222).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (223).Productions := WisiToken.To_Vector ((1 => (49, 
1)));
-            Add_Action (Table.States (223), (5, 7, 11, 15, 17, 22, 24, 35), 
(49, 1), 1, null, null);
-            Table.States (223).Minimal_Complete_Action := (Reduce, 49, 1);
-            Table.States (224).Productions := WisiToken.To_Vector ((1 => (53, 
1)));
-            Add_Action (Table.States (224), (31, 34), (53, 1), 3, null, null);
-            Table.States (224).Minimal_Complete_Action := (Reduce, 53, 3);
-            Table.States (225).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (225), (5, 7, 11, 15, 17, 22, 35), (43, 
0), 7, case_statement_0'Access, null);
-            Table.States (225).Minimal_Complete_Action := (Reduce, 43, 7);
-            Table.States (226).Productions := WisiToken.To_Vector (((40, 2), 
(54, 1)));
-            Add_Action (Table.States (226), 26, 170);
-            Add_Action (Table.States (226), 33, 240);
+            Add_Action (Table.States (211), 37, 249);
+            Add_Error (Table.States (211));
+            Table.States (211).Kernel := To_Vector ((0 => (72, 23, 5, False)));
+            Table.States (211).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 249)));
+            Add_Action (Table.States (212), 28, 250);
+            Add_Action (Table.States (212), 29, 251);
+            Add_Error (Table.States (212));
+            Table.States (212).Kernel := To_Vector (((67, 37, 2, False), (67, 
37, 4, False)));
+            Table.States (212).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 29, 251)));
+            Add_Action (Table.States (213), (6, 8, 12, 16, 18, 23, 25, 37), 
(67, 2), 1, null, null);
+            Table.States (213).Kernel := To_Vector ((0 => (67, 42, 0, False)));
+            Table.States (213).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 1)));
+            Add_Action (Table.States (214), (6, 8, 12, 16, 18, 23, 25, 37), 
(67, 3), 1, null, null);
+            Table.States (214).Kernel := To_Vector ((0 => (67, 45, 0, False)));
+            Table.States (214).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 1)));
+            Add_Action (Table.States (215), (6, 8, 12, 16, 18, 23, 25, 37), 
(52, 0), 1, null, null);
+            Table.States (215).Kernel := To_Vector ((0 => (52, 51, 0, False)));
+            Table.States (215).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 52, 1)));
+            Add_Action (Table.States (216), 6, 207);
+            Add_Action (Table.States (216), 8, Reduce, (53, 1), 1, null, null);
+            Add_Action (Table.States (216), 12, 208);
+            Add_Action (Table.States (216), 16, 209);
+            Add_Action (Table.States (216), 18, 210);
+            Add_Action (Table.States (216), 23, 211);
+            Add_Action (Table.States (216), 25, Reduce, (53, 1), 1, null, 
null);
+            Add_Action (Table.States (216), 37, 212);
+            Add_Error (Table.States (216));
+            Add_Goto (Table.States (216), 42, 213);
+            Add_Goto (Table.States (216), 45, 214);
+            Add_Goto (Table.States (216), 51, 252);
+            Add_Goto (Table.States (216), 60, 218);
+            Add_Goto (Table.States (216), 61, 219);
+            Add_Goto (Table.States (216), 62, 220);
+            Add_Goto (Table.States (216), 63, 221);
+            Add_Goto (Table.States (216), 67, 222);
+            Add_Goto (Table.States (216), 72, 223);
+            Table.States (216).Kernel := To_Vector (((52, 52, 2, True), (53, 
52, 0, False)));
+            Table.States (216).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 1)));
+            Add_Action (Table.States (217), (8, 25), (46, 0), 4, 
case_item_0'Access, null);
+            Table.States (217).Kernel := To_Vector ((0 => (46, 53, 0, False)));
+            Table.States (217).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 46, 4)));
+            Add_Action (Table.States (218), (6, 8, 12, 16, 18, 23, 25, 37), 
(51, 2), 1, null, null);
+            Table.States (218).Kernel := To_Vector ((0 => (51, 60, 0, False)));
+            Table.States (218).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (219), (6, 8, 12, 16, 18, 23, 25, 37), 
(60, 0), 1, null, null);
+            Table.States (219).Kernel := To_Vector ((0 => (60, 61, 0, False)));
+            Table.States (219).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (220), (6, 8, 12, 16, 18, 23, 25, 37), 
(60, 1), 1, null, null);
+            Table.States (220).Kernel := To_Vector ((0 => (60, 62, 0, False)));
+            Table.States (220).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (221), (6, 8, 12, 16, 18, 23, 25, 37), 
(60, 2), 1, null, null);
+            Table.States (221).Kernel := To_Vector ((0 => (60, 63, 0, False)));
+            Table.States (221).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 60, 1)));
+            Add_Action (Table.States (222), (6, 8, 12, 16, 18, 23, 25, 37), 
(51, 0), 1, null, null);
+            Table.States (222).Kernel := To_Vector ((0 => (51, 67, 0, False)));
+            Table.States (222).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (223), (6, 8, 12, 16, 18, 23, 25, 37), 
(51, 1), 1, null, null);
+            Table.States (223).Kernel := To_Vector ((0 => (51, 72, 0, False)));
+            Table.States (223).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 51, 1)));
+            Add_Action (Table.States (224), (32, 35), (55, 1), 3, null, null);
+            Table.States (224).Kernel := To_Vector ((0 => (55, 54, 0, True)));
+            Table.States (224).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 55, 3)));
+            Table.States (224).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (225), (6, 8, 12, 16, 18, 23, 37), (45, 
0), 7, case_statement_0'Access, null);
+            Table.States (225).Kernel := To_Vector ((0 => (45, 34, 0, False)));
+            Table.States (225).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 45, 7)));
+            Add_Action (Table.States (226), 27, 170);
+            Add_Action (Table.States (226), 34, 253);
             Add_Error (Table.States (226));
-            Table.States (226).Minimal_Complete_Action := (Shift, 33, 240);
-            Table.States (227).Productions := WisiToken.To_Vector (((40, 1), 
(54, 1)));
-            Add_Action (Table.States (227), 26, 170);
-            Add_Action (Table.States (227), 33, 241);
+            Table.States (226).Kernel := To_Vector (((42, 56, 1, False), (56, 
56, 1, True)));
+            Table.States (226).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 253)));
+            Add_Action (Table.States (227), 14, 254);
             Add_Error (Table.States (227));
-            Table.States (227).Minimal_Complete_Action := (Shift, 33, 241);
-            Table.States (228).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (228), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (228), 35, 144);
+            Add_Goto (Table.States (227), 41, 255);
+            Table.States (227).Kernel := To_Vector ((0 => (57, 10, 2, False)));
+            Table.States (227).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 254)));
+            Add_Action (Table.States (228), 14, 254);
             Add_Error (Table.States (228));
-            Add_Goto (Table.States (228), 56, 242);
-            Table.States (228).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (229).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (229), (5, 7, 11, 15, 17, 22, 35), (59, 
0), 7, package_spec_0'Access,
-            package_spec_0_check'Access);
-            Table.States (229).Minimal_Complete_Action := (Reduce, 59, 7);
-            Table.States (230).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (230), 20, 243);
-            Add_Error (Table.States (230));
-            Table.States (230).Minimal_Complete_Action := (Shift, 20, 243);
-            Table.States (231).Productions := WisiToken.To_Vector (((43, 0), 
(57, 1)));
-            Add_Action (Table.States (231), 12, 244);
-            Add_Action (Table.States (231), 30, 121);
-            Add_Error (Table.States (231));
-            Table.States (231).Minimal_Complete_Action := (Shift, 12, 244);
-            Table.States (232).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (232), 13, 245);
-            Add_Error (Table.States (232));
-            Table.States (232).Minimal_Complete_Action := (Shift, 13, 245);
-            Table.States (233).Productions := WisiToken.To_Vector (((40, 0), 
(40, 1)));
-            Add_Action (Table.States (233), 13, 246);
-            Add_Action (Table.States (233), 23, 247);
+            Add_Goto (Table.States (228), 41, 256);
+            Table.States (228).Kernel := To_Vector ((0 => (57, 11, 2, False)));
+            Table.States (228).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 254)));
+            Add_Action (Table.States (229), 10, 32);
+            Add_Action (Table.States (229), 11, 33);
+            Add_Action (Table.States (229), 14, 34);
+            Add_Action (Table.States (229), 19, 9);
+            Add_Action (Table.States (229), 21, 257);
+            Add_Conflict (Table.States (229), 21, (58, 0), 0, null, null);
+            Add_Action (Table.States (229), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (229), 30, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (229), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (229), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (229), 37, 36);
+            Add_Action (Table.States (229), 38, 37);
+            Add_Error (Table.States (229));
+            Add_Goto (Table.States (229), 41, 38);
+            Add_Goto (Table.States (229), 43, 39);
+            Add_Goto (Table.States (229), 44, 40);
+            Add_Goto (Table.States (229), 56, 41);
+            Add_Goto (Table.States (229), 57, 42);
+            Add_Goto (Table.States (229), 58, 43);
+            Add_Goto (Table.States (229), 59, 44);
+            Add_Goto (Table.States (229), 69, 45);
+            Add_Goto (Table.States (229), 70, 258);
+            Add_Goto (Table.States (229), 71, 47);
+            Table.States (229).Kernel := To_Vector (((41, 14, 1, False), (71, 
14, 1, False)));
+            Table.States (229).Minimal_Complete_Actions := To_Vector 
(((Reduce, 70, 0), (Shift, 21, 257)));
+            Add_Action (Table.States (230), (4, 27, 31, 33, 34), (58, 1), 1, 
null, identifier_opt_1_check'Access);
+            Table.States (230).Kernel := To_Vector ((0 => (58, 37, 0, False)));
+            Table.States (230).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 1)));
+            Add_Action (Table.States (231), (4, 27, 34), (69, 0), 1, null, 
null);
+            Table.States (231).Kernel := To_Vector ((0 => (69, 38, 0, False)));
+            Table.States (231).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (232), (4, 27, 34), (71, 2), 1, null, 
null);
+            Table.States (232).Kernel := To_Vector ((0 => (71, 41, 0, False)));
+            Table.States (232).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (233), 33, 259);
             Add_Error (Table.States (233));
-            Table.States (233).Minimal_Complete_Action := (Shift, 23, 247);
-            Table.States (234).Productions := WisiToken.To_Vector ((1 => (65, 
4)));
-            Add_Action (Table.States (234), (5, 7, 11, 15, 17, 22, 24, 35), 
(65, 4), 2,
-            simple_declarative_item_4'Access, null);
-            Table.States (234).Minimal_Complete_Action := (Reduce, 65, 2);
-            Table.States (235).Productions := WisiToken.To_Vector (((59, 0), 
(60, 0), (61, 0)));
-            Add_Action (Table.States (235), 8, 248);
-            Add_Action (Table.States (235), 12, 249);
-            Add_Action (Table.States (235), 19, 250);
+            Table.States (233).Kernel := To_Vector (((44, 43, 2, False), (44, 
43, 5, False)));
+            Table.States (233).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 33, 259)));
+            Add_Action (Table.States (234), (4, 27, 34), (69, 3), 1, null, 
null);
+            Table.States (234).Kernel := To_Vector ((0 => (69, 44, 0, False)));
+            Table.States (234).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (235), 4, 260);
+            Add_Action (Table.States (235), 27, 261);
+            Add_Action (Table.States (235), 34, 262);
             Add_Error (Table.States (235));
-            Table.States (235).Minimal_Complete_Action := (Shift, 19, 250);
-            Table.States (236).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (236), 12, 251);
-            Add_Error (Table.States (236));
-            Table.States (236).Minimal_Complete_Action := (Shift, 12, 251);
-            Table.States (237).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (237), 35, 252);
-            Add_Error (Table.States (237));
-            Table.States (237).Minimal_Complete_Action := (Shift, 35, 252);
-            Table.States (238).Productions := WisiToken.To_Vector ((1 => (65, 
0)));
-            Add_Action (Table.States (238), 9, 130);
-            Add_Action (Table.States (238), 10, 131);
-            Add_Action (Table.States (238), 13, 132);
-            Add_Action (Table.States (238), 18, 9);
-            Add_Action (Table.States (238), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (238), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (238), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (238), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (238), 35, 133);
-            Add_Action (Table.States (238), 36, 134);
+            Table.States (235).Kernel := To_Vector (((42, 56, 1, False), (42, 
56, 3, False), (56, 56, 1, True)));
+            Table.States (235).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 262)));
+            Add_Action (Table.States (236), (4, 27, 34), (69, 2), 1, null, 
null);
+            Table.States (236).Kernel := To_Vector ((0 => (69, 57, 0, False)));
+            Table.States (236).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 69, 1)));
+            Add_Action (Table.States (237), (4, 27, 31, 33, 34), (59, 0), 1, 
null, null);
+            Table.States (237).Kernel := To_Vector ((0 => (59, 58, 0, False)));
+            Table.States (237).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 1)));
+            Add_Action (Table.States (238), 4, Reduce, (69, 1), 1, null, null);
+            Add_Action (Table.States (238), 27, Reduce, (69, 1), 1, null, 
null);
+            Add_Action (Table.States (238), 31, 263);
+            Add_Action (Table.States (238), 33, Reduce, (43, 1), 1, null, 
null);
+            Add_Action (Table.States (238), 34, Reduce, (69, 1), 1, null, 
null);
             Add_Error (Table.States (238));
-            Add_Goto (Table.States (238), 39, 135);
-            Add_Goto (Table.States (238), 41, 136);
-            Add_Goto (Table.States (238), 42, 137);
-            Add_Goto (Table.States (238), 54, 253);
-            Add_Goto (Table.States (238), 55, 139);
-            Add_Goto (Table.States (238), 56, 140);
-            Add_Goto (Table.States (238), 57, 141);
-            Add_Goto (Table.States (238), 67, 142);
-            Add_Goto (Table.States (238), 69, 143);
-            Table.States (238).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (239).Productions := WisiToken.To_Vector ((1 => (50, 
1)));
-            Add_Action (Table.States (239), (5, 7, 11, 15, 17, 22, 24, 35), 
(50, 1), 2, null, null);
-            Table.States (239).Minimal_Complete_Action := (Reduce, 50, 2);
-            Table.States (240).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (240), (5, 7, 11, 15, 17, 22, 35), (40, 
2), 8, attribute_declaration_2'Access,
-            null);
-            Table.States (240).Minimal_Complete_Action := (Reduce, 40, 8);
-            Table.States (241).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (241), (5, 7, 11, 15, 17, 22, 35), (40, 
1), 8, attribute_declaration_1'Access,
-            null);
-            Table.States (241).Minimal_Complete_Action := (Reduce, 40, 8);
-            Table.States (242).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (242), 33, 254);
-            Add_Error (Table.States (242));
-            Table.States (242).Minimal_Complete_Action := (Shift, 33, 254);
-            Table.States (243).Productions := WisiToken.To_Vector ((1 => (42, 
1)));
-            Add_Action (Table.States (243), (26, 33), (42, 1), 6, null, null);
-            Table.States (243).Minimal_Complete_Action := (Reduce, 42, 6);
-            Table.States (244).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (244), 7, Reduce, (45, 0), 0, null, null);
-            Add_Action (Table.States (244), 24, 147, (45, 0), 0, null, null);
+            Table.States (238).Kernel := To_Vector (((43, 59, 0, False), (59, 
59, 2, True), (69, 59, 0, False)));
+            Table.States (238).Minimal_Complete_Actions := To_Vector 
(((Reduce, 43, 1), (Reduce, 69, 1)));
+            Add_Action (Table.States (239), (4, 27, 34), (71, 0), 1, null, 
null);
+            Table.States (239).Kernel := To_Vector ((0 => (71, 69, 0, False)));
+            Table.States (239).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 1)));
+            Add_Action (Table.States (240), (4, 27, 34), (56, 0), 1, null, 
null);
+            Table.States (240).Kernel := To_Vector ((0 => (56, 71, 0, False)));
+            Table.States (240).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 1)));
+            Add_Action (Table.States (241), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (241), 37, 144);
+            Add_Error (Table.States (241));
+            Add_Goto (Table.States (241), 58, 264);
+            Table.States (241).Kernel := To_Vector ((0 => (62, 8, 1, False)));
+            Table.States (241).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (242), (6, 8, 12, 16, 18, 23, 37), (61, 
0), 7, package_spec_0'Access,
+            package_spec_0_check'Access);
+            Table.States (242).Kernel := To_Vector ((0 => (61, 34, 0, False)));
+            Table.States (242).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 61, 7)));
+            Add_Action (Table.States (243), 21, 265);
+            Add_Error (Table.States (243));
+            Table.States (243).Kernel := To_Vector ((0 => (44, 38, 1, False)));
+            Table.States (243).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 265)));
+            Add_Action (Table.States (244), 13, 266);
+            Add_Action (Table.States (244), 31, 121);
             Add_Error (Table.States (244));
-            Add_Goto (Table.States (244), 44, 148);
-            Add_Goto (Table.States (244), 45, 255);
-            Table.States (244).Minimal_Complete_Action := (Reduce, 45, 0);
-            Table.States (245).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (245), 36, 256);
+            Table.States (244).Kernel := To_Vector (((45, 59, 4, False), (59, 
59, 2, True)));
+            Table.States (244).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 266)));
+            Add_Action (Table.States (245), 14, 267);
             Add_Error (Table.States (245));
-            Table.States (245).Minimal_Complete_Action := (Shift, 36, 256);
-            Table.States (246).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (246), 16, 152);
-            Add_Action (Table.States (246), 20, Reduce, (52, 0), 0, null, 
null);
-            Add_Action (Table.States (246), 36, 153);
+            Table.States (245).Kernel := To_Vector ((0 => (42, 10, 5, False)));
+            Table.States (245).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 267)));
+            Add_Action (Table.States (246), 14, 268);
+            Add_Action (Table.States (246), 24, 269);
             Add_Error (Table.States (246));
-            Add_Goto (Table.States (246), 52, 257);
-            Table.States (246).Minimal_Complete_Action := (Reduce, 52, 0);
-            Table.States (247).Productions := WisiToken.To_Vector ((1 => (40, 
0)));
-            Add_Action (Table.States (247), 9, 130);
-            Add_Action (Table.States (247), 10, 131);
-            Add_Action (Table.States (247), 13, 132);
-            Add_Action (Table.States (247), 18, 9);
-            Add_Action (Table.States (247), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (247), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (247), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (247), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (247), 35, 133);
-            Add_Action (Table.States (247), 36, 134);
-            Add_Error (Table.States (247));
-            Add_Goto (Table.States (247), 39, 135);
-            Add_Goto (Table.States (247), 41, 136);
-            Add_Goto (Table.States (247), 42, 137);
-            Add_Goto (Table.States (247), 54, 258);
-            Add_Goto (Table.States (247), 55, 139);
-            Add_Goto (Table.States (247), 56, 140);
-            Add_Goto (Table.States (247), 57, 141);
-            Add_Goto (Table.States (247), 67, 142);
-            Add_Goto (Table.States (247), 69, 143);
-            Table.States (247).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (248).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (248), 12, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (248), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (248), 35, 105);
+            Table.States (246).Kernel := To_Vector (((42, 37, 2, False), (42, 
37, 4, False), (42, 37, 6, False)));
+            Table.States (246).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 269)));
+            Add_Action (Table.States (247), (6, 8, 12, 16, 18, 23, 25, 37), 
(67, 4), 2,
+            simple_declarative_item_4'Access, null);
+            Table.States (247).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (247).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 2)));
+            Add_Action (Table.States (248), 9, 270);
+            Add_Action (Table.States (248), 13, 271);
+            Add_Action (Table.States (248), 20, 272);
             Add_Error (Table.States (248));
-            Add_Goto (Table.States (248), 56, 106);
-            Add_Goto (Table.States (248), 57, 259);
-            Table.States (248).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (249).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (249), 5, 85);
-            Add_Action (Table.States (249), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (249), 11, 86);
-            Add_Action (Table.States (249), 15, 87);
-            Add_Action (Table.States (249), 17, 88);
-            Add_Action (Table.States (249), 22, 89);
-            Add_Action (Table.States (249), 35, 90);
+            Table.States (248).Kernel := To_Vector (((61, 58, 3, False), (62, 
58, 4, False), (63, 58, 2, False)));
+            Table.States (248).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 20, 272)));
+            Add_Action (Table.States (249), 13, 273);
             Add_Error (Table.States (249));
-            Add_Goto (Table.States (249), 40, 91);
-            Add_Goto (Table.States (249), 43, 92);
-            Add_Goto (Table.States (249), 49, 93);
-            Add_Goto (Table.States (249), 50, 94);
-            Add_Goto (Table.States (249), 51, 260);
-            Add_Goto (Table.States (249), 58, 96);
-            Add_Goto (Table.States (249), 59, 97);
-            Add_Goto (Table.States (249), 60, 98);
-            Add_Goto (Table.States (249), 61, 99);
-            Add_Goto (Table.States (249), 65, 100);
-            Add_Goto (Table.States (249), 70, 101);
-            Table.States (249).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (250).Productions := WisiToken.To_Vector ((1 => (61, 
0)));
-            Add_Action (Table.States (250), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (250), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (250), 35, 158);
+            Table.States (249).Kernel := To_Vector ((0 => (72, 37, 4, False)));
+            Table.States (249).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 273)));
+            Add_Action (Table.States (250), 37, 274);
             Add_Error (Table.States (250));
-            Add_Goto (Table.States (250), 56, 159);
-            Add_Goto (Table.States (250), 57, 261);
-            Table.States (250).Minimal_Complete_Action := (Reduce, 57, 0);
-            Table.States (251).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (251), 13, 161);
+            Table.States (250).Kernel := To_Vector ((0 => (67, 28, 3, False)));
+            Table.States (250).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 274)));
+            Add_Action (Table.States (251), 10, 130);
+            Add_Action (Table.States (251), 11, 131);
+            Add_Action (Table.States (251), 14, 132);
+            Add_Action (Table.States (251), 19, 9);
+            Add_Action (Table.States (251), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (251), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (251), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (251), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (251), 37, 133);
+            Add_Action (Table.States (251), 38, 134);
             Add_Error (Table.States (251));
-            Add_Goto (Table.States (251), 39, 262);
-            Table.States (251).Minimal_Complete_Action := (Shift, 13, 161);
-            Table.States (252).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (252), 28, 263);
-            Add_Error (Table.States (252));
-            Table.States (252).Minimal_Complete_Action := (Shift, 28, 263);
-            Table.States (253).Productions := WisiToken.To_Vector (((54, 1), 
(65, 0)));
-            Add_Action (Table.States (253), 26, 170);
-            Add_Action (Table.States (253), 33, 264);
-            Add_Error (Table.States (253));
-            Table.States (253).Minimal_Complete_Action := (Shift, 33, 264);
-            Table.States (254).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (254), (5, 7, 11, 15, 17, 22, 35), (60, 
0), 9, package_extension_0'Access,
-            package_extension_0_check'Access);
-            Table.States (254).Minimal_Complete_Action := (Reduce, 60, 9);
-            Table.States (255).Productions := WisiToken.To_Vector (((43, 0), 
(45, 2)));
-            Add_Action (Table.States (255), 7, 265);
-            Add_Action (Table.States (255), 24, 147);
-            Add_Error (Table.States (255));
-            Add_Goto (Table.States (255), 44, 180);
-            Table.States (255).Minimal_Complete_Action := (Shift, 7, 265);
-            Table.States (256).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (256), 20, 266);
-            Add_Error (Table.States (256));
-            Table.States (256).Minimal_Complete_Action := (Shift, 20, 266);
-            Table.States (257).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (257), 20, 267);
-            Add_Error (Table.States (257));
-            Table.States (257).Minimal_Complete_Action := (Shift, 20, 267);
-            Table.States (258).Productions := WisiToken.To_Vector (((40, 0), 
(54, 1)));
-            Add_Action (Table.States (258), 26, 170);
-            Add_Action (Table.States (258), 33, 268);
+            Add_Goto (Table.States (251), 41, 135);
+            Add_Goto (Table.States (251), 43, 136);
+            Add_Goto (Table.States (251), 44, 137);
+            Add_Goto (Table.States (251), 56, 275);
+            Add_Goto (Table.States (251), 57, 139);
+            Add_Goto (Table.States (251), 58, 140);
+            Add_Goto (Table.States (251), 59, 141);
+            Add_Goto (Table.States (251), 69, 142);
+            Add_Goto (Table.States (251), 71, 143);
+            Table.States (251).Kernel := To_Vector ((0 => (67, 29, 1, False)));
+            Table.States (251).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (252), (6, 8, 12, 16, 18, 23, 25, 37), 
(52, 1), 2, null, null);
+            Table.States (252).Kernel := To_Vector ((0 => (52, 51, 0, True)));
+            Table.States (252).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 52, 2)));
+            Table.States (252).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (253), (6, 8, 12, 16, 18, 23, 37), (42, 
3), 8, attribute_declaration_3'Access,
+            null);
+            Table.States (253).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (253).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 8)));
+            Add_Action (Table.States (254), 10, 32);
+            Add_Action (Table.States (254), 11, 33);
+            Add_Action (Table.States (254), 14, 34);
+            Add_Action (Table.States (254), 19, 9);
+            Add_Action (Table.States (254), 21, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (254), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (254), 30, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (254), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (254), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (254), 37, 36);
+            Add_Action (Table.States (254), 38, 37);
+            Add_Error (Table.States (254));
+            Add_Goto (Table.States (254), 41, 38);
+            Add_Goto (Table.States (254), 43, 39);
+            Add_Goto (Table.States (254), 44, 40);
+            Add_Goto (Table.States (254), 56, 41);
+            Add_Goto (Table.States (254), 57, 42);
+            Add_Goto (Table.States (254), 58, 43);
+            Add_Goto (Table.States (254), 59, 44);
+            Add_Goto (Table.States (254), 69, 45);
+            Add_Goto (Table.States (254), 70, 258);
+            Add_Goto (Table.States (254), 71, 47);
+            Table.States (254).Kernel := To_Vector ((0 => (41, 14, 1, False)));
+            Table.States (254).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 70, 0)));
+            Add_Action (Table.States (255), (4, 27, 34), (57, 0), 2, null, 
null);
+            Table.States (255).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (255).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (256), (4, 27, 34), (57, 1), 2, null, 
null);
+            Table.States (256).Kernel := To_Vector ((0 => (57, 41, 0, False)));
+            Table.States (256).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 57, 2)));
+            Add_Action (Table.States (257), (4, 27, 34), (71, 1), 2, null, 
null);
+            Table.States (257).Kernel := To_Vector ((0 => (71, 21, 0, False)));
+            Table.States (257).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 2)));
+            Add_Action (Table.States (258), 21, 276);
+            Add_Action (Table.States (258), 30, 67);
             Add_Error (Table.States (258));
-            Table.States (258).Minimal_Complete_Action := (Shift, 33, 268);
-            Table.States (259).Productions := WisiToken.To_Vector (((57, 1), 
(60, 0)));
-            Add_Action (Table.States (259), 12, 269);
-            Add_Action (Table.States (259), 30, 121);
+            Table.States (258).Kernel := To_Vector (((41, 70, 1, False), (70, 
70, 1, True)));
+            Table.States (258).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 276)));
+            Add_Action (Table.States (259), 37, 277);
             Add_Error (Table.States (259));
-            Table.States (259).Minimal_Complete_Action := (Shift, 12, 269);
-            Table.States (260).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (260), 7, 270);
+            Table.States (259).Kernel := To_Vector (((44, 33, 1, False), (44, 
33, 4, False)));
+            Table.States (259).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 277)));
+            Add_Action (Table.States (260), 36, 278);
             Add_Error (Table.States (260));
-            Table.States (260).Minimal_Complete_Action := (Shift, 7, 270);
-            Table.States (261).Productions := WisiToken.To_Vector (((57, 1), 
(61, 0)));
-            Add_Action (Table.States (261), 30, 186);
-            Add_Action (Table.States (261), 33, 271);
+            Table.States (260).Kernel := To_Vector ((0 => (42, 4, 2, False)));
+            Table.States (260).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 36, 278)));
+            Add_Action (Table.States (261), 4, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (261), 10, 227);
+            Add_Action (Table.States (261), 11, 228);
+            Add_Action (Table.States (261), 14, 229);
+            Add_Action (Table.States (261), 19, 9);
+            Add_Action (Table.States (261), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (261), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (261), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (261), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (261), 37, 230);
+            Add_Action (Table.States (261), 38, 231);
             Add_Error (Table.States (261));
-            Table.States (261).Minimal_Complete_Action := (Shift, 33, 271);
-            Table.States (262).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (262), 33, 272);
-            Add_Error (Table.States (262));
-            Table.States (262).Minimal_Complete_Action := (Shift, 33, 272);
-            Table.States (263).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (263), 9, 130);
-            Add_Action (Table.States (263), 10, 131);
-            Add_Action (Table.States (263), 13, 132);
-            Add_Action (Table.States (263), 18, 9);
-            Add_Action (Table.States (263), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (263), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (263), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (263), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (263), 35, 133);
-            Add_Action (Table.States (263), 36, 134);
+            Add_Goto (Table.States (261), 41, 232);
+            Add_Goto (Table.States (261), 43, 233);
+            Add_Goto (Table.States (261), 44, 234);
+            Add_Goto (Table.States (261), 57, 236);
+            Add_Goto (Table.States (261), 58, 237);
+            Add_Goto (Table.States (261), 59, 238);
+            Add_Goto (Table.States (261), 69, 239);
+            Add_Goto (Table.States (261), 71, 279);
+            Table.States (261).Kernel := To_Vector ((0 => (56, 27, 0, True)));
+            Table.States (261).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 71, 0)));
+            Table.States (261).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (262), (6, 8, 12, 16, 18, 23, 37), (42, 
1), 8, attribute_declaration_1'Access,
+            null);
+            Table.States (262).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (262).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 8)));
+            Add_Action (Table.States (263), 37, 280);
             Add_Error (Table.States (263));
-            Add_Goto (Table.States (263), 39, 135);
-            Add_Goto (Table.States (263), 41, 136);
-            Add_Goto (Table.States (263), 42, 137);
-            Add_Goto (Table.States (263), 54, 273);
-            Add_Goto (Table.States (263), 55, 139);
-            Add_Goto (Table.States (263), 56, 140);
-            Add_Goto (Table.States (263), 57, 141);
-            Add_Goto (Table.States (263), 67, 142);
-            Add_Goto (Table.States (263), 69, 143);
-            Table.States (263).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (264).Productions := WisiToken.To_Vector ((1 => (65, 
0)));
-            Add_Action (Table.States (264), (5, 7, 11, 15, 17, 22, 24, 35), 
(65, 0), 4,
-            simple_declarative_item_0'Access, null);
-            Table.States (264).Minimal_Complete_Action := (Reduce, 65, 4);
-            Table.States (265).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (265), 5, 274);
-            Add_Error (Table.States (265));
-            Table.States (265).Minimal_Complete_Action := (Shift, 5, 274);
-            Table.States (266).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (266), 23, 275);
+            Table.States (263).Kernel := To_Vector ((0 => (59, 31, 1, True)));
+            Table.States (263).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 37, 280)));
+            Table.States (263).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (264), 34, 281);
+            Add_Error (Table.States (264));
+            Table.States (264).Kernel := To_Vector ((0 => (62, 58, 1, False)));
+            Table.States (264).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 281)));
+            Add_Action (Table.States (265), (27, 34), (44, 1), 6, null, null);
+            Table.States (265).Kernel := To_Vector ((0 => (44, 21, 0, False)));
+            Table.States (265).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 6)));
+            Add_Action (Table.States (266), 8, Reduce, (47, 0), 0, null, null);
+            Add_Action (Table.States (266), 25, 147);
+            Add_Conflict (Table.States (266), 25, (47, 0), 0, null, null);
             Add_Error (Table.States (266));
-            Table.States (266).Minimal_Complete_Action := (Shift, 23, 275);
-            Table.States (267).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (267), 23, 276);
+            Add_Goto (Table.States (266), 46, 148);
+            Add_Goto (Table.States (266), 47, 282);
+            Table.States (266).Kernel := To_Vector ((0 => (45, 13, 3, False)));
+            Table.States (266).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 47, 0)));
+            Add_Action (Table.States (267), 38, 283);
             Add_Error (Table.States (267));
-            Table.States (267).Minimal_Complete_Action := (Shift, 23, 276);
-            Table.States (268).Productions := WisiToken.To_Vector ((1 => (40, 
0)));
-            Add_Action (Table.States (268), (5, 7, 11, 15, 17, 22, 24, 35), 
(40, 0), 5, attribute_declaration_0'Access,
-            null);
-            Table.States (268).Minimal_Complete_Action := (Reduce, 40, 5);
-            Table.States (269).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (269), 5, 85);
-            Add_Action (Table.States (269), 7, Reduce, (51, 0), 0, null, null);
-            Add_Action (Table.States (269), 11, 86);
-            Add_Action (Table.States (269), 15, 87);
-            Add_Action (Table.States (269), 17, 88);
-            Add_Action (Table.States (269), 22, 89);
-            Add_Action (Table.States (269), 35, 90);
+            Table.States (267).Kernel := To_Vector ((0 => (42, 14, 4, False)));
+            Table.States (267).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 283)));
+            Add_Action (Table.States (268), 17, 152);
+            Add_Action (Table.States (268), 21, Reduce, (54, 0), 0, null, 
null);
+            Add_Action (Table.States (268), 38, 153);
+            Add_Error (Table.States (268));
+            Add_Goto (Table.States (268), 54, 284);
+            Table.States (268).Kernel := To_Vector (((42, 14, 3, False), (42, 
14, 5, False)));
+            Table.States (268).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 54, 0)));
+            Add_Action (Table.States (269), 10, 130);
+            Add_Action (Table.States (269), 11, 131);
+            Add_Action (Table.States (269), 14, 132);
+            Add_Action (Table.States (269), 19, 9);
+            Add_Action (Table.States (269), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (269), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (269), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (269), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (269), 37, 133);
+            Add_Action (Table.States (269), 38, 134);
             Add_Error (Table.States (269));
-            Add_Goto (Table.States (269), 40, 91);
-            Add_Goto (Table.States (269), 43, 92);
-            Add_Goto (Table.States (269), 49, 93);
-            Add_Goto (Table.States (269), 50, 94);
-            Add_Goto (Table.States (269), 51, 277);
-            Add_Goto (Table.States (269), 58, 96);
-            Add_Goto (Table.States (269), 59, 97);
-            Add_Goto (Table.States (269), 60, 98);
-            Add_Goto (Table.States (269), 61, 99);
-            Add_Goto (Table.States (269), 65, 100);
-            Add_Goto (Table.States (269), 70, 101);
-            Table.States (269).Minimal_Complete_Action := (Reduce, 51, 0);
-            Table.States (270).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (270), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (270), 35, 144);
+            Add_Goto (Table.States (269), 41, 135);
+            Add_Goto (Table.States (269), 43, 136);
+            Add_Goto (Table.States (269), 44, 137);
+            Add_Goto (Table.States (269), 56, 285);
+            Add_Goto (Table.States (269), 57, 139);
+            Add_Goto (Table.States (269), 58, 140);
+            Add_Goto (Table.States (269), 59, 141);
+            Add_Goto (Table.States (269), 69, 142);
+            Add_Goto (Table.States (269), 71, 143);
+            Table.States (269).Kernel := To_Vector ((0 => (42, 24, 1, False)));
+            Table.States (269).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (270), 13, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (270), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (270), 37, 105);
             Add_Error (Table.States (270));
-            Add_Goto (Table.States (270), 56, 278);
-            Table.States (270).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (271).Productions := WisiToken.To_Vector ((1 => (61, 
0)));
-            Add_Action (Table.States (271), (5, 7, 11, 15, 17, 22, 24, 35), 
(61, 0), 5, package_renaming_0'Access,
-            null);
-            Table.States (271).Minimal_Complete_Action := (Reduce, 61, 5);
-            Table.States (272).Productions := WisiToken.To_Vector ((1 => (70, 
0)));
-            Add_Action (Table.States (272), (5, 7, 11, 15, 17, 22, 24, 35), 
(70, 0), 5,
-            typed_string_declaration_0'Access, null);
-            Table.States (272).Minimal_Complete_Action := (Reduce, 70, 5);
-            Table.States (273).Productions := WisiToken.To_Vector (((54, 1), 
(65, 1)));
-            Add_Action (Table.States (273), 26, 170);
-            Add_Action (Table.States (273), 33, 279);
+            Add_Goto (Table.States (270), 58, 106);
+            Add_Goto (Table.States (270), 59, 286);
+            Table.States (270).Kernel := To_Vector ((0 => (62, 9, 3, False)));
+            Table.States (270).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (271), 6, 85);
+            Add_Action (Table.States (271), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (271), 12, 86);
+            Add_Action (Table.States (271), 16, 87);
+            Add_Action (Table.States (271), 18, 88);
+            Add_Action (Table.States (271), 23, 89);
+            Add_Action (Table.States (271), 37, 90);
+            Add_Error (Table.States (271));
+            Add_Goto (Table.States (271), 42, 91);
+            Add_Goto (Table.States (271), 45, 92);
+            Add_Goto (Table.States (271), 51, 93);
+            Add_Goto (Table.States (271), 52, 94);
+            Add_Goto (Table.States (271), 53, 287);
+            Add_Goto (Table.States (271), 60, 96);
+            Add_Goto (Table.States (271), 61, 97);
+            Add_Goto (Table.States (271), 62, 98);
+            Add_Goto (Table.States (271), 63, 99);
+            Add_Goto (Table.States (271), 67, 100);
+            Add_Goto (Table.States (271), 72, 101);
+            Table.States (271).Kernel := To_Vector ((0 => (61, 13, 2, False)));
+            Table.States (271).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (272), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (272), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (272), 37, 158);
+            Add_Error (Table.States (272));
+            Add_Goto (Table.States (272), 58, 159);
+            Add_Goto (Table.States (272), 59, 288);
+            Table.States (272).Kernel := To_Vector ((0 => (63, 20, 1, False)));
+            Table.States (272).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 0)));
+            Add_Action (Table.States (273), 14, 161);
             Add_Error (Table.States (273));
-            Table.States (273).Minimal_Complete_Action := (Shift, 33, 279);
-            Table.States (274).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (274), 33, 280);
+            Add_Goto (Table.States (273), 41, 289);
+            Table.States (273).Kernel := To_Vector ((0 => (72, 13, 3, False)));
+            Table.States (273).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 14, 161)));
+            Add_Action (Table.States (274), 29, 290);
             Add_Error (Table.States (274));
-            Table.States (274).Minimal_Complete_Action := (Shift, 33, 280);
-            Table.States (275).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (275), 9, 130);
-            Add_Action (Table.States (275), 10, 131);
-            Add_Action (Table.States (275), 13, 132);
-            Add_Action (Table.States (275), 18, 9);
-            Add_Action (Table.States (275), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (275), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (275), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (275), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (275), 35, 133);
-            Add_Action (Table.States (275), 36, 134);
+            Table.States (274).Kernel := To_Vector ((0 => (67, 37, 2, False)));
+            Table.States (274).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 29, 290)));
+            Add_Action (Table.States (275), 27, 170);
+            Add_Action (Table.States (275), 34, 291);
             Add_Error (Table.States (275));
-            Add_Goto (Table.States (275), 39, 135);
-            Add_Goto (Table.States (275), 41, 136);
-            Add_Goto (Table.States (275), 42, 137);
-            Add_Goto (Table.States (275), 54, 281);
-            Add_Goto (Table.States (275), 55, 139);
-            Add_Goto (Table.States (275), 56, 140);
-            Add_Goto (Table.States (275), 57, 141);
-            Add_Goto (Table.States (275), 67, 142);
-            Add_Goto (Table.States (275), 69, 143);
-            Table.States (275).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (276).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (276), 9, 130);
-            Add_Action (Table.States (276), 10, 131);
-            Add_Action (Table.States (276), 13, 132);
-            Add_Action (Table.States (276), 18, 9);
-            Add_Action (Table.States (276), 26, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (276), 30, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (276), 32, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (276), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (276), 35, 133);
-            Add_Action (Table.States (276), 36, 134);
-            Add_Error (Table.States (276));
-            Add_Goto (Table.States (276), 39, 135);
-            Add_Goto (Table.States (276), 41, 136);
-            Add_Goto (Table.States (276), 42, 137);
-            Add_Goto (Table.States (276), 54, 282);
-            Add_Goto (Table.States (276), 55, 139);
-            Add_Goto (Table.States (276), 56, 140);
-            Add_Goto (Table.States (276), 57, 141);
-            Add_Goto (Table.States (276), 67, 142);
-            Add_Goto (Table.States (276), 69, 143);
-            Table.States (276).Minimal_Complete_Action := (Reduce, 54, 0);
-            Table.States (277).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (277), 7, 283);
+            Table.States (275).Kernel := To_Vector (((56, 56, 1, True), (67, 
56, 1, False)));
+            Table.States (275).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 291)));
+            Add_Action (Table.States (276), (4, 27, 34), (41, 0), 3, 
aggregate_g_0'Access, null);
+            Table.States (276).Kernel := To_Vector ((0 => (41, 21, 0, False)));
+            Table.States (276).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 41, 3)));
+            Add_Action (Table.States (277), 4, Reduce, (44, 0), 3, null, null);
+            Add_Action (Table.States (277), 14, 292);
+            Add_Action (Table.States (277), 27, Reduce, (44, 0), 3, null, 
null);
+            Add_Action (Table.States (277), 34, Reduce, (44, 0), 3, null, 
null);
             Add_Error (Table.States (277));
-            Table.States (277).Minimal_Complete_Action := (Shift, 7, 283);
-            Table.States (278).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (278), 33, 284);
+            Table.States (277).Kernel := To_Vector (((44, 37, 0, False), (44, 
37, 3, False)));
+            Table.States (277).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 3)));
+            Add_Action (Table.States (278), 34, 293);
             Add_Error (Table.States (278));
-            Table.States (278).Minimal_Complete_Action := (Shift, 33, 284);
-            Table.States (279).Productions := WisiToken.To_Vector ((1 => (65, 
1)));
-            Add_Action (Table.States (279), (5, 7, 11, 15, 17, 22, 24, 35), 
(65, 1), 6,
-            simple_declarative_item_1'Access, null);
-            Table.States (279).Minimal_Complete_Action := (Reduce, 65, 6);
-            Table.States (280).Productions := WisiToken.To_Vector ((1 => (43, 
0)));
-            Add_Action (Table.States (280), (5, 7, 11, 15, 17, 22, 24, 35), 
(43, 0), 7, case_statement_0'Access, null);
-            Table.States (280).Minimal_Complete_Action := (Reduce, 43, 7);
-            Table.States (281).Productions := WisiToken.To_Vector (((40, 2), 
(54, 1)));
-            Add_Action (Table.States (281), 26, 170);
-            Add_Action (Table.States (281), 33, 285);
-            Add_Error (Table.States (281));
-            Table.States (281).Minimal_Complete_Action := (Shift, 33, 285);
-            Table.States (282).Productions := WisiToken.To_Vector (((40, 1), 
(54, 1)));
-            Add_Action (Table.States (282), 26, 170);
-            Add_Action (Table.States (282), 33, 286);
+            Table.States (278).Kernel := To_Vector ((0 => (42, 36, 1, False)));
+            Table.States (278).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 293)));
+            Add_Action (Table.States (279), (4, 27, 34), (56, 1), 3, null, 
null);
+            Table.States (279).Kernel := To_Vector ((0 => (56, 71, 0, True)));
+            Table.States (279).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 3)));
+            Table.States (279).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (280), (4, 27, 31, 33, 34), (59, 1), 3, 
null, null);
+            Table.States (280).Kernel := To_Vector ((0 => (59, 37, 0, True)));
+            Table.States (280).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 59, 3)));
+            Table.States (280).Minimal_Complete_Actions_Recursive := True;
+            Add_Action (Table.States (281), (6, 8, 12, 16, 18, 23, 37), (62, 
0), 9, package_extension_0'Access,
+            package_extension_0_check'Access);
+            Table.States (281).Kernel := To_Vector ((0 => (62, 34, 0, False)));
+            Table.States (281).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 62, 9)));
+            Add_Action (Table.States (282), 8, 294);
+            Add_Action (Table.States (282), 25, 147);
             Add_Error (Table.States (282));
-            Table.States (282).Minimal_Complete_Action := (Shift, 33, 286);
-            Table.States (283).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (283), 33, Reduce, (56, 0), 0, null, 
null);
-            Add_Action (Table.States (283), 35, 144);
+            Add_Goto (Table.States (282), 46, 180);
+            Table.States (282).Kernel := To_Vector (((45, 47, 3, False), (47, 
47, 2, True)));
+            Table.States (282).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 294)));
+            Add_Action (Table.States (283), 21, 295);
             Add_Error (Table.States (283));
-            Add_Goto (Table.States (283), 56, 287);
-            Table.States (283).Minimal_Complete_Action := (Reduce, 56, 0);
-            Table.States (284).Productions := WisiToken.To_Vector ((1 => (59, 
0)));
-            Add_Action (Table.States (284), (5, 7, 11, 15, 17, 22, 24, 35), 
(59, 0), 7, package_spec_0'Access,
+            Table.States (283).Kernel := To_Vector ((0 => (42, 38, 3, False)));
+            Table.States (283).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 295)));
+            Add_Action (Table.States (284), 21, 296);
+            Add_Error (Table.States (284));
+            Table.States (284).Kernel := To_Vector (((42, 54, 3, False), (42, 
54, 5, False)));
+            Table.States (284).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 296)));
+            Add_Action (Table.States (285), 27, 170);
+            Add_Action (Table.States (285), 34, 297);
+            Add_Error (Table.States (285));
+            Table.States (285).Kernel := To_Vector (((42, 56, 1, False), (56, 
56, 1, True)));
+            Table.States (285).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 297)));
+            Add_Action (Table.States (286), 13, 298);
+            Add_Action (Table.States (286), 31, 121);
+            Add_Error (Table.States (286));
+            Table.States (286).Kernel := To_Vector (((59, 59, 2, True), (62, 
59, 3, False)));
+            Table.States (286).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 13, 298)));
+            Add_Action (Table.States (287), 8, 299);
+            Add_Error (Table.States (287));
+            Table.States (287).Kernel := To_Vector ((0 => (61, 53, 2, False)));
+            Table.States (287).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 299)));
+            Add_Action (Table.States (288), 31, 186);
+            Add_Action (Table.States (288), 34, 300);
+            Add_Error (Table.States (288));
+            Table.States (288).Kernel := To_Vector (((59, 59, 2, True), (63, 
59, 1, False)));
+            Table.States (288).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 300)));
+            Add_Action (Table.States (289), 34, 301);
+            Add_Error (Table.States (289));
+            Table.States (289).Kernel := To_Vector ((0 => (72, 41, 1, False)));
+            Table.States (289).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 301)));
+            Add_Action (Table.States (290), 10, 130);
+            Add_Action (Table.States (290), 11, 131);
+            Add_Action (Table.States (290), 14, 132);
+            Add_Action (Table.States (290), 19, 9);
+            Add_Action (Table.States (290), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (290), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (290), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (290), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (290), 37, 133);
+            Add_Action (Table.States (290), 38, 134);
+            Add_Error (Table.States (290));
+            Add_Goto (Table.States (290), 41, 135);
+            Add_Goto (Table.States (290), 43, 136);
+            Add_Goto (Table.States (290), 44, 137);
+            Add_Goto (Table.States (290), 56, 302);
+            Add_Goto (Table.States (290), 57, 139);
+            Add_Goto (Table.States (290), 58, 140);
+            Add_Goto (Table.States (290), 59, 141);
+            Add_Goto (Table.States (290), 69, 142);
+            Add_Goto (Table.States (290), 71, 143);
+            Table.States (290).Kernel := To_Vector ((0 => (67, 29, 1, False)));
+            Table.States (290).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (291), (6, 8, 12, 16, 18, 23, 25, 37), 
(67, 0), 4,
+            simple_declarative_item_0'Access, null);
+            Table.States (291).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (291).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 4)));
+            Add_Action (Table.States (292), 38, 303);
+            Add_Error (Table.States (292));
+            Table.States (292).Kernel := To_Vector ((0 => (44, 14, 2, False)));
+            Table.States (292).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 38, 303)));
+            Add_Action (Table.States (293), (6, 8, 12, 16, 18, 23, 37), (42, 
2), 10, attribute_declaration_2'Access,
+            null);
+            Table.States (293).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (293).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 10)));
+            Add_Action (Table.States (294), 6, 304);
+            Add_Error (Table.States (294));
+            Table.States (294).Kernel := To_Vector ((0 => (45, 8, 2, False)));
+            Table.States (294).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 6, 304)));
+            Add_Action (Table.States (295), 24, 305);
+            Add_Error (Table.States (295));
+            Table.States (295).Kernel := To_Vector ((0 => (42, 21, 2, False)));
+            Table.States (295).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 305)));
+            Add_Action (Table.States (296), 24, 306);
+            Add_Error (Table.States (296));
+            Table.States (296).Kernel := To_Vector (((42, 21, 2, False), (42, 
21, 4, False)));
+            Table.States (296).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 24, 306)));
+            Add_Action (Table.States (297), (6, 8, 12, 16, 18, 23, 25, 37), 
(42, 0), 5, attribute_declaration_0'Access,
+            null);
+            Table.States (297).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (297).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 5)));
+            Add_Action (Table.States (298), 6, 85);
+            Add_Action (Table.States (298), 8, Reduce, (53, 0), 0, null, null);
+            Add_Action (Table.States (298), 12, 86);
+            Add_Action (Table.States (298), 16, 87);
+            Add_Action (Table.States (298), 18, 88);
+            Add_Action (Table.States (298), 23, 89);
+            Add_Action (Table.States (298), 37, 90);
+            Add_Error (Table.States (298));
+            Add_Goto (Table.States (298), 42, 91);
+            Add_Goto (Table.States (298), 45, 92);
+            Add_Goto (Table.States (298), 51, 93);
+            Add_Goto (Table.States (298), 52, 94);
+            Add_Goto (Table.States (298), 53, 307);
+            Add_Goto (Table.States (298), 60, 96);
+            Add_Goto (Table.States (298), 61, 97);
+            Add_Goto (Table.States (298), 62, 98);
+            Add_Goto (Table.States (298), 63, 99);
+            Add_Goto (Table.States (298), 67, 100);
+            Add_Goto (Table.States (298), 72, 101);
+            Table.States (298).Kernel := To_Vector ((0 => (62, 13, 2, False)));
+            Table.States (298).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 53, 0)));
+            Add_Action (Table.States (299), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (299), 37, 144);
+            Add_Error (Table.States (299));
+            Add_Goto (Table.States (299), 58, 308);
+            Table.States (299).Kernel := To_Vector ((0 => (61, 8, 1, False)));
+            Table.States (299).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (300), (6, 8, 12, 16, 18, 23, 25, 37), 
(63, 0), 5, package_renaming_0'Access,
+            null);
+            Table.States (300).Kernel := To_Vector ((0 => (63, 34, 0, False)));
+            Table.States (300).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 63, 5)));
+            Add_Action (Table.States (301), (6, 8, 12, 16, 18, 23, 25, 37), 
(72, 0), 5,
+            typed_string_declaration_0'Access, null);
+            Table.States (301).Kernel := To_Vector ((0 => (72, 34, 0, False)));
+            Table.States (301).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 72, 5)));
+            Add_Action (Table.States (302), 27, 170);
+            Add_Action (Table.States (302), 34, 309);
+            Add_Error (Table.States (302));
+            Table.States (302).Kernel := To_Vector (((56, 56, 1, True), (67, 
56, 1, False)));
+            Table.States (302).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 309)));
+            Add_Action (Table.States (303), 21, 310);
+            Add_Error (Table.States (303));
+            Table.States (303).Kernel := To_Vector ((0 => (44, 38, 1, False)));
+            Table.States (303).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 21, 310)));
+            Add_Action (Table.States (304), 34, 311);
+            Add_Error (Table.States (304));
+            Table.States (304).Kernel := To_Vector ((0 => (45, 6, 1, False)));
+            Table.States (304).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 311)));
+            Add_Action (Table.States (305), 10, 130);
+            Add_Action (Table.States (305), 11, 131);
+            Add_Action (Table.States (305), 14, 132);
+            Add_Action (Table.States (305), 19, 9);
+            Add_Action (Table.States (305), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (305), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (305), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (305), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (305), 37, 133);
+            Add_Action (Table.States (305), 38, 134);
+            Add_Error (Table.States (305));
+            Add_Goto (Table.States (305), 41, 135);
+            Add_Goto (Table.States (305), 43, 136);
+            Add_Goto (Table.States (305), 44, 137);
+            Add_Goto (Table.States (305), 56, 312);
+            Add_Goto (Table.States (305), 57, 139);
+            Add_Goto (Table.States (305), 58, 140);
+            Add_Goto (Table.States (305), 59, 141);
+            Add_Goto (Table.States (305), 69, 142);
+            Add_Goto (Table.States (305), 71, 143);
+            Table.States (305).Kernel := To_Vector ((0 => (42, 24, 1, False)));
+            Table.States (305).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (306), 4, Reduce, (58, 0), 0, null, null);
+            Add_Action (Table.States (306), 10, 227);
+            Add_Action (Table.States (306), 11, 228);
+            Add_Action (Table.States (306), 14, 229);
+            Add_Action (Table.States (306), 19, 9);
+            Add_Action (Table.States (306), 27, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (306), 31, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (306), 33, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (306), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (306), 37, 230);
+            Add_Action (Table.States (306), 38, 231);
+            Add_Error (Table.States (306));
+            Add_Goto (Table.States (306), 41, 232);
+            Add_Goto (Table.States (306), 43, 233);
+            Add_Goto (Table.States (306), 44, 234);
+            Add_Goto (Table.States (306), 56, 313);
+            Add_Goto (Table.States (306), 57, 236);
+            Add_Goto (Table.States (306), 58, 237);
+            Add_Goto (Table.States (306), 59, 238);
+            Add_Goto (Table.States (306), 69, 239);
+            Add_Goto (Table.States (306), 71, 240);
+            Table.States (306).Kernel := To_Vector (((42, 24, 1, False), (42, 
24, 3, False)));
+            Table.States (306).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 56, 0)));
+            Add_Action (Table.States (307), 8, 314);
+            Add_Error (Table.States (307));
+            Table.States (307).Kernel := To_Vector ((0 => (62, 53, 2, False)));
+            Table.States (307).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 8, 314)));
+            Add_Action (Table.States (308), 34, 315);
+            Add_Error (Table.States (308));
+            Table.States (308).Kernel := To_Vector ((0 => (61, 58, 1, False)));
+            Table.States (308).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 315)));
+            Add_Action (Table.States (309), (6, 8, 12, 16, 18, 23, 25, 37), 
(67, 1), 6,
+            simple_declarative_item_1'Access, null);
+            Table.States (309).Kernel := To_Vector ((0 => (67, 34, 0, False)));
+            Table.States (309).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 67, 6)));
+            Add_Action (Table.States (310), (4, 27, 34), (44, 1), 6, null, 
null);
+            Table.States (310).Kernel := To_Vector ((0 => (44, 21, 0, False)));
+            Table.States (310).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 44, 6)));
+            Add_Action (Table.States (311), (6, 8, 12, 16, 18, 23, 25, 37), 
(45, 0), 7, case_statement_0'Access, null);
+            Table.States (311).Kernel := To_Vector ((0 => (45, 34, 0, False)));
+            Table.States (311).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 45, 7)));
+            Add_Action (Table.States (312), 27, 170);
+            Add_Action (Table.States (312), 34, 316);
+            Add_Error (Table.States (312));
+            Table.States (312).Kernel := To_Vector (((42, 56, 1, False), (56, 
56, 1, True)));
+            Table.States (312).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 316)));
+            Add_Action (Table.States (313), 4, 317);
+            Add_Action (Table.States (313), 27, 261);
+            Add_Action (Table.States (313), 34, 318);
+            Add_Error (Table.States (313));
+            Table.States (313).Kernel := To_Vector (((42, 56, 1, False), (42, 
56, 3, False), (56, 56, 1, True)));
+            Table.States (313).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 318)));
+            Add_Action (Table.States (314), 34, Reduce, (58, 0), 0, null, 
null);
+            Add_Action (Table.States (314), 37, 144);
+            Add_Error (Table.States (314));
+            Add_Goto (Table.States (314), 58, 319);
+            Table.States (314).Kernel := To_Vector ((0 => (62, 8, 1, False)));
+            Table.States (314).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 58, 0)));
+            Add_Action (Table.States (315), (6, 8, 12, 16, 18, 23, 25, 37), 
(61, 0), 7, package_spec_0'Access,
             package_spec_0_check'Access);
-            Table.States (284).Minimal_Complete_Action := (Reduce, 59, 7);
-            Table.States (285).Productions := WisiToken.To_Vector ((1 => (40, 
2)));
-            Add_Action (Table.States (285), (5, 7, 11, 15, 17, 22, 24, 35), 
(40, 2), 8, attribute_declaration_2'Access,
+            Table.States (315).Kernel := To_Vector ((0 => (61, 34, 0, False)));
+            Table.States (315).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 61, 7)));
+            Add_Action (Table.States (316), (6, 8, 12, 16, 18, 23, 25, 37), 
(42, 3), 8, attribute_declaration_3'Access,
             null);
-            Table.States (285).Minimal_Complete_Action := (Reduce, 40, 8);
-            Table.States (286).Productions := WisiToken.To_Vector ((1 => (40, 
1)));
-            Add_Action (Table.States (286), (5, 7, 11, 15, 17, 22, 24, 35), 
(40, 1), 8, attribute_declaration_1'Access,
+            Table.States (316).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (316).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 8)));
+            Add_Action (Table.States (317), 36, 320);
+            Add_Error (Table.States (317));
+            Table.States (317).Kernel := To_Vector ((0 => (42, 4, 2, False)));
+            Table.States (317).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 36, 320)));
+            Add_Action (Table.States (318), (6, 8, 12, 16, 18, 23, 25, 37), 
(42, 1), 8, attribute_declaration_1'Access,
             null);
-            Table.States (286).Minimal_Complete_Action := (Reduce, 40, 8);
-            Table.States (287).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (287), 33, 288);
-            Add_Error (Table.States (287));
-            Table.States (287).Minimal_Complete_Action := (Shift, 33, 288);
-            Table.States (288).Productions := WisiToken.To_Vector ((1 => (60, 
0)));
-            Add_Action (Table.States (288), (5, 7, 11, 15, 17, 22, 24, 35), 
(60, 0), 9, package_extension_0'Access,
+            Table.States (318).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (318).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 8)));
+            Add_Action (Table.States (319), 34, 321);
+            Add_Error (Table.States (319));
+            Table.States (319).Kernel := To_Vector ((0 => (62, 58, 1, False)));
+            Table.States (319).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 321)));
+            Add_Action (Table.States (320), 34, 322);
+            Add_Error (Table.States (320));
+            Table.States (320).Kernel := To_Vector ((0 => (42, 36, 1, False)));
+            Table.States (320).Minimal_Complete_Actions := To_Vector ((0 => 
(Shift, 34, 322)));
+            Add_Action (Table.States (321), (6, 8, 12, 16, 18, 23, 25, 37), 
(62, 0), 9, package_extension_0'Access,
             package_extension_0_check'Access);
-            Table.States (288).Minimal_Complete_Action := (Reduce, 60, 9);
+            Table.States (321).Kernel := To_Vector ((0 => (62, 34, 0, False)));
+            Table.States (321).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 62, 9)));
+            Add_Action (Table.States (322), (6, 8, 12, 16, 18, 23, 25, 37), 
(42, 2), 10,
+            attribute_declaration_2'Access, null);
+            Table.States (322).Kernel := To_Vector ((0 => (42, 34, 0, False)));
+            Table.States (322).Minimal_Complete_Actions := To_Vector ((0 => 
(Reduce, 42, 10)));
          end Subr_3;
       begin
          Subr_1;
@@ -1898,7 +2133,7 @@ package body Gpr_Process_LR1_Main is
          Lexer.New_Lexer (Trace.Descriptor),
          Table,
          Language_Fixes,
-         Language_Use_Minimal_Complete_Actions,
+         Language_Matching_Begin_Tokens,
          Language_String_ID_Set,
          User_Data,
          Max_Parallel         => 15,
diff --git a/packages/ada-mode/gpr_process_lr1_main.ads 
b/packages/ada-mode/gpr_process_lr1_main.ads
index 272485c..e3ea47c 100644
--- a/packages/ada-mode/gpr_process_lr1_main.ads
+++ b/packages/ada-mode/gpr_process_lr1_main.ads
@@ -22,11 +22,10 @@ with WisiToken.Parse.LR.Parser;
 package Gpr_Process_LR1_Main is
 
    procedure Create_Parser
-     (Parser                       :    out WisiToken.Parse.LR.Parser.Parser;
-      Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in
-     WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+     (Parser                         :    out WisiToken.Parse.LR.Parser.Parser;
+      Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in     
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access);
 
diff --git a/packages/ada-mode/gpr_re2c.c b/packages/ada-mode/gpr_re2c.c
index d773f4e..107372e 100644
--- a/packages/ada-mode/gpr_re2c.c
+++ b/packages/ada-mode/gpr_re2c.c
@@ -124,7 +124,7 @@ int gpr_next_token
    *id = -1;
    if (lexer->cursor > lexer->buffer_last)
    {
-      *id            = 37;
+      *id            = 39;
       *byte_position = lexer->buffer_last - lexer->buffer + 1;
       *byte_length   = 0;
       *char_position = lexer->char_token_start;
@@ -163,11 +163,21 @@ int gpr_next_token
        case ',':       goto yy20;
        case '-':       goto yy22;
        case '.':       goto yy23;
-       case ':':       goto yy25;
-       case ';':       goto yy27;
-       case '=':       goto yy29;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       goto yy25;
+       case ':':       goto yy28;
+       case ';':       goto yy30;
+       case '=':       goto yy32;
        case 'A':
-       case 'a':       goto yy30;
+       case 'a':       goto yy33;
        case 'B':
        case 'D':
        case 'G':
@@ -191,34 +201,34 @@ int gpr_next_token
        case 'v':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
+       case 'z':       goto yy35;
        case 'C':
-       case 'c':       goto yy34;
+       case 'c':       goto yy37;
        case 'E':
-       case 'e':       goto yy35;
+       case 'e':       goto yy38;
        case 'F':
-       case 'f':       goto yy36;
+       case 'f':       goto yy39;
        case 'I':
-       case 'i':       goto yy37;
+       case 'i':       goto yy40;
        case 'L':
-       case 'l':       goto yy38;
+       case 'l':       goto yy41;
        case 'N':
-       case 'n':       goto yy39;
+       case 'n':       goto yy42;
        case 'O':
-       case 'o':       goto yy40;
+       case 'o':       goto yy43;
        case 'P':
-       case 'p':       goto yy41;
+       case 'p':       goto yy44;
        case 'R':
-       case 'r':       goto yy42;
+       case 'r':       goto yy45;
        case 'S':
-       case 's':       goto yy43;
+       case 's':       goto yy46;
        case 'T':
-       case 't':       goto yy44;
+       case 't':       goto yy47;
        case 'U':
-       case 'u':       goto yy45;
+       case 'u':       goto yy48;
        case 'W':
-       case 'w':       goto yy46;
-       case '|':       goto yy47;
+       case 'w':       goto yy49;
+       case '|':       goto yy50;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -248,8 +258,8 @@ int gpr_next_token
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy49;
-       case 0xE0:      goto yy50;
+       case 0xDF:      goto yy52;
+       case 0xE0:      goto yy53;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -264,12 +274,12 @@ int gpr_next_token
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy51;
-       case 0xF0:      goto yy52;
+       case 0xEF:      goto yy54;
+       case 0xF0:      goto yy55;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy53;
-       case 0xF4:      goto yy54;
+       case 0xF3:      goto yy56;
+       case 0xF4:      goto yy57;
        default:        goto yy2;
        }
 yy2:
@@ -277,21 +287,21 @@ yy2:
        YYSKIP ();
 yy3:
        YYDEBUG(3, YYPEEK ());
-#line 231 "../gpr.re2c"
+#line 235 "../gpr.re2c"
        {status = ERROR_unrecognized_character; continue;}
-#line 283 "../gpr_re2c.c"
+#line 293 "../gpr_re2c.c"
 yy4:
        YYDEBUG(4, YYPEEK ());
        YYSKIP ();
        YYDEBUG(5, YYPEEK ());
-#line 229 "../gpr.re2c"
-       {*id =  37; continue;}
-#line 290 "../gpr_re2c.c"
+#line 233 "../gpr.re2c"
+       {*id =  39; continue;}
+#line 300 "../gpr_re2c.c"
 yy6:
        YYDEBUG(6, YYPEEK ());
        YYSKIP ();
        YYDEBUG(7, YYPEEK ());
-#line 186 "../gpr.re2c"
+#line 188 "../gpr.re2c"
        { lexer->byte_token_start = lexer->cursor;
           lexer->char_token_start = lexer->char_pos;
           if (*lexer->cursor == 0x0A)
@@ -299,14 +309,14 @@ yy6:
           else
              lexer->line_token_start = lexer->line;
           continue; }
-#line 303 "../gpr_re2c.c"
+#line 313 "../gpr_re2c.c"
 yy8:
        YYDEBUG(8, YYPEEK ());
        YYSKIP ();
        YYDEBUG(9, YYPEEK ());
-#line 193 "../gpr.re2c"
+#line 195 "../gpr.re2c"
        {*id =  1; continue;}
-#line 310 "../gpr_re2c.c"
+#line 320 "../gpr_re2c.c"
 yy10:
        YYDEBUG(10, YYPEEK ());
        YYSKIP ();
@@ -468,113 +478,138 @@ yy11:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy56;
+       case 0xF4:      goto yy59;
        default:        goto yy3;
        }
 yy12:
        YYDEBUG(12, YYPEEK ());
        YYSKIP ();
        YYDEBUG(13, YYPEEK ());
-#line 218 "../gpr.re2c"
-       {*id =  26; continue;}
-#line 481 "../gpr_re2c.c"
+#line 221 "../gpr.re2c"
+       {*id =  27; continue;}
+#line 491 "../gpr_re2c.c"
 yy14:
        YYDEBUG(14, YYPEEK ());
        YYSKIP ();
        YYDEBUG(15, YYPEEK ());
-#line 224 "../gpr.re2c"
-       {*id =  32; continue;}
-#line 488 "../gpr_re2c.c"
+#line 227 "../gpr.re2c"
+       {*id =  33; continue;}
+#line 498 "../gpr_re2c.c"
 yy16:
        YYDEBUG(16, YYPEEK ());
        YYSKIP ();
        YYDEBUG(17, YYPEEK ());
-#line 205 "../gpr.re2c"
-       {*id =  13; continue;}
-#line 495 "../gpr_re2c.c"
+#line 208 "../gpr.re2c"
+       {*id =  14; continue;}
+#line 505 "../gpr_re2c.c"
 yy18:
        YYDEBUG(18, YYPEEK ());
        YYSKIP ();
        YYDEBUG(19, YYPEEK ());
-#line 212 "../gpr.re2c"
-       {*id =  20; continue;}
-#line 502 "../gpr_re2c.c"
+#line 215 "../gpr.re2c"
+       {*id =  21; continue;}
+#line 512 "../gpr_re2c.c"
 yy20:
        YYDEBUG(20, YYPEEK ());
        YYSKIP ();
        YYDEBUG(21, YYPEEK ());
-#line 221 "../gpr.re2c"
-       {*id =  29; continue;}
-#line 509 "../gpr_re2c.c"
+#line 224 "../gpr.re2c"
+       {*id =  30; continue;}
+#line 519 "../gpr_re2c.c"
 yy22:
        YYDEBUG(22, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '-':       goto yy66;
+       case '-':       goto yy69;
        default:        goto yy3;
        }
 yy23:
        YYDEBUG(23, YYPEEK ());
        YYSKIP ();
        YYDEBUG(24, YYPEEK ());
-#line 222 "../gpr.re2c"
-       {*id =  30; continue;}
-#line 524 "../gpr_re2c.c"
+#line 225 "../gpr.re2c"
+       {*id =  31; continue;}
+#line 534 "../gpr_re2c.c"
 yy25:
        YYDEBUG(25, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
+       YYDEBUG(26, YYPEEK ());
        switch (yych) {
-       case '=':       goto yy69;
-       default:        goto yy26;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       goto yy25;
+       default:        goto yy27;
        }
-yy26:
-       YYDEBUG(26, YYPEEK ());
-#line 219 "../gpr.re2c"
-       {*id =  27; continue;}
-#line 537 "../gpr_re2c.c"
 yy27:
        YYDEBUG(27, YYPEEK ());
-       YYSKIP ();
+#line 230 "../gpr.re2c"
+       {*id =  36; continue;}
+#line 557 "../gpr_re2c.c"
+yy28:
        YYDEBUG(28, YYPEEK ());
-#line 225 "../gpr.re2c"
-       {*id =  33; continue;}
-#line 544 "../gpr_re2c.c"
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case '=':       goto yy72;
+       default:        goto yy29;
+       }
 yy29:
        YYDEBUG(29, YYPEEK ());
+#line 222 "../gpr.re2c"
+       {*id =  28; continue;}
+#line 570 "../gpr_re2c.c"
+yy30:
+       YYDEBUG(30, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(31, YYPEEK ());
+#line 228 "../gpr.re2c"
+       {*id =  34; continue;}
+#line 577 "../gpr_re2c.c"
+yy32:
+       YYDEBUG(32, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '>':       goto yy71;
+       case '>':       goto yy74;
        default:        goto yy3;
        }
-yy30:
-       YYDEBUG(30, YYPEEK ());
+yy33:
+       YYDEBUG(33, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'B':
-       case 'b':       goto yy73;
+       case 'b':       goto yy76;
        case 'G':
-       case 'g':       goto yy74;
-       default:        goto yy33;
+       case 'g':       goto yy77;
+       case 'T':
+       case 't':       goto yy78;
+       default:        goto yy36;
        }
-yy31:
-       YYDEBUG(31, YYPEEK ());
-#line 227 "../gpr.re2c"
-       {*id =  35; continue;}
-#line 570 "../gpr_re2c.c"
-yy32:
-       YYDEBUG(32, YYPEEK ());
+yy34:
+       YYDEBUG(34, YYPEEK ());
+#line 231 "../gpr.re2c"
+       {*id =  37; continue;}
+#line 605 "../gpr_re2c.c"
+yy35:
+       YYDEBUG(35, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
-yy33:
-       YYDEBUG(33, YYPEEK ());
+yy36:
+       YYDEBUG(36, YYPEEK ());
        switch (yych) {
        case '0':
        case '1':
@@ -638,7 +673,7 @@ yy33:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
+       case 'z':       goto yy35;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -668,8 +703,8 @@ yy33:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy75;
-       case 0xE0:      goto yy76;
+       case 0xDF:      goto yy80;
+       case 0xE0:      goto yy81;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -684,174 +719,174 @@ yy33:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy77;
-       case 0xF0:      goto yy78;
+       case 0xEF:      goto yy82;
+       case 0xF0:      goto yy83;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy79;
-       case 0xF4:      goto yy80;
-       default:        goto yy31;
+       case 0xF3:      goto yy84;
+       case 0xF4:      goto yy85;
+       default:        goto yy34;
        }
-yy34:
-       YYDEBUG(34, YYPEEK ());
+yy37:
+       YYDEBUG(37, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy81;
+       case 'a':       goto yy86;
        case 'O':
-       case 'o':       goto yy82;
-       default:        goto yy33;
+       case 'o':       goto yy87;
+       default:        goto yy36;
        }
-yy35:
-       YYDEBUG(35, YYPEEK ());
+yy38:
+       YYDEBUG(38, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy83;
+       case 'n':       goto yy88;
        case 'X':
-       case 'x':       goto yy84;
-       default:        goto yy33;
+       case 'x':       goto yy89;
+       default:        goto yy36;
        }
-yy36:
-       YYDEBUG(36, YYPEEK ());
+yy39:
+       YYDEBUG(39, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
-       case 'o':       goto yy85;
-       default:        goto yy33;
+       case 'o':       goto yy90;
+       default:        goto yy36;
        }
-yy37:
-       YYDEBUG(37, YYPEEK ());
+yy40:
+       YYDEBUG(40, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy86;
-       default:        goto yy33;
+       case 's':       goto yy91;
+       default:        goto yy36;
        }
-yy38:
-       YYDEBUG(38, YYPEEK ());
+yy41:
+       YYDEBUG(41, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
-       case 'i':       goto yy88;
-       default:        goto yy33;
+       case 'i':       goto yy93;
+       default:        goto yy36;
        }
-yy39:
-       YYDEBUG(39, YYPEEK ());
+yy42:
+       YYDEBUG(42, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
-       case 'u':       goto yy89;
-       default:        goto yy33;
+       case 'u':       goto yy94;
+       default:        goto yy36;
        }
-yy40:
-       YYDEBUG(40, YYPEEK ());
+yy43:
+       YYDEBUG(43, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy90;
-       default:        goto yy33;
+       case 't':       goto yy95;
+       default:        goto yy36;
        }
-yy41:
-       YYDEBUG(41, YYPEEK ());
+yy44:
+       YYDEBUG(44, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy91;
+       case 'a':       goto yy96;
        case 'R':
-       case 'r':       goto yy92;
-       default:        goto yy33;
+       case 'r':       goto yy97;
+       default:        goto yy36;
        }
-yy42:
-       YYDEBUG(42, YYPEEK ());
+yy45:
+       YYDEBUG(45, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy93;
-       default:        goto yy33;
+       case 'e':       goto yy98;
+       default:        goto yy36;
        }
-yy43:
-       YYDEBUG(43, YYPEEK ());
+yy46:
+       YYDEBUG(46, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy94;
-       default:        goto yy33;
+       case 't':       goto yy99;
+       default:        goto yy36;
        }
-yy44:
-       YYDEBUG(44, YYPEEK ());
+yy47:
+       YYDEBUG(47, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
-       case 'y':       goto yy95;
-       default:        goto yy33;
+       case 'y':       goto yy100;
+       default:        goto yy36;
        }
-yy45:
-       YYDEBUG(45, YYPEEK ());
+yy48:
+       YYDEBUG(48, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy96;
-       default:        goto yy33;
+       case 's':       goto yy101;
+       default:        goto yy36;
        }
-yy46:
-       YYDEBUG(46, YYPEEK ());
+yy49:
+       YYDEBUG(49, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
-       case 'h':       goto yy97;
+       case 'h':       goto yy102;
        case 'I':
-       case 'i':       goto yy98;
-       default:        goto yy33;
+       case 'i':       goto yy103;
+       default:        goto yy36;
        }
-yy47:
-       YYDEBUG(47, YYPEEK ());
+yy50:
+       YYDEBUG(50, YYPEEK ());
        YYSKIP ();
-       YYDEBUG(48, YYPEEK ());
-#line 226 "../gpr.re2c"
-       {*id =  34; continue;}
-#line 853 "../gpr_re2c.c"
-yy49:
-       YYDEBUG(49, YYPEEK ());
+       YYDEBUG(51, YYPEEK ());
+#line 229 "../gpr.re2c"
+       {*id =  35; continue;}
+#line 888 "../gpr_re2c.c"
+yy52:
+       YYDEBUG(52, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -918,11 +953,11 @@ yy49:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy32;
+       case 0xBF:      goto yy35;
        default:        goto yy3;
        }
-yy50:
-       YYDEBUG(50, YYPEEK ());
+yy53:
+       YYDEBUG(53, YYPEEK ());
        yyaccept = 0;
        YYSKIP ();
        YYBACKUP ();
@@ -959,11 +994,11 @@ yy50:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy75;
+       case 0xBF:      goto yy80;
        default:        goto yy3;
        }
-yy51:
-       YYDEBUG(51, YYPEEK ());
+yy54:
+       YYDEBUG(54, YYPEEK ());
        yyaccept = 0;
        YYSKIP ();
        YYBACKUP ();
@@ -1032,11 +1067,11 @@ yy51:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy75;
+       case 0xBF:      goto yy80;
        default:        goto yy3;
        }
-yy52:
-       YYDEBUG(52, YYPEEK ());
+yy55:
+       YYDEBUG(55, YYPEEK ());
        yyaccept = 0;
        YYSKIP ();
        YYBACKUP ();
@@ -1089,11 +1124,11 @@ yy52:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy77;
+       case 0xBF:      goto yy82;
        default:        goto yy3;
        }
-yy53:
-       YYDEBUG(53, YYPEEK ());
+yy56:
+       YYDEBUG(56, YYPEEK ());
        yyaccept = 0;
        YYSKIP ();
        YYBACKUP ();
@@ -1162,11 +1197,11 @@ yy53:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy77;
+       case 0xBF:      goto yy82;
        default:        goto yy3;
        }
-yy54:
-       YYDEBUG(54, YYPEEK ());
+yy57:
+       YYDEBUG(57, YYPEEK ());
        yyaccept = 0;
        YYSKIP ();
        YYBACKUP ();
@@ -1187,15 +1222,15 @@ yy54:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy77;
+       case 0x8F:      goto yy82;
        default:        goto yy3;
        }
-yy55:
-       YYDEBUG(55, YYPEEK ());
+yy58:
+       YYDEBUG(58, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
-yy56:
-       YYDEBUG(56, YYPEEK ());
+yy59:
+       YYDEBUG(59, YYPEEK ());
        switch (yych) {
        case ' ':
        case '!':
@@ -1291,8 +1326,8 @@ yy56:
        case '|':
        case '}':
        case '~':
-       case 0x7F:      goto yy55;
-       case '"':       goto yy58;
+       case 0x7F:      goto yy58;
+       case '"':       goto yy61;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -1322,8 +1357,8 @@ yy56:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy60;
-       case 0xE0:      goto yy61;
+       case 0xDF:      goto yy63;
+       case 0xE0:      goto yy64;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -1338,61 +1373,62 @@ yy56:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy62;
-       case 0xF0:      goto yy63;
+       case 0xEF:      goto yy65;
+       case 0xF0:      goto yy66;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy64;
-       case 0xF4:      goto yy65;
-       default:        goto yy57;
+       case 0xF3:      goto yy67;
+       case 0xF4:      goto yy68;
+       default:        goto yy60;
        }
-yy57:
-       YYDEBUG(57, YYPEEK ());
+yy60:
+       YYDEBUG(60, YYPEEK ());
        YYRESTORE ();
        switch (yyaccept) {
        case 0:         goto yy3;
-       case 1:         goto yy31;
-       case 2:         goto yy59;
-       case 3:         goto yy68;
-       case 4:         goto yy87;
-       case 5:         goto yy110;
-       case 6:         goto yy113;
-       case 7:         goto yy123;
-       case 8:         goto yy129;
+       case 1:         goto yy34;
+       case 2:         goto yy62;
+       case 3:         goto yy71;
+       case 4:         goto yy79;
+       case 5:         goto yy92;
+       case 6:         goto yy115;
+       case 7:         goto yy118;
+       case 8:         goto yy128;
        case 9:         goto yy134;
-       case 10:        goto yy141;
-       case 11:        goto yy143;
-       case 12:        goto yy145;
-       case 13:        goto yy164;
-       case 14:        goto yy173;
-       case 15:        goto yy176;
-       case 16:        goto yy178;
-       case 17:        goto yy180;
-       case 18:        goto yy182;
-       case 19:        goto yy185;
-       case 20:        goto yy189;
-       case 21:        goto yy191;
-       case 22:        goto yy193;
-       case 23:        goto yy203;
-       default:        goto yy208;
+       case 10:        goto yy139;
+       case 11:        goto yy146;
+       case 12:        goto yy148;
+       case 13:        goto yy150;
+       case 14:        goto yy169;
+       case 15:        goto yy178;
+       case 16:        goto yy181;
+       case 17:        goto yy183;
+       case 18:        goto yy185;
+       case 19:        goto yy187;
+       case 20:        goto yy190;
+       case 21:        goto yy194;
+       case 22:        goto yy196;
+       case 23:        goto yy198;
+       case 24:        goto yy208;
+       default:        goto yy213;
        }
-yy58:
-       YYDEBUG(58, YYPEEK ());
+yy61:
+       YYDEBUG(61, YYPEEK ());
        yyaccept = 2;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '"':       goto yy55;
-       default:        goto yy59;
+       case '"':       goto yy58;
+       default:        goto yy62;
        }
-yy59:
-       YYDEBUG(59, YYPEEK ());
-#line 228 "../gpr.re2c"
-       {*id =  36; continue;}
-#line 1394 "../gpr_re2c.c"
-yy60:
-       YYDEBUG(60, YYPEEK ());
+yy62:
+       YYDEBUG(62, YYPEEK ());
+#line 232 "../gpr.re2c"
+       {*id =  38; continue;}
+#line 1430 "../gpr_re2c.c"
+yy63:
+       YYDEBUG(63, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1459,11 +1495,11 @@ yy60:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy55;
-       default:        goto yy57;
+       case 0xBF:      goto yy58;
+       default:        goto yy60;
        }
-yy61:
-       YYDEBUG(61, YYPEEK ());
+yy64:
+       YYDEBUG(64, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1498,11 +1534,11 @@ yy61:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy60;
-       default:        goto yy57;
+       case 0xBF:      goto yy63;
+       default:        goto yy60;
        }
-yy62:
-       YYDEBUG(62, YYPEEK ());
+yy65:
+       YYDEBUG(65, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1569,11 +1605,11 @@ yy62:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy60;
-       default:        goto yy57;
+       case 0xBF:      goto yy63;
+       default:        goto yy60;
        }
-yy63:
-       YYDEBUG(63, YYPEEK ());
+yy66:
+       YYDEBUG(66, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1624,11 +1660,11 @@ yy63:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy62;
-       default:        goto yy57;
+       case 0xBF:      goto yy65;
+       default:        goto yy60;
        }
-yy64:
-       YYDEBUG(64, YYPEEK ());
+yy67:
+       YYDEBUG(67, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1695,11 +1731,11 @@ yy64:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy62;
-       default:        goto yy57;
+       case 0xBF:      goto yy65;
+       default:        goto yy60;
        }
-yy65:
-       YYDEBUG(65, YYPEEK ());
+yy68:
+       YYDEBUG(68, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1718,16 +1754,16 @@ yy65:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy62;
-       default:        goto yy57;
+       case 0x8F:      goto yy65;
+       default:        goto yy60;
        }
-yy66:
-       YYDEBUG(66, YYPEEK ());
+yy69:
+       YYDEBUG(69, YYPEEK ());
        yyaccept = 3;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
-       YYDEBUG(67, YYPEEK ());
+       YYDEBUG(70, YYPEEK ());
        switch (yych) {
        case 0x00:
        case 0x01:
@@ -1855,7 +1891,7 @@ yy66:
        case '|':
        case '}':
        case '~':
-       case 0x7F:      goto yy66;
+       case 0x7F:      goto yy69;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -1885,8 +1921,8 @@ yy66:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy99;
-       case 0xE0:      goto yy100;
+       case 0xDF:      goto yy104;
+       case 0xE0:      goto yy105;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -1901,57 +1937,185 @@ yy66:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy101;
-       case 0xF0:      goto yy102;
+       case 0xEF:      goto yy106;
+       case 0xF0:      goto yy107;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy103;
-       case 0xF4:      goto yy104;
-       default:        goto yy68;
+       case 0xF3:      goto yy108;
+       case 0xF4:      goto yy109;
+       default:        goto yy71;
        }
-yy68:
-       YYDEBUG(68, YYPEEK ());
-#line 194 "../gpr.re2c"
-       {*id =  2; continue;}
-#line 1917 "../gpr_re2c.c"
-yy69:
-       YYDEBUG(69, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(70, YYPEEK ());
-#line 220 "../gpr.re2c"
-       {*id =  28; continue;}
-#line 1924 "../gpr_re2c.c"
 yy71:
        YYDEBUG(71, YYPEEK ());
-       YYSKIP ();
+#line 196 "../gpr.re2c"
+       {*id =  2; continue;}
+#line 1953 "../gpr_re2c.c"
+yy72:
        YYDEBUG(72, YYPEEK ());
-#line 223 "../gpr.re2c"
-       {*id =  31; continue;}
-#line 1931 "../gpr_re2c.c"
-yy73:
+       YYSKIP ();
        YYDEBUG(73, YYPEEK ());
+#line 223 "../gpr.re2c"
+       {*id =  29; continue;}
+#line 1960 "../gpr_re2c.c"
+yy74:
+       YYDEBUG(74, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(75, YYPEEK ());
+#line 226 "../gpr.re2c"
+       {*id =  32; continue;}
+#line 1967 "../gpr_re2c.c"
+yy76:
+       YYDEBUG(76, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy105;
-       default:        goto yy33;
+       case 's':       goto yy110;
+       default:        goto yy36;
        }
-yy74:
-       YYDEBUG(74, YYPEEK ());
+yy77:
+       YYDEBUG(77, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
-       case 'g':       goto yy106;
-       default:        goto yy33;
+       case 'g':       goto yy111;
+       default:        goto yy36;
        }
-yy75:
-       YYDEBUG(75, YYPEEK ());
+yy78:
+       YYDEBUG(78, YYPEEK ());
+       yyaccept = 4;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy36;
+       default:        goto yy79;
+       }
+yy79:
+       YYDEBUG(79, YYPEEK ());
+#line 198 "../gpr.re2c"
+       {*id =  4; continue;}
+#line 2117 "../gpr_re2c.c"
+yy80:
+       YYDEBUG(80, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2018,11 +2182,11 @@ yy75:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy32;
-       default:        goto yy57;
+       case 0xBF:      goto yy35;
+       default:        goto yy60;
        }
-yy76:
-       YYDEBUG(76, YYPEEK ());
+yy81:
+       YYDEBUG(81, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2057,11 +2221,11 @@ yy76:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy75;
-       default:        goto yy57;
+       case 0xBF:      goto yy80;
+       default:        goto yy60;
        }
-yy77:
-       YYDEBUG(77, YYPEEK ());
+yy82:
+       YYDEBUG(82, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2128,11 +2292,11 @@ yy77:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy75;
-       default:        goto yy57;
+       case 0xBF:      goto yy80;
+       default:        goto yy60;
        }
-yy78:
-       YYDEBUG(78, YYPEEK ());
+yy83:
+       YYDEBUG(83, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2183,11 +2347,11 @@ yy78:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy77;
-       default:        goto yy57;
+       case 0xBF:      goto yy82;
+       default:        goto yy60;
        }
-yy79:
-       YYDEBUG(79, YYPEEK ());
+yy84:
+       YYDEBUG(84, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2254,11 +2418,11 @@ yy79:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy77;
-       default:        goto yy57;
+       case 0xBF:      goto yy82;
+       default:        goto yy60;
        }
-yy80:
-       YYDEBUG(80, YYPEEK ());
+yy85:
+       YYDEBUG(85, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2277,67 +2441,67 @@ yy80:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy77;
-       default:        goto yy57;
+       case 0x8F:      goto yy82;
+       default:        goto yy60;
        }
-yy81:
-       YYDEBUG(81, YYPEEK ());
+yy86:
+       YYDEBUG(86, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy107;
-       default:        goto yy33;
+       case 's':       goto yy112;
+       default:        goto yy36;
        }
-yy82:
-       YYDEBUG(82, YYPEEK ());
+yy87:
+       YYDEBUG(87, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy108;
-       default:        goto yy33;
+       case 'n':       goto yy113;
+       default:        goto yy36;
        }
-yy83:
-       YYDEBUG(83, YYPEEK ());
+yy88:
+       YYDEBUG(88, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
-       case 'd':       goto yy109;
-       default:        goto yy33;
+       case 'd':       goto yy114;
+       default:        goto yy36;
        }
-yy84:
-       YYDEBUG(84, YYPEEK ());
+yy89:
+       YYDEBUG(89, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy111;
-       default:        goto yy33;
+       case 't':       goto yy116;
+       default:        goto yy36;
        }
-yy85:
-       YYDEBUG(85, YYPEEK ());
+yy90:
+       YYDEBUG(90, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy112;
-       default:        goto yy33;
+       case 'r':       goto yy117;
+       default:        goto yy36;
        }
-yy86:
-       YYDEBUG(86, YYPEEK ());
-       yyaccept = 4;
+yy91:
+       YYDEBUG(91, YYPEEK ());
+       yyaccept = 5;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -2455,137 +2619,137 @@ yy86:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy87;
+       case 0xF4:      goto yy36;
+       default:        goto yy92;
        }
-yy87:
-       YYDEBUG(87, YYPEEK ());
-#line 204 "../gpr.re2c"
-       {*id =  12; continue;}
-#line 2466 "../gpr_re2c.c"
-yy88:
-       YYDEBUG(88, YYPEEK ());
+yy92:
+       YYDEBUG(92, YYPEEK ());
+#line 207 "../gpr.re2c"
+       {*id =  13; continue;}
+#line 2630 "../gpr_re2c.c"
+yy93:
+       YYDEBUG(93, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'B':
-       case 'b':       goto yy114;
-       default:        goto yy33;
+       case 'b':       goto yy119;
+       default:        goto yy36;
        }
-yy89:
-       YYDEBUG(89, YYPEEK ());
+yy94:
+       YYDEBUG(94, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
-       case 'l':       goto yy115;
-       default:        goto yy33;
+       case 'l':       goto yy120;
+       default:        goto yy36;
        }
-yy90:
-       YYDEBUG(90, YYPEEK ());
+yy95:
+       YYDEBUG(95, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
-       case 'h':       goto yy116;
-       default:        goto yy33;
+       case 'h':       goto yy121;
+       default:        goto yy36;
        }
-yy91:
-       YYDEBUG(91, YYPEEK ());
+yy96:
+       YYDEBUG(96, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
-       case 'c':       goto yy117;
-       default:        goto yy33;
+       case 'c':       goto yy122;
+       default:        goto yy36;
        }
-yy92:
-       YYDEBUG(92, YYPEEK ());
+yy97:
+       YYDEBUG(97, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
-       case 'o':       goto yy118;
-       default:        goto yy33;
+       case 'o':       goto yy123;
+       default:        goto yy36;
        }
-yy93:
-       YYDEBUG(93, YYPEEK ());
+yy98:
+       YYDEBUG(98, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy119;
-       default:        goto yy33;
+       case 'n':       goto yy124;
+       default:        goto yy36;
        }
-yy94:
-       YYDEBUG(94, YYPEEK ());
+yy99:
+       YYDEBUG(99, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy120;
-       default:        goto yy33;
+       case 'a':       goto yy125;
+       default:        goto yy36;
        }
-yy95:
-       YYDEBUG(95, YYPEEK ());
+yy100:
+       YYDEBUG(100, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'P':
-       case 'p':       goto yy121;
-       default:        goto yy33;
+       case 'p':       goto yy126;
+       default:        goto yy36;
        }
-yy96:
-       YYDEBUG(96, YYPEEK ());
+yy101:
+       YYDEBUG(101, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy122;
-       default:        goto yy33;
+       case 'e':       goto yy127;
+       default:        goto yy36;
        }
-yy97:
-       YYDEBUG(97, YYPEEK ());
+yy102:
+       YYDEBUG(102, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy124;
-       default:        goto yy33;
+       case 'e':       goto yy129;
+       default:        goto yy36;
        }
-yy98:
-       YYDEBUG(98, YYPEEK ());
+yy103:
+       YYDEBUG(103, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy125;
-       default:        goto yy33;
+       case 't':       goto yy130;
+       default:        goto yy36;
        }
-yy99:
-       YYDEBUG(99, YYPEEK ());
+yy104:
+       YYDEBUG(104, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2652,11 +2816,11 @@ yy99:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy66;
-       default:        goto yy57;
+       case 0xBF:      goto yy69;
+       default:        goto yy60;
        }
-yy100:
-       YYDEBUG(100, YYPEEK ());
+yy105:
+       YYDEBUG(105, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2691,11 +2855,11 @@ yy100:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy99;
-       default:        goto yy57;
+       case 0xBF:      goto yy104;
+       default:        goto yy60;
        }
-yy101:
-       YYDEBUG(101, YYPEEK ());
+yy106:
+       YYDEBUG(106, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2762,11 +2926,11 @@ yy101:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy99;
-       default:        goto yy57;
+       case 0xBF:      goto yy104;
+       default:        goto yy60;
        }
-yy102:
-       YYDEBUG(102, YYPEEK ());
+yy107:
+       YYDEBUG(107, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2817,11 +2981,11 @@ yy102:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy101;
-       default:        goto yy57;
+       case 0xBF:      goto yy106;
+       default:        goto yy60;
        }
-yy103:
-       YYDEBUG(103, YYPEEK ());
+yy108:
+       YYDEBUG(108, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2888,11 +3052,11 @@ yy103:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy101;
-       default:        goto yy57;
+       case 0xBF:      goto yy106;
+       default:        goto yy60;
        }
-yy104:
-       YYDEBUG(104, YYPEEK ());
+yy109:
+       YYDEBUG(109, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2911,56 +3075,56 @@ yy104:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy101;
-       default:        goto yy57;
+       case 0x8F:      goto yy106;
+       default:        goto yy60;
        }
-yy105:
-       YYDEBUG(105, YYPEEK ());
+yy110:
+       YYDEBUG(110, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy126;
-       default:        goto yy33;
+       case 't':       goto yy131;
+       default:        goto yy36;
        }
-yy106:
-       YYDEBUG(106, YYPEEK ());
+yy111:
+       YYDEBUG(111, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy127;
-       default:        goto yy33;
+       case 'r':       goto yy132;
+       default:        goto yy36;
        }
-yy107:
-       YYDEBUG(107, YYPEEK ());
+yy112:
+       YYDEBUG(112, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy128;
-       default:        goto yy33;
+       case 'e':       goto yy133;
+       default:        goto yy36;
        }
-yy108:
-       YYDEBUG(108, YYPEEK ());
+yy113:
+       YYDEBUG(113, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'F':
-       case 'f':       goto yy130;
-       default:        goto yy33;
+       case 'f':       goto yy135;
+       default:        goto yy36;
        }
-yy109:
-       YYDEBUG(109, YYPEEK ());
-       yyaccept = 5;
+yy114:
+       YYDEBUG(114, YYPEEK ());
+       yyaccept = 6;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3076,30 +3240,30 @@ yy109:
        case 0xEF:
        case 0xF0:
        case 0xF1:
-       case 0xF2:
-       case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy110;
-       }
-yy110:
-       YYDEBUG(110, YYPEEK ());
-#line 199 "../gpr.re2c"
-       {*id =  7; continue;}
-#line 3089 "../gpr_re2c.c"
-yy111:
-       YYDEBUG(111, YYPEEK ());
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy36;
+       default:        goto yy115;
+       }
+yy115:
+       YYDEBUG(115, YYPEEK ());
+#line 202 "../gpr.re2c"
+       {*id =  8; continue;}
+#line 3253 "../gpr_re2c.c"
+yy116:
+       YYDEBUG(116, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy131;
-       default:        goto yy33;
+       case 'e':       goto yy136;
+       default:        goto yy36;
        }
-yy112:
-       YYDEBUG(112, YYPEEK ());
-       yyaccept = 6;
+yy117:
+       YYDEBUG(117, YYPEEK ());
+       yyaccept = 7;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3217,105 +3381,105 @@ yy112:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy113;
+       case 0xF4:      goto yy36;
+       default:        goto yy118;
        }
-yy113:
-       YYDEBUG(113, YYPEEK ());
-#line 203 "../gpr.re2c"
-       {*id =  11; continue;}
-#line 3228 "../gpr_re2c.c"
-yy114:
-       YYDEBUG(114, YYPEEK ());
+yy118:
+       YYDEBUG(118, YYPEEK ());
+#line 206 "../gpr.re2c"
+       {*id =  12; continue;}
+#line 3392 "../gpr_re2c.c"
+yy119:
+       YYDEBUG(119, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy132;
-       default:        goto yy33;
+       case 'r':       goto yy137;
+       default:        goto yy36;
        }
-yy115:
-       YYDEBUG(115, YYPEEK ());
+yy120:
+       YYDEBUG(120, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
-       case 'l':       goto yy133;
-       default:        goto yy33;
+       case 'l':       goto yy138;
+       default:        goto yy36;
        }
-yy116:
-       YYDEBUG(116, YYPEEK ());
+yy121:
+       YYDEBUG(121, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy135;
-       default:        goto yy33;
+       case 'e':       goto yy140;
+       default:        goto yy36;
        }
-yy117:
-       YYDEBUG(117, YYPEEK ());
+yy122:
+       YYDEBUG(122, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'K':
-       case 'k':       goto yy136;
-       default:        goto yy33;
+       case 'k':       goto yy141;
+       default:        goto yy36;
        }
-yy118:
-       YYDEBUG(118, YYPEEK ());
+yy123:
+       YYDEBUG(123, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'J':
-       case 'j':       goto yy137;
-       default:        goto yy33;
+       case 'j':       goto yy142;
+       default:        goto yy36;
        }
-yy119:
-       YYDEBUG(119, YYPEEK ());
+yy124:
+       YYDEBUG(124, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy138;
-       default:        goto yy33;
+       case 'a':       goto yy143;
+       default:        goto yy36;
        }
-yy120:
-       YYDEBUG(120, YYPEEK ());
+yy125:
+       YYDEBUG(125, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy139;
-       default:        goto yy33;
+       case 'n':       goto yy144;
+       default:        goto yy36;
        }
-yy121:
-       YYDEBUG(121, YYPEEK ());
+yy126:
+       YYDEBUG(126, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy140;
-       default:        goto yy33;
+       case 'e':       goto yy145;
+       default:        goto yy36;
        }
-yy122:
-       YYDEBUG(122, YYPEEK ());
-       yyaccept = 7;
+yy127:
+       YYDEBUG(127, YYPEEK ());
+       yyaccept = 8;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3433,61 +3597,61 @@ yy122:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy123;
+       case 0xF4:      goto yy36;
+       default:        goto yy128;
        }
-yy123:
-       YYDEBUG(123, YYPEEK ());
-#line 215 "../gpr.re2c"
-       {*id =  23; continue;}
-#line 3444 "../gpr_re2c.c"
-yy124:
-       YYDEBUG(124, YYPEEK ());
+yy128:
+       YYDEBUG(128, YYPEEK ());
+#line 218 "../gpr.re2c"
+       {*id =  24; continue;}
+#line 3608 "../gpr_re2c.c"
+yy129:
+       YYDEBUG(129, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy142;
-       default:        goto yy33;
+       case 'n':       goto yy147;
+       default:        goto yy36;
        }
-yy125:
-       YYDEBUG(125, YYPEEK ());
+yy130:
+       YYDEBUG(130, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'H':
-       case 'h':       goto yy144;
-       default:        goto yy33;
+       case 'h':       goto yy149;
+       default:        goto yy36;
        }
-yy126:
-       YYDEBUG(126, YYPEEK ());
+yy131:
+       YYDEBUG(131, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy146;
-       default:        goto yy33;
+       case 'r':       goto yy151;
+       default:        goto yy36;
        }
-yy127:
-       YYDEBUG(127, YYPEEK ());
+yy132:
+       YYDEBUG(132, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy147;
-       default:        goto yy33;
+       case 'e':       goto yy152;
+       default:        goto yy36;
        }
-yy128:
-       YYDEBUG(128, YYPEEK ());
-       yyaccept = 8;
+yy133:
+       YYDEBUG(133, YYPEEK ());
+       yyaccept = 9;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3605,52 +3769,52 @@ yy128:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy129;
+       case 0xF4:      goto yy36;
+       default:        goto yy134;
        }
-yy129:
-       YYDEBUG(129, YYPEEK ());
-#line 197 "../gpr.re2c"
-       {*id =  5; continue;}
-#line 3616 "../gpr_re2c.c"
-yy130:
-       YYDEBUG(130, YYPEEK ());
+yy134:
+       YYDEBUG(134, YYPEEK ());
+#line 200 "../gpr.re2c"
+       {*id =  6; continue;}
+#line 3780 "../gpr_re2c.c"
+yy135:
+       YYDEBUG(135, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
-       case 'i':       goto yy148;
-       default:        goto yy33;
+       case 'i':       goto yy153;
+       default:        goto yy36;
        }
-yy131:
-       YYDEBUG(131, YYPEEK ());
+yy136:
+       YYDEBUG(136, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy149;
+       case 'n':       goto yy154;
        case 'R':
-       case 'r':       goto yy150;
-       default:        goto yy33;
+       case 'r':       goto yy155;
+       default:        goto yy36;
        }
-yy132:
-       YYDEBUG(132, YYPEEK ());
+yy137:
+       YYDEBUG(137, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy151;
-       default:        goto yy33;
+       case 'a':       goto yy156;
+       default:        goto yy36;
        }
-yy133:
-       YYDEBUG(133, YYPEEK ());
-       yyaccept = 9;
+yy138:
+       YYDEBUG(138, YYPEEK ());
+       yyaccept = 10;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3768,72 +3932,72 @@ yy133:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy134;
+       case 0xF4:      goto yy36;
+       default:        goto yy139;
        }
-yy134:
-       YYDEBUG(134, YYPEEK ());
-#line 207 "../gpr.re2c"
-       {*id =  15; continue;}
-#line 3779 "../gpr_re2c.c"
-yy135:
-       YYDEBUG(135, YYPEEK ());
+yy139:
+       YYDEBUG(139, YYPEEK ());
+#line 210 "../gpr.re2c"
+       {*id =  16; continue;}
+#line 3943 "../gpr_re2c.c"
+yy140:
+       YYDEBUG(140, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy152;
-       default:        goto yy33;
+       case 'r':       goto yy157;
+       default:        goto yy36;
        }
-yy136:
-       YYDEBUG(136, YYPEEK ());
+yy141:
+       YYDEBUG(141, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy153;
-       default:        goto yy33;
+       case 'a':       goto yy158;
+       default:        goto yy36;
        }
-yy137:
-       YYDEBUG(137, YYPEEK ());
+yy142:
+       YYDEBUG(142, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy154;
-       default:        goto yy33;
+       case 'e':       goto yy159;
+       default:        goto yy36;
        }
-yy138:
-       YYDEBUG(138, YYPEEK ());
+yy143:
+       YYDEBUG(143, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'M':
-       case 'm':       goto yy155;
-       default:        goto yy33;
+       case 'm':       goto yy160;
+       default:        goto yy36;
        }
-yy139:
-       YYDEBUG(139, YYPEEK ());
+yy144:
+       YYDEBUG(144, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
-       case 'd':       goto yy156;
-       default:        goto yy33;
+       case 'd':       goto yy161;
+       default:        goto yy36;
        }
-yy140:
-       YYDEBUG(140, YYPEEK ());
-       yyaccept = 10;
+yy145:
+       YYDEBUG(145, YYPEEK ());
+       yyaccept = 11;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -3951,17 +4115,17 @@ yy140:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy141;
+       case 0xF4:      goto yy36;
+       default:        goto yy146;
        }
-yy141:
-       YYDEBUG(141, YYPEEK ());
-#line 214 "../gpr.re2c"
-       {*id =  22; continue;}
-#line 3962 "../gpr_re2c.c"
-yy142:
-       YYDEBUG(142, YYPEEK ());
-       yyaccept = 11;
+yy146:
+       YYDEBUG(146, YYPEEK ());
+#line 217 "../gpr.re2c"
+       {*id =  23; continue;}
+#line 4126 "../gpr_re2c.c"
+yy147:
+       YYDEBUG(147, YYPEEK ());
+       yyaccept = 12;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4079,17 +4243,17 @@ yy142:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy143;
+       case 0xF4:      goto yy36;
+       default:        goto yy148;
        }
-yy143:
-       YYDEBUG(143, YYPEEK ());
-#line 216 "../gpr.re2c"
-       {*id =  24; continue;}
-#line 4090 "../gpr_re2c.c"
-yy144:
-       YYDEBUG(144, YYPEEK ());
-       yyaccept = 12;
+yy148:
+       YYDEBUG(148, YYPEEK ());
+#line 219 "../gpr.re2c"
+       {*id =  25; continue;}
+#line 4254 "../gpr_re2c.c"
+yy149:
+       YYDEBUG(149, YYPEEK ());
+       yyaccept = 13;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4207,204 +4371,204 @@ yy144:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy145;
+       case 0xF4:      goto yy36;
+       default:        goto yy150;
        }
-yy145:
-       YYDEBUG(145, YYPEEK ());
-#line 217 "../gpr.re2c"
-       {*id =  25; continue;}
-#line 4218 "../gpr_re2c.c"
-yy146:
-       YYDEBUG(146, YYPEEK ());
+yy150:
+       YYDEBUG(150, YYPEEK ());
+#line 220 "../gpr.re2c"
+       {*id =  26; continue;}
+#line 4382 "../gpr_re2c.c"
+yy151:
+       YYDEBUG(151, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy157;
-       default:        goto yy33;
+       case 'a':       goto yy162;
+       default:        goto yy36;
        }
-yy147:
-       YYDEBUG(147, YYPEEK ());
+yy152:
+       YYDEBUG(152, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
-       case 'g':       goto yy158;
-       default:        goto yy33;
+       case 'g':       goto yy163;
+       default:        goto yy36;
        }
-yy148:
-       YYDEBUG(148, YYPEEK ());
+yy153:
+       YYDEBUG(153, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
-       case 'g':       goto yy159;
-       default:        goto yy33;
+       case 'g':       goto yy164;
+       default:        goto yy36;
        }
-yy149:
-       YYDEBUG(149, YYPEEK ());
+yy154:
+       YYDEBUG(154, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
-       case 'd':       goto yy160;
-       default:        goto yy33;
+       case 'd':       goto yy165;
+       default:        goto yy36;
        }
-yy150:
-       YYDEBUG(150, YYPEEK ());
+yy155:
+       YYDEBUG(155, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy161;
-       default:        goto yy33;
+       case 'n':       goto yy166;
+       default:        goto yy36;
        }
-yy151:
-       YYDEBUG(151, YYPEEK ());
+yy156:
+       YYDEBUG(156, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy162;
-       default:        goto yy33;
+       case 'r':       goto yy167;
+       default:        goto yy36;
        }
-yy152:
-       YYDEBUG(152, YYPEEK ());
+yy157:
+       YYDEBUG(157, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy163;
-       default:        goto yy33;
+       case 's':       goto yy168;
+       default:        goto yy36;
        }
-yy153:
-       YYDEBUG(153, YYPEEK ());
+yy158:
+       YYDEBUG(158, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'G':
-       case 'g':       goto yy165;
-       default:        goto yy33;
+       case 'g':       goto yy170;
+       default:        goto yy36;
        }
-yy154:
-       YYDEBUG(154, YYPEEK ());
+yy159:
+       YYDEBUG(159, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
-       case 'c':       goto yy166;
-       default:        goto yy33;
+       case 'c':       goto yy171;
+       default:        goto yy36;
        }
-yy155:
-       YYDEBUG(155, YYPEEK ());
+yy160:
+       YYDEBUG(160, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy167;
-       default:        goto yy33;
+       case 'e':       goto yy172;
+       default:        goto yy36;
        }
-yy156:
-       YYDEBUG(156, YYPEEK ());
+yy161:
+       YYDEBUG(161, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy168;
-       default:        goto yy33;
+       case 'a':       goto yy173;
+       default:        goto yy36;
        }
-yy157:
-       YYDEBUG(157, YYPEEK ());
+yy162:
+       YYDEBUG(162, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'C':
-       case 'c':       goto yy169;
-       default:        goto yy33;
+       case 'c':       goto yy174;
+       default:        goto yy36;
        }
-yy158:
-       YYDEBUG(158, YYPEEK ());
+yy163:
+       YYDEBUG(163, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy170;
-       default:        goto yy33;
+       case 'a':       goto yy175;
+       default:        goto yy36;
        }
-yy159:
-       YYDEBUG(159, YYPEEK ());
+yy164:
+       YYDEBUG(164, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'U':
-       case 'u':       goto yy171;
-       default:        goto yy33;
+       case 'u':       goto yy176;
+       default:        goto yy36;
        }
-yy160:
-       YYDEBUG(160, YYPEEK ());
+yy165:
+       YYDEBUG(165, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy172;
-       default:        goto yy33;
+       case 's':       goto yy177;
+       default:        goto yy36;
        }
-yy161:
-       YYDEBUG(161, YYPEEK ());
+yy166:
+       YYDEBUG(166, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy174;
-       default:        goto yy33;
+       case 'a':       goto yy179;
+       default:        goto yy36;
        }
-yy162:
-       YYDEBUG(162, YYPEEK ());
+yy167:
+       YYDEBUG(167, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'Y':
-       case 'y':       goto yy175;
-       default:        goto yy33;
+       case 'y':       goto yy180;
+       default:        goto yy36;
        }
-yy163:
-       YYDEBUG(163, YYPEEK ());
-       yyaccept = 13;
+yy168:
+       YYDEBUG(168, YYPEEK ());
+       yyaccept = 14;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4522,94 +4686,94 @@ yy163:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy164;
+       case 0xF4:      goto yy36;
+       default:        goto yy169;
        }
-yy164:
-       YYDEBUG(164, YYPEEK ());
-#line 208 "../gpr.re2c"
-       {*id =  16; continue;}
-#line 4533 "../gpr_re2c.c"
-yy165:
-       YYDEBUG(165, YYPEEK ());
+yy169:
+       YYDEBUG(169, YYPEEK ());
+#line 211 "../gpr.re2c"
+       {*id =  17; continue;}
+#line 4697 "../gpr_re2c.c"
+yy170:
+       YYDEBUG(170, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy177;
-       default:        goto yy33;
+       case 'e':       goto yy182;
+       default:        goto yy36;
        }
-yy166:
-       YYDEBUG(166, YYPEEK ());
+yy171:
+       YYDEBUG(171, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy179;
-       default:        goto yy33;
+       case 't':       goto yy184;
+       default:        goto yy36;
        }
-yy167:
-       YYDEBUG(167, YYPEEK ());
+yy172:
+       YYDEBUG(172, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy181;
-       default:        goto yy33;
+       case 's':       goto yy186;
+       default:        goto yy36;
        }
-yy168:
-       YYDEBUG(168, YYPEEK ());
+yy173:
+       YYDEBUG(173, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy183;
-       default:        goto yy33;
+       case 'r':       goto yy188;
+       default:        goto yy36;
        }
-yy169:
-       YYDEBUG(169, YYPEEK ());
+yy174:
+       YYDEBUG(174, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy184;
-       default:        goto yy33;
+       case 't':       goto yy189;
+       default:        goto yy36;
        }
-yy170:
-       YYDEBUG(170, YYPEEK ());
+yy175:
+       YYDEBUG(175, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy186;
-       default:        goto yy33;
+       case 't':       goto yy191;
+       default:        goto yy36;
        }
-yy171:
-       YYDEBUG(171, YYPEEK ());
+yy176:
+       YYDEBUG(176, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'R':
-       case 'r':       goto yy187;
-       default:        goto yy33;
+       case 'r':       goto yy192;
+       default:        goto yy36;
        }
-yy172:
-       YYDEBUG(172, YYPEEK ());
-       yyaccept = 14;
+yy177:
+       YYDEBUG(177, YYPEEK ());
+       yyaccept = 15;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4727,28 +4891,28 @@ yy172:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy173;
+       case 0xF4:      goto yy36;
+       default:        goto yy178;
        }
-yy173:
-       YYDEBUG(173, YYPEEK ());
-#line 200 "../gpr.re2c"
-       {*id =  8; continue;}
-#line 4738 "../gpr_re2c.c"
-yy174:
-       YYDEBUG(174, YYPEEK ());
+yy178:
+       YYDEBUG(178, YYPEEK ());
+#line 203 "../gpr.re2c"
+       {*id =  9; continue;}
+#line 4902 "../gpr_re2c.c"
+yy179:
+       YYDEBUG(179, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
-       case 'l':       goto yy188;
-       default:        goto yy33;
+       case 'l':       goto yy193;
+       default:        goto yy36;
        }
-yy175:
-       YYDEBUG(175, YYPEEK ());
-       yyaccept = 15;
+yy180:
+       YYDEBUG(180, YYPEEK ());
+       yyaccept = 16;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4866,17 +5030,17 @@ yy175:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy176;
+       case 0xF4:      goto yy36;
+       default:        goto yy181;
        }
-yy176:
-       YYDEBUG(176, YYPEEK ());
-#line 206 "../gpr.re2c"
-       {*id =  14; continue;}
-#line 4877 "../gpr_re2c.c"
-yy177:
-       YYDEBUG(177, YYPEEK ());
-       yyaccept = 16;
+yy181:
+       YYDEBUG(181, YYPEEK ());
+#line 209 "../gpr.re2c"
+       {*id =  15; continue;}
+#line 5041 "../gpr_re2c.c"
+yy182:
+       YYDEBUG(182, YYPEEK ());
+       yyaccept = 17;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -4994,17 +5158,17 @@ yy177:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy178;
+       case 0xF4:      goto yy36;
+       default:        goto yy183;
        }
-yy178:
-       YYDEBUG(178, YYPEEK ());
-#line 209 "../gpr.re2c"
-       {*id =  17; continue;}
-#line 5005 "../gpr_re2c.c"
-yy179:
-       YYDEBUG(179, YYPEEK ());
-       yyaccept = 17;
+yy183:
+       YYDEBUG(183, YYPEEK ());
+#line 212 "../gpr.re2c"
+       {*id =  18; continue;}
+#line 5169 "../gpr_re2c.c"
+yy184:
+       YYDEBUG(184, YYPEEK ());
+       yyaccept = 18;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5122,17 +5286,17 @@ yy179:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy180;
+       case 0xF4:      goto yy36;
+       default:        goto yy185;
        }
-yy180:
-       YYDEBUG(180, YYPEEK ());
-#line 210 "../gpr.re2c"
-       {*id =  18; continue;}
-#line 5133 "../gpr_re2c.c"
-yy181:
-       YYDEBUG(181, YYPEEK ());
-       yyaccept = 18;
+yy185:
+       YYDEBUG(185, YYPEEK ());
+#line 213 "../gpr.re2c"
+       {*id =  19; continue;}
+#line 5297 "../gpr_re2c.c"
+yy186:
+       YYDEBUG(186, YYPEEK ());
+       yyaccept = 19;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5250,28 +5414,28 @@ yy181:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy182;
+       case 0xF4:      goto yy36;
+       default:        goto yy187;
        }
-yy182:
-       YYDEBUG(182, YYPEEK ());
-#line 211 "../gpr.re2c"
-       {*id =  19; continue;}
-#line 5261 "../gpr_re2c.c"
-yy183:
-       YYDEBUG(183, YYPEEK ());
+yy187:
+       YYDEBUG(187, YYPEEK ());
+#line 214 "../gpr.re2c"
+       {*id =  20; continue;}
+#line 5425 "../gpr_re2c.c"
+yy188:
+       YYDEBUG(188, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'D':
-       case 'd':       goto yy190;
-       default:        goto yy33;
+       case 'd':       goto yy195;
+       default:        goto yy36;
        }
-yy184:
-       YYDEBUG(184, YYPEEK ());
-       yyaccept = 19;
+yy189:
+       YYDEBUG(189, YYPEEK ());
+       yyaccept = 20;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5389,39 +5553,39 @@ yy184:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy185;
+       case 0xF4:      goto yy36;
+       default:        goto yy190;
        }
-yy185:
-       YYDEBUG(185, YYPEEK ());
-#line 195 "../gpr.re2c"
+yy190:
+       YYDEBUG(190, YYPEEK ());
+#line 197 "../gpr.re2c"
        {*id =  3; continue;}
-#line 5400 "../gpr_re2c.c"
-yy186:
-       YYDEBUG(186, YYPEEK ());
+#line 5564 "../gpr_re2c.c"
+yy191:
+       YYDEBUG(191, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'E':
-       case 'e':       goto yy192;
-       default:        goto yy33;
+       case 'e':       goto yy197;
+       default:        goto yy36;
        }
-yy187:
-       YYDEBUG(187, YYPEEK ());
+yy192:
+       YYDEBUG(192, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy194;
-       default:        goto yy33;
+       case 'a':       goto yy199;
+       default:        goto yy36;
        }
-yy188:
-       YYDEBUG(188, YYPEEK ());
-       yyaccept = 20;
+yy193:
+       YYDEBUG(193, YYPEEK ());
+       yyaccept = 21;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5538,18 +5702,18 @@ yy188:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       case '_':       goto yy195;
-       default:        goto yy189;
+       case 0xF4:      goto yy36;
+       case '_':       goto yy200;
+       default:        goto yy194;
        }
-yy189:
-       YYDEBUG(189, YYPEEK ());
-#line 201 "../gpr.re2c"
-       {*id =  9; continue;}
-#line 5550 "../gpr_re2c.c"
-yy190:
-       YYDEBUG(190, YYPEEK ());
-       yyaccept = 21;
+yy194:
+       YYDEBUG(194, YYPEEK ());
+#line 204 "../gpr.re2c"
+       {*id =  10; continue;}
+#line 5714 "../gpr_re2c.c"
+yy195:
+       YYDEBUG(195, YYPEEK ());
+       yyaccept = 22;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5667,17 +5831,17 @@ yy190:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy191;
+       case 0xF4:      goto yy36;
+       default:        goto yy196;
        }
-yy191:
-       YYDEBUG(191, YYPEEK ());
-#line 213 "../gpr.re2c"
-       {*id =  21; continue;}
-#line 5678 "../gpr_re2c.c"
-yy192:
-       YYDEBUG(192, YYPEEK ());
-       yyaccept = 22;
+yy196:
+       YYDEBUG(196, YYPEEK ());
+#line 216 "../gpr.re2c"
+       {*id =  22; continue;}
+#line 5842 "../gpr_re2c.c"
+yy197:
+       YYDEBUG(197, YYPEEK ());
+       yyaccept = 23;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -5795,104 +5959,104 @@ yy192:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy193;
+       case 0xF4:      goto yy36;
+       default:        goto yy198;
        }
-yy193:
-       YYDEBUG(193, YYPEEK ());
-#line 196 "../gpr.re2c"
-       {*id =  4; continue;}
-#line 5806 "../gpr_re2c.c"
-yy194:
-       YYDEBUG(194, YYPEEK ());
+yy198:
+       YYDEBUG(198, YYPEEK ());
+#line 199 "../gpr.re2c"
+       {*id =  5; continue;}
+#line 5970 "../gpr_re2c.c"
+yy199:
+       YYDEBUG(199, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy196;
-       default:        goto yy33;
+       case 't':       goto yy201;
+       default:        goto yy36;
        }
-yy195:
-       YYDEBUG(195, YYPEEK ());
+yy200:
+       YYDEBUG(200, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'A':
-       case 'a':       goto yy197;
-       default:        goto yy33;
+       case 'a':       goto yy202;
+       default:        goto yy36;
        }
-yy196:
-       YYDEBUG(196, YYPEEK ());
+yy201:
+       YYDEBUG(201, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
-       case 'i':       goto yy198;
-       default:        goto yy33;
+       case 'i':       goto yy203;
+       default:        goto yy36;
        }
-yy197:
-       YYDEBUG(197, YYPEEK ());
+yy202:
+       YYDEBUG(202, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy199;
-       default:        goto yy33;
+       case 's':       goto yy204;
+       default:        goto yy36;
        }
-yy198:
-       YYDEBUG(198, YYPEEK ());
+yy203:
+       YYDEBUG(203, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'O':
-       case 'o':       goto yy200;
-       default:        goto yy33;
+       case 'o':       goto yy205;
+       default:        goto yy36;
        }
-yy199:
-       YYDEBUG(199, YYPEEK ());
+yy204:
+       YYDEBUG(204, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '_':       goto yy201;
-       default:        goto yy33;
+       case '_':       goto yy206;
+       default:        goto yy36;
        }
-yy200:
-       YYDEBUG(200, YYPEEK ());
+yy205:
+       YYDEBUG(205, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'N':
-       case 'n':       goto yy202;
-       default:        goto yy33;
+       case 'n':       goto yy207;
+       default:        goto yy36;
        }
-yy201:
-       YYDEBUG(201, YYPEEK ());
+yy206:
+       YYDEBUG(206, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'L':
-       case 'l':       goto yy204;
-       default:        goto yy33;
+       case 'l':       goto yy209;
+       default:        goto yy36;
        }
-yy202:
-       YYDEBUG(202, YYPEEK ());
-       yyaccept = 23;
+yy207:
+       YYDEBUG(207, YYPEEK ());
+       yyaccept = 24;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -6010,50 +6174,50 @@ yy202:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy203;
+       case 0xF4:      goto yy36;
+       default:        goto yy208;
        }
-yy203:
-       YYDEBUG(203, YYPEEK ());
-#line 198 "../gpr.re2c"
-       {*id =  6; continue;}
-#line 6021 "../gpr_re2c.c"
-yy204:
-       YYDEBUG(204, YYPEEK ());
+yy208:
+       YYDEBUG(208, YYPEEK ());
+#line 201 "../gpr.re2c"
+       {*id =  7; continue;}
+#line 6185 "../gpr_re2c.c"
+yy209:
+       YYDEBUG(209, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'I':
-       case 'i':       goto yy205;
-       default:        goto yy33;
+       case 'i':       goto yy210;
+       default:        goto yy36;
        }
-yy205:
-       YYDEBUG(205, YYPEEK ());
+yy210:
+       YYDEBUG(210, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'S':
-       case 's':       goto yy206;
-       default:        goto yy33;
+       case 's':       goto yy211;
+       default:        goto yy36;
        }
-yy206:
-       YYDEBUG(206, YYPEEK ());
+yy211:
+       YYDEBUG(211, YYPEEK ());
        yyaccept = 1;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 'T':
-       case 't':       goto yy207;
-       default:        goto yy33;
+       case 't':       goto yy212;
+       default:        goto yy36;
        }
-yy207:
-       YYDEBUG(207, YYPEEK ());
-       yyaccept = 24;
+yy212:
+       YYDEBUG(212, YYPEEK ());
+       yyaccept = 25;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
@@ -6171,16 +6335,16 @@ yy207:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy33;
-       default:        goto yy208;
+       case 0xF4:      goto yy36;
+       default:        goto yy213;
        }
-yy208:
-       YYDEBUG(208, YYPEEK ());
-#line 202 "../gpr.re2c"
-       {*id =  10; continue;}
-#line 6182 "../gpr_re2c.c"
+yy213:
+       YYDEBUG(213, YYPEEK ());
+#line 205 "../gpr.re2c"
+       {*id =  11; continue;}
+#line 6346 "../gpr_re2c.c"
 }
-#line 232 "../gpr.re2c"
+#line 236 "../gpr.re2c"
 
       }
    *byte_position = lexer->byte_token_start - lexer->buffer + 1;
diff --git a/packages/ada-mode/run_ada_lalr_parse.ads 
b/packages/ada-mode/run_ada_lalr_parse.ads
index 3952b14..7eac49d 100644
--- a/packages/ada-mode/run_ada_lalr_parse.ads
+++ b/packages/ada-mode/run_ada_lalr_parse.ads
@@ -2,7 +2,7 @@
 --
 --  Run the Ada LALR parser standalone. Useful for debugging grammar issues.
 --
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -27,6 +27,6 @@ procedure Run_Ada_LALR_Parse is new Gen_Run_Wisi_LR_Parse
   (Wisi.Ada.Parse_Data_Type,
    Ada_Process_Actions.Descriptor,
    WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
-   WisiToken.Parse.LR.McKenzie_Recover.Ada.Use_Minimal_Complete_Actions'Access,
+   WisiToken.Parse.LR.McKenzie_Recover.Ada.Matching_Begin_Tokens'Access,
    WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
    Ada_Process_LALR_Main.Create_Parser);
diff --git a/packages/ada-mode/run_ada_lr1_parse.ads 
b/packages/ada-mode/run_ada_lr1_parse.ads
index 62a2888..76984a7 100644
--- a/packages/ada-mode/run_ada_lr1_parse.ads
+++ b/packages/ada-mode/run_ada_lr1_parse.ads
@@ -2,7 +2,7 @@
 --
 --  Run the Ada parser standalone. Useful for debugging grammar issues.
 --
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -27,7 +27,7 @@ procedure Run_Ada_LR1_Parse is new 
Gen_Run_Wisi_LR_Text_Rep_Parse
   (Wisi.Ada.Parse_Data_Type,
    Ada_Process_Actions.Descriptor,
    WisiToken.Parse.LR.McKenzie_Recover.Ada.Language_Fixes'Access,
-   WisiToken.Parse.LR.McKenzie_Recover.Ada.Use_Minimal_Complete_Actions'Access,
+   WisiToken.Parse.LR.McKenzie_Recover.Ada.Matching_Begin_Tokens'Access,
    WisiToken.Parse.LR.McKenzie_Recover.Ada.String_ID_Set'Access,
    "ada_lr1_parse_table.txt",
    Ada_Process_LR1_Main.Create_Parser);
diff --git a/packages/ada-mode/run_wisi_common_parse.adb 
b/packages/ada-mode/run_wisi_common_parse.adb
index 5d99578..df51b7a 100644
--- a/packages/ada-mode/run_wisi_common_parse.adb
+++ b/packages/ada-mode/run_wisi_common_parse.adb
@@ -47,9 +47,6 @@ package body Run_Wisi_Common_Parse is
       Put_Line ("   2 - add each parser cycle, error recovery enqueue/check");
       Put_Line ("   3 - parse stack in each cycle, error recovery parse 
actions");
       Put_Line ("   4 - add lexer debug");
-      Put_Line ("--cost_limit n   : set error recover cost limit" &
-                  (if Parser.Table = null then ""
-                   else "; default" & Integer'Image 
(Parser.Table.McKenzie_Param.Cost_Limit)));
       Put_Line ("--check_limit n  : set error recover token check limit" &
                   (if Parser.Table = null then ""
                    else "; default" & WisiToken.Token_Index'Image 
(Parser.Table.McKenzie_Param.Check_Limit)));
@@ -117,10 +114,6 @@ package body Run_Wisi_Common_Parse is
                WisiToken.Trace_Action   := Integer'Value (Argument (Arg + 3));
                Arg                      := Arg + 4;
 
-            elsif Argument (Arg) = "--cost_limit" then
-               Parser.Table.McKenzie_Param.Cost_Limit := Integer'Value 
(Argument (Arg + 1));
-               Arg := Arg + 2;
-
             elsif Argument (Arg) = "--check_limit" then
                Parser.Table.McKenzie_Param.Check_Limit := Token_Index'Value 
(Argument (Arg + 1));
                Arg := Arg + 2;
diff --git a/packages/ada-mode/wisi-ada.adb b/packages/ada-mode/wisi-ada.adb
index a476541..ddab858 100644
--- a/packages/ada-mode/wisi-ada.adb
+++ b/packages/ada-mode/wisi-ada.adb
@@ -1,500 +1,517 @@
---  Abstract :
---
---  see spec.
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Strings.Fixed;
-with Ada_Process_Actions; --  token_enum_id
-package body Wisi.Ada is
-   use WisiToken;
-
-   function Indent_Record
-     (Data              : in out Parse_Data_Type;
-      Anchor_Token      : in     Augmented_Token;
-      Record_Token      : in     Augmented_Token;
-      Indenting_Token   : in     Augmented_Token;
-      Indenting_Comment : in     Boolean;
-      Offset            : in     Integer)
-     return Wisi.Delta_Type
-   is
-      use Ada_Process_Actions;
-   begin
-      --  [1] ada-wisi-elisp-parse--indent-record-1.
-
-      if Anchor_Token.Byte_Region = Null_Buffer_Region or
-        Record_Token.Byte_Region = Null_Buffer_Region or
-        Indenting_Token.Byte_Region = Null_Buffer_Region
-      then
-         return Null_Delta;
-      end if;
-
-      if not Indenting_Comment and Indenting_Token.ID = +RECORD_ID then
-         --  Indenting 'record'
-         return Indent_Anchored_2
-           (Data, Anchor_Token.Line, Record_Token.Last_Line 
(Indenting_Comment), Ada_Indent_Record_Rel_Type,
-            Accumulate => True);
-
-      else
-         --  Indenting comment, component or 'end'
-         --
-         --  Ensure 'record' line is anchored.
-         if not (Data.Indents (Record_Token.Line).Label = Anchored or
-                   Data.Indents (Record_Token.Line).Label = Anchor_Anchored)
-         then
-            if Anchor_Token.Line /= Record_Token.Line then
-               --  We don't pass Indenting_Comment here, because 'record' is 
code.
-               Indent_Token_1
-                 (Data,
-                  Record_Token,
-                  Indent_Anchored_2
-                    (Data, Anchor_Token.Line,
-                     Record_Token.Last_Line (Indenting_Comment => False),
-                     Ada_Indent_Record_Rel_Type,
-                     Accumulate => True),
-                  Indenting_Comment => False);
-            end if;
-         end if;
-
-         --  from [2] wisi-elisp-parse--anchored-1
-         return Indent_Anchored_2
-           (Data,
-            Anchor_Line => Anchor_Token.Line,
-            Last_Line   => Indenting_Token.Last_Line (Indenting_Comment),
-            Offset      => Current_Indent_Offset
-              (Data, Anchor_Token,
-               Offset   =>
-                 (if Anchor_Token.Line = Record_Token.Line
-                  then Offset
-                  else Offset + Ada_Indent_Record_Rel_Type)),
-            Accumulate => True);
-      end if;
-   end Indent_Record;
-
-   ----------
-   --  Public subprograms
-
-   overriding
-   procedure Initialize
-     (Data              : in out Parse_Data_Type;
-      Descriptor        : access constant WisiToken.Descriptor;
-      Source_File_Name  : in     String;
-      Post_Parse_Action : in     Post_Parse_Action_Type;
-      Begin_Line        : in     WisiToken.Line_Number_Type;
-      End_Line          : in     WisiToken.Line_Number_Type;
-      Begin_Indent      : in     Integer;
-      Params            : in     String)
-   is
-      use Standard.Ada.Strings.Fixed;
-      First : Integer := Params'First;
-      Last  : Integer := Index (Params, " ");
-   begin
-      Wisi.Initialize
-        (Wisi.Parse_Data_Type (Data), Descriptor, Source_File_Name, 
Post_Parse_Action, Begin_Line, End_Line,
-         Begin_Indent, "");
-
-      if Params /= "" then
-         Ada_Indent := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Broken := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := First + 1;
-         Ada_Indent_Comment_Col_0 := Params (First) = '1';
-
-         First := Last + 1;
-         Last := First + 1;
-         Ada_Indent_Comment_GNAT := Params (First) = '1';
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Label := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Record_Rel_Type := Integer'Value (Params (First .. Last - 
1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Renames := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Return := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_Use := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_When := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := Index (Params, " ", First);
-         Ada_Indent_With := Integer'Value (Params (First .. Last - 1));
-
-         First := Last + 1;
-         Last := First + 1;
-         Ada_Indent_Hanging_Rel_Exp := Params (First) = '1';
-
-         First := Last + 1;
-         Last := First + 1;
-         End_Names_Optional := Params (First) = '1';
-      end if;
-
-      Data.Indent_Comment_Col_0 := Ada_Indent_Comment_Col_0;
-   end Initialize;
-
-   overriding
-   function Indent_Hanging_1
-     (Data              : in out Parse_Data_Type;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Delta_1           : in     Simple_Indent_Param;
-      Delta_2           : in     Simple_Indent_Param;
-      Option            : in     Boolean;
-      Accumulate        : in     Boolean)
-     return Delta_Type
-   is
-      use all type Syntax_Trees.Node_Index;
-      Indenting_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
-
-      function Result (Delta_1 : in Simple_Indent_Param; Delta_2 : in 
Simple_Delta_Type) return Delta_Type
-      is begin
-         return
-           (Hanging,
-            Hanging_First_Line  => Indenting_Token.Line,
-            Hanging_Paren_State => Indenting_Token.Paren_State,
-            Hanging_Delta_1     => Indent_Compute_Delta
-              (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta,
-            Hanging_Delta_2     => Delta_2,
-            Hanging_Accumulate => Accumulate);
-      end Result;
-
-      function Result (Delta_1 : in Simple_Delta_Type) return Delta_Type
-      is begin
-         return
-           (Hanging,
-            Hanging_First_Line  => Indenting_Token.Line,
-            Hanging_Paren_State => Indenting_Token.Paren_State,
-            Hanging_Delta_1     => Delta_1,
-            Hanging_Delta_2     => Delta_1,
-            Hanging_Accumulate => Accumulate);
-      end Result;
-
-      function Comment_Result (D : in Simple_Indent_Param) return Delta_Type
-      is begin
-         return Indent_Compute_Delta
-           (Data, Tree, Tokens, (Simple, D), Tree_Indenting, Indenting_Comment 
=> False);
-      end Comment_Result;
-
-      use Ada_Process_Actions;
-   begin
-      if Tree.ID (Tree.Parent (Tree_Indenting)) = +association_opt_ID and then
-        Syntax_Trees.Invalid_Node_Index /= Tree.Find_Ancestor (Tree_Indenting, 
+aspect_specification_opt_ID)
-      then
-         --  In aspect_specification_opt
-         --  See ada.wy association_opt for test cases
-         if not Indenting_Comment then
-            return Result
-              (Delta_1,
-               Indent_Anchored_2
-                 (Data, Indenting_Token.Line, Indenting_Token.Last_Indent_Line,
-                  Current_Indent_Offset (Data, Indenting_Token, 0),
-                  Accumulate => False).Simple_Delta);
-         else
-            --  Test case in test/aspects.ads
-            return Result
-              (Indent_Compute_Delta
-                 (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
-         end if;
-
-      elsif Ada_Indent_Hanging_Rel_Exp then
-         declare
-            New_Delta_2 : constant Simple_Delta_Type := Indent_Anchored_2
-              (Data, Indenting_Token.Line, Indenting_Token.Last_Indent_Line,
-               Current_Indent_Offset (Data, Indenting_Token, 
Ada_Indent_Broken),
-               Accumulate => False).Simple_Delta;
-         begin
-            if not Option or Indenting_Token.Line = 
Indenting_Token.First_Indent_Line then
-               return Result (Delta_1, New_Delta_2);
-            else
-               return Result (New_Delta_2);
-            end if;
-         end;
-
-      elsif Indenting_Comment then
-         --  Use delta for last line of Indenting_Token.
-         --  Test cases in test/ada_mode-parens.adb Hello
-         declare
-            First_Terminal : Augmented_Token renames
-              Data.Terminals (Indenting_Token.First_Terminals_Index);
-         begin
-            if Option then
-               --  Test cases with "Item => ..."
-               if First_Terminal.First then
-                  if Indenting_Token.First_Indent_Line = 
Indenting_Token.Last_Indent_Line then
-                     return Comment_Result (Delta_1);
-                  else
-                     return Comment_Result (Delta_2);
-                  end if;
-               else
-                  if Indenting_Token.First_Indent_Line = Invalid_Line_Number 
then
-                     return Comment_Result ((Int, 0));
-                  else
-                     return Comment_Result (Delta_1);
-                  end if;
-               end if;
-
-            else
-               if First_Terminal.First then
-                  if Indenting_Token.First_Indent_Line = 
Indenting_Token.Last_Indent_Line then
-                     return Comment_Result (Delta_1);
-                  else
-                     return Comment_Result (Delta_2);
-                  end if;
-               else
-                  if Indenting_Token.First_Indent_Line = Invalid_Line_Number 
then
-                     --  Comment is after first line in token
-                     return Comment_Result (Delta_1);
-                  else
-                     return Comment_Result (Delta_2);
-                  end if;
-               end if;
-            end if;
-         end;
-
-      elsif not Option or Indenting_Token.Line = 
Indenting_Token.First_Indent_Line then
-         return Result
-           (Delta_1,
-            Indent_Compute_Delta
-              (Data, Tree, Tokens, (Simple, Delta_2), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
-
-      else
-         return Result
-           (Indent_Compute_Delta
-              (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
-      end if;
-   end Indent_Hanging_1;
-
-   function Ada_Indent_Aggregate
-     (Data              : in out Wisi.Parse_Data_Type'Class;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
-     return Wisi.Delta_Type
-   is
-      pragma Unreferenced (Data);
-      pragma Unreferenced (Indenting_Comment);
-      pragma Unreferenced (Args);
-      pragma Unreferenced (Tokens);
-
-      use all type Syntax_Trees.Node_Index;
-      use Ada_Process_Actions;
-
-      --  In our grammar, 'aggregate' can be an Ada aggregate, or a
-      --  parenthesized expression.
-      --
-      --  We always want an 'aggregate' to be indented by
-      --  ada-indent-broken. However, in some places in the grammar,
-      --  'aggregate' is indented by ada-indent. The following checks for
-      --  those places, and returns a correction value.
-
-      Expression : constant Syntax_Trees.Node_Index := Tree.Find_Ancestor 
(Tree_Indenting, +expression_opt_ID);
-   begin
-      if Expression = Syntax_Trees.Invalid_Node_Index or else
-        Tree.Parent (Expression) = Syntax_Trees.Invalid_Node_Index
-      then
-         return Null_Delta;
-      elsif Tree.ID (Tree.Parent (Expression)) in +if_expression_ID | 
+elsif_expression_item_ID |
-        +case_expression_alternative_ID
-      then
-         --  The controlling boolean expression in 'if_expression' and
-         --  'elsif_expression_item' cannot be an aggregate in legal Ada
-         --  syntax.
-         return (Simple, (Int, Ada_Indent_Broken - Ada_Indent));
-      else
-         return Null_Delta;
-      end if;
-   end Ada_Indent_Aggregate;
-
-   function Ada_Indent_Renames_0
-     (Data              : in out Wisi.Parse_Data_Type'Class;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Args              : in     Indent_Arg_Arrays.Vector)
-     return Wisi.Delta_Type
-   is
-      Subp_Tok    : constant Aug_Token_Ref := Get_Aug_Token
-        (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args (1)))));
-      Renames_Tok : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
-      Paren_I     : Base_Token_Index;
-   begin
-      if Subp_Tok.Char_Region = Null_Buffer_Region then
-         --  built from entirely virtual tokens
-         return Null_Delta;
-      end if;
-
-      Paren_I := Data.Find (Data.Descriptor.Left_Paren_ID, Subp_Tok);
-
-      if Paren_I /= Augmented_Token_Arrays.No_Index then
-         --  paren is present
-         declare
-            Paren_Tok : Augmented_Token renames Data.Terminals (Paren_I);
-         begin
-            if Ada_Indent_Renames > 0 then
-               return Indent_Anchored_2
-                 (Data,
-                  Anchor_Line => Subp_Tok.Line,
-                  Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
-                  Offset      => Ada_Indent_Renames,
-                  Accumulate  => True);
-            else
-               return Indent_Anchored_2
-                 (Data,
-                  Anchor_Line => Paren_Tok.Line,
-                  Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
-                  Offset      => Current_Indent_Offset (Data, Paren_Tok, abs 
Ada_Indent_Renames),
-                  Accumulate  => True);
-            end if;
-         end;
-      else
-         return Indent_Anchored_2
-           (Data,
-            Anchor_Line => Subp_Tok.Line,
-            Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
-            Offset      => Ada_Indent_Broken,
-            Accumulate  => True);
-      end if;
-   end Ada_Indent_Renames_0;
-
-   function Ada_Indent_Return_0
-     (Data              : in out Wisi.Parse_Data_Type'Class;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
-     return Wisi.Delta_Type
-   is
-      use all type Ada_Process_Actions.Token_Enum_ID;
-      --  Tokens (Args (1)) = 'formal_part'
-      --  Indenting = 'result_profile'
-      --  Args (2) = delta (= 0!)
-      --
-      --  We are indenting 'result_profile' in
-      --  'parameter_and_result_profile'. The indent depends on whether the
-      --  'formal_part' is present, and the location of 'FUNCTION'.
-
-      Parameter_And_Result_Profile : constant Syntax_Trees.Valid_Node_Index := 
Tree.Parent (Tree_Indenting);
-
-      Indenting : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
-   begin
-      if Indenting.Line = Indenting.First_Indent_Line then
-         if Ada_Indent_Return <= 0 then
-            declare
-               Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token
-                 (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args 
(1)))));
-            begin
-               return Indent_Anchored_2
-                 (Data,
-                  Anchor_Line => Anchor_Token.Line,
-                  Last_Line   => Indenting.Last_Line (Indenting_Comment),
-                  Offset      => Current_Indent_Offset (Data, Anchor_Token, 
Args (2) + abs Ada_Indent_Return),
-                  Accumulate  => True);
-            end;
-         else
-            declare
-               Function_N   : constant Syntax_Trees.Valid_Node_Index := 
Tree.Find_Sibling
-                 (Parameter_And_Result_Profile, +FUNCTION_ID);
-               Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, 
Tree, Function_N);
-            begin
-               return Indent_Anchored_2
-                 (Data,
-                  Anchor_Line => Anchor_Token.Line,
-                  Last_Line   => Indenting.Last_Line (Indenting_Comment),
-                  Offset      => Current_Indent_Offset (Data, Anchor_Token, 
Args (2) + abs Ada_Indent_Return),
-                  Accumulate  => True);
-            end;
-         end if;
-
-      else
-         return Null_Delta;
-      end if;
-   end Ada_Indent_Return_0;
-
-   function Ada_Indent_Record_0
-     (Data              : in out Wisi.Parse_Data_Type'Class;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
-     return Wisi.Delta_Type
-   is begin
-      return Indent_Record
-        (Parse_Data_Type (Data),
-         Anchor_Token      => Get_Aug_Token (Data, Tree, Tokens 
(Positive_Index_Type (Integer'(Args (1))))),
-         Record_Token      => Get_Aug_Token (Data, Tree, Tokens 
(Positive_Index_Type (Integer'(Args (2))))),
-         Offset            => Args (3),
-         Indenting_Token   => Get_Aug_Token (Data, Tree, Tree_Indenting),
-         Indenting_Comment => Indenting_Comment);
-   end Ada_Indent_Record_0;
-
-   function Ada_Indent_Record_1
-     (Data              : in out Wisi.Parse_Data_Type'Class;
-      Tree              : in     Syntax_Trees.Tree;
-      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
-      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
-      Indenting_Comment : in     Boolean;
-      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
-     return Wisi.Delta_Type
-   is
-      --  We are indenting a token in 'record_definition'.
-      --
-      --  Args (1) is the token ID of the anchor (= TYPE); it appears as a
-      --  direct child in an ancestor 'full_type_declaration'.
-      use Ada_Process_Actions;
-
-      Full_Type_Declaration : constant Syntax_Trees.Valid_Node_Index := 
Tree.Find_Ancestor
-        (Tree_Indenting, +full_type_declaration_ID);
-
-      Tree_Anchor : constant Syntax_Trees.Valid_Node_Index := Tree.Find_Child
-        (Full_Type_Declaration, Token_ID (Integer'(Args (1))));
-
-      Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Anchor);
-
-      --  Args (2) is the index of RECORD in Tokens
-      Record_Token : constant Aug_Token_Ref := Get_Aug_Token
-        (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args (2)))));
-
-      Indenting_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
-   begin
-      --  Args (3) is the offset
-      return Indent_Record
-        (Parse_Data_Type (Data), Anchor_Token, Record_Token, Indenting_Token, 
Indenting_Comment, Args (3));
-   end Ada_Indent_Record_1;
-
-end Wisi.Ada;
+--  Abstract :
+--
+--  see spec.
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Strings.Fixed;
+with Ada_Process_Actions; --  token_enum_id
+package body Wisi.Ada is
+   use WisiToken;
+
+   function Indent_Record
+     (Data              : in out Parse_Data_Type;
+      Anchor_Token      : in     Augmented_Token;
+      Record_Token      : in     Augmented_Token;
+      Indenting_Token   : in     Augmented_Token;
+      Indenting_Comment : in     Boolean;
+      Offset            : in     Integer)
+     return Wisi.Delta_Type
+   is
+      use Ada_Process_Actions;
+   begin
+      --  [1] ada-wisi-elisp-parse--indent-record-1.
+
+      if Anchor_Token.Byte_Region = Null_Buffer_Region or
+        Record_Token.Byte_Region = Null_Buffer_Region or
+        Indenting_Token.Byte_Region = Null_Buffer_Region
+      then
+         return Null_Delta;
+      end if;
+
+      if not Indenting_Comment and Indenting_Token.ID = +RECORD_ID then
+         --  Indenting 'record'
+         return Indent_Anchored_2
+           (Data, Anchor_Token.Line, Record_Token.Last_Line 
(Indenting_Comment), Ada_Indent_Record_Rel_Type,
+            Accumulate => True);
+
+      else
+         --  Indenting comment, component or 'end'
+         --
+         --  Ensure 'record' line is anchored.
+         if not (Data.Indents (Record_Token.Line).Label = Anchored or
+                   Data.Indents (Record_Token.Line).Label = Anchor_Anchored)
+         then
+            if Anchor_Token.Line /= Record_Token.Line then
+               --  We don't pass Indenting_Comment here, because 'record' is 
code.
+               Indent_Token_1
+                 (Data,
+                  Record_Token,
+                  Indent_Anchored_2
+                    (Data, Anchor_Token.Line,
+                     Record_Token.Last_Line (Indenting_Comment => False),
+                     Ada_Indent_Record_Rel_Type,
+                     Accumulate => True),
+                  Indenting_Comment => False);
+            end if;
+         end if;
+
+         --  from [2] wisi-elisp-parse--anchored-1
+         return Indent_Anchored_2
+           (Data,
+            Anchor_Line => Anchor_Token.Line,
+            Last_Line   => Indenting_Token.Last_Line (Indenting_Comment),
+            Offset      => Current_Indent_Offset
+              (Data, Anchor_Token,
+               Offset   =>
+                 (if Anchor_Token.Line = Record_Token.Line
+                  then Offset
+                  else Offset + Ada_Indent_Record_Rel_Type)),
+            Accumulate => True);
+      end if;
+   end Indent_Record;
+
+   ----------
+   --  Public subprograms
+
+   overriding
+   procedure Initialize
+     (Data              : in out Parse_Data_Type;
+      Descriptor        : access constant WisiToken.Descriptor;
+      Source_File_Name  : in     String;
+      Post_Parse_Action : in     Post_Parse_Action_Type;
+      Begin_Line        : in     WisiToken.Line_Number_Type;
+      End_Line          : in     WisiToken.Line_Number_Type;
+      Begin_Indent      : in     Integer;
+      Params            : in     String)
+   is
+      use Standard.Ada.Strings.Fixed;
+      use all type Ada_Process_Actions.Token_Enum_ID;
+      First : Integer := Params'First;
+      Last  : Integer := Index (Params, " ");
+   begin
+      Wisi.Initialize
+        (Wisi.Parse_Data_Type (Data), Descriptor, Source_File_Name, 
Post_Parse_Action, Begin_Line, End_Line,
+         Begin_Indent, "");
+
+      Data.First_Comment_ID := +COMMENT_ID;
+      Data.Last_Comment_ID  := WisiToken.Invalid_Token_ID;
+      Data.Left_Paren_ID    := +LEFT_PAREN_ID;
+      Data.Right_Paren_ID   := +RIGHT_PAREN_ID;
+
+      Data.Embedded_Quote_Escape_Doubled := True;
+
+      if Params /= "" then
+         Ada_Indent := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Broken := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := First + 1;
+         Ada_Indent_Comment_Col_0 := Params (First) = '1';
+
+         First := Last + 1;
+         Last := First + 1;
+         Ada_Indent_Comment_GNAT := Params (First) = '1';
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Label := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Record_Rel_Type := Integer'Value (Params (First .. Last - 
1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Renames := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Return := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_Use := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_When := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := Index (Params, " ", First);
+         Ada_Indent_With := Integer'Value (Params (First .. Last - 1));
+
+         First := Last + 1;
+         Last := First + 1;
+         Ada_Indent_Hanging_Rel_Exp := Params (First) = '1';
+
+         First := Last + 1;
+         Last := First + 1;
+         End_Names_Optional := Params (First) = '1';
+      end if;
+
+      Data.Indent_Comment_Col_0 := Ada_Indent_Comment_Col_0;
+   end Initialize;
+
+   overriding
+   function Indent_Hanging_1
+     (Data              : in out Parse_Data_Type;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Delta_1           : in     Simple_Indent_Param;
+      Delta_2           : in     Simple_Indent_Param;
+      Option            : in     Boolean;
+      Accumulate        : in     Boolean)
+     return Delta_Type
+   is
+      use all type Syntax_Trees.Node_Index;
+      Indenting_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
+
+      function Result (Delta_1 : in Simple_Indent_Param; Delta_2 : in 
Simple_Delta_Type) return Delta_Type
+      is begin
+         return
+           (Hanging,
+            Hanging_First_Line  => Indenting_Token.Line,
+            Hanging_Paren_State => Indenting_Token.Paren_State,
+            Hanging_Delta_1     => Indent_Compute_Delta
+              (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta,
+            Hanging_Delta_2     => Delta_2,
+            Hanging_Accumulate => Accumulate);
+      end Result;
+
+      function Result (Delta_1 : in Simple_Delta_Type) return Delta_Type
+      is begin
+         return
+           (Hanging,
+            Hanging_First_Line  => Indenting_Token.Line,
+            Hanging_Paren_State => Indenting_Token.Paren_State,
+            Hanging_Delta_1     => Delta_1,
+            Hanging_Delta_2     => Delta_1,
+            Hanging_Accumulate => Accumulate);
+      end Result;
+
+      function Comment_Result (D : in Simple_Indent_Param) return Delta_Type
+      is begin
+         return Indent_Compute_Delta
+           (Data, Tree, Tokens, (Simple, D), Tree_Indenting, Indenting_Comment 
=> False);
+      end Comment_Result;
+
+      use Ada_Process_Actions;
+   begin
+      if Tree.ID (Tree.Parent (Tree_Indenting)) = +association_opt_ID and then
+        Syntax_Trees.Invalid_Node_Index /= Tree.Find_Ancestor (Tree_Indenting, 
+aspect_specification_opt_ID)
+      then
+         --  In aspect_specification_opt
+         --  See ada.wy association_opt for test cases
+         if not Indenting_Comment then
+            return Result
+              (Delta_1,
+               Indent_Anchored_2
+                 (Data, Indenting_Token.Line, Indenting_Token.Last_Indent_Line,
+                  Current_Indent_Offset (Data, Indenting_Token, 0),
+                  Accumulate => False).Simple_Delta);
+         else
+            --  Test case in test/aspects.ads
+            return Result
+              (Indent_Compute_Delta
+                 (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
+         end if;
+
+      elsif Ada_Indent_Hanging_Rel_Exp then
+         declare
+            New_Delta_2 : constant Simple_Delta_Type := Indent_Anchored_2
+              (Data, Indenting_Token.Line, Indenting_Token.Last_Indent_Line,
+               Current_Indent_Offset (Data, Indenting_Token, 
Ada_Indent_Broken),
+               Accumulate => False).Simple_Delta;
+         begin
+            if not Option or Indenting_Token.Line = 
Indenting_Token.First_Indent_Line then
+               return Result (Delta_1, New_Delta_2);
+            else
+               return Result (New_Delta_2);
+            end if;
+         end;
+
+      elsif Indenting_Comment then
+         --  Use delta for last line of Indenting_Token.
+         --  Test cases in test/ada_mode-parens.adb Hello
+         declare
+            First_Terminal : Augmented_Token renames
+              Data.Terminals (Indenting_Token.First_Terminals_Index);
+         begin
+            if Option then
+               --  Test cases with "Item => ..."
+               if First_Terminal.First then
+                  if Indenting_Token.First_Indent_Line = 
Indenting_Token.Last_Indent_Line then
+                     return Comment_Result (Delta_1);
+                  else
+                     return Comment_Result (Delta_2);
+                  end if;
+               else
+                  if Indenting_Token.First_Indent_Line = Invalid_Line_Number 
then
+                     return Comment_Result ((Int, 0));
+                  else
+                     return Comment_Result (Delta_1);
+                  end if;
+               end if;
+
+            else
+               if First_Terminal.First then
+                  if Indenting_Token.First_Indent_Line = 
Indenting_Token.Last_Indent_Line then
+                     return Comment_Result (Delta_1);
+                  else
+                     return Comment_Result (Delta_2);
+                  end if;
+               else
+                  if Indenting_Token.First_Indent_Line = Invalid_Line_Number 
then
+                     --  Comment is after first line in token
+                     return Comment_Result (Delta_1);
+                  else
+                     return Comment_Result (Delta_2);
+                  end if;
+               end if;
+            end if;
+         end;
+
+      elsif not Option or Indenting_Token.Line = 
Indenting_Token.First_Indent_Line then
+         return Result
+           (Delta_1,
+            Indent_Compute_Delta
+              (Data, Tree, Tokens, (Simple, Delta_2), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
+
+      else
+         return Result
+           (Indent_Compute_Delta
+              (Data, Tree, Tokens, (Simple, Delta_1), Tree_Indenting, 
Indenting_Comment).Simple_Delta);
+      end if;
+   end Indent_Hanging_1;
+
+   function Ada_Indent_Aggregate
+     (Data              : in out Wisi.Parse_Data_Type'Class;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
+     return Wisi.Delta_Type
+   is
+      pragma Unreferenced (Data);
+      pragma Unreferenced (Indenting_Comment);
+      pragma Unreferenced (Args);
+      pragma Unreferenced (Tokens);
+
+      use all type Syntax_Trees.Node_Index;
+      use Ada_Process_Actions;
+
+      --  In our grammar, 'aggregate' can be an Ada aggregate, or a
+      --  parenthesized expression.
+      --
+      --  We always want an 'aggregate' to be indented by
+      --  ada-indent-broken. However, in some places in the grammar,
+      --  'aggregate' is indented by ada-indent. The following checks for
+      --  those places, and returns a correction value.
+
+      Expression : constant Syntax_Trees.Node_Index := Tree.Find_Ancestor 
(Tree_Indenting, +expression_opt_ID);
+   begin
+      if Expression = Syntax_Trees.Invalid_Node_Index or else
+        Tree.Parent (Expression) = Syntax_Trees.Invalid_Node_Index
+      then
+         return Null_Delta;
+      elsif Tree.ID (Tree.Parent (Expression)) in +if_expression_ID | 
+elsif_expression_item_ID |
+        +case_expression_alternative_ID
+      then
+         --  The controlling boolean expression in 'if_expression' and
+         --  'elsif_expression_item' cannot be an aggregate in legal Ada
+         --  syntax.
+         return (Simple, (Int, Ada_Indent_Broken - Ada_Indent));
+      else
+         return Null_Delta;
+      end if;
+   end Ada_Indent_Aggregate;
+
+   function Ada_Indent_Renames_0
+     (Data              : in out Wisi.Parse_Data_Type'Class;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Args              : in     Indent_Arg_Arrays.Vector)
+     return Wisi.Delta_Type
+   is
+      Subp_Tok    : constant Aug_Token_Ref := Get_Aug_Token
+        (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args (1)))));
+      Renames_Tok : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
+      Paren_I     : Base_Token_Index;
+   begin
+      if Subp_Tok.Char_Region = Null_Buffer_Region then
+         --  built from entirely virtual tokens
+         return Null_Delta;
+      end if;
+
+      Paren_I := Data.Find (Data.Left_Paren_ID, Subp_Tok);
+
+      if Paren_I /= Augmented_Token_Arrays.No_Index then
+         --  paren is present
+         declare
+            Paren_Tok : Augmented_Token renames Data.Terminals (Paren_I);
+         begin
+            if Ada_Indent_Renames > 0 then
+               return Indent_Anchored_2
+                 (Data,
+                  Anchor_Line => Subp_Tok.Line,
+                  Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
+                  Offset      => Ada_Indent_Renames,
+                  Accumulate  => True);
+            else
+               return Indent_Anchored_2
+                 (Data,
+                  Anchor_Line => Paren_Tok.Line,
+                  Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
+                  Offset      => Current_Indent_Offset (Data, Paren_Tok, abs 
Ada_Indent_Renames),
+                  Accumulate  => True);
+            end if;
+         end;
+      else
+         return Indent_Anchored_2
+           (Data,
+            Anchor_Line => Subp_Tok.Line,
+            Last_Line   => Renames_Tok.Last_Line (Indenting_Comment),
+            Offset      => Ada_Indent_Broken,
+            Accumulate  => True);
+      end if;
+   end Ada_Indent_Renames_0;
+
+   function Ada_Indent_Return_0
+     (Data              : in out Wisi.Parse_Data_Type'Class;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
+     return Wisi.Delta_Type
+   is
+      use all type Ada_Process_Actions.Token_Enum_ID;
+      --  Tokens (Args (1)) = 'formal_part'
+      --  Indenting = 'result_profile'
+      --  Args (2) = delta (= 0!)
+      --
+      --  We are indenting 'result_profile' in
+      --  'parameter_and_result_profile'. The indent depends on whether the
+      --  'formal_part' is present, and the location of 'FUNCTION'.
+
+      Parameter_And_Result_Profile : constant Syntax_Trees.Valid_Node_Index := 
Tree.Parent (Tree_Indenting);
+
+      Indenting : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Indenting);
+   begin
+      if Indenting.Line = Indenting.First_Indent_Line then
+         if Ada_Indent_Return <= 0 then
+            declare
+               Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token
+                 (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args 
(1)))));
+            begin
+               return Indent_Anchored_2
+                 (Data,
+                  Anchor_Line => Anchor_Token.Line,
+                  Last_Line   => Indenting.Last_Line (Indenting_Comment),
+                  Offset      => Current_Indent_Offset (Data, Anchor_Token, 
Args (2) + abs Ada_Indent_Return),
+                  Accumulate  => True);
+            end;
+         else
+            declare
+               Function_N   : constant Syntax_Trees.Valid_Node_Index := 
Tree.Find_Sibling
+                 (Parameter_And_Result_Profile, +FUNCTION_ID);
+               Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, 
Tree, Function_N);
+            begin
+               return Indent_Anchored_2
+                 (Data,
+                  Anchor_Line => Anchor_Token.Line,
+                  Last_Line   => Indenting.Last_Line (Indenting_Comment),
+                  Offset      => Current_Indent_Offset (Data, Anchor_Token, 
Args (2) + abs Ada_Indent_Return),
+                  Accumulate  => True);
+            end;
+         end if;
+
+      else
+         return Null_Delta;
+      end if;
+   end Ada_Indent_Return_0;
+
+   function Ada_Indent_Record_0
+     (Data              : in out Wisi.Parse_Data_Type'Class;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
+     return Wisi.Delta_Type
+   is begin
+      return Indent_Record
+        (Parse_Data_Type (Data),
+         Anchor_Token      => Get_Aug_Token (Data, Tree, Tokens 
(Positive_Index_Type (Integer'(Args (1))))),
+         Record_Token      => Get_Aug_Token (Data, Tree, Tokens 
(Positive_Index_Type (Integer'(Args (2))))),
+         Offset            => Args (3),
+         Indenting_Token   => Get_Aug_Token (Data, Tree, Tree_Indenting),
+         Indenting_Comment => Indenting_Comment);
+   end Ada_Indent_Record_0;
+
+   function Ada_Indent_Record_1
+     (Data              : in out Wisi.Parse_Data_Type'Class;
+      Tree              : in     Syntax_Trees.Tree;
+      Tokens            : in     Syntax_Trees.Valid_Node_Index_Array;
+      Tree_Indenting    : in     Syntax_Trees.Valid_Node_Index;
+      Indenting_Comment : in     Boolean;
+      Args              : in     Wisi.Indent_Arg_Arrays.Vector)
+     return Wisi.Delta_Type
+   is
+      --  We are indenting a token in 'record_definition'.
+      --
+      --  Args (1) is the token ID of the anchor (= TYPE); it appears as a
+      --  direct child in an ancestor 'full_type_declaration'.
+
+      use all type WisiToken.Syntax_Trees.Node_Label;
+      use Ada_Process_Actions;
+
+      Full_Type_Declaration : constant Syntax_Trees.Valid_Node_Index := 
Tree.Find_Ancestor
+        (Tree_Indenting, +full_type_declaration_ID);
+
+      Tree_Anchor : constant Syntax_Trees.Valid_Node_Index := Tree.Find_Child
+        (Full_Type_Declaration, Token_ID (Integer'(Args (1))));
+   begin
+      if Tree.Label (Tree_Anchor) /= WisiToken.Syntax_Trees.Shared_Terminal 
then
+         --  Anchor is virtual; Indent_Record would return Null_Delta
+         return Null_Delta;
+      end if;
+
+      declare
+         Anchor_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tree_Anchor);
+
+         --  Args (2) is the index of RECORD in Tokens
+         Record_Token : constant Aug_Token_Ref := Get_Aug_Token
+           (Data, Tree, Tokens (Positive_Index_Type (Integer'(Args (2)))));
+
+         Indenting_Token : constant Aug_Token_Ref := Get_Aug_Token (Data, 
Tree, Tree_Indenting);
+      begin
+         --  Args (3) is the offset
+         return Indent_Record
+           (Parse_Data_Type (Data), Anchor_Token, Record_Token, 
Indenting_Token, Indenting_Comment, Args (3));
+      end;
+   end Ada_Indent_Record_1;
+
+end Wisi.Ada;
diff --git a/packages/ada-mode/wisi-ada.ads b/packages/ada-mode/wisi-ada.ads
index 419db92..585e513 100644
--- a/packages/ada-mode/wisi-ada.ads
+++ b/packages/ada-mode/wisi-ada.ads
@@ -22,6 +22,15 @@ pragma License (Modified_GPL);
 
 package Wisi.Ada is
 
+   Language_Protocol_Version : constant String := "1";
+   --  Defines the data passed to Initialize in Params.
+   --
+   --  This value must match ada-wisi.el
+   --  ada-wisi-language-protocol-version.
+   --
+   --  Only changes once per ada-mode release. Increment as soon as
+   --  required, record new version in NEWS-ada-mode.text.
+
    --  Indent parameters from [2]
    Ada_Indent                 : Integer := 3;
    Ada_Indent_Broken          : Integer := 2;
diff --git a/packages/ada-mode/wisi-gpr.adb b/packages/ada-mode/wisi-gpr.adb
index caf3577..60d7df8 100644
--- a/packages/ada-mode/wisi-gpr.adb
+++ b/packages/ada-mode/wisi-gpr.adb
@@ -18,6 +18,7 @@
 pragma License (Modified_GPL);
 
 with Ada.Strings.Fixed;
+with Gpr_Process_Actions;
 package body Wisi.Gpr is
 
    overriding
@@ -32,6 +33,7 @@ package body Wisi.Gpr is
       Params            : in     String)
    is
       use Ada.Strings.Fixed;
+      use all type Gpr_Process_Actions.Token_Enum_ID;
       First : Integer := Params'First;
       Last  : Integer := Index (Params, " ");
    begin
@@ -39,6 +41,11 @@ package body Wisi.Gpr is
         (Wisi.Parse_Data_Type (Data), Descriptor, Source_File_Name, 
Post_Parse_Action, Begin_Line, End_Line,
          Begin_Indent, "");
 
+      Data.First_Comment_ID := +COMMENT_ID;
+      Data.Last_Comment_ID  := WisiToken.Invalid_Token_ID;
+      Data.Left_Paren_ID    := WisiToken.Invalid_Token_ID;
+      Data.Right_Paren_ID   := WisiToken.Invalid_Token_ID;
+
       if Params /= "" then
          --  must match [1] wisi-parse-format-language-options
          Gpr_Indent := Integer'Value (Params (First .. Last - 1));
diff --git a/packages/ada-mode/wisi-gpr.ads b/packages/ada-mode/wisi-gpr.ads
index c2fe78e..aab5e0d 100644
--- a/packages/ada-mode/wisi-gpr.ads
+++ b/packages/ada-mode/wisi-gpr.ads
@@ -22,6 +22,12 @@ pragma License (Modified_GPL);
 
 package Wisi.Gpr is
 
+   Language_Protocol_Version : constant String := "1";
+   --  Defines the data passed to Initialize in Params.
+   --
+   --  This value must match gpr-wisi.el
+   --  gpr-wisi-language-protocol-version.
+
    --  Indent parameters from [2]
    Gpr_Indent        : Integer := 3;
    Gpr_Indent_Broken : Integer := 2;
diff --git a/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.adb 
b/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.adb
index 9a1f156..763850a 100644
--- a/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.adb
+++ b/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.adb
@@ -1,1143 +1,1133 @@
---  Abstract :
---
---  see spec.
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Containers;
-with Ada.Exceptions;
-with Ada_Process_Actions;
-with System.Assertions;
-package body WisiToken.Parse.LR.McKenzie_Recover.Ada is
-
-   use all type Ada_Process_Actions.Token_Enum_ID; -- token names
-   use all type Semantic_Checks.Check_Status_Label;
-
-   Descriptor : WisiToken.Descriptor renames Ada_Process_Actions.Descriptor;
-
-   subtype Grammar_Token_ID_Set is WisiToken.Token_ID_Set 
(Descriptor.First_Terminal .. Descriptor.Last_Nonterminal);
-   subtype Terminal_Token_ID_Set is WisiToken.Token_ID_Set 
(Descriptor.First_Terminal .. Descriptor.Last_Terminal);
-
-   --  From ada.wy, all nonterms with a Match_Names check:
-   --
-   --  nonterm                       <begin_name_token>        <end_name_token>
-   --  |-----------------------------|-------------------------|-------------
-   --  accept_statement              IDENTIFIER                identifier_opt
-   --  block_statement               block_label_opt           identifier_opt
-   --  entry_body                    IDENTIFIER                identifier_opt
-   --  loop_statement                block_label_opt           identifier_opt
-   --  package_body                  name                      name_opt
-   --  package_specification         name                      name_opt
-   --  protected_body                IDENTIFIER                identifier_opt
-   --  protected_type_declaration    IDENTIFIER                
protected_definition
-   --  single_protected_declaration  IDENTIFIER                
protected_definition
-   --  single_task_declaration       IDENTIFIER                identifier_opt
-   --  subprogram_body               subprogram_specification  name_opt
-   --  task_body                     IDENTIFIER                identifier_opt
-   --  task_type_declaration         IDENTIFIER                identifier_opt
-
-   Begin_Name_IDs : constant Grammar_Token_ID_Set := To_Token_ID_Set
-     (Descriptor.First_Terminal, Descriptor.Last_Nonterminal,
-      +block_label_opt_ID & (+IDENTIFIER_ID) & (+name_ID) & 
(+subprogram_specification_ID));
-
-   End_Name_IDs : constant Grammar_Token_ID_Set := To_Token_ID_Set
-     (Descriptor.First_Terminal, Descriptor.Last_Nonterminal,
-      +identifier_opt_ID & (+name_opt_ID) & (+protected_definition_ID));
-
-   End_Keyword_IDs : constant Terminal_Token_ID_Set := To_Token_ID_Set
-     (Descriptor.First_Terminal, Descriptor.Last_Terminal,
-      +IF_ID & (+CASE_ID) & (+LOOP_ID) & (+RECORD_ID) & (+RETURN_ID) & 
(+SELECT_ID));
-
-   Named_Nonterm_IDs : constant Grammar_Token_ID_Set := To_Token_ID_Set
-     (Descriptor.First_Terminal, Descriptor.Last_Nonterminal,
-      +accept_statement_ID & (+block_statement_ID) & (+entry_body_ID) & 
(+loop_statement_ID) & (+package_body_ID) &
-        (+package_specification_ID) & (+protected_body_ID) & 
(+protected_type_declaration_ID) &
-        (+single_protected_declaration_ID) & (+single_task_declaration_ID) & 
(+subprogram_body_ID) & (+task_body_ID) &
-        (+task_type_declaration_ID));
-
-   No_Statements_Nonterm_IDs : constant Grammar_Token_ID_Set := To_Token_ID_Set
-     --  Nonterms that cannot contain a handled_sequence_of_statements
-     --  (transitive).
-     (Descriptor.First_Terminal, Descriptor.Last_Nonterminal,
-      +package_specification_ID  & (+protected_type_declaration_ID) & 
(+single_protected_declaration_ID) &
-        (+single_task_declaration_ID) & (+task_type_declaration_ID));
-
-   Minimal_Complete_Action_IDs : constant Terminal_Token_ID_Set :=
-     To_Token_ID_Set
-       (Descriptor.First_Terminal, Descriptor.Last_Terminal,
-        +ABORT_ID & (+ACCEPT_ID) & (+BEGIN_ID) & (+CASE_ID) & (+DECLARE_ID) & 
(+DELAY_ID) & (+ELSE_ID) & (+ELSIF_ID) &
-          (+END_ID) & (+ENTRY_ID) & (+EXCEPTION_ID) & (+EXIT_ID) & (+FOR_ID) & 
(+FUNCTION_ID) & (+GENERIC_ID) &
-          (+GOTO_ID) & (+IF_ID) & (+IS_ID) & (+LOOP_ID) & (+OVERRIDING_ID) & 
(+PACKAGE_ID) & (+PRAGMA_ID) &
-          (+PROCEDURE_ID) & (+PROTECTED_ID) & (+RAISE_ID) & (+REQUEUE_ID) & 
(+RETURN_ID) & (+RIGHT_PAREN_ID) &
-          (+SELECT_ID) & (+SUBTYPE_ID) & (+TASK_ID) & (+THEN_ID) & (+TYPE_ID) 
& (+USE_ID) & (+WHEN_ID) & (+WITH_ID) &
-          Descriptor.EOI_ID);
-   --  Terminal tokens where Minimal_Complete_Actions is useful. That
-   --  includes tokens that must be preceded by the end of a statement,
-   --  declaration, or expression (for trailing right paren).
-
-   procedure Handle_Check_Fail
-     (Trace             : in out WisiToken.Trace'Class;
-      Lexer             : access constant WisiToken.Lexer.Instance'Class;
-      Parser_Label      : in     Natural;
-      Terminals         : in     Base_Token_Arrays.Vector;
-      Tree              : in     Syntax_Trees.Tree;
-      Local_Config_Heap : in out Config_Heaps.Heap_Type;
-      Config            : in     Configuration)
-   with Pre => Config.Check_Status.Label /= Ok
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Syntax_Trees.Node_Index;
-
-      procedure Put (Message : in String; Config : in Configuration)
-      is begin
-         Put (Message, Trace, Parser_Label, Terminals, Config);
-      end Put;
-
-      Begin_Name_Token : Recover_Token renames Config.Check_Status.Begin_Name;
-      End_Name_Token   : Recover_Token renames Config.Check_Status.End_Name;
-   begin
-      --  There is a top level exception handler in McKenzie_Recover; the
-      --  user has no way to work around an exception. If we are trying to
-      --  fix a particular use case, the trace messages will be enough.
-
-      if not Begin_Name_IDs (Begin_Name_Token.ID) then
-         raise SAL.Programmer_Error with "unrecognized begin_name_token id " & 
Image (Begin_Name_Token.ID, Descriptor);
-      end if;
-
-      if not End_Name_IDs (End_Name_Token.ID) then
-         raise SAL.Programmer_Error with "unrecognized begin_name_token id " & 
Image (End_Name_Token.ID, Descriptor);
-      end if;
-
-      if not Named_Nonterm_IDs (Config.Error_Token.ID) then
-         raise SAL.Programmer_Error with "unrecognized name error token id " &
-           Image (Config.Error_Token.ID, Descriptor);
-      end if;
-
-      case Config.Check_Status.Label is
-      when Ok =>
-         raise SAL.Programmer_Error;
-
-      when Match_Names_Error =>
-         --  There are several cases:
-         --
-         --  0. User name error. The input looks like:
-         --
-         --  "<begin_name_token> ... <end_name_token> ;"
-         --
-         --  where the names do not match, because the user is changing them.
-         --
-         --  The fix is to ignore the error.
-         --
-         --  1. The mismatch indicates one or more missing 'end's. The input
-         --  looks like:
-         --
-         --  "<correct_begin_name_token> ... <bad_begin_name_token> ... 
<end_name_token> ;"
-         --
-         --  where <correct_begin_name_token> matches <end_name_token>, but
-         --  <bad_begin_name_token> does not, and the erroneous reduce has
-         --  matched <bad_begin_name_token> with <end_name_token>.
-         --
-         --  The fix is to insert one or more 'end ;' before <end_name_token>.
-         --  See test_mckenzie_recover.adb Block_Match_Names_1, Extra_Name_2.
-         --
-         --  2. The mismatch indicates a missing block start. The input looks 
like:
-         --
-         --  "<bad_begin_name_token> ... begin ... end <end_name_token> ;"
-         --
-         --  where the matching begin name token has been deleted.
-         --
-         --  The fix is to insert a matching block start before the 'begin'.
-         --  See test/ada_mode-recover_deleted_procedure_1.adb
-         --
-         --
-         --  It is not possible for the mismatch to indicate an extra 'end';
-         --  that would generate either a Missing_Name_Error, or a syntax
-         --  error.
-         --
-         --  To distinguish between case 0 and 1, we search the stack for
-         --  <correct_begin_name_token>. If found, it's case 1, otherwise case
-         --  0 or 2. We cannot distinguish between 0 and 2 (without parsing
-         --  ahead).
-         --
-         --  If there is more than one missing 'end', a later recover operation
-         --  will fix the others. For example, in test_mckenzie_recover
-         --  Extra_Name_2, we get here on a second semantic check error.
-
-         --  This case doesn't use Tree, and it can handle some virtual tokens.
-
-         declare
-            End_Name : constant String := Lexer.Buffer_Text 
(End_Name_Token.Name);
-
-            Matching_Name_Index : SAL.Peek_Type := 3; -- start search before 
<end_name_token>
-         begin
-            Find_Matching_Name (Config, Lexer, End_Name, Matching_Name_Index, 
Case_Insensitive => True);
-
-            if Matching_Name_Index = Config.Stack.Depth then
-               --  case 0 or 2.
-
-               if Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) in
-                 protected_body_ID | protected_type_declaration_ID |
-                 single_protected_declaration_ID | single_task_declaration_ID
-               then
-                  --  Not case 2
-                  return;
-               end if;
-
-               declare
-                  New_Config : Configuration := Config;
-               begin
-                  New_Config.Cost := New_Config.Cost + 1;
-
-                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-                  New_Config.Error_Token.ID := Invalid_Token_ID;
-                  New_Config.Check_Status   := (Label => Ok);
-
-                  case 
Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) is
-                  when block_statement_ID =>
-                     Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+identifier_opt_ID, +END_ID));
-                     Insert (New_Config, +BEGIN_ID);
-
-                  when entry_body_ID =>
-                     Push_Back_Check
-                       (New_Config,
-                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID));
-                     Insert (New_Config, +BEGIN_ID);
-
-                  when loop_statement_ID =>
-                     Push_Back_Check
-                       (New_Config,
-                        (+SEMICOLON_ID, +identifier_opt_ID, +LOOP_ID, 
+END_ID));
-                     Insert (New_Config, +LOOP_ID);
-
-                  when package_body_ID =>
-                     Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+name_opt_ID, +END_ID));
-                     if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
-                        Push_Back_Check
-                          (New_Config,
-                           (+handled_sequence_of_statements_ID, +BEGIN_ID));
-                     end if;
-                     Push_Back_Check (New_Config, (1 => 
+declarative_part_opt_ID));
-                     Insert (New_Config, (+PACKAGE_ID, +BODY_ID, 
+IDENTIFIER_ID, +IS_ID));
-
-                  when package_specification_ID =>
-                     Push_Back_Check (New_Config, (+name_opt_ID, +END_ID, 
+declarative_part_opt_ID));
-                     if New_Config.Stack.Peek (1).Token.ID = +PRIVATE_ID then
-                        Push_Back_Check (New_Config, (+PRIVATE_ID, 
+declarative_part_opt_ID));
-                     end if;
-                     Insert (New_Config, (+PACKAGE_ID, +IDENTIFIER_ID, 
+IS_ID));
-
-                  when subprogram_body_ID =>
-                     Push_Back_Check
-                       (New_Config,
-                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID, +BEGIN_ID,
-                         +declarative_part_opt_ID));
-                     Insert (New_Config, (+PROCEDURE_ID, +IDENTIFIER_ID, 
+IS_ID));
-
-                  when task_body_ID =>
-                     Push_Back_Check
-                       (New_Config,
-                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID));
-                     Insert (New_Config, +BEGIN_ID);
-
-                  when others =>
-                     raise SAL.Programmer_Error with "Match_Names_Error 2 " & 
Image (Config.Error_Token.ID, Descriptor);
-                  end case;
-
-                  if Trace_McKenzie > Detail then
-                     Put ("Match_Names_Error 2 " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-                     if Trace_McKenzie > Extra then
-                        Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                     end if;
-                  end if;
-                  Local_Config_Heap.Add (New_Config);
-               exception
-               when Bad_Config =>
-                  null;
-               end;
-
-            else
-               --  Case 1.
-               declare
-                  New_Config : Configuration := Config;
-               begin
-                  New_Config.Error_Token.ID := Invalid_Token_ID;
-                  New_Config.Check_Status   := (Label => Ok);
-
-                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-                  Push_Back_Check
-                    (New_Config,
-                     (+SEMICOLON_ID,
-                      (case 
Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) is
-                       when package_body_ID | package_specification_ID | 
subprogram_body_ID => +name_opt_ID,
-                       when protected_type_declaration_ID | 
single_protected_declaration_ID => +protected_definition_ID,
-                       when others =>  +identifier_opt_ID)));
-
-                  if New_Config.Stack (1).Token.Min_Terminal_Index = 
Invalid_Token_Index then
-                     --  'end' is on top of stack. We want to set 
Current_Shared_Token to
-                     --  'end'; we can't if it has an invalid index (which it 
has if it was
-                     --  pushed after a previous fix).
-                     --
-                     --  We don't check earlier for Invalid_Indices, because 
we can handle
-                     --  other tokens having invalid indices.
-
-                     return;
-                  end if;
-
-                  Push_Back_Check (New_Config, +END_ID);
-                  Insert (New_Config, (+END_ID, +SEMICOLON_ID));
-
-                  Local_Config_Heap.Add (New_Config);
-
-                  if Trace_McKenzie > Detail then
-                     Put ("Match_Names_Error 1 " & Image 
(Config.Error_Token.ID, Descriptor),
-                          New_Config);
-                     if Trace_McKenzie > Extra then
-                        Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                     end if;
-                  end if;
-               exception
-               when Bad_Config =>
-                  null;
-
-               when E : System.Assertions.Assert_Failure =>
-                  if Trace_McKenzie > Outline then
-                     Trace.Put_Line
-                       ("Match_Names_Error 1 " & 
Standard.Ada.Exceptions.Exception_Message (E) & " " &
-                          Image (Config.Error_Token.ID, Descriptor));
-                  end if;
-               end;
-            end if;
-         end;
-
-      when Missing_Name_Error =>
-         --  0. User name error. The input looks like:
-         --
-         --  "<begin_name_token> ... <end_name_token> ;"
-         --
-         --  where <end_name_token> is empty, because the user is changing it.
-         --
-         --  There are two cases:
-         --
-         --  0a. The nonterm can contain a handled_sequence_of_statements; ie 
a subprogram or named block
-         --
-         --  0b. The nonterm cannot contain a handled_sequence_of_statements;
-         --  ie a protected object or type declaration.
-         --
-         --  The fix is to ignore the error.
-         --
-         --  1. missing 'begin' or extra 'end'. The stack looks like:
-         --
-         --   "<begin_named_token> ... begin handled_sequence_of_statements 
end <end_name_token> ;"
-         --
-         --  where the <end_name_token> is empty. See test_mckenzie_recover.adb
-         --  Missing_Name_*, ada_mode-recover_15.adb.
-         --
-         --  There are two subcases:
-         --
-         --  1a. The 'end <end_name_token> ;' is left over from editing, and
-         --  should be deleted. Note that there could be an End_Keyword_IDs
-         --  with that end instead of a name.
-         --
-         --  1b. There is a missing 'begin'.
-         --
-         --  We can distinguish between 1a and 1b by looking for 'exception';
-         --  if it is present, it is more likely there is a missing 'begin'.
-         --  However, 'exception' is contained by
-         --  'handled_sequence_of_statements' on the stack, so we have to look
-         --  inside that using the syntax tree.
-         --
-         --  We cannot distinguish between cases 0 and 1, other than by parsing
-         --  ahead, except in case 0b. So we enqueue two solutions; 'ignore
-         --  error' and either 'insert begin' or 'delete end;'.
-
-         if not Valid_Tree_Indices (Config.Stack, SAL.Base_Peek_Type 
(Config.Check_Token_Count)) then
-            --  Invalid tree indices happens when recover enqueues a config 
that
-            --  contains tokens pushed during recover. The logic below depends 
on
-            --  valid tree indices.
-
-            return;
-         end if;
-
-         if No_Statements_Nonterm_IDs (Config.Error_Token.ID) then
-            --  case 0b.
-            --  test/ada_mode.ads
-            return;
-         end if;
-
-         if Syntax_Trees.Invalid_Node_Index = Tree.Find_Child (Config.Stack 
(4).Tree_Index, +EXCEPTION_ID) then
-            --  'exception' not found; case 1a - assume extra 'end [keyword] 
;'; delete it.
-            declare
-               New_Config     : Configuration := Config;
-               Ops            : Config_Op_Arrays.Vector renames New_Config.Ops;
-               Stack          : Recover_Stacks.Stack renames New_Config.Stack;
-               End_Item       : Recover_Stack_Item; -- 'end' keyword; position 
in stack varies with case
-               Keyword_Item   : Recover_Stack_Item; -- keyword after 'end'; 
may not be present
-               Semicolon_Item : Recover_Stack_Item; -- semicolon after 'end'
-            begin
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-               New_Config.Check_Status   := (Label => Ok);
-
-               --  This is a guess, and sometimes deleting the error keyword 
is better, so
-               --  give it a cost.
-               New_Config.Cost := New_Config.Cost + 1;
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               case Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) 
is
-               when block_statement_ID | package_body_ID | subprogram_body_ID 
| task_body_ID =>
-                  Semicolon_Item := Stack.Peek (1);
-                  End_Item       := Stack.Peek (3);
-
-                  Push_Back_Check
-                    (New_Config,
-                     (+SEMICOLON_ID,
-                      (if Config.Error_Token.ID in +block_statement_ID | 
+task_body_ID
-                       then +identifier_opt_ID
-                       else +name_opt_ID),
-                      +END_ID));
-
-                  if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
-                     Undo_Reduce_Check
-                       (New_Config, Tree,
-                        (+handled_sequence_of_statements_ID,
-                         +sequence_of_statements_opt_ID));
-                  end if;
-
-               when package_specification_ID =>
-                  Semicolon_Item := Stack.Peek (1);
-                  End_Item       := Stack.Peek (3);
-
-                  Push_Back_Check (New_Config, (+SEMICOLON_ID, +name_opt_ID, 
+END_ID));
-                  Undo_Reduce_Check (New_Config, Tree, 
+declarative_part_opt_ID);
-
-               when loop_statement_ID =>
-                  Semicolon_Item := Stack.Peek (1);
-                  Keyword_Item   := Stack.Peek (3);
-                  End_Item       := Stack.Peek (4);
-
-                  Push_Back_Check
-                    (New_Config, (+SEMICOLON_ID, +identifier_opt_ID, +LOOP_ID, 
+END_ID));
-
-                  if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
-                     Undo_Reduce_Check
-                       (New_Config, Tree,
-                        (+handled_sequence_of_statements_ID,
-                         +sequence_of_statements_opt_ID));
-                  end if;
-               when others =>
-                  raise SAL.Programmer_Error with "unimplemented nonterm for 
Missing_Name_Error " &
-                    Image (Config.Error_Token, Descriptor);
-               end case;
-
-               Ops.Append ((Delete, +END_ID, Token_Index => 
End_Item.Token.Min_Terminal_Index));
-               if Keyword_Item.Token.ID /= Invalid_Token_ID then
-                  Ops.Append ((Delete, Keyword_Item.Token.ID, Token_Index => 
Keyword_Item.Token.Min_Terminal_Index));
-               end if;
-               --  We don't need to delete the identifier|name ; it is missing 
and therefore empty.
-               Ops.Append ((Delete, +SEMICOLON_ID, Token_Index => 
Semicolon_Item.Token.Min_Terminal_Index));
-
-               New_Config.Current_Shared_Token := Config.Current_Shared_Token; 
--  After pushed_back SEMICOLON.
-
-               Local_Config_Heap.Add (New_Config);
-
-               if Trace_McKenzie > Detail then
-                  Put ("Missing_Name_Error 1a " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-                  if Trace_McKenzie > Extra then
-                     Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                  end if;
-               end if;
-            exception
-            when Bad_Config =>
-               null;
-            end;
-
-         else
-            --  'exception' found; case 1b - assume missing 'begin'; insert it
-            --  before 'handled_sequence_of_statements'
-            declare
-               New_Config : Configuration := Config;
-            begin
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-               New_Config.Check_Status   := (Label => Ok);
-
-               New_Config.Cost := New_Config.Cost + 1;
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               Push_Back_Check
-                 (New_Config,
-                  (+SEMICOLON_ID,
-                   (if Config.Error_Token.ID = +block_statement_ID
-                    then +identifier_opt_ID
-                    else +name_opt_ID),
-                   +END_ID, +handled_sequence_of_statements_ID));
-
-               Insert (New_Config, +BEGIN_ID);
-
-               Local_Config_Heap.Add (New_Config);
-
-               if Trace_McKenzie > Detail then
-                  Put ("Missing_Name_Error 1b " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-                  if Trace_McKenzie > Extra then
-                     Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                  end if;
-               end if;
-            exception
-            when Bad_Config =>
-               null;
-            end;
-         end if;
-
-      when Extra_Name_Error =>
-         --  The input looks like
-         --
-         --  "<begin_name_token> ... block_label_opt begin ... end 
<end_name_token> ;"
-         --
-         --  where the erroneous reduce matches the empty 'block_label_opt'
-         --  with '<end_name_Token>'.
-         --
-         --  or
-         --
-         --  "block_label_opt loop ... end loop <end_name_token> ;"
-         --
-         --  where the extra <end_name_token> is created by an attempted fix.
-         --  See test/ada_mode-recover_constant_as_statement.adb,
-         --  test/ada_mode-recover_26.adb
-         --
-         --
-         --  0. If a matching <begin_name_token> is found, this is not a
-         --  plausible user name error. If it is not found, the user could be
-         --  adding/deleting names. In either case, enqueue other solutions.
-         --
-         --  1. There is at least one missing 'end' before 'begin'. See
-         --  test_mckenzie_recover.adb Extra_Name_1, Extra_Name_2,
-         --  Two_Missing_Ends. The solution is to insert 'end ;' before the
-         --  'begin'.
-         --
-         --  2. There is at least one missing 'end' after 'begin'. See
-         --  test_mckenzie_recover.adb Extra_Name_3, Block_Match_Names_1. The
-         --  solution is to insert 'end ;' before the 'end'.
-         --
-         --  There is no reliable way to distinguish between 1 and 2, so we
-         --  enqueue both solutions. See test/ada_mode-recover_exception_1.adb
-         --
-         --  If there is more than one missing 'end', a later recover operation
-         --  will fix the others.
-
-         --  This case can handle Config.Error_Token.Virtual = True, and it 
doesn't use
-         --  Tree.
-         begin
-            declare
-               New_Config : Configuration := Config;
-               Ops        : Config_Op_Arrays.Vector renames New_Config.Ops;
-            begin
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-               New_Config.Check_Status   := (Label => Ok);
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               --  Push_Back the failed reduce tokens.
-               for I in 1 .. New_Config.Check_Token_Count loop
-                  declare
-                     Item : constant Recover_Stack_Item := 
New_Config.Stack.Pop;
-                  begin
-                     if Item.Token.Virtual then
-                        raise Bad_Config;
-                     end if;
-                     Ops.Append ((Push_Back, Item.Token.ID, 
Item.Token.Min_Terminal_Index));
-                  end;
-               end loop;
-               New_Config.Current_Shared_Token := 
New_Config.Error_Token.Min_Terminal_Index;
-
-               Insert (New_Config, (+END_ID, +SEMICOLON_ID));
-
-               Local_Config_Heap.Add (New_Config);
-
-               if Trace_McKenzie > Detail then
-                  Put ("Extra_Name_Error 1 " & Image (Config.Error_Token.ID, 
Descriptor), New_Config);
-                  if Trace_McKenzie > Extra then
-                     Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                  end if;
-               end if;
-            exception
-            when Bad_Config =>
-               null;
-            end;
-
-            --  Case 2
-            declare
-               New_Config : Configuration := Config;
-               Matching_Index : SAL.Peek_Type;
-            begin
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-               New_Config.Check_Status   := (Label => Ok);
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               case Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) 
is
-               when block_statement_ID =>
-                  --  There is almost always an open block of some sort; not 
worth
-                  --  checking.
-                  Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+identifier_opt_ID, +END_ID));
-                  Insert (New_Config, (+END_ID, +SEMICOLON_ID));
-
-               when loop_statement_ID =>
-                  --  Look for an open 'loop', starting before error 
loop_statement.
-                  Matching_Index := SAL.Peek_Type (Config.Check_Token_Count) + 
1;
-                  Find_ID (Config, +LOOP_ID, Matching_Index);
-                  if Matching_Index = Config.Stack.Depth then
-                     --  No open 'loop'. The failing loop_statement was 
created by recover,
-                     --  but it was a bad idea. See 
test/ada_mode-recover_26.adb. Or the
-                     --  user is editing; this error will be ignored.
-                     raise Bad_Config;
-                  end if;
-
-                  Push_Back_Check
-                    (New_Config, (+SEMICOLON_ID, +identifier_opt_ID, +LOOP_ID, 
+END_ID));
-                  Insert (New_Config, (+END_ID, +LOOP_ID, +SEMICOLON_ID));
-
-               when others =>
-                  raise SAL.Programmer_Error with "Extra_Name_Error 2: 
unrecognized Error_Token.ID " & Image
-                    (Config.Error_Token.ID, Descriptor);
-               end case;
-
-               Local_Config_Heap.Add (New_Config);
-
-               if Trace_McKenzie > Detail then
-                  Put ("Extra_Name_Error 2 " & Image (Config.Error_Token.ID, 
Descriptor), New_Config);
-                  if Trace_McKenzie > Extra then
-                     Trace.Put_Line ("config stack: " & Image 
(New_Config.Stack, Descriptor));
-                  end if;
-               end if;
-            exception
-            when Bad_Config =>
-               null;
-            end;
-         end;
-      end case;
-   exception
-   when Bad_Config =>
-      null;
-
-   when System.Assertions.Assert_Failure =>
-      if Trace_McKenzie > Outline then
-         Trace.Put_Line ("Ada Language_Fixes Handle_Check_Fail Assert fail");
-      end if;
-   end Handle_Check_Fail;
-
-   procedure Handle_Parse_Error
-     (Trace             : in out WisiToken.Trace'Class;
-      Parser_Label      : in     Natural;
-      Parse_Table       : in     WisiToken.Parse.LR.Parse_Table;
-      Terminals         : in     Base_Token_Arrays.Vector;
-      Local_Config_Heap : in out Config_Heaps.Heap_Type;
-      Config            : in     Configuration)
-   with Pre => Config.Check_Status.Label = Ok
-   is
-      use all type Standard.Ada.Containers.Count_Type;
-      use all type SAL.Base_Peek_Type;
-
-      procedure Put (Message : in String; Config : in Configuration)
-      is begin
-         Put (Message, Trace, Parser_Label, Terminals, Config);
-      end Put;
-   begin
-      --  There is a top level exception handler in McKenzie_Recover; the
-      --  user has no way to work around an exception. If we are trying to
-      --  fix a particular use case, the trace messages will be enough.
-
-      if Config.Error_Token.ID = +DOT_ID then
-         --  We've encountered a Selected_Component when we were expecting a
-         --  simple IDENTIFIER or a name. If the name is preceded by 'end', 
then
-         --  this similar to a semantic check Extra_Name_Error, and the
-         --  solutions are similar.
-
-         if Config.Stack (1).Token.ID = +IDENTIFIER_ID and
-           Config.Stack (2).Token.ID = +END_ID
-         then
-            --  The input looks like one of:
-            --
-            --  1) "<begin_name_token_1> ... <begin_name_token_2> ... begin 
... begin ... end <end_name_token_1> ;"
-            --
-            --  2) "<begin_name_token_1> ... begin ... declare ... begin ... 
end <end_name_token_1> ;"
-            --
-            --  Case 1) is missing 'end <end_name_token_2> ;' between the
-            --  'begin's, so parsing expects <end_name_token_1> to match the
-            --  second 'begin', which looks like an unnamed block. See
-            --  test_mckenzie_recover Match_Selected_Component_1. 'declare ...'
-            --  may _not_ be present on the second begin. The solution is to
-            --  insert 'end ;' before the second 'begin'.
-            --
-            --  Case 2) is missing 'end;' after the second 'begin'. See
-            --  test_mckenzie_recover Match_Selected_Component_2. 'declare ...'
-            --  may be absent on the second begin, or a name may be present. 
The
-            --  solution is to insert 'end;' after the second 'begin' (ie 
before
-            --  the last 'end').
-            --
-            --  Note that it's _not_ possible the user is just editing names; 
that
-            --  would generate a semantic check fail, not a parse table error,
-            --  since a "." would be permitted.
-
-            declare
-               Label        : constant String := "selected_component 1";
-               New_Config_1 : Configuration   := Config;
-               New_Config_2 : Configuration;
-            begin
-               New_Config_1.Error_Token.ID := Invalid_Token_ID;
-
-               Push_Back_Check (New_Config_1, (+IDENTIFIER_ID, +END_ID));
-
-               case Ada_Process_Actions.Token_Enum_ID'(-New_Config_1.Stack 
(3).Token.ID) is
-               when block_label_opt_ID =>
-                  --  no 'declare'; either case 1 or 2
-
-                  New_Config_2 := New_Config_1;
-                  Insert (New_Config_2, (+END_ID, +SEMICOLON_ID));
-
-                  Push_Back_Check
-                    (New_Config_1,
-                     (+handled_sequence_of_statements_ID, +BEGIN_ID, 
+block_label_opt_ID));
-                  Insert (New_Config_1, (+END_ID, +SEMICOLON_ID));
-
-                  Local_Config_Heap.Add (New_Config_1);
-                  Local_Config_Heap.Add (New_Config_2);
-
-               when declarative_part_opt_ID =>
-                  --  case 2
-                  Insert (New_Config_1, (+END_ID, +SEMICOLON_ID));
-                  Local_Config_Heap.Add (New_Config_1);
-
-               when others =>
-                  if Trace_McKenzie > Outline then
-                     Put ("Language_Fixes " & Label & " missing case " & Image
-                            (New_Config_1.Stack (3).Token.ID, Descriptor), 
Config);
-                     Trace.Put_Line ("... new_config stack: " & Image 
(New_Config_1.Stack, Descriptor));
-                  end if;
-                  return;
-               end case;
-
-               if Trace_McKenzie > Detail then
-                  Put ("Language_Fixes " & Label & Image 
(Config.Error_Token.ID, Descriptor),
-                       New_Config_1);
-                  if Trace_McKenzie > Extra then
-                     Trace.Put_Line ("config stack: " & Image 
(New_Config_1.Stack, Descriptor));
-                  end if;
-
-                  if New_Config_2.Ops.Length > 0 then
-                     Put ("Language_Fixes " & Label & Image 
(Config.Error_Token.ID, Descriptor),
-                          New_Config_2);
-                     if Trace_McKenzie > Extra then
-                        Trace.Put_Line ("config stack: " & Image 
(New_Config_2.Stack, Descriptor));
-                     end if;
-                  end if;
-               end if;
-            exception
-            when Bad_Config =>
-               null;
-            end;
-         end if;
-
-      elsif -Config.Error_Token.ID in IDENTIFIER_ID | SEMICOLON_ID and 
Config.Stack (1).Token.ID = +END_ID then
-         --  Encountered 'end <name>;' or 'end;' when expecting 'end 
<keyword>;'
-         --
-         --  The input looks like
-         --
-         --  "<begin_name_token> ... <keyword> ... end <end_name_token> ;"
-         --
-         --  where <keyword> is any of End_Keyword_IDs. 'end <keyword> ;' is
-         --  missing before 'end'. See test/ada_mode-recover_18.adb,
-         --  test/ada_mode-recover_end_1.adb.
-         --
-         --  The solution is to insert 'end <keyword>;' before the 'end'. We
-         --  can find the keyword on the stack.
-         --
-         --  Or 'end;' could be in the wrong place; see
-         --  test/ada_mode-recover_23.adb. Best solution there is to delete
-         --  'end;'; we let normal DFA explore do that, so we give the solution
-         --  provided here a cost.
-         declare
-            Label         : constant String := "end keyword 1";
-            New_Config    : Configuration   := Config;
-            Keyword_Index : SAL.Peek_Type   := 2;
-         begin
-            Find_ID (Config, End_Keyword_IDs, Keyword_Index);
-
-            if Keyword_Index = Config.Stack.Depth then
-               --  not found
-               if Trace_McKenzie > Outline then
-                  Put ("Language_Fixes " & Label & " keyword not found " &
-                         Image (Config.Error_Token.ID, Descriptor), 
New_Config);
-                  Trace.Put_Line ("config stack: " & Image (New_Config.Stack, 
Descriptor));
-               end if;
-               raise Bad_Config;
-            end if;
-
-            New_Config.Error_Token.ID := Invalid_Token_ID;
-            New_Config.Cost := New_Config.Cost + 2;
-
-            New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-            Push_Back_Check (New_Config, +END_ID);
-
-            Insert (New_Config, (+END_ID, Config.Stack 
(Keyword_Index).Token.ID, +SEMICOLON_ID));
-
-            Local_Config_Heap.Add (New_Config);
-
-            if Trace_McKenzie > Detail then
-               Put ("Language_Fixes " & Label & " " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-               if Trace_McKenzie > Extra then
-                  Trace.Put_Line ("config stack: " & Image (New_Config.Stack, 
Descriptor));
-               end if;
-            end if;
-         exception
-         when Bad_Config =>
-            null;
-         when System.Assertions.Assert_Failure =>
-            --  From *_Check
-            if Trace_McKenzie > Outline then
-               Put ("Language_Fixes " & Label & " ID mismatch " &
-                      Image (Config.Error_Token.ID, Descriptor), Config);
-               Trace.Put_Line ("... new_config stack: " & Image 
(New_Config.Stack, Descriptor));
-            end if;
-         end;
-
-      elsif End_Keyword_IDs (Config.Error_Token.ID) and Config.Stack 
(1).Token.ID = +END_ID then
-         --  Encountered 'end <keyword>;' when expecting 'end <different 
keyword>;' or 'end <name>;'
-         --
-         --  The input looks like one of:
-         --
-         --  a. <matching_begin_keyword> ... <other_begin_keyword> ... end 
<keyword> ;
-         --
-         --     where <begin_keyword> matches the error keyword. The solution
-         --     is to insert an 'end <keyword>;' matching <other_begin_keyword>
-         --     before the 'end'. See test/ada_mode_recover_12.adb
-         --
-         --  b. <other_begin> ... end <keyword> ;
-         --
-         --     where the matching keyword is missing. The solution is to
-         --     insert a matching <begin_keyword> before the '...'
-         --     sequence_of_statements_opt.
-         --
-         --  c. 'end <keyword>;' could be in the wrong place;
-         --
-         --      see test/ada_mode-recover_24.adb. Best solution there is to
-         --      replace the wrong keyword with the right one, so we enqueue 
that
-         --      solution also.
-         declare
-            Label             : constant String := "end keyword 2";
-            New_Config        : Configuration   := Config;
-            Matching_Index    : SAL.Peek_Type   := 2;
-            Other_Begin_Index : SAL.Peek_Type   := 2;
-         begin
-            Find_ID (Config, Config.Error_Token.ID, Matching_Index);
-
-            New_Config.Error_Token.ID := Invalid_Token_ID;
-            New_Config.Cost := New_Config.Cost + 1;
-
-            New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-            Push_Back (New_Config); -- end_id
-
-            if Matching_Index = Config.Stack.Depth then
-               --  matching keyword not found; case b
-               case Ada_Process_Actions.Token_Enum_ID'(-New_Config.Stack 
(1).Token.ID) is
-               when sequence_of_statements_opt_ID | 
handled_sequence_of_statements_ID =>
-                  Push_Back (New_Config);
-
-               when declarative_part_opt_ID =>
-                  --  Code looks like:
-                  --  package <declaration>... end <keyword> ; ...
-                  Insert (New_Config, +BEGIN_ID);
-
-               when others =>
-                  if Trace_McKenzie > Outline then
-                     Trace.Put_Line
-                       ("Language_Fixes " & Label & " unrecognized nonterm " & 
Image
-                          (New_Config.Stack (1).Token.ID, Descriptor));
-                  end if;
-               end case;
-
-               Insert (New_Config, (1 => Config.Error_Token.ID));
-
-               if Trace_McKenzie > Detail then
-                  Put ("Language_Fixes " & Label & "b " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-               end if;
-            else
-               --  Matching keyword found; case a. Look for the 
<other_begin_keyword>.
-               Find_ID (Config, End_Keyword_IDs & (+BEGIN_ID), 
Other_Begin_Index);
-
-               if Other_Begin_Index = Config.Stack.Depth then
-                  if Trace_McKenzie > Outline then
-                     Put (Label & " other_begin_keyword not found", Config);
-                  end if;
-                  return;
-               end if;
-
-               if Config.Stack.Peek (Other_Begin_Index).Token.ID = (+BEGIN_ID) 
then
-                  Insert (New_Config, (+END_ID, +SEMICOLON_ID));
-               else
-                  Insert (New_Config, (+END_ID, Config.Stack.Peek 
(Other_Begin_Index).Token.ID, +SEMICOLON_ID));
-               end if;
-
-               if Trace_McKenzie > Detail then
-                  Put ("Language_Fixes " & Label & "a " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-               end if;
-            end if;
-
-            Local_Config_Heap.Add (New_Config);
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-         declare
-            Label      : constant String := "end keyword 2c ";
-            New_Config : Configuration   := Config;
-         begin
-            Delete (New_Config, New_Config.Error_Token.ID); -- wrong keyword
-
-            --  It's not easy to tell what the right keyword to insert is; the
-            --  normal explore mechanism will find it.
-
-            New_Config.Error_Token.ID := Invalid_Token_ID;
-
-            --  Inserting the replacement is likely to cost 2, so make this 
cost 0.
-            New_Config.Cost := New_Config.Cost + 0;
-
-            New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-            if Trace_McKenzie > Detail then
-               Put ("Language_Fixes " & Label & Image (Config.Error_Token.ID, 
Descriptor), New_Config);
-            end if;
-            Local_Config_Heap.Add (New_Config);
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-      elsif Config.Error_Token.ID = +WHEN_ID then
-         declare
-            Label         : constant String := "missing  'case' ";
-            New_Config    : Configuration;
-            Matching_Index : SAL.Peek_Type := 1;
-         begin
-            Find_ID (Config, +CASE_ID, Matching_Index);
-            if Matching_Index = Config.Stack.Depth then
-               --  missing 'case'
-               New_Config := Config;
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               Insert (New_Config, (+CASE_ID, +IS_ID));
-               Local_Config_Heap.Add (New_Config);
-               if Trace_McKenzie > Detail then
-                  Put ("Language_Fixes " & Label & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-               end if;
-            end if;
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-      elsif Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) in 
ELSE_ID | ELSIF_ID then
-         declare
-            Label         : constant String := "missing 'if then' ";
-            New_Config    : Configuration;
-            Matching_Index : SAL.Peek_Type := 1;
-         begin
-            Find_ID (Config, +IF_ID, Matching_Index);
-            if Matching_Index = Config.Stack.Depth then
-               --  missing 'if .. then'
-               --
-               --  We don't handle missing 'if' alone; less likely.
-
-               New_Config := Config;
-               New_Config.Error_Token.ID := Invalid_Token_ID;
-
-               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-               if New_Config.Stack (1).Token.ID /= Invalid_Token_ID then
-                  case Ada_Process_Actions.Token_Enum_ID'(-New_Config.Stack 
(1).Token.ID) is
-                  when sequence_of_statements_opt_ID =>
-                     Push_Back_Check (New_Config, 
+sequence_of_statements_opt_ID);
-                     if -New_Config.Stack (1).Token.ID = +block_label_opt_ID 
then
-                        Push_Back_Check (New_Config, +block_label_opt_ID);
-                     end if;
-
-                  when others =>
-                     if Trace_McKenzie > Outline then
-                        Trace.Put_Line
-                          ("Language_Fixes " & Label & " unimplemented 
token_id " &
-                             Image (New_Config.Stack (1).Token.ID, 
Descriptor));
-                     end if;
-                  end case;
-               end if;
-               Insert (New_Config, (+IF_ID, +THEN_ID));
-               Local_Config_Heap.Add (New_Config);
-               if Trace_McKenzie > Detail then
-                  Put ("Language_Fixes " & Label & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-               end if;
-            end if;
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-      elsif Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) in 
CONSTANT_ID | IDENTIFIER_ID and
-        (for some Prod of Parse_Table.States 
(Config.Stack.Peek.State).Productions => Prod.LHS = +block_label_ID)
-      then
-         --  Code looks like:
-         --
-         --  ... <subprogram|package start> begin ... <variable_name> : 
[constant] <type_name>;
-         --
-         --  There is a missing 'end;' before the <variable_name>. See 
test/ada_mode-recover_25.adb
-
-         declare
-            New_Config : Configuration := Config;
-         begin
-            New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
-
-            Push_Back_Check (New_Config, (+COLON_ID, +IDENTIFIER_ID));
-            Insert (New_Config, (+END_ID, +SEMICOLON_ID));
-            Local_Config_Heap.Add (New_Config);
-            if Trace_McKenzie > Detail then
-               Put ("Language_Fixes terminate_subprogram" & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
-            end if;
-         end;
-      end if;
-   exception
-   when Bad_Config =>
-      null;
-
-   when System.Assertions.Assert_Failure =>
-      if Trace_McKenzie > Outline then
-         Trace.Put_Line ("Ada Language_Fixes Handle_Parse_Error Assert fail");
-      end if;
-   end Handle_Parse_Error;
-
-   ----------
-   --  Public subprograms
-
-   procedure Language_Fixes
-     (Trace             : in out WisiToken.Trace'Class;
-      Lexer             : access constant WisiToken.Lexer.Instance'Class;
-      Parser_Label      : in     Natural;
-      Parse_Table       : in     WisiToken.Parse.LR.Parse_Table;
-      Terminals         : in     Base_Token_Arrays.Vector;
-      Tree              : in     Syntax_Trees.Tree;
-      Local_Config_Heap : in out Config_Heaps.Heap_Type;
-      Config            : in     Configuration)
-   is
-      use all type SAL.Base_Peek_Type;
-   begin
-      if Trace_McKenzie > Extra then
-         Put ("Ada Language_Fixes", Trace, Parser_Label, Terminals, Config);
-         Put_Line (Trace, Parser_Label, "config stack: " & Image 
(Config.Stack, Descriptor));
-      end if;
-
-      if Config.Current_Ops /= No_Insert_Delete then
-         if Trace_McKenzie > Outline then
-            Put_Line (Trace, Parser_Label, "Ada Language_Fixes: 
Config.Current_Ops /= No_Insert_Delete");
-         end if;
-         return;
-      end if;
-
-      case Config.Check_Status.Label is
-      when Ok =>
-         Handle_Parse_Error (Trace, Parser_Label, Parse_Table, Terminals, 
Local_Config_Heap, Config);
-
-      when others =>
-         Handle_Check_Fail (Trace, Lexer, Parser_Label, Terminals, Tree, 
Local_Config_Heap, Config);
-      end case;
-   end Language_Fixes;
-
-   procedure Use_Minimal_Complete_Actions
-     (Current_Token        : in     Token_ID;
-      Next_Token           : in     Token_ID;
-      Config               : in     Configuration;
-      Use_Complete         :    out Boolean;
-      Matching_Begin_Token :    out Token_ID)
-   is
-      use all type SAL.Base_Peek_Type;
-   begin
-      if Config.Stack.Depth = 1 and Current_Token = Descriptor.EOI_ID then
-         --  Empty input buffer
-         Use_Complete         := True;
-         Matching_Begin_Token := +IDENTIFIER_ID;
-
-      elsif Minimal_Complete_Action_IDs (Current_Token) then
-         Use_Complete := True;
-         case Ada_Process_Actions.Token_Enum_ID'(-Current_Token) is
-         when END_ID =>
-            case Ada_Process_Actions.Token_Enum_ID'(-Next_Token) is
-            when CASE_ID | IF_ID | LOOP_ID | RETURN_ID | SELECT_ID =>
-               Matching_Begin_Token := Next_Token;
-            when IDENTIFIER_ID | SEMICOLON_ID =>
-               Matching_Begin_Token := +BEGIN_ID;
-            when others =>
-               --  'end' is misplaced (see test_mckenzie_recover.adb 
Conflict_1);
-               --  best to delete it.
-               Use_Complete         := False;
-               Matching_Begin_Token := Invalid_Token_ID;
-            end case;
-
-         when ELSE_ID | ELSIF_ID | THEN_ID =>
-            Matching_Begin_Token := +IF_ID;
-
-         when EXCEPTION_ID =>
-            Matching_Begin_Token := +BEGIN_ID;
-
-         --  We don't return LEFT_PAREN for RIGHT_PAREN; better to delete it.
-
-         when IS_ID | WHEN_ID =>
-            --  'IS' could also be FUNCTION, PACKAGE, PROCEDURE; 'WHEN' could 
also be EXCEPTION.
-            Matching_Begin_Token := +CASE_ID;
-
-         when others =>
-            Matching_Begin_Token := Invalid_Token_ID;
-         end case;
-      else
-         Use_Complete := False;
-         Matching_Begin_Token := Invalid_Token_ID;
-      end if;
-   end Use_Minimal_Complete_Actions;
-
-   function String_ID_Set
-     (Descriptor        : in WisiToken.Descriptor;
-      String_Literal_ID : in Token_ID)
-     return Token_ID_Set
-   is begin
-      --  Character literal can be part of a string primary, so the nonterms
-      --  are independent of String_Literal_ID.
-
-      return Result : Token_ID_Set (Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal) := (others => False) do
-
-         Result (String_Literal_ID)     := True;
-         Result (+name_ID)              := True;
-         Result (+primary_ID)           := True;
-         Result (+factor_ID)            := True;
-         Result (+term_ID)              := True;
-         Result (+term_list_ID)         := True;
-         Result (+simple_expression_ID) := True;
-         Result (+relation_ID)          := True;
-         Result (+expression_ID)        := True;
-      end return;
-   end String_ID_Set;
-
-end WisiToken.Parse.LR.McKenzie_Recover.Ada;
+--  Abstract :
+--
+--  see spec.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers;
+with Ada.Exceptions;
+with Ada_Process_Actions;
+with System.Assertions;
+package body WisiToken.Parse.LR.McKenzie_Recover.Ada is
+
+   use all type Ada_Process_Actions.Token_Enum_ID; -- token names
+   use all type Semantic_Checks.Check_Status_Label;
+
+   Descriptor : WisiToken.Descriptor renames Ada_Process_Actions.Descriptor;
+
+   subtype Grammar_Token_ID_Set is WisiToken.Token_ID_Set 
(Descriptor.First_Terminal .. Descriptor.Last_Nonterminal);
+   subtype Terminal_Token_ID_Set is WisiToken.Token_ID_Set 
(Descriptor.First_Terminal .. Descriptor.Last_Terminal);
+
+   --  From ada.wy, all nonterms with a Match_Names check:
+   --
+   --  nonterm                       <begin_name_token>        <end_name_token>
+   --  |-----------------------------|-------------------------|-------------
+   --  accept_statement              IDENTIFIER                identifier_opt
+   --  block_statement               block_label_opt           identifier_opt
+   --  entry_body                    IDENTIFIER                identifier_opt
+   --  loop_statement                block_label_opt           identifier_opt
+   --  package_body                  name                      name_opt
+   --  package_specification         name                      name_opt
+   --  protected_body                IDENTIFIER                identifier_opt
+   --  protected_type_declaration    IDENTIFIER                
protected_definition
+   --  single_protected_declaration  IDENTIFIER                
protected_definition
+   --  single_task_declaration       IDENTIFIER                identifier_opt
+   --  subprogram_body               subprogram_specification  name_opt
+   --  task_body                     IDENTIFIER                identifier_opt
+   --  task_type_declaration         IDENTIFIER                identifier_opt
+
+   No_Statements_Nonterm_IDs : constant Grammar_Token_ID_Set := To_Token_ID_Set
+     --  Nonterms that cannot contain a handled_sequence_of_statements
+     --  (transitive).
+     (Descriptor.First_Terminal, Descriptor.Last_Nonterminal,
+      +package_specification_ID  & (+protected_type_declaration_ID) & 
(+single_protected_declaration_ID) &
+        (+single_task_declaration_ID) & (+task_type_declaration_ID));
+
+   End_Keyword_IDs : constant Terminal_Token_ID_Set :=
+     To_Token_ID_Set
+       (Descriptor.First_Terminal, Descriptor.Last_Terminal,
+        +CASE_ID & (+IF_ID) & (+LOOP_ID) & (+RECORD_ID) & (+RETURN_ID) & 
(+SELECT_ID));
+
+   procedure Handle_Check_Fail
+     (Trace             : in out WisiToken.Trace'Class;
+      Lexer             : access constant WisiToken.Lexer.Instance'Class;
+      Parser_Label      : in     Natural;
+      Parse_Table       : in     WisiToken.Parse.LR.Parse_Table;
+      Terminals         : in     Base_Token_Arrays.Vector;
+      Tree              : in     Syntax_Trees.Tree;
+      Local_Config_Heap : in out Config_Heaps.Heap_Type;
+      Config            : in     Configuration)
+   with Pre => Config.Check_Status.Label /= Ok
+   is
+      use all type SAL.Base_Peek_Type;
+
+      procedure Put (Message : in String; Config : in Configuration)
+      is begin
+         Put (Message, Trace, Parser_Label, Terminals, Config);
+      end Put;
+
+      End_Name_Token : Recover_Token renames Config.Check_Status.End_Name;
+   begin
+      --  There is a top level exception handler in McKenzie_Recover; the
+      --  user has no way to work around an exception. If we are trying to
+      --  fix a particular use case, the trace messages will be enough.
+
+      case Config.Check_Status.Label is
+      when Ok =>
+         raise SAL.Programmer_Error;
+
+      when Match_Names_Error =>
+         --  There are several cases:
+         --
+         --  0. User name error. The input looks like:
+         --
+         --  "<begin_name_token> ... <end_name_token> ;"
+         --
+         --  where the names do not match, because the user is changing them.
+         --
+         --  The fix is to ignore the error. See
+         --  test/ada_mode-recover_change_name.adb.
+         --
+         --  1. The mismatch indicates one or more missing 'end's. The input
+         --  looks like:
+         --
+         --  "<correct_begin_name_token> ... <bad_begin_name_token> ... 
<end_name_token> ;"
+         --
+         --  where <correct_begin_name_token> matches <end_name_token>, but
+         --  <bad_begin_name_token> does not, and the erroneous reduce has
+         --  matched <bad_begin_name_token> with <end_name_token>.
+         --
+         --  The fix is to insert one or more 'end ;' before <end_name_token>.
+         --  See test_mckenzie_recover.adb Block_Match_Names_1, Extra_Name_2.
+         --
+         --  2. The mismatch indicates a missing block start. The input looks 
like:
+         --
+         --  "<bad_begin_name_token> ... begin ... end <end_name_token> ;"
+         --
+         --  where the matching begin name token has been deleted.
+         --
+         --  The fix is to insert a matching block start before the 'begin'.
+         --  See test/ada_mode-recover_deleted_procedure_1.adb
+         --
+         --
+         --  It is not possible for the mismatch to indicate an extra 'end';
+         --  that would generate either a Missing_Name_Error, or a syntax
+         --  error.
+         --
+         --  To distinguish between case 0 and 1, we search the stack for
+         --  <correct_begin_name_token>. If found, it's case 1, otherwise case
+         --  0 or 2. We cannot distinguish between 0 and 2 (without parsing
+         --  ahead).
+         --
+         --  If there is more than one missing 'end', a later recover operation
+         --  will fix the others. For example, in test_mckenzie_recover
+         --  Extra_Name_2, we get here on a second semantic check error.
+
+         --  This case doesn't use Tree, and it can handle some virtual tokens.
+
+         declare
+            End_Name : constant String := Lexer.Buffer_Text 
(End_Name_Token.Name);
+
+            Matching_Name_Index : SAL.Peek_Type := 3; -- start search before 
<end_name_token>
+         begin
+            Find_Matching_Name (Config, Lexer, End_Name, Matching_Name_Index, 
Case_Insensitive => True);
+
+            if Matching_Name_Index = Config.Stack.Depth then
+               --  case 0 or 2.
+
+               if Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) in
+                 protected_body_ID | protected_type_declaration_ID |
+                 single_protected_declaration_ID | single_task_declaration_ID
+               then
+                  --  Not case 2
+                  return;
+               end if;
+
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  --  These solutions must compete with 'ignore check fail', 
so give them the same cost.
+                  New_Config.Cost := New_Config.Cost + 
Parse_Table.McKenzie_Param.Ignore_Check_Fail;
+
+                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+                  New_Config.Error_Token.ID := Invalid_Token_ID;
+                  New_Config.Check_Status   := (Label => Ok);
+
+                  case 
Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) is
+                  when block_statement_ID =>
+                     Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+identifier_opt_ID, +END_ID));
+                     Insert (New_Config, +BEGIN_ID);
+
+                  when entry_body_ID =>
+                     Push_Back_Check
+                       (New_Config,
+                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID));
+                     Insert (New_Config, +BEGIN_ID);
+
+                  when loop_statement_ID =>
+                     Push_Back_Check
+                       (New_Config,
+                        (+SEMICOLON_ID, +identifier_opt_ID, +LOOP_ID, 
+END_ID));
+                     Insert (New_Config, +LOOP_ID);
+
+                  when package_body_ID =>
+                     Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+name_opt_ID, +END_ID));
+                     if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
+                        Push_Back_Check
+                          (New_Config,
+                           (+handled_sequence_of_statements_ID, +BEGIN_ID));
+                     end if;
+                     Push_Back_Check (New_Config, (1 => 
+declarative_part_opt_ID));
+                     Insert (New_Config, (+PACKAGE_ID, +BODY_ID, 
+IDENTIFIER_ID, +IS_ID));
+
+                  when package_specification_ID =>
+                     Push_Back_Check (New_Config, (+name_opt_ID, +END_ID, 
+declarative_part_opt_ID));
+                     if New_Config.Stack.Peek (1).Token.ID = +PRIVATE_ID then
+                        Push_Back_Check (New_Config, (+PRIVATE_ID, 
+declarative_part_opt_ID));
+                     end if;
+                     Insert (New_Config, (+PACKAGE_ID, +IDENTIFIER_ID, 
+IS_ID));
+
+                  when subprogram_body_ID =>
+                     Push_Back_Check
+                       (New_Config,
+                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID, +BEGIN_ID,
+                         +declarative_part_opt_ID));
+                     Insert (New_Config, (+PROCEDURE_ID, +IDENTIFIER_ID, 
+IS_ID));
+
+                  when task_body_ID =>
+                     Push_Back_Check
+                       (New_Config,
+                        (+SEMICOLON_ID, +name_opt_ID, +END_ID, 
+handled_sequence_of_statements_ID));
+                     Insert (New_Config, +BEGIN_ID);
+
+                  when others =>
+                     if Trace_McKenzie > Outline then
+                        Put ("Language_Fixes Match_Names_Error 2: unknown 
error token", Config);
+                     end if;
+                     return;
+                  end case;
+
+                  if Trace_McKenzie > Detail then
+                     Put ("Language_Fixes Match_Names_Error 2 " &
+                            Image (Config.Error_Token.ID, Descriptor), 
New_Config);
+                  end if;
+                  Local_Config_Heap.Add (New_Config);
+               exception
+               when Bad_Config =>
+                  null;
+               end;
+
+            else
+               --  Case 1.
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  New_Config.Error_Token.ID := Invalid_Token_ID;
+                  New_Config.Check_Status   := (Label => Ok);
+
+                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+                  Push_Back_Check
+                    (New_Config,
+                     (+SEMICOLON_ID,
+                      (case 
Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) is
+                       when package_body_ID | package_specification_ID | 
subprogram_body_ID => +name_opt_ID,
+                       when protected_type_declaration_ID | 
single_protected_declaration_ID => +protected_definition_ID,
+                       when others =>  +identifier_opt_ID)));
+
+                  if New_Config.Stack (1).Token.Min_Terminal_Index = 
Invalid_Token_Index then
+                     --  'end' is on top of stack. We want to set 
Current_Shared_Token to
+                     --  'end'; we can't if it has an invalid index (which it 
has if it was
+                     --  pushed after a previous fix).
+                     --
+                     --  We don't check earlier for Invalid_Indices, because 
we can handle
+                     --  other tokens having invalid indices.
+
+                     return;
+                  end if;
+
+                  Push_Back_Check (New_Config, +END_ID);
+
+                  --  We don't insert ';' here, because we may need to insert 
other
+                  --  stuff first; let Minimal_Complete_Actions handle it.
+                  Insert (New_Config, +END_ID);
+
+                  Local_Config_Heap.Add (New_Config);
+
+                  if Trace_McKenzie > Detail then
+                     Put ("Language_Fixes Match_Names_Error 1 " & Image 
(Config.Error_Token.ID, Descriptor),
+                          New_Config);
+                  end if;
+               exception
+               when Bad_Config =>
+                  null;
+
+               when E : System.Assertions.Assert_Failure =>
+                  if Trace_McKenzie > Outline then
+                     Trace.Put_Line
+                       ("Match_Names_Error 1 " & 
Standard.Ada.Exceptions.Exception_Message (E) & " " &
+                          Image (Config.Error_Token.ID, Descriptor));
+                  end if;
+               end;
+            end if;
+         end;
+
+      when Missing_Name_Error =>
+         --  0. User name error. The input looks like:
+         --
+         --  "<begin_name_token> ... <end_name_token> ;"
+         --
+         --  where <end_name_token> is empty, because the user is changing it.
+         --
+         --  There are two cases:
+         --
+         --  0a. The nonterm can contain a handled_sequence_of_statements; ie 
a subprogram or named block
+         --
+         --  0b. The nonterm cannot contain a handled_sequence_of_statements;
+         --  ie a protected object or type declaration.
+         --
+         --  The fix is to ignore the error.
+         --
+         --  1. missing 'begin' or extra 'end'. The stack looks like:
+         --
+         --   "<begin_named_token> ... begin handled_sequence_of_statements 
end <end_name_token> ;"
+         --
+         --  where the <end_name_token> is empty. See test_mckenzie_recover.adb
+         --  Missing_Name_*, ada_mode-recover_15.adb.
+         --
+         --  There are two subcases:
+         --
+         --  1a. The 'end <end_name_token> ;' is left over from editing, and
+         --  should be deleted. Note that there could be an End_Keyword_IDs
+         --  with that end instead of a name.
+         --
+         --  1b. There is a missing 'begin'.
+         --
+         --  We can distinguish between 1a and 1b by looking for 'exception';
+         --  if it is present, it is more likely there is a missing 'begin'.
+         --  However, 'exception' is contained by
+         --  'handled_sequence_of_statements' on the stack, so we have to look
+         --  inside that using the syntax tree.
+         --
+         --  We cannot distinguish between cases 0 and 1, other than by parsing
+         --  ahead, except in case 0b. So we enqueue two solutions; 'ignore
+         --  error' and either 'insert begin' or 'delete end;'.
+
+         if not Valid_Tree_Indices (Config.Stack, SAL.Base_Peek_Type 
(Config.Check_Token_Count)) then
+            --  Invalid tree indices happens when recover enqueues a config 
that
+            --  contains tokens pushed during recover. The logic below depends 
on
+            --  valid tree indices.
+
+            return;
+         end if;
+
+         if No_Statements_Nonterm_IDs (Config.Error_Token.ID) then
+            --  case 0b.
+            --  test/ada_mode.ads
+            return;
+         end if;
+
+         if Syntax_Trees.Invalid_Node_Index = Tree.Find_Child (Config.Stack 
(4).Tree_Index, +EXCEPTION_ID) then
+            --  'exception' not found; case 1a - assume extra 'end [keyword] 
;'; delete it.
+            declare
+               New_Config     : Configuration := Config;
+               Ops            : Config_Op_Arrays.Vector renames New_Config.Ops;
+               Stack          : Recover_Stacks.Stack renames New_Config.Stack;
+               End_Item       : Recover_Stack_Item; -- 'end' keyword; position 
in stack varies with case
+               Keyword_Item   : Recover_Stack_Item; -- keyword after 'end'; 
may not be present
+               Semicolon_Item : Recover_Stack_Item; -- semicolon after 'end'
+            begin
+               New_Config.Error_Token.ID := Invalid_Token_ID;
+               New_Config.Check_Status   := (Label => Ok);
+
+               --  This is a guess, and sometimes deleting the error keyword 
is better, so
+               --  give it a cost.
+               New_Config.Cost := New_Config.Cost + 1;
+
+               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+               case To_Token_Enum (Config.Error_Token.ID) is
+               when block_statement_ID | package_body_ID | subprogram_body_ID 
| task_body_ID =>
+                  Semicolon_Item := Stack.Peek (1);
+                  End_Item       := Stack.Peek (3);
+
+                  Push_Back_Check
+                    (New_Config,
+                     (+SEMICOLON_ID,
+                      (if Config.Error_Token.ID in +block_statement_ID | 
+task_body_ID
+                       then +identifier_opt_ID
+                       else +name_opt_ID),
+                      +END_ID));
+
+                  if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
+                     Undo_Reduce_Check
+                       (New_Config, Tree,
+                        (+handled_sequence_of_statements_ID,
+                         +sequence_of_statements_opt_ID));
+                  end if;
+
+               when package_specification_ID =>
+                  Semicolon_Item := Stack.Peek (1);
+                  End_Item       := Stack.Peek (3);
+
+                  Push_Back_Check (New_Config, (+SEMICOLON_ID, +name_opt_ID, 
+END_ID));
+                  Undo_Reduce_Check (New_Config, Tree, 
+declarative_part_opt_ID);
+
+               when loop_statement_ID =>
+                  Semicolon_Item := Stack.Peek (1);
+                  Keyword_Item   := Stack.Peek (3);
+                  End_Item       := Stack.Peek (4);
+
+                  Push_Back_Check
+                    (New_Config, (+SEMICOLON_ID, +identifier_opt_ID, +LOOP_ID, 
+END_ID));
+
+                  if New_Config.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
+                     Undo_Reduce_Check
+                       (New_Config, Tree,
+                        (+handled_sequence_of_statements_ID,
+                         +sequence_of_statements_opt_ID));
+                  end if;
+               when others =>
+                  if Trace_McKenzie > Outline then
+                     Put ("Language_Fixes unimplemented nonterm for 
Missing_Name_Error.", Config);
+                  end if;
+                  raise Bad_Config;
+               end case;
+
+               Ops.Append ((Delete, +END_ID, 
End_Item.Token.Min_Terminal_Index));
+               if Keyword_Item.Token.ID /= Invalid_Token_ID then
+                  Ops.Append ((Delete, Keyword_Item.Token.ID, 
Keyword_Item.Token.Min_Terminal_Index));
+               end if;
+               --  We don't need to delete the identifier|name ; it is missing 
and therefore empty.
+               Ops.Append ((Delete, +SEMICOLON_ID, 
Semicolon_Item.Token.Min_Terminal_Index));
+
+               New_Config.Current_Shared_Token := Config.Current_Shared_Token; 
--  After pushed_back SEMICOLON.
+
+               Local_Config_Heap.Add (New_Config);
+
+               if Trace_McKenzie > Detail then
+                  Put ("Language_Fixes Missing_Name_Error 1a " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
+               end if;
+            exception
+            when Bad_Config =>
+               null;
+            end;
+
+         else
+            --  'exception' found; case 1b - assume missing 'begin'; insert it
+            --  before 'handled_sequence_of_statements'
+            declare
+               New_Config : Configuration := Config;
+            begin
+               New_Config.Error_Token.ID := Invalid_Token_ID;
+               New_Config.Check_Status   := (Label => Ok);
+
+               New_Config.Cost := New_Config.Cost + 1;
+
+               New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+               Push_Back_Check
+                 (New_Config,
+                  (+SEMICOLON_ID,
+                   (if Config.Error_Token.ID = +block_statement_ID
+                    then +identifier_opt_ID
+                    else +name_opt_ID),
+                   +END_ID, +handled_sequence_of_statements_ID));
+
+               Insert (New_Config, +BEGIN_ID);
+
+               Local_Config_Heap.Add (New_Config);
+
+               if Trace_McKenzie > Detail then
+                  Put ("Language_Fixes Missing_Name_Error 1b " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
+               end if;
+            exception
+            when Bad_Config =>
+               null;
+            end;
+         end if;
+
+      when Extra_Name_Error =>
+         --  The input looks like
+         --
+         --  "<begin_name_token> ... block_label_opt begin ... end 
<end_name_token> ;"
+         --
+         --  where the erroneous reduce matches the empty 'block_label_opt'
+         --  with '<end_name_Token>'.
+         --
+         --  0. If a matching <begin_name_token> is found, this is not a
+         --  plausible user name error (but we always allow 'ignore error'). If
+         --  it is not found, the user could be adding/deleting names; ignore
+         --  error is appropriate. In either case, enqueue other solutions.
+         --
+         --  1. There is at least one missing 'end' before 'begin'. See
+         --  test_mckenzie_recover.adb Extra_Name_1, Extra_Name_2,
+         --  Two_Missing_Ends. The solution is to insert 'end ;' before the
+         --  'begin'.
+         --
+         --  2. There is at least one missing 'end' after 'begin'. See
+         --  test_mckenzie_recover.adb Extra_Name_3, Block_Match_Names_1. The
+         --  solution is to insert 'end ;' before the 'end'.
+         --
+         --  3. There is an extra 'begin', before the 'begin'. See
+         --  test/ada_mode-recover_block_name_mismatch.adb
+         --
+         --  There is no reliable way to distinguish between 1 and 2, so we
+         --  enqueue both solutions. See test/ada_mode-recover_exception_1.adb
+         --
+         --  If there is more than one missing 'end', a later recover operation
+         --  will fix the others.
+
+         --  This case can handle Config.Error_Token.Virtual = True, and it 
doesn't use
+         --  Tree.
+
+         declare
+            End_Name : constant String := Lexer.Buffer_Text 
(End_Name_Token.Name);
+
+            Matching_Name_Index : SAL.Peek_Type := 3; -- start search before 
<end_name_token>
+            Begin_Count         : Integer;
+         begin
+            Find_Matching_Name
+              (Config, Lexer, End_Name, Matching_Name_Index,
+               Other_ID => +BEGIN_ID, Other_Count => Begin_Count, 
Case_Insensitive => True);
+
+            if Matching_Name_Index = Config.Stack.Depth then
+               --  No matching name found; ignore error is the only fix.
+               return;
+            end if;
+
+            if Begin_Count = 1 then
+               --  Case 1 or 2.
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  New_Config.Error_Token.ID := Invalid_Token_ID;
+                  New_Config.Check_Status   := (Label => Ok);
+
+                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+                  --  Push_Back the failed reduce tokens.
+                  for I in 1 .. New_Config.Check_Token_Count loop
+                     Push_Back (New_Config);
+                  end loop;
+
+                  Insert (New_Config, +END_ID);
+                  --  Let Minimal_Complete_Actions handle (insert ';').
+
+                  Local_Config_Heap.Add (New_Config);
+
+                  if Trace_McKenzie > Detail then
+                     Put ("Language_Fixes Extra_Name_Error 1 " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
+                  end if;
+
+               exception
+               when Bad_Config =>
+                  null;
+               end;
+
+               --  Case 2
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  New_Config.Error_Token.ID := Invalid_Token_ID;
+                  New_Config.Check_Status   := (Label => Ok);
+
+                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+                  case 
Ada_Process_Actions.Token_Enum_ID'(-Config.Error_Token.ID) is
+                  when block_statement_ID =>
+                     --  There is almost always an open block of some sort; 
not worth
+                     --  checking.
+                     Push_Back_Check (New_Config, (+SEMICOLON_ID, 
+identifier_opt_ID, +END_ID));
+
+                  when loop_statement_ID =>
+                     Push_Back_Check
+                       (New_Config, (+SEMICOLON_ID, +identifier_opt_ID, 
+LOOP_ID, +END_ID));
+
+                  when others =>
+                     if Trace_McKenzie > Outline then
+                        Put ("Language_Fixes Extra_Name_Error 2: unrecognized 
Error_Token", Config);
+                     end if;
+                     raise Bad_Config;
+                  end case;
+
+                  --  Let Minimal_Complete_Actions finish insert
+                  Insert (New_Config, +END_ID);
+
+                  Local_Config_Heap.Add (New_Config);
+
+                  if Trace_McKenzie > Detail then
+                     Put ("Language_Fixes Extra_Name_Error 2 " & Image 
(Config.Error_Token.ID, Descriptor), New_Config);
+                  end if;
+               exception
+               when Bad_Config =>
+                  null;
+               end;
+
+            else
+               --  Case 3. Delete the extra begin
+               --
+               --  If the first begin was inserted by recovery; we actually 
want to
+               --  delete the second begin. see 
test/ada_mode-recover_indent_4.adb
+               declare
+                  New_Config     : Configuration := Config;
+                  I              : SAL.Peek_Type := 1;
+                  First_Begin_I  : SAL.Peek_Type;
+                  Second_Begin_I : SAL.Peek_Type;
+               begin
+                  loop
+                     if New_Config.Stack.Peek (I).Token.ID = +BEGIN_ID then
+                        Second_Begin_I := I;
+                        exit;
+                     end if;
+                     I := I + 1;
+                  end loop;
+
+                  loop
+                     I := I + 1;
+                     if New_Config.Stack.Peek (I).Token.ID = +BEGIN_ID then
+                        First_Begin_I := I;
+                        exit;
+                     end if;
+                  end loop;
+
+                  if New_Config.Stack.Peek (First_Begin_I).Token.Virtual then
+                     if New_Config.Stack.Peek (Second_Begin_I).Token.Virtual 
then
+                        --  nothing we can do.
+                        return;
+                     end if;
+
+                     --  Delete the second begin
+                     for I in 1 .. Second_Begin_I loop
+                        Push_Back (New_Config);
+                     end loop;
+                     pragma Assert (New_Config.Stack.Peek.Token.ID = 
+block_label_opt_ID);
+
+                     if New_Config.Stack.Peek.Token.Byte_Region = 
Null_Buffer_Region then
+                        --  block label is empty
+                        Push_Back (New_Config);
+                        Delete_Check (Terminals, New_Config, +BEGIN_ID);
+                     else
+                        Push_Back (New_Config);
+
+                        declare
+                           Index : WisiToken.Token_Index := 
New_Config.Current_Shared_Token;
+                        begin
+                           Delete_Check (Terminals, New_Config, Index, 
+IDENTIFIER_ID);
+                           Delete_Check (Terminals, New_Config, Index, 
+COLON_ID);
+                           Delete_Check (Terminals, New_Config, Index, 
+BEGIN_ID);
+                        end;
+                     end if;
+
+                     if Undo_Reduce_Valid (New_Config.Stack, Tree) then
+                        Undo_Reduce_Check (New_Config, Tree, 
+sequence_of_statements_ID);
+                     else
+                        Push_Back_Check (New_Config, 
+sequence_of_statements_ID);
+                     end if;
+                     Local_Config_Heap.Add (New_Config);
+
+                     if Trace_McKenzie > Detail then
+                        Put ("Language_Fixes Extra_Name_Error 3a " &
+                               Image (Config.Error_Token.ID, Descriptor), 
New_Config);
+                     end if;
+                  else
+                     --  Delete the first begin. We assume it is in a 
subprogram body, so
+                     --  we don't need to adjust anything else.
+                     for I in 1 .. First_Begin_I loop
+                        Push_Back (New_Config);
+                     end loop;
+
+                     Delete_Check (Terminals, New_Config, +BEGIN_ID);
+                     Local_Config_Heap.Add (New_Config);
+
+                     if Trace_McKenzie > Detail then
+                        Put ("Language_Fixes Extra_Name_Error 3b " &
+                               Image (Config.Error_Token.ID, Descriptor), 
New_Config);
+                     end if;
+                  end if;
+               end;
+            end if;
+         end;
+      end case;
+   exception
+   when Bad_Config =>
+      null;
+
+   when System.Assertions.Assert_Failure =>
+      if Trace_McKenzie > Outline then
+         Trace.Put_Line ("Language_Fixes Handle_Check_Fail Assert fail");
+      end if;
+   end Handle_Check_Fail;
+
+   procedure Handle_Parse_Error
+     (Trace             : in out WisiToken.Trace'Class;
+      Lexer             : access constant WisiToken.Lexer.Instance'Class;
+      Parser_Label      : in     Natural;
+      Parse_Table       : in     WisiToken.Parse.LR.Parse_Table;
+      Terminals         : in     Base_Token_Arrays.Vector;
+      Tree              : in     Syntax_Trees.Tree;
+      Local_Config_Heap : in out Config_Heaps.Heap_Type;
+      Config            : in     Configuration)
+   with Pre => Config.Check_Status.Label = Ok
+   is
+      use all type Standard.Ada.Containers.Count_Type;
+
+      procedure Put (Message : in String; Config : in Configuration)
+      is begin
+         Put (Message, Trace, Parser_Label, Terminals, Config);
+      end Put;
+   begin
+      if Config.Error_Token.ID = +COLON_ID and
+        Config.Stack (1).Token.ID = +IDENTIFIER_ID
+      then
+         --  Code looks like:
+         --
+         --  begin ... <variable_identifier> : [aliased constant] 
<subtype_indication> ...
+         --
+         --  compare to "missing begin"/"extra begin" case below.
+         --
+         --  Assume the user copied a declaration with an initializer, and is
+         --  converting it to a subprogram parameter; see
+         --  ada_mode-recover_02.adb). Delete the ': [aliased constant]
+         --  <subtype_indication>'.
+         --
+         --  Note that if the user was converting to an assignment, the error
+         --  would be on 'constant', not ':'.
+
+         if Config.Insert_Delete.Length > 0 and then
+           Token_Index (Config.Insert_Delete 
(Config.Insert_Delete.Last_Index)) >= Config.Current_Shared_Token
+         then
+            --  Can't delete tokens from here
+            return;
+         end if;
+
+         declare
+            New_Config : Configuration := Config;
+            Delete_Index : WisiToken.Token_Index := 
Config.Current_Shared_Token;
+         begin
+            Delete_Check (Terminals, New_Config, Delete_Index, +COLON_ID);
+            if Terminals (Delete_Index).ID = +ALIASED_ID then
+               Delete_Check (Terminals, New_Config, Delete_Index, +ALIASED_ID);
+            end if;
+            if Terminals (Delete_Index).ID = +CONSTANT_ID then
+               Delete_Check (Terminals, New_Config, Delete_Index, 
+CONSTANT_ID);
+            end if;
+            if Terminals (Delete_Index).ID = +NOT_ID then
+               Delete_Check (Terminals, New_Config, Delete_Index, +NOT_ID);
+            end if;
+            if Terminals (Delete_Index).ID = +NULL_ID then
+               Delete_Check (Terminals, New_Config, Delete_Index, +NULL_ID);
+            end if;
+            if Terminals (Delete_Index).ID = +IDENTIFIER_ID then
+               Delete_Check (Terminals, New_Config, Delete_Index, 
+IDENTIFIER_ID);
+
+               --  There might be more to the subtype_indication; we'll let 
explore sort that out.
+               Local_Config_Heap.Add (New_Config);
+               if Trace_McKenzie > Detail then
+                  Put ("Language_Fixes variable decl as param", New_Config);
+               end if;
+            else
+               --  Something else is going on, abandon this
+               return;
+            end if;
+         end;
+
+      elsif Config.Error_Token.ID = +DOT_ID then
+         --  We've encountered a Selected_Component when we were expecting a
+         --  simple IDENTIFIER or a name. If the name is preceded by 'end', 
then
+         --  this similar to a semantic check Extra_Name_Error, and the
+         --  solutions are similar.
+
+         if Config.Stack (1).Token.ID = +IDENTIFIER_ID and
+           Config.Stack (2).Token.ID = +END_ID
+         then
+            --  The input looks like one of:
+            --
+            --  1) "<begin_name_token_1> ... <begin_name_token_2> ... begin 
... begin ... end <end_name_token_1> ;"
+            --
+            --  2) "<begin_name_token_1> ... begin ... declare ... begin ... 
end <end_name_token_1> ;"
+            --
+            --  Case 1) is missing 'end <end_name_token_2> ;' between the
+            --  'begin's, so parsing expects <end_name_token_1> to match the
+            --  second 'begin', which looks like an unnamed block. See
+            --  test_mckenzie_recover Match_Selected_Component_1. 'declare ...'
+            --  may _not_ be present on the second begin. The solution is to
+            --  insert 'end ;' before the second 'begin'.
+            --
+            --  Case 2) is missing 'end;' after the second 'begin'. See
+            --  test_mckenzie_recover Match_Selected_Component_2. 'declare ...'
+            --  may be absent on the second begin, or a name may be present. 
The
+            --  solution is to insert 'end;' after the second 'begin' (ie 
before
+            --  the last 'end').
+            --
+            --  Minimal_Complete_Actions does not handle this case well.
+            --
+            --  Note that it's _not_ possible the user is just editing names; 
that
+            --  would generate a semantic check fail, not a parse table error,
+            --  since a "." would be permitted.
+
+            declare
+               Label        : constant String := "selected_component 1";
+               New_Config_1 : Configuration   := Config;
+               New_Config_2 : Configuration;
+            begin
+               New_Config_1.Error_Token.ID := Invalid_Token_ID;
+
+               New_Config_1.Strategy_Counts (Language_Fix) := 
New_Config_1.Strategy_Counts (Language_Fix) + 1;
+
+               Push_Back_Check (New_Config_1, (+IDENTIFIER_ID, +END_ID));
+               if New_Config_1.Stack.Peek (1).Token.ID = 
+handled_sequence_of_statements_ID then
+                  Undo_Reduce_Check
+                    (New_Config_1, Tree,
+                     (+handled_sequence_of_statements_ID,
+                      +sequence_of_statements_opt_ID));
+               end if;
+
+               case To_Token_Enum (New_Config_1.Stack (3).Token.ID) is
+               when block_label_opt_ID =>
+                  --  no 'declare'; either case 1 or 2
+
+                  New_Config_2 := New_Config_1;
+                  New_Config_2.Strategy_Counts (Language_Fix) := 
New_Config_2.Strategy_Counts (Language_Fix) + 1;
+
+                  Insert (New_Config_2, +END_ID);
+                  --  Let Minimal_Complete_Actions finish insert.
+
+                  Push_Back_Check
+                    (New_Config_1,
+                     (+handled_sequence_of_statements_ID, +BEGIN_ID, 
+block_label_opt_ID));
+
+                  Insert (New_Config_1, +END_ID);
+                  --  Let Minimal_Complete_Actions finish insert.
+
+                  Local_Config_Heap.Add (New_Config_1);
+                  Local_Config_Heap.Add (New_Config_2);
+
+               when declarative_part_opt_ID =>
+                  --  case 2
+                  Insert (New_Config_1, +END_ID);
+                  Local_Config_Heap.Add (New_Config_1);
+
+               when others =>
+                  if Trace_McKenzie > Outline then
+                     Put ("Language_Fixes " & Label & " missing case " & Image
+                            (New_Config_1.Stack (3).Token.ID, Descriptor), 
Config);
+                     Trace.Put_Line ("... new_config stack: " & Image 
(New_Config_1.Stack, Descriptor));
+                  end if;
+                  return;
+               end case;
+
+               if Trace_McKenzie > Detail then
+                  Put ("Language_Fixes " & Label, New_Config_1);
+
+                  if New_Config_2.Ops.Length > 0 then
+                     Put ("Language_Fixes " & Label, New_Config_2);
+                  end if;
+               end if;
+            exception
+            when Bad_Config =>
+               null;
+            end;
+         end if;
+
+      elsif Config.Error_Token.ID = +IDENTIFIER_ID and
+        Config.Stack.Peek.Token.ID = +END_ID
+      then
+         --  We've encountered an identifier after 'end' when expecting a
+         --  keyword. See test/ada_mode-recover_26.adb.
+         --
+         --  If a matching 'begin name' is found on the stack, the input looks 
like:
+         --
+         --  1) "<begin_name_token> ... begin ... <compound_statement_begin> 
... end <end_name_token> ;"
+         --
+         --  There is a missing 'end <compound_statement_id> ;' before the
+         --  'end'. We can get the ID to insert from Parse_Table
+         --  Minimal_Complete_Actions.
+         --
+         --  Minimal_Complete_Actions does not handle this case well; it
+         --  ignores the name.
+         declare
+            use all type SAL.Base_Peek_Type;
+            End_ID_Actions : constant Minimal_Action_Arrays.Vector := 
Parse_Table.States
+              (Config.Stack.Peek.State).Minimal_Complete_Actions;
+            End_Name       : constant String := Lexer.Buffer_Text 
(Config.Error_Token.Byte_Region);
+
+            Matching_Name_Index : SAL.Peek_Type := 2; -- start search before 
'end'
+         begin
+            Find_Matching_Name (Config, Lexer, End_Name, Matching_Name_Index, 
Case_Insensitive => True);
+
+            if Matching_Name_Index < Config.Stack.Depth and then
+              End_ID_Actions.Length = 1 and then
+              End_ID_Actions (End_ID_Actions.First_Index).Verb = Shift
+            then
+               declare
+                  Label      : constant String := "missing end keyword";
+                  New_Config : Configuration   := Config;
+               begin
+                  New_Config.Error_Token.ID := Invalid_Token_ID;
+
+                  New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+                  Push_Back_Check (New_Config, +END_ID);
+
+                  --  Inserting the end keyword and semicolon here avoids the 
costs added by
+                  --  Insert_Minimal_Complete_Actions.
+                  Insert (New_Config, (+END_ID, End_ID_Actions 
(End_ID_Actions.First_Index).ID, +SEMICOLON_ID));
+
+                  Local_Config_Heap.Add (New_Config);
+                  if Trace_McKenzie > Detail then
+                     Put ("Language_Fixes " & Label, New_Config);
+                  end if;
+               exception
+               when Bad_Config =>
+                  null;
+               end;
+            end if;
+         end;
+
+      elsif To_Token_Enum (Config.Error_Token.ID) in CONSTANT_ID | 
IDENTIFIER_ID and
+        Config.Stack.Peek.Token.ID = +COLON_ID
+      then
+         --  Code looks like:
+         --
+         --  ... <subprogram|package start> begin ... <variable_name> : 
[constant] <type_name>;
+         --
+         --  The variable_name looks like a block_label. compare to "variable 
decl as
+         --  param" case above.
+         --
+         --  1) There is a missing 'end;' before the <variable_name>. See
+         --  test/ada_mode-recover_25.adb. Minimal_Complete now handles this
+         --  case, but we enqueue the same solution here at lower cost, so it
+         --  can compete with the solution for case 2..
+         --
+         --  2) There is an extra 'begin' before the <variable_name>. See
+         --  test/ada_mode-recover_27.adb.
+         --
+         --  FIXME: if there is a sequence_of_statements between the 'begin'
+         --  and the error point, or declarations before the 'begin', this is
+         --  either a copied variable declaration that the user is converting
+         --  to an assignment (solution: delete ': type'), or a subprogram
+         --  begin split in two (solution: insert 'declare' or 'end; procedure
+         --  name'). Need test cases.
+
+         declare
+            New_Config_1 : Configuration := Config;
+            New_Config_2 : Configuration;
+         begin
+            New_Config_1.Strategy_Counts (Language_Fix) := 
New_Config_1.Strategy_Counts (Language_Fix) + 1;
+
+            Push_Back_Check (New_Config_1, (+COLON_ID, +IDENTIFIER_ID));
+            New_Config_2 := New_Config_1;
+
+            Insert (New_Config_1, +END_ID);
+            --  Let Minimal_Complete finish insert; that will add cost, so no 
cost here.
+            Local_Config_Heap.Add (New_Config_1);
+
+            if Trace_McKenzie > Detail then
+               Put ("Language_Fixes missing begin", New_Config_1);
+            end if;
+
+            --  Case 2.
+            Push_Back_Check (New_Config_2, +BEGIN_ID);
+            if Undo_Reduce_Valid (New_Config_2.Stack, Tree) then
+               Undo_Reduce_Check (New_Config_2, Tree, 
+declarative_part_opt_ID);
+            else
+               return;
+            end if;
+            Delete_Check (Terminals, New_Config_2, +BEGIN_ID);
+
+            --  This is a guess, so add a cost.
+            New_Config_2.Cost := New_Config_2.Cost + 1;
+            Local_Config_Heap.Add (New_Config_2);
+
+            if Trace_McKenzie > Detail then
+               Put ("Language_Fixes extra begin", New_Config_2);
+            end if;
+         end;
+
+      elsif Config.Error_Token.ID = +OR_ID and then
+        Config.Stack.Peek.Token.ID = +expression_opt_ID
+      then
+         --  Code looks like:
+         --
+         --  expr1 and expr2 or expr3
+         --
+         --  where 'expr1 and expr2' is in the expression on the stack. Missing
+         --  left paren before expr1. See test/ada_mode-recover_20.adb.
+         --
+         --  We could check for the presence of 'and' in expression_opt, but
+         --  that requires a syntax tree. If the left paren doesn't help, this
+         --  config will be dropped.
+
+         declare
+            New_Config : Configuration := Config;
+         begin
+            New_Config.Strategy_Counts (Language_Fix) := 
New_Config.Strategy_Counts (Language_Fix) + 1;
+
+            Push_Back_Check (New_Config, +expression_opt_ID);
+            Insert (New_Config, +LEFT_PAREN_ID);
+            --  Minimal_Complete will add the matching right paren.
+
+            Local_Config_Heap.Add (New_Config);
+            if Trace_McKenzie > Detail then
+               Put ("Language_Fixes and/or", New_Config);
+            end if;
+         end;
+
+      end if;
+   exception
+   when Bad_Config =>
+      null;
+
+   when System.Assertions.Assert_Failure =>
+      if Trace_McKenzie > Outline then
+         Trace.Put_Line ("Language_Fixes Handle_Parse_Error assert fail");
+      end if;
+   end Handle_Parse_Error;
+
+   ----------
+   --  Public subprograms
+
+   procedure Language_Fixes
+     (Trace             : in out WisiToken.Trace'Class;
+      Lexer             : access constant WisiToken.Lexer.Instance'Class;
+      Parser_Label      : in     Natural;
+      Parse_Table       : in     WisiToken.Parse.LR.Parse_Table;
+      Terminals         : in     Base_Token_Arrays.Vector;
+      Tree              : in     Syntax_Trees.Tree;
+      Local_Config_Heap : in out Config_Heaps.Heap_Type;
+      Config            : in     Configuration)
+   is begin
+      if Trace_McKenzie > Extra then
+         Put ("Language_Fixes", Trace, Parser_Label, Terminals, Config);
+         Put_Line (Trace, Parser_Label, "config stack: " & Image 
(Config.Stack, Descriptor));
+      end if;
+
+      case Config.Check_Status.Label is
+      when Ok =>
+         Handle_Parse_Error (Trace, Lexer, Parser_Label, Parse_Table, 
Terminals, Tree, Local_Config_Heap, Config);
+
+      when others =>
+         Handle_Check_Fail (Trace, Lexer, Parser_Label, Parse_Table, 
Terminals, Tree, Local_Config_Heap, Config);
+      end case;
+   end Language_Fixes;
+
+   procedure Matching_Begin_Tokens
+     (Tokens                  : in     Token_ID_Array_1_3;
+      Config                  : in     Configuration;
+      Matching_Tokens         :    out Token_ID_Arrays.Vector;
+      Forbid_Minimal_Complete :    out Boolean)
+   is
+      use all type SAL.Base_Peek_Type;
+      use Ada_Process_Actions;
+      use Token_ID_Arrays;
+
+      function Matching_Begin_For_End (Next_Index : in Positive) return 
Token_ID_Arrays.Vector
+      is begin
+         return Result : Token_ID_Arrays.Vector do
+            if Tokens (Next_Index) = Invalid_Token_ID then
+               --  Better to delete 'end'
+               Result := Empty_Vector;
+            else
+               case To_Token_Enum (Tokens (Next_Index)) is
+               when CASE_ID | IF_ID | LOOP_ID | RETURN_ID | SELECT_ID =>
+                  Result := To_Vector (Tokens (Next_Index));
+
+               when IDENTIFIER_ID =>
+                  if Tokens (Next_Index + 1) /= Invalid_Token_ID and then
+                    To_Token_Enum (Tokens (Next_Index + 1)) = DOT_ID
+                  then
+                     Result := To_Vector ((+PACKAGE_ID, +BODY_ID, 
+IDENTIFIER_ID, +IS_ID)); --  package body
+                  else
+                     Result := To_Vector ((+IDENTIFIER_ID, +COLON_ID, 
+BEGIN_ID)); -- named block begin
+                  end if;
+
+               when SEMICOLON_ID =>
+                  Result := To_Vector (+BEGIN_ID);
+
+               when others =>
+                  null;
+               end case;
+            end if;
+         end return;
+      end Matching_Begin_For_End;
+
+   begin
+      if Config.Stack.Depth > 0 and then Config.Stack.Peek.Token.ID = +END_ID 
then
+         Matching_Tokens := Matching_Begin_For_End (1);
+
+      else
+         case To_Token_Enum (Tokens (1)) is
+         when END_ID =>
+            Matching_Tokens := Matching_Begin_For_End (2);
+
+         when ELSE_ID | ELSIF_ID | THEN_ID =>
+            Matching_Tokens := To_Vector (+IF_ID);
+
+         when EXCEPTION_ID =>
+            Matching_Tokens := To_Vector (+BEGIN_ID);
+
+            --  We don't return LEFT_PAREN for RIGHT_PAREN; better to delete 
it.
+
+         when WHEN_ID =>
+            Matching_Tokens := To_Vector ((+CASE_ID, +IDENTIFIER_ID, +IS_ID));
+
+         when others =>
+            null;
+         end case;
+      end if;
+
+      if Config.Stack.Peek.Token.ID = +END_ID and
+        ((Tokens (1) = +IDENTIFIER_ID and
+            (Tokens (2) /= Invalid_Token_ID and then
+               -Tokens (2) in DOT_ID | SEMICOLON_ID)) or
+           End_Keyword_IDs (Tokens (1)))
+      then
+         Forbid_Minimal_Complete := True;
+      else
+         Forbid_Minimal_Complete := False;
+      end if;
+   end Matching_Begin_Tokens;
+
+   function String_ID_Set
+     (Descriptor        : in WisiToken.Descriptor;
+      String_Literal_ID : in Token_ID)
+     return Token_ID_Set
+   is
+      use Ada_Process_Actions;
+   begin
+      --  Character literal can be part of a string primary, so the nonterms
+      --  are independent of String_Literal_ID.
+
+      return Result : Token_ID_Set (Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal) := (others => False) do
+
+         Result (String_Literal_ID)     := True;
+         Result (+name_ID)              := True;
+         Result (+primary_ID)           := True;
+         Result (+factor_ID)            := True;
+         Result (+term_ID)              := True;
+         Result (+term_list_ID)         := True;
+         Result (+simple_expression_ID) := True;
+         Result (+relation_ID)          := True;
+         Result (+expression_ID)        := True;
+      end return;
+   end String_ID_Set;
+
+end WisiToken.Parse.LR.McKenzie_Recover.Ada;
+--  Local Variables:
+--  ada-auto-case: not-upper-case
+--  End:
diff --git a/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.ads 
b/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.ads
index 2ceceab..36a71c5 100644
--- a/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.ads
+++ b/packages/ada-mode/wisitoken-parse-lr-mckenzie_recover-ada.ads
@@ -30,13 +30,12 @@ package WisiToken.Parse.LR.McKenzie_Recover.Ada is
       Config            : in     Configuration);
    --  See wisitoken-parse-lr-parser.ads Language_Fixes_Access for description.
 
-   procedure Use_Minimal_Complete_Actions
-     (Current_Token        : in     Token_ID;
-      Next_Token           : in     Token_ID;
-      Config               : in     Configuration;
-      Use_Complete         :    out Boolean;
-      Matching_Begin_Token :    out Token_ID);
-   --  See wisitoken-parse-lr-parser.ads 
Language_Use_Minimal_Complete_Actions_Access
+   procedure Matching_Begin_Tokens
+     (Tokens                  : in     Token_ID_Array_1_3;
+      Config                  : in     Configuration;
+      Matching_Tokens         :    out Token_ID_Arrays.Vector;
+      Forbid_Minimal_Complete :    out Boolean);
+   --  See wisitoken-parse-lr-parser.ads Language_Matching_Begin_Tokens_Access
    --  for description.
 
    function String_ID_Set
diff --git a/packages/ada-mode/xref-ada.el b/packages/ada-mode/xref-ada.el
index ee93697..cf18271 100644
--- a/packages/ada-mode/xref-ada.el
+++ b/packages/ada-mode/xref-ada.el
@@ -19,65 +19,33 @@
 
 ;;; Code:
 
+(require 'wisi)
 (require 'xref)
 
 (defun xref-ada-find-backend ()
   'xref-ada)
 
 (cl-defmethod xref-backend-definitions ((_backend (eql xref-ada)) identifier)
-  (let* ((t-prop (get-text-property 0 'xref-identifier identifier))
-        ;; If t-prop is non-nil: identifier is from
-        ;; identifier-at-point, the desired location is the ’other’
-        ;; (spec/body).
-        ;;
-        ;; If t-prop is nil: identifier is from prompt/completion,
-        ;; the line number may be included in the identifier
-        ;; wrapped in <>, and the desired file is the current file.
-        (ident
-         (if t-prop
-             (substring-no-properties identifier 0 nil)
-           (string-match "\\([^<]*\\)\\(?:<\\([0-9]+\\)>\\)?" identifier)
-           (match-string 1 identifier)
-           ))
-        (file
-         (if t-prop
-             (plist-get t-prop ':file)
-           (buffer-file-name)))
-        (line
-         (if t-prop
-             (plist-get t-prop ':line)
-           (when (match-string 2 identifier)
-             (string-to-number (match-string 2 identifier)))))
-        (column
-         (if t-prop
-             (plist-get t-prop ':column)
-           0))
-        )
-
-    (if t-prop
-       (progn
-         (ada-check-current-project file)
-
-         (when (null ada-xref-other-function)
-           (error "no cross reference information available"))
-
-         (let ((target
-                (funcall
-                 ada-xref-other-function
-                 ident file line column)))
-           ;; IMPROVEME: when drop support for emacs 24, change
-           ;; ada-xref-other-function to return xref-file-location
-           (list
-            (xref-make
-             ident
-             (xref-make-file-location
-              (nth 0 target) ;; file
-              (nth 1 target) ;; line
-              (nth 2 target)) ;; column
-             ))))
-
-      (list (xref-make ident (xref-make-file-location file line column)))
-      )))
+  (wisi-xref-ident-make
+   identifier
+   (lambda (ident file line column)
+     (ada-check-current-project file)
+     (when (null ada-xref-other-function)
+       (error "no cross reference information available"))
+     (let ((target
+           (funcall
+            ada-xref-other-function
+            ident file line column)))
+       ;; IMPROVEME: when drop support for emacs 24, change
+       ;; ada-xref-other-function to return xref-file-location
+       (list
+       (xref-make
+        ident
+        (xref-make-file-location
+         (nth 0 target) ;; file
+         (nth 1 target) ;; line
+         (nth 2 target)) ;; column
+        ))))))
 
 (cl-defmethod xref-backend-identifier-at-point ((_backend (eql xref-ada)))
   (save-excursion
@@ -96,51 +64,7 @@
         nil))))
 
 (cl-defmethod xref-backend-identifier-completion-table ((_backend (eql 
xref-ada)))
-  (wisi-validate-cache (point-min) (point-max) t 'navigate)
-  (save-excursion
-    (let ((table nil)
-         cache)
-      (goto-char (point-min))
-      (while (not (eobp))
-       (setq cache (wisi-forward-find-cache-token '(IDENTIFIER name 
)(point-max)))
-       (cond
-        ((null cache)
-         ;; eob
-         )
-
-        ((memq (wisi-cache-nonterm cache)
-               '(abstract_subprogram_declaration
-                 entry_body
-                 entry_declaration
-                 exception_declaration
-                 function_specification
-                 full_type_declaration
-                 generic_declaration
-                 generic_instantiation
-                 null_procedure_declaration
-                 object_declaration
-                 object_renaming_declaration
-                 private_extension_declaration
-                 private_type_declaration
-                 procedure_specification
-                 protected_declaration
-                 protected_type_declaration
-                 package_specification
-                 subtype_declaration
-                 task_declaration
-                 task_type_declaration
-                 type_declaration))
-         ;; We can’t store location data in a string text property -
-         ;; it does not survive completion. So we include the line
-         ;; number in the identifier string. This also serves to
-         ;; disambiguate overloaded identifiers.
-         (push
-          (format "%s<%d>"
-           (wisi-cache-text cache)
-           (line-number-at-pos))
-          table))
-        ))
-      table)))
+  (wisi-xref-identifier-completion-table))
 
 (define-minor-mode xref-ada-mode ()
   "Use xref-ada functions."
diff --git a/packages/path-iterator/path-iterator.el 
b/packages/path-iterator/path-iterator.el
index c4b550a..e99cfcc 100644
--- a/packages/path-iterator/path-iterator.el
+++ b/packages/path-iterator/path-iterator.el
@@ -108,12 +108,6 @@
   state ;; one of nil, 'started, 'complete. Allows detecting interrupted 
computation.
   )
 
-(cl-defmethod path-iter-contains-root ((iter path-iterator) root)
-  "Return non-nil if ITER roots contain ROOT."
-  (or (member root (path-iter-path-recursive-init iter))
-      (member root (path-iter-path-non-recursive-init iter))
-      ))
-
 (defun path-iter--to-truename (path)
   "Convert each existing element of PATH to an absolute directory file 
truename,
 return the resulting list.  Elements of PATH are either absolute or
@@ -275,8 +269,10 @@ Return a list of absolute filenames or nil if none found."
        (file-name-all-completions filename dir)))
     result))
 
-(defun path-iter-all-files (iter)
-  "Return all filenames in ITER (a `path-iterator' object."
+(cl-defmethod path-iter-files ((iter path-iterator) pred)
+  "Return all filenames in ITER satisfying predicate PRED.
+If non-nil, PRED is a function taking a single absolute file
+name; the file is included if PRED returns non-nil"
   (let (dir result)
     (path-iter-restart iter)
 
@@ -285,7 +281,9 @@ Return a list of absolute filenames or nil if none found."
        (lambda (absfile)
         (when (and (not (string-equal "." (substring absfile -1)))
                    (not (string-equal ".." (substring absfile -2)))
-                   (not (file-directory-p absfile)))
+                   (not (file-directory-p absfile))
+                    (or (null pred)
+                        (funcall pred absfile)))
           (push absfile result)))
        (directory-files dir t))
       )
diff --git a/packages/wisi/NEWS b/packages/wisi/NEWS
index 22fe4e4..28f737c 100644
--- a/packages/wisi/NEWS
+++ b/packages/wisi/NEWS
@@ -1,15 +1,48 @@
 GNU Emacs wisi NEWS -- history of user-visible changes.
 
-Copyright (C) 2018 Free Software Foundation, Inc.
+Copyright (C) 2019 Free Software Foundation, Inc.
 See the end of the file for license conditions.
 
 Please send wisi bug reports to address@hidden, with
 'wisi' in the subject. If possible, use M-x report-emacs-bug.
 
 
+* wisi
+11 Jul 2019
+
+** parser process protocol version 3
+
+** User variable wisi-mckenzie-cost-limit is deleted; set
+   wisi-mckenzie-enqueue-limit instead, it gives better results.
+
+** `wisi-show-parse-errors' now shows errors in a dedicated window, so
+   it will not be resized or reused.
+
+** New grammar action `wisi-name-action'; sets a name that will be
+   fontified. This replaces the previous 'name' navigate class.
+
+** Support 'nil' as an indent argument; useful for the first token,
+   whose indent is typically unknown. Indent functions that do not
+   accumulate now only check for "nil", not "zero or nil".
+
+** New file wisi-xref.el provides a completion table built from tokens
+   marked by the new grammar action `wisi-name-action'.
+
+** The process parser checks the parser process protocol version, to
+   ensure the elisp code matches the process code.
+
+** The process parser supports passing data to a language-specific
+   elisp function, via the `language-action-table' field of the
+   `wisi-process--parser' struct.
+
+** New user option `wisi-parse-max-parallel' to set the number of
+   parallel parsers used; Java needs more than Ada.
+
 * wisi 2.1.0
 21 Mar 2019
 
+** parser process protocol version 2
+
 ** Add support for partial parsing; useful in very large files. Files
    larger than wisi-partial-parse-threshold (default 100_001) will be
    parsed partially.
@@ -23,6 +56,8 @@ Please send wisi bug reports to address@hidden, with
 * wisi 2.0.1
 8 Dec 2018
 
+** parser process protocol version 1
+
 ** Assign copyright in Ada files to FSF
 
 ** Update user guide, include it in elpa package
diff --git a/packages/wisi/README b/packages/wisi/README
index db1af26..f7fc4eb 100644
--- a/packages/wisi/README
+++ b/packages/wisi/README
@@ -1,4 +1,4 @@
-Emacs wisi package 2.1.0
+Emacs wisi package 2.1.1
 
 The wisi package provides utilities for using generalized LALR parsers
 (in elisp or external processes) to do indentation, fontification, and
diff --git a/packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.adb 
b/packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.adb
new file mode 100644
index 0000000..a5dd042
--- /dev/null
+++ b/packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.adb
@@ -0,0 +1,50 @@
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Strings.Unbounded;
+function SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image
+  (Item   : in Lists.List;
+   Strict : in Boolean := False)
+  return String
+is
+   use all type Ada.Containers.Count_Type;
+   use Ada.Strings;
+   use Ada.Strings.Unbounded;
+   Result     : Unbounded_String := To_Unbounded_String ("(");
+   Need_Comma : Boolean          := False;
+begin
+   if Strict and Item.Length = 0 then
+      return "(1 .. 0 => <>)";
+
+   elsif Strict and Item.Length = 1 then
+      return "(1 => " & Element_Image (Lists.Element (Item.First)) & ")";
+
+   else
+      for El of Item loop
+         if Need_Comma then
+            Result := Result & ", ";
+         else
+            Need_Comma := True;
+         end if;
+         Result := Result & Element_Image (El);
+      end loop;
+      Result := Result & ")";
+      return To_String (Result);
+   end if;
+end SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image;
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads 
b/packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.ads
similarity index 56%
copy from packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
copy to packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.ads
index 0be7c41..39e9b9e 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
+++ b/packages/wisi/sal-ada_containers-gen_doubly_linked_lists_image.ads
@@ -1,8 +1,8 @@
 --  Abstract :
 --
---  Image with auxiliary data for instantiations of parent.
+--  Image for normal Ada array types
 --
---  Copyright (C) 2018 Stephen Leake All Rights Reserved.
+--  Copyright (C) 2019 Free Software Foundation, Inc.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -16,8 +16,13 @@
 --  version 3.1, as published by the Free Software Foundation.
 
 pragma License (Modified_GPL);
-
+with Ada.Containers.Doubly_Linked_Lists;
 generic
-   type Aux_Data (<>) is private;
-   with function Element_Image (Item : in Element_Type; Aux : in Aux_Data) 
return String;
-function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux (Item : in Vector; 
Aux : in Aux_Data) return String;
+   type Element_Type is private;
+   with function "=" (Left, Right : Element_Type) return Boolean is <>;
+   with package Lists is new Ada.Containers.Doubly_Linked_Lists (Element_Type, 
"=");
+   with function Element_Image (Item : in Element_Type) return String;
+function SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image
+  (Item   : in Lists.List;
+   Strict : in Boolean := False)
+  return String;
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads 
b/packages/wisi/sal-ada_containers.ads
similarity index 64%
copy from packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
copy to packages/wisi/sal-ada_containers.ads
index 0be7c41..4afad1e 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
+++ b/packages/wisi/sal-ada_containers.ads
@@ -1,23 +1,21 @@
---  Abstract :
---
---  Image with auxiliary data for instantiations of parent.
---
---  Copyright (C) 2018 Stephen Leake All Rights Reserved.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-generic
-   type Aux_Data (<>) is private;
-   with function Element_Image (Item : in Element_Type; Aux : in Aux_Data) 
return String;
-function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux (Item : in Vector; 
Aux : in Aux_Data) return String;
+--  Abstract :
+--
+--  Root of extensions to Ada.Containers.
+--
+--  Copyright (C) 2019 Free Software Foundation All Rights Reserved.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+package SAL.Ada_Containers is
+
+end SAL.Ada_Containers;
diff --git a/packages/wisi/sal-gen_bounded_definite_queues.adb 
b/packages/wisi/sal-gen_bounded_definite_queues.adb
new file mode 100644
index 0000000..61e5c12
--- /dev/null
+++ b/packages/wisi/sal-gen_bounded_definite_queues.adb
@@ -0,0 +1,154 @@
+--  Abstract:
+--
+--  See spec.
+--
+--  Copyright (C) 2004, 2008, 2009, 2011, 2017, 2019 Free Software Foundation 
All Rights Reserved.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+package body SAL.Gen_Bounded_Definite_Queues is
+
+   --  Local subprograms
+
+   function Wrap (Queue : in Queue_Type; I : in Integer) return Integer
+   is begin
+      if I > Queue.Size then
+         return I - Queue.Size;
+      elsif I < 1 then
+         return Queue.Size + I;
+      else
+         return I;
+      end if;
+   end Wrap;
+
+   ----------
+   --  Public subprograms
+
+   function Get_Overflow_Handling (Queue : in Queue_Type) return 
Overflow_Action_Type
+   is begin
+      return Queue.Overflow_Handling;
+   end Get_Overflow_Handling;
+
+   procedure Set_Overflow_Handling (Queue : in out Queue_Type; Handling : in 
Overflow_Action_Type)
+   is begin
+      Queue.Overflow_Handling := Handling;
+   end Set_Overflow_Handling;
+
+   procedure Clear (Queue : in out Queue_Type) is
+   begin
+      Queue.Count := 0;
+   end Clear;
+
+   function Count (Queue : in Queue_Type) return Natural is
+   begin
+      return Queue.Count;
+   end Count;
+
+   function Is_Empty (Queue : in Queue_Type) return Boolean is
+   begin
+      return Queue.Count = 0;
+   end Is_Empty;
+
+   function Is_Full (Queue : in Queue_Type) return Boolean is
+   begin
+      return Queue.Count = Queue.Size;
+   end Is_Full;
+
+   function Remove (Queue : in out Queue_Type) return Item_Type
+   is begin
+      if Queue.Count = 0 then
+         raise Container_Empty;
+      end if;
+
+      return Item : constant Item_Type := Queue.Data (Queue.Head)
+      do
+         Queue.Count := Queue.Count - 1;
+
+         if Queue.Count > 0 then
+            Queue.Head := Wrap (Queue, Queue.Head + 1);
+         end if;
+      end return;
+   end Remove;
+
+   procedure Drop (Queue : in out Queue_Type)
+   is begin
+      if Queue.Count = 0 then
+         raise Container_Empty;
+      end if;
+
+      Queue.Count := Queue.Count - 1;
+
+      if Queue.Count > 0 then
+         Queue.Head := Wrap (Queue, Queue.Head + 1);
+      end if;
+   end Drop;
+
+   function Peek (Queue : in Queue_Type; N : Integer := 0) return Item_Type
+   is begin
+      if Queue.Count = 0 then
+         raise Container_Empty;
+      end if;
+
+      return Queue.Data (Wrap (Queue, Queue.Head + N));
+   end Peek;
+
+   procedure Add (Queue : in out Queue_Type; Item : in Item_Type) is
+   begin
+      if Queue.Count = Queue.Size then
+         case Queue.Overflow_Handling is
+         when Error =>
+            raise Container_Full;
+         when Overwrite =>
+            Queue.Count := Queue.Count - 1;
+            Queue.Head  := Wrap (Queue, Queue.Head + 1);
+         end case;
+      end if;
+
+      if Queue.Count = 0 then
+         Queue.Tail     := 1;
+         Queue.Head     := 1;
+         Queue.Count    := 1;
+         Queue.Data (1) := Item;
+      else
+         Queue.Tail              := Wrap (Queue, Queue.Tail + 1);
+         Queue.Data (Queue.Tail) := Item;
+         Queue.Count             := Queue.Count + 1;
+      end if;
+   end Add;
+
+   procedure Add_To_Head (Queue : in out Queue_Type; Item : in Item_Type) is
+   begin
+      if Queue.Count = Queue.Size then
+         case Queue.Overflow_Handling is
+         when Error =>
+            raise Container_Full;
+         when Overwrite =>
+            Queue.Count := Queue.Count - 1;
+            Queue.Tail  := Wrap (Queue, Queue.Tail + 1);
+         end case;
+      end if;
+
+      if Queue.Count = 0 then
+         Queue.Tail     := 1;
+         Queue.Head     := 1;
+         Queue.Count    := 1;
+         Queue.Data (1) := Item;
+      else
+         Queue.Head              := Wrap (Queue, Queue.Head - 1);
+         Queue.Data (Queue.Head) := Item;
+         Queue.Count             := Queue.Count + 1;
+      end if;
+   end Add_To_Head;
+
+end SAL.Gen_Bounded_Definite_Queues;
diff --git a/packages/wisi/sal-gen_bounded_definite_queues.ads 
b/packages/wisi/sal-gen_bounded_definite_queues.ads
new file mode 100644
index 0000000..0b286f8
--- /dev/null
+++ b/packages/wisi/sal-gen_bounded_definite_queues.ads
@@ -0,0 +1,99 @@
+--  Abstract:
+--
+--  A generic queue, allowing definite non-limited item types.
+--
+--  Copyright (C) 2004, 2008, 2009, 2011, 2017, 2019 Free Software Foundation 
All Rights Reserved.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+generic
+   type Item_Type is private;
+package SAL.Gen_Bounded_Definite_Queues is
+   pragma Pure;
+
+   type Queue_Type (Size : Positive) is tagged private;
+   --  Size is maximum number of items in the queue.
+   --  Tagged to allow Object.Method syntax.
+
+   function Get_Overflow_Handling (Queue : in Queue_Type) return 
Overflow_Action_Type;
+   procedure Set_Overflow_Handling (Queue : in out Queue_Type; Handling : in 
Overflow_Action_Type);
+   --  See Add for meaning of Overflow_Handling. Default is Error.
+
+   procedure Clear (Queue : in out Queue_Type);
+   --  Empty Queue of all items.
+
+   function Count (Queue : in Queue_Type) return Natural;
+   --  Returns count of items in the Queue
+
+   function Is_Empty (Queue : in Queue_Type) return Boolean;
+   --  Returns true if no items are in Queue.
+
+   function Is_Full (Queue : in Queue_Type) return Boolean;
+   --  Returns true if Queue is full.
+
+   function Remove (Queue : in out Queue_Type) return Item_Type;
+   --  Remove head item from Queue, return it.
+   --
+   --  Raises Container_Empty if Is_Empty.
+
+   function Get (Queue : in out Queue_Type) return Item_Type renames Remove;
+
+   procedure Drop (Queue : in out Queue_Type);
+   --  Remove head item from Queue, discard it.
+   --
+   --  Raises Container_Empty if Is_Empty.
+
+   function Peek (Queue : in Queue_Type; N : Integer := 0) return Item_Type;
+   --  Return a copy of a queue item, without removing it. N = 0 is
+   --  the queue head.
+
+   procedure Add (Queue : in out Queue_Type; Item : in Item_Type);
+   --  Add Item to the tail of Queue.
+   --
+   --  If Queue is full, result depends on Queue.Overflow_Handling:
+   --
+   --  when Overwrite, an implicit Remove is done (and the data
+   --  discarded), then Add is done.
+   --
+   --  when Error, raises Container_Full.
+
+   procedure Put (Queue : in out Queue_Type; Item : in Item_Type) renames Add;
+
+   procedure Add_To_Head (Queue : in out Queue_Type; Item : in Item_Type);
+   --  Add Item to the head of Queue.
+   --
+   --  If Queue is full, result depends on Queue.Overflow_Handling:
+   --
+   --  when Overwrite, an implicit Remove is done (and the data
+   --  discarded), then Add is done.
+   --
+   --  when Error, raises Container_Full.
+
+private
+
+   type Item_Array_Type is array (Positive range <>) of Item_Type;
+
+   type Queue_Type (Size : Positive) is tagged record
+      Overflow_Handling : Overflow_Action_Type := Error;
+
+      Head  : Natural := 0;
+      Tail  : Natural := 0;
+      Count : Natural := 0;
+      Data  : Item_Array_Type (1 .. Size);
+      --  Add at Tail + 1, remove at Head. Count is current count;
+      --  easier to keep track of that than to compute Is_Empty for
+      --  each Add and Remove.
+   end record;
+
+end SAL.Gen_Bounded_Definite_Queues;
diff --git a/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.adb 
b/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.adb
index 5a8c550..b77f06c 100644
--- a/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.adb
+++ b/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.adb
@@ -2,7 +2,7 @@
 --
 --  See spec.
 --
---  Copyright (C) 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -39,8 +39,9 @@ package body SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted is
    end Insert;
 
    procedure Insert
-     (Container : in out Vector;
-      New_Item  : in     Element_Type)
+     (Container       : in out Vector;
+      New_Item        : in     Element_Type;
+      Ignore_If_Equal : in     Boolean := False)
    is
       K : constant Base_Peek_Type := To_Peek_Index (Container.Last);
       J : Base_Peek_Type := K;
@@ -62,8 +63,12 @@ package body SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted is
          when Less =>
             J := J - 1;
          when Equal =>
-            --  Insert after J
-            exit;
+            if Ignore_If_Equal then
+               return;
+            else
+               --  Insert after J
+               exit;
+            end if;
          when Greater =>
             --  Insert after J
             exit;
diff --git a/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.ads 
b/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.ads
index 917a344..e6e101f 100644
--- a/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.ads
+++ b/packages/wisi/sal-gen_bounded_definite_vectors-gen_sorted.ads
@@ -2,7 +2,7 @@
 --
 --  Add sorted behavior to parent.
 --
---  Copyright (C) 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -41,10 +41,12 @@ package SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted is
 
    not overriding
    procedure Insert
-     (Container : in out Vector;
-      New_Item  : in     Element_Type);
+     (Container       : in out Vector;
+      New_Item        : in     Element_Type;
+      Ignore_If_Equal : in     Boolean := False);
    --  Insert New_Item in sorted position. Items are sorted in increasing
    --  order according to Element_Compare. New_Item is inserted after
-   --  Equal items.
+   --  Equal items, unless Ignore_If_Equal is true, in which case
+   --  New_Item is not inserted.
 
 end SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted;
diff --git a/packages/wisi/sal-gen_graphs.adb b/packages/wisi/sal-gen_graphs.adb
new file mode 100644
index 0000000..284b26c
--- /dev/null
+++ b/packages/wisi/sal-gen_graphs.adb
@@ -0,0 +1,718 @@
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2017, 2019 Free Software Foundation All Rights Reserved.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Strings.Unbounded;
+with Ada.Text_IO;
+with SAL.Gen_Bounded_Definite_Queues;
+with SAL.Gen_Unbounded_Definite_Stacks;
+package body SAL.Gen_Graphs is
+
+   package Vertex_Queues is new SAL.Gen_Bounded_Definite_Queues (Vertex_Index);
+   package Vertex_Stacks is new SAL.Gen_Unbounded_Definite_Stacks 
(Vertex_Index);
+
+   function Find (Data : in Edge_Data; List : in Edge_Node_Lists.List) return 
Edge_Node_Lists.Cursor
+   is begin
+      for I in List.Iterate loop
+         if Edge_Node_Lists.Element (I).Data = Data then
+            return I;
+         end if;
+      end loop;
+      return Edge_Node_Lists.No_Element;
+   end Find;
+
+   ----------
+   --  Visible subprograms
+
+   procedure Add_Edge
+     (Graph    : in out Gen_Graphs.Graph;
+      Vertex_A : in     Vertex_Index;
+      Vertex_B : in     Vertex_Index;
+      Data     : in     Edge_Data)
+   is
+      Multigraph : Boolean := False;
+
+      procedure Update_First_Last (Vertex : in Vertex_Index)
+      is
+         use all type Ada.Containers.Count_Type;
+      begin
+         if Graph.Vertices.Length = 0 then
+            Graph.Vertices.Set_First_Last (Vertex, Vertex);
+         else
+            if Vertex < Graph.Vertices.First_Index then
+               Graph.Vertices.Set_First (Vertex);
+            end if;
+            if Vertex > Graph.Vertices.Last_Index then
+               Graph.Vertices.Set_Last (Vertex);
+            end if;
+         end if;
+      end Update_First_Last;
+
+   begin
+      Update_First_Last (Vertex_A);
+      Update_First_Last (Vertex_B);
+
+      Graph.Last_Edge_ID := Graph.Last_Edge_ID + 1;
+      if (for some E of Graph.Vertices (Vertex_A) => E.Vertex_B = Vertex_B) 
then
+         Multigraph       := True;
+         Graph.Multigraph := True;
+      end if;
+
+      Graph.Vertices (Vertex_A).Append ((Graph.Last_Edge_ID, Vertex_B, 
Multigraph, Data));
+   end Add_Edge;
+
+   function Count_Nodes (Graph : in Gen_Graphs.Graph) return 
Ada.Containers.Count_Type
+   is begin
+      return Graph.Vertices.Length;
+   end Count_Nodes;
+
+   function Count_Edges (Graph : in Gen_Graphs.Graph) return 
Ada.Containers.Count_Type
+   is
+      use Ada.Containers;
+      Result : Count_Type := 0;
+   begin
+      for Edges of Graph.Vertices loop
+         Result := Result + Edges.Length;
+      end loop;
+      return Result;
+   end Count_Edges;
+
+   function Multigraph (Graph : in Gen_Graphs.Graph) return Boolean
+   is begin
+      return Graph.Multigraph;
+   end Multigraph;
+
+   function "+" (Right : in Edge_Item) return Edge_Lists.List
+   is
+      use Edge_Lists;
+   begin
+      return Result : List do
+         Append (Result, Right);
+      end return;
+   end "+";
+
+   function Edges (Graph : in Gen_Graphs.Graph; Vertex : in Vertex_Index) 
return Edge_Lists.List
+   is begin
+      return Result : Edge_Lists.List do
+         for E of Graph.Vertices (Vertex) loop
+            Result.Append ((E.ID, E.Data));
+         end loop;
+      end return;
+   end Edges;
+
+   function Image (Item : in Path) return String
+   is
+      use Ada.Strings.Unbounded;
+
+      Result : Unbounded_String := To_Unbounded_String ("(");
+   begin
+      for I in Item'Range loop
+         Result := Result & Trimmed_Image (Item (I).Vertex) & " " &
+           Image ((if I = Item'Last then Item (Item'First).Edges else Item (I 
+ 1).Edges)) & " -> ";
+      end loop;
+      Result := Result & ")";
+      return To_String (Result);
+   end Image;
+
+   function "<" (Left, Right : in Path) return Boolean
+   is begin
+      for I in Left'Range loop
+         if I > Right'Last then
+            return False;
+         elsif Left (I).Vertex < Right (I).Vertex then
+            return True;
+         elsif Left (I).Vertex > Right (I).Vertex then
+            return False;
+         else
+            --  =; check remaining elements
+            null;
+         end if;
+      end loop;
+
+      if Left'Last < Right'Last then
+         return True;
+      else
+         --  All =
+         return False;
+      end if;
+   end "<";
+
+   function Find_Paths
+     (Graph : in out Gen_Graphs.Graph;
+      From  : in     Vertex_Index;
+      To    : in     Edge_Data)
+     return Path_Arrays.Vector
+   is
+      Vertex_Queue  : Vertex_Queues.Queue_Type
+        (Size => Integer (Graph.Vertices.Last_Index - 
Graph.Vertices.First_Index + 1));
+
+      type Colors is (White, Gray, Black);
+
+      type Aux_Node is record
+         Color       : Colors            := Colors'First;
+         D           : Natural           := Natural'Last;
+         Parent      : Vertex_Index'Base := Invalid_Vertex;
+         Parent_Set  : Boolean           := False;
+         Parent_Edge : Edge_Node_Lists.Cursor := Edge_Node_Lists.No_Element;
+      end record;
+
+      package Aux_Arrays is new SAL.Gen_Unbounded_Definite_Vectors 
(Vertex_Index, Aux_Node, (others => <>));
+      Aux : Aux_Arrays.Vector;
+
+      function Build_Path
+        (Tail_Vertex : in Vertex_Index;
+         Tail_Edge   : in Edge_Node_Lists.Cursor)
+        return Path
+      is
+      begin
+         return Result : Path (1 .. Aux (Tail_Vertex).D + 1)
+         do
+            declare
+               use Edge_Node_Lists;
+               V_Index   : Vertex_Index := Tail_Vertex;
+               Last_Edge : Cursor       := Tail_Edge;
+            begin
+               for I in reverse 1 .. Result'Length loop
+                  declare
+                     V : Aux_Node renames Aux (V_Index);
+                  begin
+                     if Last_Edge = No_Element then
+                        Result (I) := (V_Index, Edge_Lists.Empty_List);
+                     else
+                        Result (I) := (V_Index, +(Element (Last_Edge).ID, 
Element (Last_Edge).Data));
+                     end if;
+
+                     if V.Parent_Set then
+                        Last_Edge := V.Parent_Edge;
+                        V_Index   := V.Parent;
+                     end if;
+                  end;
+               end loop;
+            end;
+         end return;
+      end Build_Path;
+
+      Result_List : Path_Arrays.Vector;
+      Result_Edge : Edge_Node_Lists.Cursor;
+   begin
+      --  [1] figure 22.3 breadth-first search; 'From' = s.
+
+      Aux.Set_First_Last (Graph.Vertices.First_Index, 
Graph.Vertices.Last_Index);
+
+      for I in Aux.First_Index .. Aux.Last_Index loop
+         if I = From then
+            Aux (I).Color      := Gray;
+            Aux (I).D          := 0;
+            Aux (I).Parent_Set := False;
+
+         else
+            Aux (I).Color      := White;
+            Aux (I).D          := Natural'Last;
+            Aux (I).Parent_Set := False;
+         end if;
+      end loop;
+
+      Vertex_Queue.Put (From);
+
+      while not Vertex_Queue.Is_Empty loop
+         declare
+            U_Index : constant Vertex_Index := Vertex_Queue.Get;
+            U       : Aux_Node renames Aux (U_Index);
+         begin
+            Edges :
+            for C in Graph.Vertices (U_Index).Iterate loop
+               declare
+                  use all type Edge_Node_Lists.Cursor;
+                  V_Index : constant Vertex_Index := Edge_Node_Lists.Element 
(C).Vertex_B;
+                  V       : Aux_Node renames Aux (V_Index);
+               begin
+                  if V.Color = White then
+                     V.Color       := Gray;
+                     V.D           := U.D + 1;
+                     V.Parent      := U_Index;
+                     V.Parent_Edge := C;
+                     V.Parent_Set  := True;
+
+                     Result_Edge := Find (To, Graph.Vertices (V_Index));
+                     if Result_Edge /= Edge_Node_Lists.No_Element then
+                        Result_List.Append (Build_Path (V_Index, Result_Edge));
+                     end if;
+
+                     Vertex_Queue.Put (V_Index);
+                  end if;
+               end;
+            end loop Edges;
+            U.Color := Black;
+         end;
+      end loop;
+      return Result_List;
+   end Find_Paths;
+
+   function Find_Cycles_Tiernan (Graph : in Gen_Graphs.Graph)
+     return Path_Arrays.Vector
+   is
+      --  Implements [2] "Algorithm EC"
+      --
+      --  vertex 0 = Invalid_Vertex
+      --  vertex 1 = Graph.Vertices.First_Index
+      --  vertex N = Graph.Vertices.Last_Index
+
+      First : Vertex_Index renames Graph.Vertices.First_Index;
+      Last  : Vertex_Index renames Graph.Vertices.Last_Index;
+
+      G : Vertex_Arrays.Vector renames Graph.Vertices;
+      P : Path (1 .. Integer (Last - First + 1));
+      K : Positive := 1; -- ie P_Last
+
+      type H_Row is array (G.First_Index .. G.Last_Index) of Vertex_Index'Base;
+      H : array (G.First_Index .. G.Last_Index) of H_Row := (others => (others 
=> Invalid_Vertex));
+
+      Next_Vertex_Found : Boolean;
+
+      Result : Path_Arrays.Vector;
+
+      function Contains (P : in Path; V : in Vertex_Index) return Boolean
+      is (for some N of P => N.Vertex = V);
+
+      function Contains (Row : in H_Row; V : in Vertex_Index) return Boolean
+      is (for some N of Row => N = V);
+
+      function Contains (Edges : in Edge_Lists.List; ID : in Edge_ID) return 
Boolean
+        is (for some E of Edges => E.ID = ID);
+
+      procedure Add_Alternate_Edges (P : in out Path)
+      is
+         function Dec (I : in Positive) return Positive
+           is (if I = P'First then P'Last else I - 1);
+      begin
+         for I in P'Range loop
+            for New_Edge of G (P (Dec (I)).Vertex) loop
+               if New_Edge.Vertex_B = P (I).Vertex and (not Contains (P 
(I).Edges, New_Edge.ID)) then
+                  P (I).Edges.Append ((New_Edge.ID, New_Edge.Data));
+               end if;
+            end loop;
+         end loop;
+      end Add_Alternate_Edges;
+
+   begin
+      P (1) := (First, Edge_Lists.Empty_List);
+
+      All_Initial_Vertices :
+      loop
+         Explore_Vertex :
+         loop
+            Path_Extension :
+            loop  -- EC2 Path Extension
+               Next_Vertex_Found := False;
+
+               Find_Next_Vertex :
+               for Edge of G (P (K).Vertex) loop
+                  declare
+                     Next_Vertex : constant Vertex_Index := Edge.Vertex_B; -- 
ie G[P[k],j]
+                  begin
+                     if Next_Vertex > P (1).Vertex and -- (1)
+                       (not Contains (P, Next_Vertex)) and -- (2)
+                       (not Contains (H (P (K).Vertex), Next_Vertex))
+                     then
+                        K     := K + 1;
+                        P (K) := (Next_Vertex, +(Edge.ID, Edge.Data));
+
+                        Next_Vertex_Found := True;
+                        exit Find_Next_Vertex;
+                     end if;
+                  end;
+               end loop Find_Next_Vertex;
+
+               exit Path_Extension when not Next_Vertex_Found;
+            end loop Path_Extension;
+
+            --  EC3 Circuit Confirmation
+            for Edge of G (P (K).Vertex) loop
+               if Edge.Vertex_B = P (1).Vertex then
+                  P (1).Edges := +(Edge.ID, Edge.Data);
+                  if Graph.Multigraph then
+                     Add_Alternate_Edges (P (1 .. K));
+                  end if;
+                  Result.Append (P (1 .. K));
+                  exit;
+               end if;
+            end loop;
+
+            --  EC4 Vertex Closure
+            exit Explore_Vertex when K = 1;
+
+            H (P (K).Vertex) := (others => Invalid_Vertex);
+            for M in H (P (K - 1).Vertex)'Range loop
+               if H (P (K - 1).Vertex)(M) = Invalid_Vertex then
+                  H (P (K - 1).Vertex)(M) := P (K).Vertex;
+                  P (K) := (Invalid_Vertex, Edge_Lists.Empty_List);
+                  exit;
+               end if;
+            end loop;
+            K := K - 1;
+         end loop Explore_Vertex;
+
+         --  EC5 Advance Initial Index
+         exit All_Initial_Vertices when P (1).Vertex = 
Graph.Vertices.Last_Index;
+
+         P (1) := (P (1).Vertex + 1, Edge_Lists.Empty_List);
+         pragma Assert (K = 1);
+         H := (others => (others => Invalid_Vertex));
+      end loop All_Initial_Vertices;
+
+      --  EC6 Terminate
+      return Result;
+   end Find_Cycles_Tiernan;
+
+   function Find_Cycles (Graph : in Gen_Graphs.Graph) return Path_Arrays.Vector
+   is
+      --  Implements Circuit-Finding Algorithm from [3]
+
+      use all type Ada.Containers.Count_Type;
+
+      pragma Warnings (Off, """Edited_Graph"" is not modified, could be 
declared constant");
+      Edited_Graph : Gen_Graphs.Graph := Graph;
+
+      Result : Path_Arrays.Vector;
+
+      A_K     : Adjacency_Structures.Vector;
+      B       : Adjacency_Structures.Vector;
+      Blocked : array (Graph.Vertices.First_Index .. 
Graph.Vertices.Last_Index) of Boolean := (others => False);
+
+      Stack : Vertex_Stacks.Stack;
+      S     : Vertex_Index := Graph.Vertices.First_Index;
+
+      Dummy : Boolean;
+      pragma Unreferenced (Dummy);
+
+      function Circuit (V : in Vertex_Index) return Boolean
+      is
+         F : Boolean := False;
+
+         procedure Unblock (U : in Vertex_Index)
+         is begin
+            Blocked (U) := False;
+            declare
+               use Vertex_Lists;
+               Cur  : Cursor := B (U).First;
+               Temp : Cursor;
+               W    : Vertex_Index;
+            begin
+               loop
+                  exit when not Has_Element (Cur);
+                  W := Element (Cur);
+                  Temp := Cur;
+                  Next (Cur);
+                  B (U).Delete (Temp);
+                  if Blocked (W) then
+                     Unblock (W);
+                  end if;
+               end loop;
+            end;
+         end Unblock;
+
+         procedure Add_Result
+         is
+            Cycle : Path (1 .. Integer (Stack.Depth));
+         begin
+            for I in 1 .. Stack.Depth loop
+               Cycle (Integer (Stack.Depth - I + 1)) := (Stack.Peek (I), 
Edge_Lists.Empty_List);
+               --  We add the edge info later, after finding all the cycles.
+            end loop;
+            Result.Append (Cycle);
+            if Trace > 0 then
+               Ada.Text_IO.Put_Line ("cycle " & Image (Cycle));
+            end if;
+         end Add_Result;
+
+      begin
+         if Trace > 0 then
+            Ada.Text_IO.Put_Line ("circuit start" & V'Image);
+         end if;
+
+         Stack.Push (V);
+         Blocked (V) := True;
+         if V in A_K.First_Index .. A_K.Last_Index then
+            for W of A_K (V) loop
+               if W = S then
+                  Add_Result;
+                  F := True;
+               elsif not Blocked (W) then
+                  if Circuit (W) then
+                     F := True;
+                  end if;
+               end if;
+            end loop;
+         end if;
+         if F then
+            Unblock (V);
+         else
+            if V in A_K.First_Index .. A_K.Last_Index then
+               for W of A_K (V) loop
+                  if (for all V1 of B (W) => V /= V1) then
+                     B (W).Append (V);
+                  end if;
+               end loop;
+            end if;
+         end if;
+         Stack.Pop;
+         if Trace > 0 then
+            Ada.Text_IO.Put_Line ("circuit finish" & V'Image);
+         end if;
+         return F;
+      end Circuit;
+
+   begin
+      --  [3] restricts the graph to not have loops (edge v-v) or multiple
+      --  edges between two nodes. So we first delete any such edges.
+      Delete_Loops_Multigraph :
+      for V in Edited_Graph.Vertices.First_Index .. 
Edited_Graph.Vertices.Last_Index loop
+         declare
+            use Edge_Node_Lists;
+            Cur        : Cursor  := Edited_Graph.Vertices (V).First;
+            Temp       : Cursor;
+            Found_Loop : Boolean := False;
+         begin
+            loop
+               exit when not Has_Element (Cur);
+               if Element (Cur).Vertex_B = V then
+                  if not Found_Loop then
+                     --  This is a cycle we want in the result. Edge data is 
added to all
+                     --  cycles later.
+                     Result.Append (Path'(1 => (V, Edge_Lists.Empty_List)));
+                     Found_Loop := True;
+                  end if;
+                  Temp := Cur;
+                  Next (Cur);
+                  Edited_Graph.Vertices (V).Delete (Temp);
+               elsif Element (Cur).Multigraph then
+                  --  These will be added back from Graph after we find all 
cycles.
+                  Temp := Cur;
+                  Next (Cur);
+                  Edited_Graph.Vertices (V).Delete (Temp);
+               else
+                  Next (Cur);
+               end if;
+            end loop;
+         end;
+      end loop Delete_Loops_Multigraph;
+
+      B.Set_First_Last (Graph.Vertices.First_Index, Graph.Vertices.Last_Index);
+
+      --  Start of body of Circuit-Finding Algorithm from [3]
+      loop
+         exit when S = Graph.Vertices.Last_Index;
+         declare
+            use Component_Lists;
+            Subgraph         : Adjacency_Structures.Vector;
+            Components       : Component_Lists.List;
+            Cur              : Component_Lists.Cursor;
+            Least_Vertex_Cur : Component_Lists.Cursor;
+            Least_Vertex_V   : Vertex_Index := Vertex_Index'Last;
+
+            function Delete_Edges (Edges : in Edge_Node_Lists.List) return 
Vertex_Lists.List
+            is begin
+               return Result : Vertex_Lists.List do
+                  for Edge of Edges loop
+                     if Edge.Vertex_B >= S then
+                        Result.Append (Edge.Vertex_B);
+                     end if;
+                  end loop;
+               end return;
+            end Delete_Edges;
+         begin
+            Subgraph.Set_First_Last (S, Edited_Graph.Vertices.Last_Index);
+            for V in S .. Edited_Graph.Vertices.Last_Index loop
+               Subgraph (V) := Delete_Edges (Edited_Graph.Vertices (V));
+            end loop;
+
+            Components := Strongly_Connected_Components (Subgraph, 
Non_Trivial_Only => True);
+            Cur        := Components.First;
+            loop
+               exit when not Has_Element (Cur);
+
+               if Element (Cur).Length > 1 then
+                  declare
+                     Comp : Vertex_Lists.List renames 
Components.Constant_Reference (Cur);
+                  begin
+                     for W of Comp loop
+                        if W < Least_Vertex_V then
+                           Least_Vertex_Cur := Cur;
+                           Least_Vertex_V   := W;
+                        end if;
+                     end loop;
+                  end;
+               end if;
+               Next (Cur);
+            end loop;
+
+            A_K.Clear;
+            if Has_Element (Least_Vertex_Cur) then
+               declare
+                  Component : Vertex_Lists.List renames Components 
(Least_Vertex_Cur);
+                  Min : Vertex_Index := Vertex_Index'Last;
+                  Max : Vertex_Index := Vertex_Index'First;
+               begin
+                  if Trace > 0 then
+                     Ada.Text_IO.Put_Line ("strong component " & 
Least_Vertex_V'Image);
+                     Ada.Text_IO.Put_Line (Image (Component));
+                  end if;
+                  for V of Component loop
+                     if Min > V then
+                        Min := V;
+                     end if;
+                     if Max < V then
+                        Max := V;
+                     end if;
+                  end loop;
+                  A_K.Set_First_Last (Min, Max);
+                  for V of Component loop
+                     for Edge of Edited_Graph.Vertices (V) loop
+                        A_K (V).Append (Edge.Vertex_B);
+                     end loop;
+                  end loop;
+               end;
+            end if;
+         end;
+
+         if A_K.Length > 0 then
+            S := A_K.First_Index;
+            for I in A_K.First_Index .. A_K.Last_Index loop
+               Blocked (I) := False;
+               B (I).Clear;
+            end loop;
+            Dummy := Circuit (S);
+            S := S + 1;
+         else
+            S := Graph.Vertices.Last_Index;
+         end if;
+      end loop;
+
+      --  Add edge data.
+      for Cycle of Result loop
+         for I in Cycle'First .. Cycle'Last loop
+            declare
+               Prev_I : constant Positive := (if I = Cycle'First then 
Cycle'Last else I - 1);
+            begin
+               for Edge of Graph.Vertices (Cycle (Prev_I).Vertex) loop
+                  if Cycle (I).Vertex = Edge.Vertex_B then
+                     Cycle (I).Edges.Append ((Edge.ID, Edge.Data));
+                  end if;
+               end loop;
+            end;
+         end loop;
+      end loop;
+      return Result;
+   end Find_Cycles;
+
+   function Loops (Graph : in Gen_Graphs.Graph) return Vertex_Lists.List
+   is begin
+      return Result : Vertex_Lists.List do
+         for V in Graph.Vertices.First_Index .. Graph.Vertices.Last_Index loop
+            for Edge of Graph.Vertices (V) loop
+               if V = Edge.Vertex_B then
+                  Result.Append (V);
+                  exit;
+               end if;
+            end loop;
+         end loop;
+      end return;
+   end Loops;
+
+   function To_Adjancency (Graph : in Gen_Graphs.Graph) return 
Adjacency_Structures.Vector
+   is
+      function To_Vertex_List (Edges : in Edge_Node_Lists.List) return 
Vertex_Lists.List
+      is begin
+         return Result : Vertex_Lists.List do
+            for Edge of Edges loop
+               Result.Append (Edge.Vertex_B);
+            end loop;
+         end return;
+      end To_Vertex_List;
+   begin
+      return Result : Adjacency_Structures.Vector do
+         Result.Set_First_Last (Graph.Vertices.First_Index, 
Graph.Vertices.Last_Index);
+         for V in Graph.Vertices.First_Index .. Graph.Vertices.Last_Index loop
+            Result (V) := To_Vertex_List (Graph.Vertices (V));
+         end loop;
+      end return;
+   end To_Adjancency;
+
+   function Strongly_Connected_Components
+     (Graph            : in Adjacency_Structures.Vector;
+      Non_Trivial_Only : in Boolean := False)
+     return Component_Lists.List
+   is
+      --  Implements [4] section 4.
+
+      Low_Link : array (Graph.First_Index .. Graph.Last_Index) of 
Vertex_Index'Base := (others => Invalid_Vertex);
+
+      Number : array (Graph.First_Index .. Graph.Last_Index) of 
Vertex_Index'Base := (others => Invalid_Vertex);
+      --  Number is the order visited in the depth-first search.
+
+      Points : Vertex_Stacks.Stack;
+
+      I : Vertex_Index'Base := Graph.First_Index - 1;
+
+      Result : Component_Lists.List;
+
+      procedure Strong_Connect (V : in Vertex_Index)
+      is begin
+         I            := I + 1;
+         Number (V)   := I;
+         Low_Link (V) := I;
+         Points.Push (V);
+
+         for W of Graph (V) loop
+            if Number (W) = Invalid_Vertex then
+               --  (v, w) is a tree arc
+               Strong_Connect (W);
+               Low_Link (V) := Vertex_Index'Min (Low_Link (V), Low_Link (W));
+
+            elsif Number (W) < Number (V) then
+               --  (v, w) is a frond or cross-link
+               if (for some P of Points => P = W) then
+                  Low_Link (V) := Vertex_Index'Min (Low_Link (V), Low_Link 
(W));
+               end if;
+            end if;
+         end loop;
+         if Low_Link (V) = Number (V) then
+            --  v is the root of a component
+            declare
+               use all type Ada.Containers.Count_Type;
+               Component : Vertex_Lists.List;
+            begin
+               while (not Points.Is_Empty) and then Number (Points.Peek) >= 
Number (V) loop
+                  Component.Append (Points.Pop);
+               end loop;
+               if (not Non_Trivial_Only) or Component.Length > 1 then
+                  Result.Append (Component);
+               end if;
+            end;
+         end if;
+      end Strong_Connect;
+   begin
+      for W in Graph.First_Index .. Graph.Last_Index loop
+         if Number (W) = Invalid_Vertex then
+            Strong_Connect (W);
+         end if;
+      end loop;
+      return Result;
+   end Strongly_Connected_Components;
+
+end SAL.Gen_Graphs;
diff --git a/packages/wisi/sal-gen_graphs.ads b/packages/wisi/sal-gen_graphs.ads
new file mode 100644
index 0000000..9a66f5c
--- /dev/null
+++ b/packages/wisi/sal-gen_graphs.ads
@@ -0,0 +1,190 @@
+--  Abstract :
+--
+--  Type and operations for graphs.
+--
+--  References:
+--
+--  [1] Introduction to Algorithms, Thomas H. Cormen, Charles E.
+--  Leiserson, Ronald L. Rivest, Clifford Stein.
+--
+--  [2] "An Efficient Search Algorithm to Find the Elementary Circuits
+--  of a Graph", James C. Tiernan, Communications of the ACM Volume 13
+--  Number 12 December 1970.
+--  
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.516.9454&rep=rep1&type=pdf
+--
+--  [3] "Finding all the Elementary Circuits of a Directed Graph",
+--  Donald B. Johnson, SIAM J. Comput. Vol 4, No. 1, March 1975.
+--  https://epubs.siam.org/doi/abs/10.1137/0204007
+--
+--  [4] "Depth-First Search and Linear Graph Algorithms", Robert
+--  Tarjan, SIAM J. Comput. Vol. 1, No 2, June 1972.
+--  https://epubs.siam.org/doi/abs/10.1137/0201010
+--
+--  Copyright (C) 2017, 2019 Free Software Foundation All Rights Reserved.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers.Doubly_Linked_Lists;
+with Ada.Containers.Indefinite_Vectors;
+with SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image;
+with SAL.Gen_Trimmed_Image;
+with SAL.Gen_Unbounded_Definite_Vectors;
+generic
+   type Edge_Data is private;
+   Default_Edge_Data : in Edge_Data;
+   type Vertex_Index is range <>;
+   Invalid_Vertex : in Vertex_Index'Base;
+
+   type Path_Index is range <>;
+
+   with function Edge_Image (Item : in Edge_Data) return String;
+
+package SAL.Gen_Graphs is
+
+   type Graph is tagged private;
+
+   procedure Add_Edge
+     (Graph    : in out Gen_Graphs.Graph;
+      Vertex_A : in     Vertex_Index;
+      Vertex_B : in     Vertex_Index;
+      Data     : in     Edge_Data);
+   --  Adds a directed edge from Vertex_A to Vertex_B.
+
+   function Count_Nodes (Graph : in Gen_Graphs.Graph) return 
Ada.Containers.Count_Type;
+   function Count_Edges (Graph : in Gen_Graphs.Graph) return 
Ada.Containers.Count_Type;
+
+   function Multigraph (Graph : in Gen_Graphs.Graph) return Boolean;
+   --  If more than one edge is added between two vertices, the graph is
+   --  a multigraph. The edges are given separate identifiers internally.
+
+   Multigraph_Error : exception;
+
+   type Base_Edge_ID is range 0 .. Integer'Last;
+   subtype Edge_ID is Base_Edge_ID range 1 .. Base_Edge_ID'Last;
+   Invalid_Edge_ID : constant Base_Edge_ID := 0;
+   --  Edge ids are unique graph-wide, assigned by Add_Edge.
+
+   type Edge_Item is record
+      ID   : Base_Edge_ID := Invalid_Edge_ID;
+      Data : Edge_Data    := Default_Edge_Data;
+   end record;
+   function Image (Item : in Edge_Item) return String
+     is (Edge_Image (Item.Data));
+
+   package Edge_Lists is new Ada.Containers.Doubly_Linked_Lists (Edge_Item);
+
+   function "+" (Right : in Edge_Item) return Edge_Lists.List;
+
+   function Edges (Graph : in Gen_Graphs.Graph; Vertex : in Vertex_Index) 
return Edge_Lists.List;
+   --  All edges from Vertex, as set by Add_Edge.
+
+   function Image is new SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image
+     (Element_Type  => Edge_Item,
+      Lists         => Edge_Lists,
+      Element_Image => Image);
+
+   type Path_Item is record
+      Vertex : Vertex_Index'Base := Invalid_Vertex;
+      Edges  : Edge_Lists.List;
+      --  Edges describe the edges leading from the previous vertex
+      --  in the path to Vertex. If this is the first vertex in an open
+      --  path, Edges is empty. If it is the first vertex in a
+      --  cycle, the edge are from the last vertex in the cycle.
+   end record;
+
+   type Path is array (Positive range <>) of Path_Item;
+
+   function Image (Item : in Path) return String;
+   --  For trace, debugging.
+
+   package Path_Arrays is new Ada.Containers.Indefinite_Vectors (Path_Index, 
Path);
+
+   function "<" (Left, Right : in Path) return Boolean;
+
+   package Sort_Paths is new Path_Arrays.Generic_Sorting;
+
+   function Find_Paths
+     (Graph : in out Gen_Graphs.Graph;
+      From  : in     Vertex_Index;
+      To    : in     Edge_Data)
+     return Path_Arrays.Vector;
+   --  Return all non-cyclic paths starting at From that lead to a To
+   --  edge, using algorithm [1]. First entry in each item in result is
+   --  From, with first edge. Last entry in result contains edge data for
+   --  To.
+   --
+   --  Raises Multigraph_Error if Graph is a multigraph.
+
+   function Find_Cycles_Tiernan (Graph : in Gen_Graphs.Graph) return 
Path_Arrays.Vector;
+   --  Return all cyclic paths in Graph, using algorithm [2] extended for
+   --  multigraphs.
+   --
+   --  Time complexity is exponential in the number of nodes. Used in
+   --  unit tests for Find_Cycles_Johnson, since [2] is easier to
+   --  implement.
+
+   function Find_Cycles (Graph : in Gen_Graphs.Graph) return 
Path_Arrays.Vector;
+   --  Return all cyclic paths in Graph, using algorithm [3] extended for
+   --  multigraphs.
+   --
+   --  Time complexity is linear in the number of nodes and edges.
+
+   package Vertex_Lists is new Ada.Containers.Doubly_Linked_Lists 
(Vertex_Index);
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Vertex_Index);
+   function Image is new SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image
+     (Vertex_Index, "=", Vertex_Lists, Trimmed_Image);
+
+   function Loops (Graph : in Gen_Graphs.Graph) return Vertex_Lists.List;
+   --  List of vertices that have an edge to themselves.
+
+   package Adjacency_Structures is new SAL.Gen_Unbounded_Definite_Vectors
+     (Vertex_Index, Vertex_Lists.List, Vertex_Lists.Empty_List);
+   --  Graphs with no Edge_ID or Edge_Data; useful as intermediate results.
+
+   function To_Adjancency (Graph : in Gen_Graphs.Graph) return 
Adjacency_Structures.Vector;
+
+   package Component_Lists is new Ada.Containers.Doubly_Linked_Lists 
(Vertex_Lists.List, Vertex_Lists."=");
+
+   function Strongly_Connected_Components
+     (Graph            : in Adjacency_Structures.Vector;
+      Non_Trivial_Only : in Boolean := False)
+     return Component_Lists.List;
+   --  Find strongly connected components of Graph, using algorithm in [4].
+   --  If Non_Trivial_Only, don't include single-vertex components.
+
+   Trace : Integer := 0;
+   --  Some bodies output debug info to Text_IO.Current_Output for
+   --  non-zero values of Trace.
+private
+
+   type Edge_Node is record
+      --  Edge is from vertex contaning this Node to Vertex_B
+      ID         : Edge_ID;
+      Vertex_B   : Vertex_Index;
+      Multigraph : Boolean; -- Same Vertex_B as another edge in same vertex.
+      Data       : Edge_Data;
+   end record;
+
+   package Edge_Node_Lists is new Ada.Containers.Doubly_Linked_Lists 
(Edge_Node);
+
+   package Vertex_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Vertex_Index, Edge_Node_Lists.List, Edge_Node_Lists.Empty_List);
+
+   type Graph is tagged record
+      Last_Edge_ID : Base_Edge_ID := Invalid_Edge_ID;
+      Multigraph   : Boolean      := False;
+      Vertices     : Vertex_Arrays.Vector;
+   end record;
+
+end SAL.Gen_Graphs;
diff --git a/packages/wisi/sal-gen_unbounded_definite_stacks.adb 
b/packages/wisi/sal-gen_unbounded_definite_stacks.adb
index 6b5337d..0a54eab 100644
--- a/packages/wisi/sal-gen_unbounded_definite_stacks.adb
+++ b/packages/wisi/sal-gen_unbounded_definite_stacks.adb
@@ -2,7 +2,7 @@
 --
 --  see spec
 --
---  Copyright (C) 1998, 2003, 2009, 2015, 2017, 2018 Free Software Foundation, 
Inc.
+--  Copyright (C) 1998, 2003, 2009, 2015, 2017 - 2019 Free Software 
Foundation, Inc.
 --
 --  SAL is free software; you can redistribute it and/or modify it
 --  under terms of the GNU General Public License as published by the
@@ -175,4 +175,36 @@ package body SAL.Gen_Unbounded_Definite_Stacks is
          Dummy => 1);
    end Constant_Ref;
 
+   function Constant_Ref
+     (Container : aliased in Stack'Class;
+      Position  :         in Cursor)
+     return Constant_Ref_Type
+   is begin
+      return
+        (Element => Container.Data (Container.Top - Position.Ptr + 1)'Access,
+         Dummy => 1);
+   end Constant_Ref;
+
+   function Has_Element (Position : in Cursor) return Boolean
+   is begin
+      return Position.Container.Depth >= Position.Ptr;
+   end Has_Element;
+
+   function Iterate (Container : aliased in Stack) return 
Iterator_Interfaces.Forward_Iterator'Class
+   is begin
+      return Iterator'(Container => Container'Unrestricted_Access);
+   end Iterate;
+
+   overriding function First (Object : Iterator) return Cursor
+   is begin
+      return (Object.Container, 1);
+   end First;
+
+   overriding function Next (Object : in Iterator; Position : in Cursor) 
return Cursor
+   is
+      pragma Unreferenced (Object);
+   begin
+      return (Position.Container, Position.Ptr + 1);
+   end Next;
+
 end SAL.Gen_Unbounded_Definite_Stacks;
diff --git a/packages/wisi/sal-gen_unbounded_definite_stacks.ads 
b/packages/wisi/sal-gen_unbounded_definite_stacks.ads
index 954be19..cb54a24 100644
--- a/packages/wisi/sal-gen_unbounded_definite_stacks.ads
+++ b/packages/wisi/sal-gen_unbounded_definite_stacks.ads
@@ -23,6 +23,7 @@
 pragma License (Modified_GPL);
 
 with Ada.Finalization;
+with Ada.Iterator_Interfaces;
 with Ada.Unchecked_Deallocation;
 generic
    type Element_Type is private;
@@ -32,7 +33,9 @@ package SAL.Gen_Unbounded_Definite_Stacks is
 
    type Stack is new Ada.Finalization.Controlled with private
    with
-     Constant_Indexing => Constant_Ref;
+     Constant_Indexing => Constant_Ref,
+     Default_Iterator  => Iterate,
+     Iterator_Element  => Element_Type;
 
    Empty_Stack : constant Stack;
 
@@ -115,6 +118,20 @@ package SAL.Gen_Unbounded_Definite_Stacks is
      return Constant_Ref_Type;
    pragma Inline (Constant_Ref);
 
+   type Cursor is private;
+
+   function Constant_Ref
+     (Container : aliased in Stack'Class;
+      Position  :         in Cursor)
+     return Constant_Ref_Type;
+   pragma Inline (Constant_Ref);
+
+   function Has_Element (Position : in Cursor) return Boolean;
+
+   package Iterator_Interfaces is new Ada.Iterator_Interfaces (Cursor, 
Has_Element);
+
+   function Iterate (Container : aliased in Stack) return 
Iterator_Interfaces.Forward_Iterator'Class;
+
 private
 
    type Element_Array is array (Peek_Type range <>) of aliased Element_Type;
@@ -129,6 +146,24 @@ private
       --  Data (1 .. Last_Index) has been set at some point.
    end record;
 
+   type Stack_Access is access all Stack;
+
    Empty_Stack : constant Stack := (Ada.Finalization.Controlled with 
Invalid_Peek_Index, null);
 
+   type Cursor is record
+      Container : Stack_Access;
+      Ptr       : Peek_Type;
+   end record;
+
+   type Iterator is new Iterator_Interfaces.Forward_Iterator with
+   record
+      Container : Stack_Access;
+   end record;
+
+   overriding function First (Object : Iterator) return Cursor;
+
+   overriding function Next
+     (Object   : Iterator;
+      Position : Cursor) return Cursor;
+
 end SAL.Gen_Unbounded_Definite_Stacks;
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.adb 
b/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.adb
index c498e0e..e0d90a6 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.adb
+++ b/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.adb
@@ -2,7 +2,7 @@
 --
 --  See spec.
 --
---  Copyright (C) 2018 Stephen Leake All Rights Reserved.
+--  Copyright (C) 2018 - 2019 Stephen Leake All Rights Reserved.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -18,7 +18,11 @@
 pragma License (Modified_GPL);
 
 with Ada.Strings.Unbounded;
-function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux (Item : in Vector; 
Aux : in Aux_Data) return String
+function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux
+  (Item        : in Vector;
+   Aux         : in Aux_Data;
+   Association : in Boolean := False)
+  return String
 is
    use Ada.Strings.Unbounded;
    Result : Unbounded_String        := To_Unbounded_String ("(");
@@ -26,6 +30,9 @@ is
    Last   : constant Base_Peek_Type := To_Peek_Type (Item.Last_Index);
 begin
    for I in First .. Last loop
+      if Association then
+         Result := Result & Index_Trimmed_Image (To_Index_Type (I)) & " => ";
+      end if;
       Result := Result & Element_Image (Item.Elements (I), Aux);
       if I /= Last then
          Result := Result & ", ";
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads 
b/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
index 0be7c41..eb8a89a 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
+++ b/packages/wisi/sal-gen_unbounded_definite_vectors-gen_image_aux.ads
@@ -2,7 +2,7 @@
 --
 --  Image with auxiliary data for instantiations of parent.
 --
---  Copyright (C) 2018 Stephen Leake All Rights Reserved.
+--  Copyright (C) 2018 - 2019 Stephen Leake All Rights Reserved.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -19,5 +19,10 @@ pragma License (Modified_GPL);
 
 generic
    type Aux_Data (<>) is private;
+   with function Index_Trimmed_Image (Item : in Index_Type) return String;
    with function Element_Image (Item : in Element_Type; Aux : in Aux_Data) 
return String;
-function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux (Item : in Vector; 
Aux : in Aux_Data) return String;
+function SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux
+  (Item        : in Vector;
+   Aux         : in Aux_Data;
+   Association : in Boolean := False)
+  return String;
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors.adb 
b/packages/wisi/sal-gen_unbounded_definite_vectors.adb
index 49d59a6..b5019bb 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors.adb
+++ b/packages/wisi/sal-gen_unbounded_definite_vectors.adb
@@ -470,6 +470,28 @@ package body SAL.Gen_Unbounded_Definite_Vectors is
       end if;
    end Next;
 
+   function Prev (Position : in Cursor) return Cursor
+   is begin
+      if Position = No_Element then
+         return No_Element;
+      elsif Position.Index > To_Peek_Type (Position.Container.First) then
+         return (Position.Container, Position.Index - 1);
+      else
+         return No_Element;
+      end if;
+   end Prev;
+
+   procedure Prev (Position : in out Cursor)
+   is begin
+      if Position = No_Element then
+         null;
+      elsif Position.Index > To_Peek_Type (Position.Container.First) then
+         Position.Index := Position.Index - 1;
+      else
+         Position := No_Element;
+      end if;
+   end Prev;
+
    function To_Cursor
      (Container : aliased in Vector;
       Index     :         in Extended_Index)
diff --git a/packages/wisi/sal-gen_unbounded_definite_vectors.ads 
b/packages/wisi/sal-gen_unbounded_definite_vectors.ads
index ae472d8..8023794 100644
--- a/packages/wisi/sal-gen_unbounded_definite_vectors.ads
+++ b/packages/wisi/sal-gen_unbounded_definite_vectors.ads
@@ -158,6 +158,8 @@ package SAL.Gen_Unbounded_Definite_Vectors is
    function First (Container : aliased in Vector) return Cursor;
    function Next (Position : in Cursor) return Cursor;
    procedure Next (Position : in out Cursor);
+   function Prev (Position : in Cursor) return Cursor;
+   procedure Prev (Position : in out Cursor);
 
    function To_Cursor
      (Container : aliased in Vector;
@@ -223,5 +225,6 @@ private
    --  Visible for child package
 
    function To_Peek_Type (Item : in Extended_Index) return Base_Peek_Type with 
Inline;
+   function To_Index_Type (Item : in Base_Peek_Type) return Extended_Index;
 
 end SAL.Gen_Unbounded_Definite_Vectors;
diff --git a/packages/wisi/sal-generic_decimal_image.adb 
b/packages/wisi/sal-generic_decimal_image.adb
new file mode 100644
index 0000000..2699277
--- /dev/null
+++ b/packages/wisi/sal-generic_decimal_image.adb
@@ -0,0 +1,48 @@
+--  Abstract:
+--
+--  see spec
+--
+--  Copyright (C) 2005, 2006, 2009 Stephen Leake.  All Rights Reserved.
+--
+--  This library is free software; you can redistribute it and/or
+--  modify it under terms of the GNU General Public License as
+--  published by the Free Software Foundation; either version 3, or (at
+--  your option) any later version. This library is distributed in the
+--  hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+--  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+--  PURPOSE. See the GNU General Public License for more details. You
+--  should have received a copy of the GNU General Public License
+--  distributed with this program; see file COPYING. If not, write to
+--  the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
+--  MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this  unit  does not  by itself cause  the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file  might be covered by the  GNU Public License.
+
+pragma License (Modified_GPL);
+
+function SAL.Generic_Decimal_Image
+  (Item  : in Number_Type;
+   Width : in Natural)
+  return String
+is
+   pragma Warnings (Off);
+   --  Avoid warning about "abs applied to non-negative value has no
+   --  effect" for some instantiations.
+   Temp : Integer := abs Integer (Item);
+   --  IMPROVEME: need test for Decimal_Image, include constrained positive 
number_type
+   pragma Warnings (On);
+   Digit : Integer;
+   Image : String (1 .. Width);
+begin
+   for I in reverse Image'Range loop
+      Digit     := Temp mod 10;
+      Temp      := Temp / 10;
+      Image (I) := Character'Val (Character'Pos ('0') + Digit);
+   end loop;
+   return Image;
+end SAL.Generic_Decimal_Image;
diff --git a/packages/wisi/sal-generic_decimal_image.ads 
b/packages/wisi/sal-generic_decimal_image.ads
new file mode 100644
index 0000000..ec749f6
--- /dev/null
+++ b/packages/wisi/sal-generic_decimal_image.ads
@@ -0,0 +1,37 @@
+--  Abstract:
+--
+--  Generic leading zero unsigned decimal image
+--
+--  Copyright (C) 2004, 2009, 2019 Free Software Foundation.  All Rights 
Reserved.
+--
+--  This library is free software; you can redistribute it and/or
+--  modify it under terms of the GNU General Public License as
+--  published by the Free Software Foundation; either version 3, or (at
+--  your option) any later version. This library is distributed in the
+--  hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+--  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+--  PURPOSE. See the GNU General Public License for more details. You
+--  should have received a copy of the GNU General Public License
+--  distributed with this program; see file COPYING. If not, write to
+--  the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
+--  MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this  unit  does not  by itself cause  the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file  might be covered by the  GNU Public License.
+
+pragma License (Modified_GPL);
+
+generic
+   type Number_Type is range <>;
+function SAL.Generic_Decimal_Image
+  (Item  : in Number_Type;
+   Width : in Natural)
+  return String;
+--  Return a decimal unsigned image of Item, padded with leading zeros
+--  to Width. If Width is too small for Item, leading digits are
+--  silently truncated.
+pragma Pure (SAL.Generic_Decimal_Image);
diff --git a/packages/wisi/sal.adb b/packages/wisi/sal.adb
index 6a2dc71..ac3b037 100644
--- a/packages/wisi/sal.adb
+++ b/packages/wisi/sal.adb
@@ -26,7 +26,7 @@ package body SAL is
 
    function Version return String is
    begin
-      return "SAL 3.1";
+      return "SAL 3.2";
    end Version;
 
 end SAL;
diff --git a/packages/wisi/wisi-elisp-parse.el 
b/packages/wisi/wisi-elisp-parse.el
index e757ac8..2c93a37 100644
--- a/packages/wisi/wisi-elisp-parse.el
+++ b/packages/wisi/wisi-elisp-parse.el
@@ -1,1686 +1,1721 @@
-;; wisi-elisp-parse.el --- Wisi parser  -*- lexical-binding:t -*-
-
-;; Copyright (C) 2013-2015, 2017 - 2019  Free Software Foundation, Inc.
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-
-;; An extended LALR parser, that handles shift/reduce and
-;; reduce/reduce conflicts by spawning parallel parsers to follow each
-;; path.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'wisi-elisp-lexer)
-(require 'wisi-parse-common)
-
-(defvar wisi-elisp-parse-max-parallel-current (cons 0 0)
-  "Cons (count . point); Maximum number of parallel parsers used in most 
recent parse,
-point at which that max was spawned.")
-
-(defvar wisi-debug-identical 0
-  "Debug terminating identical parsers.
-0 - keep lower-numbered parser.
-1 - keep higher-numbered parser.
-2 - error.")
-
-(cl-defstruct (wisi-elisp-parser-state
-           (:copier nil))
-  label ;; integer identifying parser for debug
-
-  active
-  ;; 'shift  - need new token
-  ;; 'reduce - need reduce
-  ;; 'accept - parsing completed
-  ;; 'error  - failed, error not reported yet
-  ;; nil     - terminated
-  ;;
-  ;; 'pending-shift, 'pending-reduce - newly created parser
-
-  stack
-  ;; Each stack item takes two slots: wisi-tok, state
-
-  sp ;; stack pointer
-
-  pending
-  ;; list of (action-symbol stack-fragment)
-  )
-
-(cl-defstruct (wisi-elisp-parser (:include wisi-parser))
-  actions
-  gotos
-  next-token
-  )
-
-;;;###autoload
-(defun wisi-make-elisp-parser (automaton next-token)
-  "Return ‘wisi-parser’ object.
-
-- AUTOMATON is the parse table generated by `wisi-compile-grammar'.
-
-- NEXT-TOKEN is a function with no argument called by the parser to
-  obtain the next token from the current buffer after point, as a
-  ’wisi-tok’ object (normally ‘wisi-forward-token’)."
-  (make-wisi-elisp-parser
-   :actions (aref automaton 0)
-   :gotos (aref automaton 1)
-   :next-token next-token))
-
-(cl-defmethod wisi-parse-kill ((_parser wisi-elisp-parser))
-  nil)
-
-(defvar wisi-elisp-parse--indent nil
-  ;; not buffer-local; only let-bound in wisi-parse-current (elisp)
-  "A vector of indentation for all lines in buffer.
-Each element can be one of:
-- integer : indent
-
-- list ('anchor (start-id ...) indent)  :
-  indent for current line, base indent for following 'anchored
-  lines. Start-id is list of ids anchored at this line. For parens
-  and other uses.
-
-- list ('anchored id delta) :
-  indent = delta + 'anchor id line indent; for lines indented
-  relative to anchor.
-
-- list ('anchor (start-id ...) ('anchored id delta))
-  for nested anchors.")
-
-(cl-defmethod wisi-parse-current ((parser wisi-elisp-parser) _begin _send-end 
_parse-end)
-  "Parse entire current buffer.
-BEGIN, END are ignored"
-
-  (let ((actions (wisi-elisp-parser-actions parser))
-       (gotos   (wisi-elisp-parser-gotos parser))
-       (parser-states ;; vector of parallel parser states
-        (vector
-         (make-wisi-elisp-parser-state
-          :label 0
-          :active  'shift
-          :stack   (make-vector wisi-parse-max-stack-size nil)
-          :sp      0
-          :pending nil)))
-       (active-parser-count 1)
-       active-parser-count-prev
-       (active 'shift)
-       (token nil)
-       some-pending
-       wisi-elisp-parse--indent)
-
-    (cl-case wisi--parse-action
-      (indent
-       (let ((line-count (1+ (count-lines (point-min) (point-max)))))
-        (setq wisi-elisp-parse--indent (make-vector line-count 0))
-        (wisi-elisp-lexer-reset line-count wisi--lexer)))
-
-      (navigate
-       (setq wisi-end-caches nil))
-
-      (t nil))
-
-    (setf (wisi-parser-lexer-errors parser) nil)
-    (setf (wisi-parser-parse-errors parser) nil)
-
-    ;; We assume the lexer relies on syntax properties
-    (when (< emacs-major-version 25) (syntax-propertize (point-max)))
-
-    (goto-char (point-min))
-    (forward-comment (point-max))
-    (aset (wisi-elisp-parser-state-stack (aref parser-states 0)) 0 0)
-
-    (setq token (funcall (wisi-elisp-parser-next-token parser)))
-    (setq wisi-elisp-parse-max-parallel-current (cons 0 0))
-
-    (while (not (eq active 'accept))
-      (setq active-parser-count-prev active-parser-count)
-      (setq some-pending nil)
-      (dotimes (parser-index (length parser-states))
-       (when (eq active (wisi-elisp-parser-state-active (aref parser-states 
parser-index)))
-         (let* ((parser-state (aref parser-states parser-index))
-                (result (wisi-elisp-parse-1 token parser-state (> 
active-parser-count 1) actions gotos)))
-           (when result
-             ;; spawn a new parser
-             (when (= active-parser-count wisi-parse-max-parallel)
-               (let* ((state (aref (wisi-elisp-parser-state-stack parser-state)
-                                   (wisi-elisp-parser-state-sp parser-state)))
-                      (msg (wisi-error-msg (concat "too many parallel parsers 
required in grammar state %d;"
-                                                   " simplify grammar, or 
increase `wisi-elisp-parse-max-parallel'")
-                                           state)))
-                 (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
-                 (signal 'wisi-parse-error msg)))
-
-             (let ((j (wisi-elisp-parse-free-parser parser-states)))
-               (cond
-                ((= j -1)
-                 ;; Add to parser-states; the new parser won't be executed
-                 ;; again in this parser-index loop.
-                 (setq parser-states (vconcat parser-states (vector nil)))
-                 (setq j (1- (length parser-states))))
-                ((< j parser-index)
-                 ;; The new parser won't be executed again in this
-                 ;; parser-index loop; nothing to do.
-                 )
-                (t
-                 ;; Don't let the new parser execute again in this
-                 ;; parser-index loop.
-                 (setq some-pending t)
-                 (setf (wisi-elisp-parser-state-active result)
-                       (cl-case (wisi-elisp-parser-state-active result)
-                         (shift 'pending-shift)
-                         (reduce 'pending-reduce)
-                        )))
-                 )
-               (setq active-parser-count (1+ active-parser-count))
-               (when (> active-parser-count (car 
wisi-elisp-parse-max-parallel-current))
-                 (setq wisi-elisp-parse-max-parallel-current (cons 
active-parser-count (point))))
-               (setf (wisi-elisp-parser-state-label result) j)
-               (aset parser-states j result))
-             (when (> wisi-debug 1)
-                (message "spawn parser (%d active)" active-parser-count)))
-
-           (when (eq 'error (wisi-elisp-parser-state-active parser-state))
-             (setq active-parser-count (1- active-parser-count))
-             (when (> wisi-debug 1)
-                (message "terminate parser (%d active)" active-parser-count))
-             (cl-case active-parser-count
-               (0
-                (cond
-                 ((= active-parser-count-prev 1)
-                  ;; We were not in a parallel parse; abandon parsing, report 
the error.
-                  (let* ((state (aref (wisi-elisp-parser-state-stack 
parser-state)
-                                      (wisi-elisp-parser-state-sp 
parser-state)))
-                         (msg (wisi-error-msg "syntax error in grammar state 
%d; unexpected %s, expecting one of %s"
-                                              state
-                                              (wisi-token-text token)
-                                              (mapcar 'car (aref actions 
state)))))
-                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
-                    (signal 'wisi-parse-error msg)))
-                 (t
-                  ;; Report errors from all parsers that failed on this token.
-                  (let ((msg))
-                    (dotimes (_ (length parser-states))
-                      (let* ((parser-state (aref parser-states parser-index))
-                             (state (aref (wisi-elisp-parser-state-stack 
parser-state)
-                                          (wisi-elisp-parser-state-sp 
parser-state))))
-                        (when (eq 'error (wisi-elisp-parser-state-active 
parser-state))
-                          (setq msg
-                                (concat msg
-                                        (when msg "\n")
-                                        (wisi-error-msg
-                                         "syntax error in grammar state %d; 
unexpected %s, expecting one of %s"
-                                         state
-                                         (wisi-token-text token)
-                                         (mapcar 'car (aref actions state)))))
-                          )))
-                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
-                    (signal 'wisi-parse-error msg)))
-                 ))
-
-               (1
-                (setf (wisi-elisp-parser-state-active parser-state) nil); 
Don't save error for later.
-                (wisi-elisp-parse-execute-pending (aref parser-states 
(wisi-elisp-parse-active-parser parser-states))))
-
-               (t
-                ;; We were in a parallel parse, and this parser
-                ;; failed; mark it inactive, don't save error for
-                ;; later.
-                (setf (wisi-elisp-parser-state-active parser-state) nil)
-                )))
-           )));; end dotimes
-
-      (when some-pending
-       ;; Change pending-* parsers to *.
-       (dotimes (parser-index (length parser-states))
-         (cond
-          ((eq (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'pending-shift)
-           (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'shift))
-          ((eq (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'pending-reduce)
-           (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'reduce))
-          )))
-
-      (setq active (wisi-elisp-parsers-active parser-states 
active-parser-count))
-      (when (eq active 'shift)
-       (when (> active-parser-count 1)
-         (setq active-parser-count (wisi-elisp-parse-elim-identical parser 
parser-states active-parser-count)))
-
-       (setq token (funcall (wisi-elisp-parser-next-token parser))))
-    )
-    (when (> active-parser-count 1)
-      (error "ambiguous parse result"))
-
-    (cl-case wisi--parse-action
-      (indent
-       (wisi-elisp-parse--indent-leading-comments)
-       (wisi-elisp-parse--resolve-anchors))
-
-      (t nil))
-
-    ;; Return region parsed.
-    (cons (point-min) (point))
-    ))
-
-(defun wisi-elisp-parsers-active-index (parser-states)
-  ;; only called when active-parser-count = 1
-  (let ((result nil)
-       (i 0))
-    (while (and (not result)
-               (< i (length parser-states)))
-      (when (wisi-elisp-parser-state-active (aref parser-states i))
-       (setq result i))
-      (setq i (1+ i)))
-    result))
-
-(defun wisi-elisp-parsers-active (parser-states active-count)
-  "Return the type of parser cycle to execute.
-PARSER-STATES[*].active is the last action a parser took. If it
-was `shift', that parser used the input token, and should not be
-executed again until another input token is available, after all
-parsers have shifted the current token or terminated.
-
-Returns one of:
-
-`accept' : all PARSER-STATES have active set to nil or `accept' -
-done parsing
-
-`shift' : all PARSER-STATES have active set to nil, `accept', or
-`shift' - get a new token, execute `shift' parsers.
-
-`reduce' : some PARSER-STATES have active set to `reduce' - no new
-token, execute `reduce' parsers."
-  (let ((result nil)
-       (i 0)
-       (shift-count 0)
-       (accept-count 0)
-       active)
-    (while (and (not result)
-               (< i (length parser-states)))
-      (setq active (wisi-elisp-parser-state-active (aref parser-states i)))
-      (cond
-       ((eq active 'shift) (setq shift-count (1+ shift-count)))
-       ((eq active 'reduce) (setq result 'reduce))
-       ((eq active 'accept) (setq accept-count (1+ accept-count)))
-       )
-      (setq i (1+ i)))
-
-    (cond
-     (result )
-     ((= accept-count active-count)
-      'accept)
-     ((= (+ shift-count accept-count) active-count)
-      'shift)
-     (t
-      ;; all parsers in error state; should not get here
-      (error "all parsers in error state; programmer error"))
-     )))
-
-(defun wisi-elisp-parse-free-parser (parser-states)
-  "Return index to a non-active parser in PARSER-STATES, -1 if there is none."
-  (let ((result nil)
-       (i 0))
-    (while (and (not result)
-               (< i (length parser-states)))
-      (when (not (wisi-elisp-parser-state-active (aref parser-states i)))
-       (setq result i))
-      (setq i (1+ i)))
-    (if result result -1)))
-
-(defun wisi-elisp-parse-active-parser (parser-states)
-  "Return index to the first active parser in PARSER-STATES."
-  (let ((result nil)
-       (i 0))
-    (while (and (not result)
-               (< i (length parser-states)))
-      (when (wisi-elisp-parser-state-active (aref parser-states i))
-       (setq result i))
-      (setq i (1+ i)))
-    (unless result
-      (error "no active parsers"))
-    result))
-
-(defun wisi-elisp-parse-elim-identical (parser parser-states 
active-parser-count)
-  "Check for parsers in PARSER-STATES that have reached identical states 
eliminate one.
-Return new ACTIVE-PARSER-COUNT. Assumes all parsers have active
-nil, `shift', or `accept'."
-  ;; parser-states passed by reference; active-parser-count by copy
-  ;; see test/ada_mode-slices.adb for example
-  (dotimes (parser-i (1- (length parser-states)))
-    (when (wisi-elisp-parser-state-active (aref parser-states parser-i))
-      (dotimes (parser-j (- (length parser-states) parser-i 1))
-       (when (wisi-elisp-parser-state-active (aref parser-states (+ parser-i 
parser-j 1)))
-         (when (eq (wisi-elisp-parser-state-sp (aref parser-states parser-i))
-                    (wisi-elisp-parser-state-sp (aref parser-states (+ 
parser-i parser-j 1))))
-           (let ((compare t)
-                 exec)
-             (dotimes (stack-i (wisi-elisp-parser-state-sp (aref parser-states 
parser-i)))
-               (setq
-                compare
-                (and compare ;; bypass expensive 'arefs' after first stack 
item compare fail
-                     (equal (aref (wisi-elisp-parser-state-stack (aref 
parser-states parser-i)) stack-i)
-                            (aref (wisi-elisp-parser-state-stack (aref 
parser-states (+ parser-i parser-j 1)))
-                                  stack-i)))))
-             (when compare
-               ;; parser stacks are identical
-               (setq active-parser-count (1- active-parser-count))
-               (when (> wisi-debug 1)
-                 (message "terminate identical parser %d (%d active)"
-                          (+ parser-i parser-j 1) active-parser-count)
-                 (let ((state-i (aref parser-states parser-i))
-                       (state-j (aref parser-states (+ parser-i parser-j 1))))
-                   (message "%d actions:" (wisi-elisp-parser-state-label 
state-i))
-                   (mapc #'wisi-elisp-parse-debug-put-action 
(wisi-elisp-parser-state-pending state-i))
-
-                   (message "%d actions:" (wisi-elisp-parser-state-label 
state-j))
-                   (mapc #'wisi-elisp-parse-debug-put-action 
(wisi-elisp-parser-state-pending state-j))
-                   ))
-               (cl-ecase wisi-debug-identical
-                 (0
-                  (setq exec parser-i)
-                  (setf (wisi-elisp-parser-state-active (aref parser-states (+ 
parser-i parser-j 1))) nil))
-
-                 (1
-                  (setq exec (+ parser-i parser-j 1))
-                  (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-i)) nil))
-
-                 (2
-                  (let ((msg "identical parser stacks"))
-                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
-                    (signal 'wisi-parse-error msg)))
-                 )
-               (when (= active-parser-count 1)
-                 ;; The actions for the two parsers are not
-                 ;; identical, but most of the time either is good
-                 ;; enough for indentation and navigation, so we just
-                 ;; do the actions for the one that is not
-                 ;; terminating. Some times, a significant action is
-                 ;; lost. In that case, turn on
-                 ;; ‘wisi-debug-identical’ to investigate fixing it.
-                 (wisi-elisp-parse-execute-pending (aref parser-states exec)))
-               ))))
-       )))
-  active-parser-count)
-
-(defun wisi-elisp-parse-exec-action (func nonterm tokens)
-  "Execute action if TOKENS not null."
-  ;; `tokens' is null when all tokens in a grammar statement are
-  ;; optional and not present.
-  (unless wisi-action-disable
-    (if (< 0 (length tokens))
-       (when wisi--parse-action
-         (funcall func nonterm tokens))
-
-      (when (> wisi-debug 1)
-       (message "... action skipped; no tokens"))
-      )))
-
-(defvar wisi-elisp-parser-state nil
-  "Let-bound in `wisi-elisp-parse-reduce', used in `wisi-parse-find-token'.")
-
-(defun wisi-elisp-parse-debug-put-action (action)
-  ;; Action is (semantic-function nonterm [tokens])
-  (message "%s [%s]"
-          (nth 0 action)
-          (mapcar #'wisi-tok-debug-image (nth 2 action))))
-
-(defun wisi-elisp-parse-execute-pending (parser-state)
-  (let ((wisi-elisp-parser-state parser-state);; reference, for 
wisi-parse-find-token
-       (pending (wisi-elisp-parser-state-pending parser-state)))
-
-    (when (> wisi-debug 1)
-      (message "%d: pending actions:" (wisi-elisp-parser-state-label 
parser-state)))
-
-    (while pending
-      (when (> wisi-debug 1) (wisi-elisp-parse-debug-put-action (car pending)))
-
-      (let ((func-args (pop pending)))
-       (wisi-elisp-parse-exec-action (nth 0 func-args) (nth 1 func-args) 
(cl-caddr func-args)))
-      )
-    (setf (wisi-elisp-parser-state-pending parser-state) nil)
-    ))
-
-(defmacro wisi-elisp-parse-action (i al)
-  "Return the parser action.
-I is a token item number and AL is the list of (item . action)
-available at current state.  The first element of AL contains the
-default action for this state."
-  `(cdr (or (assq ,i ,al) (car ,al))))
-
-(defun wisi-elisp-parse-1 (token parser-state pendingp actions gotos)
-  "Perform one shift or reduce on PARSER-STATE.
-If PENDINGP, push actions onto PARSER-STATE.pending; otherwise execute them.
-See `wisi-elisp-parse' for full details.
-Return nil or new parser (a wisi-elisp-parser-state struct)."
-  (let* ((state (aref (wisi-elisp-parser-state-stack parser-state)
-               (wisi-elisp-parser-state-sp parser-state)))
-        (parse-action (wisi-elisp-parse-action (wisi-tok-token token) (aref 
actions state)))
-        new-parser-state)
-
-    (when (> wisi-debug 1)
-      ;; output trace info
-      (if (> wisi-debug 2)
-         (progn
-           ;; put top 10 stack items
-           (let* ((count (min 20 (wisi-elisp-parser-state-sp parser-state)))
-                  (msg (make-vector (+ 1 count) nil)))
-             (dotimes (i count)
-               (aset msg (- count i)
-                     (aref (wisi-elisp-parser-state-stack parser-state)
-                           (- (wisi-elisp-parser-state-sp parser-state) i)))
-               )
-             (message "%d: %s: %d: %s"
-                      (wisi-elisp-parser-state-label parser-state)
-                      (wisi-elisp-parser-state-active parser-state)
-                      (wisi-elisp-parser-state-sp parser-state)
-                      msg))
-           (message "   %d: %s: %s" state (wisi-tok-debug-image token) 
parse-action))
-       (message "%d: %d: %s: %s" (wisi-elisp-parser-state-label parser-state) 
state token parse-action)))
-
-    (when (and (listp parse-action)
-              (not (symbolp (car parse-action))))
-      ;; Conflict; spawn a new parser.
-      (setq new-parser-state
-           (make-wisi-elisp-parser-state
-            :active  nil
-            :stack   (vconcat (wisi-elisp-parser-state-stack parser-state))
-            :sp      (wisi-elisp-parser-state-sp parser-state)
-            :pending (wisi-elisp-parser-state-pending parser-state)))
-
-      (wisi-elisp-parse-2 (cadr parse-action) token new-parser-state t gotos)
-      (setq pendingp t)
-      (setq parse-action (car parse-action))
-      );; when
-
-    ;; current parser
-    (wisi-elisp-parse-2 parse-action token parser-state pendingp gotos)
-
-    new-parser-state))
-
-(defun wisi-elisp-parse-2 (action token parser-state pendingp gotos)
-  "Execute parser ACTION (must not be a conflict).
-Return nil."
-  (cond
-   ((eq action 'accept)
-    (setf (wisi-elisp-parser-state-active parser-state) 'accept))
-
-   ((eq action 'error)
-    (setf (wisi-elisp-parser-state-active parser-state) 'error))
-
-   ((natnump action)
-    ;; Shift token and new state (= action) onto stack
-    (let ((stack (wisi-elisp-parser-state-stack parser-state)); reference
-         (sp (wisi-elisp-parser-state-sp parser-state))); copy
-      (setq sp (+ sp 2))
-      (aset stack (1- sp) token)
-      (aset stack sp action)
-      (setf (wisi-elisp-parser-state-sp parser-state) sp))
-    (setf (wisi-elisp-parser-state-active parser-state) 'shift))
-
-   (t
-    (wisi-elisp-parse-reduce action parser-state pendingp gotos)
-    (setf (wisi-elisp-parser-state-active parser-state) 'reduce))
-   ))
-
-(defun wisi-elisp-parse-first-last (stack i j)
-  "Return a pair (FIRST . LAST), indices for the first and last
-non-empty tokens for a nonterminal; or nil if all tokens are
-empty. STACK is the parser stack.  I and J are the indices in
-STACK of the first and last tokens of the nonterminal."
-  (let ((start (car (wisi-tok-region (aref stack i))))
-        (end   (cdr (wisi-tok-region (aref stack j)))))
-    (while (and (or (not start) (not end))
-               (/= i j))
-      (cond
-       ((not start)
-       ;; item i is an empty production
-       (setq start (car (wisi-tok-region (aref stack (setq i (+ i 2)))))))
-
-       ((not end)
-       ;; item j is an empty production
-       (setq end (cdr (wisi-tok-region (aref stack (setq j (- j 2)))))))
-
-       (t (setq i j))))
-
-    (when (and start end)
-      (cons i j))
-    ))
-
-(cl-defmethod wisi-parse-find-token ((_parser wisi-elisp-parser) token-symbol)
-  "Find token with TOKEN-SYMBOL on current parser stack, return token struct.
-For use in grammar actions."
-  ;; Called from wisi-parse-exec-action in wisi-parse-reduce
-  (let* ((stack (wisi-elisp-parser-state-stack wisi-elisp-parser-state))
-        (sp (1- (wisi-elisp-parser-state-sp wisi-elisp-parser-state)))
-        (tok (aref stack sp)))
-    (while (and (> sp 0)
-               (not (eq token-symbol (wisi-tok-token tok))))
-      (setq sp (- sp 2))
-      (setq tok (aref stack sp)))
-    (if (= sp 0)
-       (error "token %s not found on parse stack" token-symbol)
-      tok)
-    ))
-
-(cl-defmethod wisi-parse-stack-peek ((_parser wisi-elisp-parser) n)
-  ;; IMPROVEME: store stack in parser
-  (let* ((stack (wisi-elisp-parser-state-stack wisi-elisp-parser-state))
-        (sp (1- (wisi-elisp-parser-state-sp wisi-elisp-parser-state)))
-        (i (- sp (* 2 n))))
-    (when (> i 0)
-      (aref stack i))))
-
-(defun wisi-elisp-parse-reduce (action parser-state pendingp gotos)
-  "Reduce PARSER-STATE.stack, and execute or pend ACTION."
-  (let* ((wisi-elisp-parser-state parser-state);; reference, for 
wisi-parse-find-token
-        (stack (wisi-elisp-parser-state-stack parser-state)); reference
-        (sp (wisi-elisp-parser-state-sp parser-state)); copy
-        (token-count (nth 2 action))
-        (nonterm (nth 0 action))
-        (first-last (when (> token-count 0)
-                      (wisi-elisp-parse-first-last stack (- sp (* 2 (1- 
token-count)) 1) (1- sp))))
-        (nonterm-region (when first-last
-                          (cons
-                           (car (wisi-tok-region (aref stack (car 
first-last))))
-                           (cdr (wisi-tok-region (aref stack (cdr 
first-last)))))))
-        (post-reduce-state (aref stack (- sp (* 2 token-count))))
-        (new-state (cdr (assoc nonterm (aref gotos post-reduce-state))))
-        (tokens (make-vector token-count nil))
-        line first comment-line comment-end)
-
-    (when (not new-state)
-      (error "no goto for %s %d" nonterm post-reduce-state))
-
-    (dotimes (i token-count) ;;  i = 0 .. (1- token-count); last token = 0, 
first token = (1- token-count)
-      (let ((tok (aref stack (- sp (* 2 i) 1))))
-       (when (nth 1 action)
-         ;; don't need wisi-tokens for a null user action
-         (aset tokens (- token-count i 1) tok))
-
-       (when (eq wisi--parse-action 'indent)
-         (setq line (or (wisi-tok-line tok) line))
-         (cond
-          ((numberp (wisi-tok-first tok))
-           (setq first (wisi-tok-first tok)))
-
-          ((wisi-tok-first tok)
-           (setq first (wisi-tok-line tok)))
-
-          ((and (not (= i 0))
-                      (wisi-tok-comment-line tok))
-           ;; comment lines following last token are not included in nonterm
-           ;; test/ada_mode-nominal.ads Object_Access_Type_5a
-           ;; test/ada_mode-parens.adb
-           (setq first (wisi-tok-comment-line tok)))
-          )
-         (when (and (= i 0)
-                    (wisi-tok-comment-line tok))
-           (setq comment-line (wisi-tok-comment-line tok))
-           (setq comment-end (wisi-tok-comment-end tok)))
-       )))
-
-    (setq sp (+ 2 (- sp (* 2 token-count))))
-    (aset stack (1- sp)
-         (make-wisi-tok
-          :token nonterm
-          :region nonterm-region
-          :nonterminal t
-          :line line
-          :first first
-          :comment-line comment-line
-          :comment-end comment-end))
-    (aset stack sp new-state)
-    (setf (wisi-elisp-parser-state-sp parser-state) sp)
-
-    (when (nth 1 action)
-      ;; nothing to do for a null user action
-      (if pendingp
-         (if (wisi-elisp-parser-state-pending parser-state)
-             (setf (wisi-elisp-parser-state-pending parser-state)
-                   (append (wisi-elisp-parser-state-pending parser-state)
-                           (list (list (nth 1 action) nonterm tokens))))
-           (setf (wisi-elisp-parser-state-pending parser-state)
-                 (list (list (nth 1 action) nonterm tokens))))
-
-       ;; Not pending.
-       (wisi-elisp-parse-exec-action (nth 1 action) nonterm tokens)
-       ))
-    ))
-
-;;;; navigate grammar actions
-
-(defun wisi-elisp-parse--set-end (start-mark end-mark)
-  "Set END-MARK on all caches in `wisi-end-caches' in range START-MARK 
END-MARK,
-delete from `wisi-end-caches'."
-  (let ((i 0)
-       pos cache)
-    (while (< i (length wisi-end-caches))
-      (setq pos (nth i wisi-end-caches))
-      (setq cache (wisi-get-cache pos))
-
-      (if (and (>= pos start-mark)
-              (<  pos end-mark))
-         (progn
-           (setf (wisi-cache-end cache) end-mark)
-           (setq wisi-end-caches (delq pos wisi-end-caches)))
-
-       ;; else not in range
-       (setq i (1+ i)))
-      )))
-
-(defvar wisi-tokens nil
-  ;; Not wisi-elisp-parse--tokens for ease in debugging actions, and
-  ;; to match lots of doc strings.
-  "Array of ‘wisi-tok’ structures for the right hand side of the current 
production.
-Let-bound in parser semantic actions.")
-
-(defvar wisi-nterm nil
-  ;; Not wisi-elisp-parse--nterm for ease in debugging actions
-  "The token id for the left hand side of the current production.
-Let-bound in parser semantic actions.")
-
-(defun wisi-statement-action (pairs)
-  ;; Not wisi-elisp-parse--statement-action to match existing grammar files
-  "Cache navigation information in text properties of tokens.
-Intended as a grammar non-terminal action.
-
-PAIRS is a vector of the form [TOKEN-NUMBER CLASS TOKEN-NUMBER
-CLASS ...] where TOKEN-NUMBER is the (1 indexed) token number in
-the production, CLASS is the wisi class of that token. Use in a
-grammar action as:
-  (wisi-statement-action [1 statement-start 7 statement-end])"
-  (when (eq wisi--parse-action 'navigate)
-    (save-excursion
-      (let ((first-item t)
-           first-keyword-mark
-           (override-start nil)
-           (i 0))
-       (while (< i (length pairs))
-         (let* ((number (1- (aref pairs i)))
-                (region (wisi-tok-region (aref wisi-tokens number)))
-                (token (wisi-tok-token (aref wisi-tokens number)))
-                (class (aref pairs (setq i (1+ i))))
-                (mark (when region (copy-marker (car region) t)))
-                cache)
-
-           (setq i (1+ i))
-
-           (unless (seq-contains wisi-class-list class)
-             (error "%s not in wisi-class-list" class))
-
-           (if region
-               (progn
-                 (if (setq cache (wisi-get-cache (car region)))
-                     ;; We are processing a previously set non-terminal; ie 
simple_statement in
-                     ;;
-                     ;; statement : label_opt simple_statement
-                     ;;
-                     ;; override nonterm, class, containing
-                     (progn
-                       (setf (wisi-cache-class cache) (or override-start 
class))
-                       (setf (wisi-cache-nonterm cache) wisi-nterm)
-                       (setf (wisi-cache-containing cache) first-keyword-mark)
-                       (if wisi-end-caches
-                           (push (car region) wisi-end-caches)
-                         (setq wisi-end-caches (list (car region)))
-                         ))
-
-                   ;; else create new cache
-                   (with-silent-modifications
-                     (put-text-property
-                      (car region)
-                      (1+ (car region))
-                      'wisi-cache
-                      (wisi-cache-create
-                       :nonterm    wisi-nterm
-                       :token      token
-                       :last       (- (cdr region) (car region))
-                       :class      (or override-start class)
-                       :containing first-keyword-mark)
-                      ))
-                   (if wisi-end-caches
-                       (push (car region) wisi-end-caches)
-                     (setq wisi-end-caches (list (car region)))
-                     ))
-
-                 (when first-item
-                   (setq first-item nil)
-                   (when (or override-start
-                             (eq class 'statement-start))
-                     (setq override-start nil)
-                     (setq first-keyword-mark mark)))
-
-                 (when (eq class 'statement-end)
-                   (wisi-elisp-parse--set-end first-keyword-mark (copy-marker 
(car region) t)))
-                 )
-
-             ;; region is nil when a production is empty; if the first
-             ;; token is a start, override the class on the next token.
-             (when (and first-item
-                        (eq class 'statement-start))
-               (setq override-start class)))
-           ))
-       ))))
-
-(defun wisi-containing-action (containing-token contained-token)
-  ;; Not wisi-elisp-parse--containing-action to match existing grammar files
-  "Set containing marks in all tokens in CONTAINED-TOKEN
-with null containing mark to marker pointing to CONTAINING-TOKEN.
-If CONTAINING-TOKEN is empty, the next token number is used."
-  (when (eq wisi--parse-action 'navigate)
-    (let* ((containing-tok (aref wisi-tokens (1- containing-token)))
-          (containing-region (wisi-tok-region containing-tok))
-          (contained-tok (aref wisi-tokens (1- contained-token)))
-          (contained-region (wisi-tok-region contained-tok)))
-
-      (unless containing-region
-       (signal 'wisi-parse-error
-               (wisi-error-msg
-                "wisi-containing-action: containing-region '%s' is empty. 
grammar error; bad action"
-                (wisi-tok-token containing-tok))))
-
-      (unless (or (not contained-region) ;; contained-token is empty
-                 (wisi-get-cache (car containing-region)))
-       (signal 'wisi-parse-error
-               (wisi-error-msg
-                "wisi-containing-action: containing-token '%s' has no cache. 
grammar error; missing action"
-                (wisi-token-text (aref wisi-tokens (1- containing-token))))))
-
-      (when contained-region
-         ;; nil when empty production, may not contain any caches
-         (save-excursion
-           (goto-char (cdr contained-region))
-           (let ((cache (wisi-backward-cache))
-                 (mark (copy-marker (car containing-region) t)))
-             (while cache
-
-               ;; skip blocks that are already marked
-               (while (and (>= (point) (car contained-region))
-                           (markerp (wisi-cache-containing cache)))
-                 (goto-char (wisi-cache-containing cache))
-                 (setq cache (wisi-get-cache (point))))
-
-               (if (or (and (= (car containing-region) (car contained-region))
-                            (<= (point) (car contained-region)))
-                       (< (point) (car contained-region)))
-                   ;; done
-                   (setq cache nil)
-
-                 ;; else set mark, loop
-                 (setf (wisi-cache-containing cache) mark)
-                 (setq cache (wisi-backward-cache)))
-               ))))
-      )))
-
-(defun wisi-elisp-parse--match-token (cache tokens start)
-  "Return t if CACHE has id from TOKENS and is at START or has containing 
equal to START.
-point must be at cache token start.
-TOKENS is a vector [number token_id token_id ...].
-number is ignored."
-  (let ((i 1)
-       (done nil)
-       (result nil)
-       token)
-    (when (or (= start (point))
-             (and (wisi-cache-containing cache)
-                  (= start (wisi-cache-containing cache))))
-      (while (and (not done)
-                 (< i (length tokens)))
-       (setq token (aref tokens i))
-       (if (eq token (wisi-cache-token cache))
-           (setq result t
-                 done t)
-         (setq i (1+ i)))
-       ))
-    result))
-
-(defun wisi-motion-action (token-numbers)
-  ;; Not wisi-elisp-parse--motion-action to match existing grammar files
-  "Set prev/next marks in all tokens given by TOKEN-NUMBERS.
-TOKEN-NUMBERS is a vector with each element one of:
-
-number: the token number; mark that token
-
-vector [number token_id]:
-vector [number token_id token_id ...]:
-   mark all tokens in number nonterminal matching token_id with nil prev/next."
-  (when (eq wisi--parse-action 'navigate)
-    (save-excursion
-      (let (prev-keyword-mark
-           prev-cache
-           token
-           start
-           cache
-           mark
-           (i 0))
-       (while (< i (length token-numbers))
-         (let ((token-number (aref token-numbers i))
-               region)
-           (setq i (1+ i))
-           (cond
-            ((numberp token-number)
-             (setq token (aref wisi-tokens (1- token-number)))
-             (setq region (wisi-tok-region token))
-             (when region
-               (unless start (setq start (car region)))
-               (setq cache (wisi-get-cache (car region)))
-               (unless cache (error "no cache on token %d; add to 
statement-action" token-number))
-               (setq mark (copy-marker (car region) t))
-
-               (if prev-keyword-mark
-                   (progn
-                     (setf (wisi-cache-prev cache) prev-keyword-mark)
-                     (setf (wisi-cache-next prev-cache) mark)
-                     (setq prev-keyword-mark mark)
-                     (setq prev-cache cache))
-
-                 ;; else first token; save as prev
-                 (setq prev-keyword-mark mark)
-                 (setq prev-cache cache))
-               ))
-
-            ((vectorp token-number)
-             ;; token-number may contain 1 or more token_ids
-             ;; the corresponding region may be empty
-             ;; there may not have been a prev keyword
-             (setq region (wisi-tok-region (aref wisi-tokens (1- (aref 
token-number 0)))))
-             (when region ;; not an empty token
-               ;; We must search for all targets at the same time, to
-               ;; get the motion order right.
-               (unless start (setq start (car region)))
-               (goto-char (car region))
-               (setq cache (wisi-get-cache (point)))
-               (unless cache (error "no cache at %d; add to statement-action" 
(car region)))
-               (while (< (point) (cdr region))
-                 (when (wisi-elisp-parse--match-token cache token-number start)
-                   (setq mark (copy-marker (point) t))
-
-                   (if prev-keyword-mark
-                       ;; Don't include this token if prev/next
-                       ;; already set by a lower level statement,
-                       ;; such as a nested if/then/elsif/end if.
-                       (when (and (null (wisi-cache-prev cache))
-                                  (null (wisi-cache-next prev-cache)))
-                         (setf (wisi-cache-prev cache) prev-keyword-mark)
-                         (setf (wisi-cache-next prev-cache) mark)
-                         (setq prev-keyword-mark mark)
-                         (setq prev-cache cache))
-
-                     ;; else first token; save as prev
-                     (setq prev-keyword-mark mark)
-                     (setq prev-cache cache)))
-
-                 (setq cache (wisi-forward-cache))
-                 )))
-
-            (t
-             (error "unexpected token-number %s" token-number))
-            )
-
-           ))
-       ))))
-
-;;;; Face grammar actions
-
-(defun wisi-elisp-parse--face-put-cache (region class)
-  "Put a ’wisi-face’ cache with class CLASS on REGION."
-  (when (> wisi-debug 1)
-    (message "face: put cache %s:%s" region class))
-  (with-silent-modifications
-    (put-text-property
-     (car region)
-     (1+ (car region))
-     'wisi-face
-     (wisi-cache-create
-      :last (- (cdr region) (car region))
-      :class class)
-     )))
-
-(defun wisi-face-mark-action (pairs)
-  ;; Not wisi-elisp-parse--face-mark-action to match existing grammar files
-  "PAIRS is a vector of TOKEN CLASS pairs; mark TOKEN (token number)
-as having face CLASS (prefix or suffix).
-Intended as a grammar action."
-  (when (eq wisi--parse-action 'face)
-    (let ((i 0))
-      (while (< i (length pairs))
-       (let ((region (wisi-tok-region (aref wisi-tokens (1- (aref pairs i)))))
-             (class (aref pairs (setq i (1+ i)))))
-         (setq i (1+ i))
-         (when region
-           ;; region can be null on an optional or virtual token
-           (let ((cache (get-text-property (car region) 'wisi-face)))
-             (if cache
-                 ;; previously marked; extend this cache, delete any others
-                 (progn
-                   (with-silent-modifications
-                     (remove-text-properties (+ (car region) (wisi-cache-last 
cache)) (cdr region) '(wisi-face nil)))
-                   (setf (wisi-cache-class cache) class)
-                   (setf (wisi-cache-last cache) (- (cdr region) (car 
region))))
-
-               ;; else not previously marked
-               (wisi-elisp-parse--face-put-cache region class)))
-           ))
-       ))))
-
-(defun wisi-face-remove-action (tokens)
-  ;; Not wisi-elisp-parse--face-remove-action to match existing grammar files
-  "Remove face caches and faces in TOKENS.
-Intended as a grammar action.
-
-TOKENS is a vector of token numbers."
-  (when (eq wisi--parse-action 'face)
-    (let ((i 0))
-      (while (< i (length tokens))
-       (let* ((number (1- (aref tokens i)))
-              (region (wisi-tok-region (aref wisi-tokens number)))
-              face-cache)
-
-         (setq i (1+ i))
-
-         (when region
-           (let ((pos (car region)))
-             (while (< pos (cdr region))
-               (when (setq face-cache (get-text-property pos 'wisi-face))
-                 (when (> wisi-debug 1)
-                   (message "face: remove face %s" (cons pos (+ pos 
(wisi-cache-last face-cache)))))
-                 (with-silent-modifications
-                   (remove-text-properties
-                    pos (+ pos (wisi-cache-last face-cache))
-                    (list
-                     'wisi-face nil
-                     'font-lock-face nil
-                     'fontified t))))
-               (setq pos (next-single-property-change
-                          (+ pos (or (and face-cache
-                                          (wisi-cache-last face-cache))
-                                     0))
-                          'wisi-face nil (cdr region)))
-               )))
-         )))))
-
-(defun wisi-elisp-parse--face-action-1 (face region)
-  "Apply FACE to REGION."
-  (when region
-    (when (> wisi-debug 1)
-      (message "face: add face %s:%s" region face))
-    (with-silent-modifications
-      (add-text-properties
-       (car region) (cdr region)
-       (list
-       'font-lock-face face
-       'fontified t)))
-    ))
-
-(defun wisi-face-apply-action (triples)
-  ;; Not wisi-elisp-parse--face-apply-action to match existing grammar files
-  "Set face information in `wisi-face' text properties of tokens.
-Intended as a grammar non-terminal action.
-
-TRIPLES is a vector of the form [TOKEN-NUMBER PREFIX-FACE SUFFIX-FACE ...]
-
-In the first ’wisi-face’ cache in each token region, apply
-PREFIX-FACE to class PREFIX, SUFFIX-FACE to class SUFFIX, or
-SUFFIX-FACE to all of the token region if there is no ’wisi-face’
-cache."
-  (when (eq wisi--parse-action 'face)
-    (let (number prefix-face suffix-face (i 0))
-      (while (< i (length triples))
-       (setq number (aref triples i))
-       (setq prefix-face (aref triples (setq i (1+ i))))
-       (setq suffix-face (aref triples (setq i (1+ i))))
-       (cond
-        ((integerp number)
-         (let* ((token-region (wisi-tok-region (aref wisi-tokens (1- number))))
-                (pos (car token-region))
-                (j 0)
-                (some-cache nil)
-                cache)
-           (when token-region
-             ;; region can be null for an optional or virtual token
-             (while (< j 2)
-               (setq cache (get-text-property pos 'wisi-face))
-               (cond
-                ((and (not some-cache)
-                      (null cache))
-                 ;; cache is null when applying a face to a token
-                 ;; directly, without first calling
-                 ;; wisi-face-mark-action. Or when there is a
-                 ;; previously applied face in a lower level token,
-                 ;; such as a numeric literal.
-                 (wisi-elisp-parse--face-action-1 suffix-face token-region))
-
-                ((and cache
-                      (eq 'prefix (wisi-cache-class cache)))
-                 (setq some-cache t)
-                 (wisi-elisp-parse--face-action-1 prefix-face 
(wisi-cache-region cache pos)))
-
-                ((and cache
-                      (eq 'suffix (wisi-cache-class cache)))
-                 (setq some-cache t)
-                 (wisi-elisp-parse--face-action-1 suffix-face 
(wisi-cache-region cache pos)))
-
-                (t
-                 ;; don’t apply a face
-                 nil)
-                )
-
-               (setq j (1+ j))
-               (if suffix-face
-                   (setq pos (next-single-property-change (+ 2 pos) 'wisi-face 
nil (cdr token-region)))
-                 (setq j 2))
-               ))))
-
-        (t
-         ;; catch conversion errors from previous grammar syntax
-         (error "wisi-face-apply-action with non-integer token number"))
-        )
-       (setq i (1+ i))
-       ))))
-
-(defun wisi-face-apply-list-action (triples)
-  ;; Not wisi-elisp-parse--face-apply-list-action to match existing grammar 
files
-  "Similar to ’wisi-face-apply-action’, but applies faces to all
-tokens with a `wisi-face' cache in the wisi-tokens[token-number]
-region, and does not apply a face if there are no such caches."
-  (when (eq wisi--parse-action 'face)
-    (let (number token-region face-region prefix-face suffix-face cache (i 0) 
pos)
-      (while (< i (length triples))
-       (setq number (aref triples i))
-       (setq prefix-face (aref triples (setq i (1+ i))))
-       (setq suffix-face (aref triples (setq i (1+ i))))
-       (cond
-        ((integerp number)
-         (setq token-region (wisi-tok-region (aref wisi-tokens (1- number))))
-         (when token-region
-           ;; region can be null for an optional token
-           (setq pos (car token-region))
-           (while (and pos
-                       (< pos (cdr token-region)))
-             (setq cache (get-text-property pos 'wisi-face))
-             (setq face-region (wisi-cache-region cache pos))
-             (cond
-              ((or (null (wisi-cache-class cache))
-                   (eq 'prefix (wisi-cache-class cache)))
-               (wisi-elisp-parse--face-action-1 prefix-face face-region))
-              ((eq 'suffix (wisi-cache-class cache))
-               (wisi-elisp-parse--face-action-1 suffix-face face-region))
-
-              (t
-               (error "wisi-face-apply-list-action: face cache class is not 
prefix or suffix")))
-
-             (setq pos (next-single-property-change (1+ pos) 'wisi-face nil 
(cdr token-region)))
-             )))
-        (t
-         ;; catch conversion errors from previous grammar syntax
-         (error "wisi-face-apply-list-action with non-integer token number"))
-        )
-       (setq i (1+ i))
-       ))))
-
-;;;; indent grammar actions
-
-(defvar wisi-elisp-parse-indent-hanging-function nil
-  "Language-specific implementation of `wisi-hanging', `wisi-hanging%'.
-A function taking args TOK DELTA1 DELTA2 OPTION NO-ACCUMULATE,
-and returning an indent.
-TOK is a `wisi-tok' struct for the token being indented.
-DELTA1, DELTA2 are the indents of the first and following lines
-within the nonterminal.  OPTION is non-nil if action is `wisi-hanging%'.
-point is at start of TOK, and may be moved.")
-(make-variable-buffer-local 'wisi-elisp-parse-indent-hanging-function)
-
-(defvar wisi-token-index nil
-  ;; Not wisi-elisp-parse--token-index for backward compatibility
-  "Index of current token in `wisi-tokens'.
-Let-bound in `wisi-indent-action', for grammar actions.")
-
-(defvar wisi-indent-comment nil
-  ;; Not wisi-elisp-parse--indent-comment for backward compatibility
-  "Non-nil if computing indent for comment.
-Let-bound in `wisi-indent-action', for grammar actions.")
-
-(defun wisi-elisp-parse--indent-zero-p (indent)
-  (cond
-   ((integerp indent)
-    (= indent 0))
-
-   (t ;; 'anchor
-    (integerp (nth 2 indent)))
-   ))
-
-(defun wisi-elisp-parse--apply-int (i delta)
-  "Add DELTA (an integer) to the indent at index I."
-  (let ((indent (aref wisi-elisp-parse--indent i))) ;; reference if list
-
-    (cond
-     ((integerp indent)
-      (aset wisi-elisp-parse--indent i (+ delta indent)))
-
-     ((listp indent)
-      (cond
-       ((eq 'anchor (car indent))
-       (when (integerp (nth 2 indent))
-         (setf (nth 2 indent) (+ delta (nth 2 indent)))
-         ;; else anchored; not affected by this delta
-         ))
-
-       ((eq 'anchored (car indent))
-       ;; not affected by this delta
-       )))
-
-     (t
-      (error "wisi-elisp-parse--apply-int: invalid form : %s" indent))
-     )))
-
-(defun wisi-elisp-parse--apply-anchored (delta i)
-  "Apply DELTA (an anchored indent) to indent I."
-  ;; delta is from wisi-anchored; ('anchored 1 delta no-accumulate)
-  (let ((indent (aref wisi-elisp-parse--indent i))
-       (accumulate (not (nth 3 delta))))
-
-    (cond
-     ((integerp indent)
-      (when (or accumulate
-               (= indent 0))
-       (let ((temp (seq-take delta 3)))
-         (setf (nth 2 temp) (+ indent (nth 2 temp)))
-         (aset wisi-elisp-parse--indent i temp))))
-
-     ((and (listp indent)
-          (eq 'anchor (car indent))
-          (integerp (nth 2 indent)))
-      (when (or accumulate
-               (= (nth 2 indent) 0))
-       (let ((temp (seq-take delta 3)))
-         (setf (nth 2 temp) (+ (nth 2 indent) (nth 2 temp)))
-         (setf (nth 2 indent) temp))))
-     )))
-
-(defun wisi-elisp-parse--indent-token-1 (line end delta)
-  "Apply indent DELTA to all lines from LINE (a line number) thru END (a 
buffer position)."
-  (let ((i (1- line));; index to wisi-elisp-lexer-line-begin, 
wisi-elisp-parse--indent
-       (paren-first (when (and (listp delta)
-                               (eq 'hanging (car delta)))
-                      (nth 2 delta))))
-
-    (while (<= (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end)
-      (unless
-         (and ;; no check for called from wisi--indent-comment;
-              ;; comments within tokens are indented by
-              ;; wisi--indent-token
-              wisi-indent-comment-col-0
-              (= 11 (syntax-class (syntax-after (aref 
(wisi-elisp-lexer-line-begin wisi--lexer) i)))))
-       (cond
-        ((integerp delta)
-         (wisi-elisp-parse--apply-int i delta))
-
-        ((listp delta)
-         (cond
-          ((eq 'anchored (car delta))
-           (wisi-elisp-parse--apply-anchored delta i))
-
-          ((eq 'hanging (car delta))
-           ;; from wisi-hanging; delta is ('hanging first-line nest delta1 
delta2 no-accumulate)
-           ;; delta1, delta2 may be anchored
-           (when (or (not (nth 5 delta))
-                     (wisi-elisp-parse--indent-zero-p (aref 
wisi-elisp-parse--indent i)))
-             (if (= i (1- (nth 1 delta)))
-                 ;; apply delta1
-                 (let ((delta1 (nth 3 delta)))
-                   (cond
-                    ((integerp delta1)
-                     (wisi-elisp-parse--apply-int i delta1))
-
-                    (t ;; anchored
-                     (wisi-elisp-parse--apply-anchored delta1 i))
-                    ))
-
-               ;; don't apply hanging indent in nested parens.
-               ;; test/ada_mode-parens.adb
-               ;; No_Conditional_Set : constant Ada.Strings.Maps.Character_Set 
:=
-               ;;   Ada.Strings.Maps."or"
-               ;;     (Ada.Strings.Maps.To_Set (' '),
-               (when (= paren-first
-                        (nth 0 (save-excursion (syntax-ppss (aref 
(wisi-elisp-lexer-line-begin wisi--lexer) i)))))
-                 (let ((delta2 (nth 4 delta)))
-                   (cond
-                    ((integerp delta2)
-                     (wisi-elisp-parse--apply-int i delta2))
-
-                    (t ;; anchored
-                     (wisi-elisp-parse--apply-anchored delta2 i))
-                    )))
-               )))
-
-          (t
-           (error "wisi-elisp-parse--indent-token-1: invalid delta: %s" delta))
-          )) ;; listp delta
-
-        (t
-         (error "wisi-elisp-parse--indent-token-1: invalid delta: %s" delta))
-        ))
-      (setq i (1+ i))
-      )))
-
-(defun wisi-elisp-parse--indent-token (tok token-delta)
-  "Add TOKEN-DELTA to all indents in TOK region,"
-  (let ((line (if (wisi-tok-nonterminal tok)
-                 (wisi-tok-first tok)
-               (when (wisi-tok-first tok) (wisi-tok-line tok))))
-       (end (cdr (wisi-tok-region tok))))
-    (when (and line end token-delta)
-      (wisi-elisp-parse--indent-token-1 line end token-delta))))
-
-(defun wisi-elisp-parse--indent-comment (tok comment-delta)
-  "Add COMMENT-DELTA to all indents in comment region following TOK."
-  (let ((line (wisi-tok-comment-line tok))
-       (end (wisi-tok-comment-end tok)))
-    (when (and line end comment-delta)
-      (wisi-elisp-parse--indent-token-1 line end comment-delta))))
-
-(defun wisi-elisp-parse--anchored-1 (tok offset &optional no-accumulate)
-  "Return offset of TOK relative to current indentation + OFFSET.
-For use in grammar indent actions."
-  (when (wisi-tok-region tok)
-    ;; region can be nil when token is inserted by error recovery
-    (let ((pos (car (wisi-tok-region tok)))
-         delta)
-
-      (goto-char pos)
-      (setq delta (+ offset (- (current-column) (current-indentation))))
-      (wisi-elisp-parse--anchored-2
-       (wisi-tok-line tok) ;; anchor-line
-       (if wisi-indent-comment
-          (wisi-tok-comment-end (aref wisi-tokens wisi-token-index))
-        (cdr (wisi-tok-region (aref wisi-tokens wisi-token-index))));; end
-       delta
-       no-accumulate)
-      )))
-
-(defun wisi-elisp-parse--max-anchor (begin-line end)
-  (let ((i (1- begin-line))
-       (max-i (length (wisi-elisp-lexer-line-begin wisi--lexer)))
-       (result 0))
-    (while (and (< i max-i)
-               (<= (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end))
-      (let ((indent (aref wisi-elisp-parse--indent i)))
-       (when (listp indent)
-         (cond
-          ((eq 'anchor (car indent))
-           (setq result (max result (car (nth 1 indent))))
-           (when (listp (nth 2 indent))
-             (setq result (max result (nth 1 (nth 2 indent))))
-             ))
-          (t ;; anchored
-           (setq result (max result (nth 1 indent))))
-          )))
-      (setq i (1+ i)))
-    result
-    ))
-
-(defun wisi-elisp-parse--anchored-2 (anchor-line end delta no-accumulate)
-  "Set ANCHOR-LINE as anchor, increment anchors thru END, return anchored 
delta."
-  ;; Typically, we use anchored to indent relative to a token buried in a line:
-  ;;
-  ;; test/ada_mode-parens.adb
-  ;; Local_2 : Integer := (1 + 2 +
-  ;;                         3);
-  ;; line starting with '3' is anchored to '('
-  ;;
-  ;; If the anchor is a nonterminal, and the first token in the anchor
-  ;; is also first on a line, we don't need anchored to compute the
-  ;; delta:
-  ;;
-  ;; test/ada_mode-parens.adb
-  ;; Local_5 : Integer :=
-  ;;   (1 + 2 +
-  ;;      3);
-  ;; delta for line starting with '3' can just be '3'.
-  ;;
-  ;; However, in some places we need anchored to prevent later
-  ;; deltas from accumulating:
-  ;;
-  ;; test/ada_mode-parens.adb
-  ;; No_Conditional_Set : constant Ada.Strings.Maps.Character_Set :=
-  ;;   Ada.Strings.Maps."or"
-  ;;     (Ada.Strings.Maps.To_Set (' '),
-  ;;
-  ;; here the function call actual parameter part is indented first
-  ;; by 'name' and later by 'expression'; we use anchored to keep the
-  ;; 'name' delta and ignore the later delta.
-  ;;
-  ;; So we apply anchored whether the anchor token is first or not.
-
-  (let* ((i (1- anchor-line))
-        (indent (aref wisi-elisp-parse--indent i)) ;; reference if list
-        (anchor-id (1+ (wisi-elisp-parse--max-anchor anchor-line end))))
-
-    ;; Set anchor
-    (cond
-     ((integerp indent)
-      (aset wisi-elisp-parse--indent i (list 'anchor (list anchor-id) indent)))
-
-     ((and (listp indent)
-          (eq 'anchor (car indent)))
-      (push anchor-id (nth 1 indent)))
-
-     ((and (listp indent)
-          (eq 'anchored (car indent)))
-      (aset wisi-elisp-parse--indent i (list 'anchor (list anchor-id) 
(copy-sequence indent))))
-
-     (t
-      (error "wisi-anchored-delta: invalid form in indent: %s" indent)))
-
-    (list 'anchored anchor-id delta no-accumulate)
-    ))
-
-(defun wisi-anchored (token-number offset &optional no-accumulate)
-  ;; Not wisi-elisp-parse--anchored to match existing grammar files
-  "Return offset of token TOKEN-NUMBER in `wisi-tokens'.relative to current 
indentation + OFFSET.
-For use in grammar indent actions."
-  (wisi-elisp-parse--anchored-1 (aref wisi-tokens (1- token-number)) offset 
no-accumulate))
-
-(defun wisi-anchored* (token-number offset)
-  ;; Not wisi-elisp-parse--anchored* to match existing grammar files
-  "If TOKEN-NUMBER token in `wisi-tokens' is first on a line,
-call ’wisi-anchored OFFSET’. Otherwise return 0.
-For use in grammar indent actions."
-  (if (wisi-tok-first (aref wisi-tokens (1- token-number)))
-      (wisi-anchored token-number offset)
-    0))
-
-(defun wisi-anchored*- (token-number offset)
-  ;; Not wisi-elisp-parse--anchored*- to match existing grammar files
-  "If existing indent is zero, and TOKEN-NUMBER token in `wisi-tokens' is 
first on a line,
-call ’wisi-anchored OFFSET’. Otherwise return 0.
-For use in grammar indent actions."
-  (if (wisi-tok-first (aref wisi-tokens (1- token-number)))
-      (wisi-anchored token-number offset t)
-    0))
-
-(defun wisi-elisp-parse--paren-in-anchor-line (anchor-tok offset)
-  "If there is an opening paren containing ANCHOR-TOK in the same line as 
ANCHOR-TOK,
-return OFFSET plus the delta from the line indent to the paren
-position. Otherwise return OFFSET."
-  (let* ((tok-syntax (syntax-ppss (car (wisi-tok-region anchor-tok))))
-        (paren-pos (nth 1 tok-syntax))
-        (anchor-line (wisi-tok-line anchor-tok)))
-
-    (when (and paren-pos ;; in paren
-             (< paren-pos (aref (wisi-elisp-lexer-line-begin wisi--lexer) (1- 
anchor-line))))
-      ;; paren not in anchor line
-      (setq paren-pos nil))
-
-    (if paren-pos
-       (progn
-         (goto-char paren-pos)
-         (+ 1 (- (current-column) (current-indentation)) offset))
-      offset)
-    ))
-
-(defun wisi-anchored% (token-number offset &optional no-accumulate)
-  ;; Not wisi-elisp-parse--anchored% to match existing grammar files
-  "Return either an anchor for the current token at OFFSET from an enclosing 
paren on
-the line containing TOKEN-NUMBER, or OFFSET.
-For use in grammar indent actions."
-  (let* ((indent-tok (aref wisi-tokens wisi-token-index))
-        ;; indent-tok is a nonterminal; this function makes no sense for 
terminals
-        (anchor-tok (aref wisi-tokens (1- token-number))))
-
-    (wisi-elisp-parse--anchored-2
-     (wisi-tok-line anchor-tok)
-
-     (if wisi-indent-comment
-        (wisi-tok-comment-end indent-tok)
-       (cdr (wisi-tok-region indent-tok))) ;; end
-
-     (wisi-elisp-parse--paren-in-anchor-line anchor-tok offset)
-     no-accumulate)
-    ))
-
-(defun wisi-anchored%- (token-number offset)
-  ;; Not wisi-elisp-parse--anchored%- to match existing grammar files
-  "If existing indent is zero, anchor the current token at OFFSET
-from the first token on the line containing TOKEN-NUMBER in `wisi-tokens'.
-Return the delta.
-For use in grammar indent actions."
-  (wisi-anchored% token-number offset t))
-
-(defun wisi-elisp-parse--hanging-1 (delta1 delta2 option no-accumulate)
-  "If OPTION is nil, implement `wisi-hanging'; otherwise `wisi-hanging%'."
-  (let ((tok (aref wisi-tokens wisi-token-index)))
-    ;; tok is a nonterminal; this function makes no sense for terminals
-    ;; syntax-ppss moves point to start of tok
-
-    (cond
-     ((functionp wisi-elisp-parse-indent-hanging-function)
-      (funcall wisi-elisp-parse-indent-hanging-function tok delta1 delta2 
option no-accumulate))
-
-     (t
-      (let ((tok-syntax (syntax-ppss (car (wisi-tok-region tok))))
-           (first-tok-first-on-line
-            ;; first token in tok is first on line
-            (and (numberp (wisi-tok-first tok))
-                 (= (wisi-tok-line tok) (wisi-tok-first tok)))))
-       (list 'hanging
-             (wisi-tok-line tok) ;; first line of token
-             (nth 0 tok-syntax) ;; paren nest level at tok
-             delta1
-             (if (or (not option) first-tok-first-on-line)
-                 delta2
-               delta1)
-             no-accumulate))
-      ))
-    ))
-
-(defun wisi-hanging (delta1 delta2)
-  ;; Not wisi-elisp-parse--hanging to match existing grammar files
-  "Use DETLA1 for first line, DELTA2 for following lines.
-For use in grammar indent actions."
-  (wisi-elisp-parse--hanging-1 delta1 delta2 nil nil))
-
-(defun wisi-hanging% (delta1 delta2)
-  ;; Not wisi-elisp-parse--hanging% to match existing grammar files
-  "If first token is first in line, use DETLA1 for first line, DELTA2 for 
following lines.
-Otherwise use DELTA1 for all lines.
-For use in grammar indent actions."
-  (wisi-elisp-parse--hanging-1 delta1 delta2 t nil))
-
-(defun wisi-hanging%- (delta1 delta2)
-  ;; Not wisi-elisp-parse--hanging%- to match existing grammar files
-  "If existing indent is non-zero, do nothing.
-Else if first token is first in line, use DETLA1 for first line,
-DELTA2 for following lines.  Otherwise use DELTA1 for all lines.
-For use in grammar indent actions."
-  (wisi-elisp-parse--hanging-1 delta1 delta2 t t))
-
-(defun wisi-elisp-parse--indent-offset (token offset)
-  "Return offset from beginning of first token on line containing TOKEN,
-   to beginning of TOKEN, plus OFFSET."
-  (save-excursion
-    (goto-char (aref (wisi-elisp-lexer-line-begin wisi--lexer) (1- 
(wisi-tok-line token))))
-    (back-to-indentation)
-    (+ offset (- (car (wisi-tok-region token)) (point)))
-    ))
-
-(defun wisi-elisp-parse--indent-compute-delta (delta tok)
-  "Return evaluation of DELTA."
-  (cond
-   ((integerp delta)
-    delta)
-
-   ((symbolp delta)
-    (symbol-value delta))
-
-   ((vectorp delta)
-    ;; [token comment]
-    ;; if wisi-indent-comment, we are indenting the comments of the
-    ;; previous token; they should align with the 'token' delta.
-    (wisi-elisp-parse--indent-compute-delta (aref delta 0) tok))
-
-   (t ;; form
-    (cond
-     ((eq 'anchored (car delta))
-      delta)
-
-     (t
-      (save-excursion
-       (goto-char (car (wisi-tok-region tok)))
-       (eval delta)))))
-   ))
-
-(defun wisi-indent-action (deltas)
-  ;; Not wisi-elisp-parse--indent-action to match existing grammar files
-  "Accumulate `wisi--indents' from DELTAS.
-DELTAS is a vector; each element can be:
-- an integer
-- a symbol
-- a lisp form
-- a vector.
-
-The first three are evaluated to give an integer delta. A vector must
-have two elements, giving the code and following comment
-deltas. Otherwise the comment delta is the following delta in
-DELTAS."
-  (when (eq wisi--parse-action 'indent)
-    (dotimes (wisi-token-index (length wisi-tokens))
-      (let* ((tok (aref wisi-tokens wisi-token-index))
-            (token-delta (aref deltas wisi-token-index))
-            (comment-delta
-             (cond
-              ((vectorp token-delta)
-               (aref token-delta 1))
-
-              ((< wisi-token-index (1- (length wisi-tokens)))
-               (aref deltas (1+ wisi-token-index)))
-              )))
-       (when (wisi-tok-region tok)
-         ;; region is null when optional nonterminal is empty
-         (let ((wisi-indent-comment nil))
-           (setq token-delta
-                 (when (and token-delta
-                            (wisi-tok-first tok))
-                   (wisi-elisp-parse--indent-compute-delta token-delta tok)))
-
-           (when (and token-delta
-                      (or (consp token-delta)
-                          (not (= 0 token-delta))))
-             (wisi-elisp-parse--indent-token tok token-delta))
-
-           (setq wisi-indent-comment t)
-           (setq comment-delta
-                 (when (and comment-delta
-                            (wisi-tok-comment-line tok))
-                   (wisi-elisp-parse--indent-compute-delta comment-delta tok)))
-
-           (when (and comment-delta
-                      (or (consp comment-delta)
-                          (not (= 0 comment-delta))))
-             (wisi-elisp-parse--indent-comment tok comment-delta))
-           )
-         )))))
-
-(defun wisi-indent-action* (n deltas)
-  ;; Not wisi-elisp-parse--indent-action* to match existing grammar files
-  "If any of the first N tokens in `wisi-tokens' is first on a line,
-call `wisi-indent-action' with DELTAS.  Otherwise do nothing."
-  (when (eq wisi--parse-action 'indent)
-    (let ((done nil)
-         (i 0)
-         tok)
-      (while (and (not done)
-                 (< i n))
-       (setq tok (aref wisi-tokens i))
-       (setq i (1+ i))
-       (when (and (wisi-tok-region tok)
-                  (wisi-tok-first tok))
-         (setq done t)
-         (wisi-indent-action deltas))
-       ))))
-
-;;;; non-grammar indent functions
-
-(defconst wisi-elisp-parse--max-anchor-depth 20) ;; IMRPOVEME: can compute in 
actions
-
-(defun wisi-elisp-parse--indent-leading-comments ()
-  "Set `wisi-elisp-parse--indent to 0 for comment lines before first token in 
buffer.
-Leave point at first token (or eob)."
-  (save-excursion
-    (goto-char (point-min))
-    (forward-comment (point-max))
-    (let ((end (point))
-         (i 0)
-         (max-i (length wisi-elisp-parse--indent)))
-      (while (and (< i max-i)
-                 (< (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end))
-       (aset wisi-elisp-parse--indent i 0)
-       (setq i (1+ i)))
-      )))
-
-(defun wisi-elisp-parse--resolve-anchors ()
-  (let ((anchor-indent (make-vector wisi-elisp-parse--max-anchor-depth 0))
-       pos)
-
-    (dotimes (i (length wisi-elisp-parse--indent))
-      (let ((indent (aref wisi-elisp-parse--indent i)))
-
-       (cond
-        ((integerp indent))
-
-        ((listp indent)
-         (let ((anchor-ids (nth 1 indent))
-               (indent2 (nth 2 indent)))
-           (cond
-            ((eq 'anchor (car indent))
-             (cond
-              ((integerp indent2)
-               (dotimes (i (length anchor-ids))
-                 (aset anchor-indent (nth i anchor-ids) indent2))
-               (setq indent indent2))
-
-              ((listp indent2) ;; 'anchored
-               (setq indent (+ (aref anchor-indent (nth 1 indent2)) (nth 2 
indent2)))
-
-               (dotimes (i (length anchor-ids))
-                 (aset anchor-indent (nth i anchor-ids) indent)))
-
-              (t
-               (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
-              ));; 'anchor
-
-            ((eq 'anchored (car indent))
-             (setq indent (+ (aref anchor-indent (nth 1 indent)) indent2)))
-
-            (t
-             (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
-            )));; listp indent
-
-        (t
-         (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
-        );; cond indent
-
-       (when (> i 0)
-         (setq pos (aref (wisi-elisp-lexer-line-begin wisi--lexer) i))
-         (with-silent-modifications
-           (put-text-property (1- pos) pos 'wisi-indent indent)))
-       )) ;; dotimes lines
-
-    ))
-
-(provide 'wisi-elisp-parse)
-;;; wisi-elisp-parse.el ends here
+;; wisi-elisp-parse.el --- Wisi parser  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2013-2015, 2017 - 2019  Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+;; An extended LALR parser, that handles shift/reduce and
+;; reduce/reduce conflicts by spawning parallel parsers to follow each
+;; path.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'wisi-elisp-lexer)
+(require 'wisi-parse-common)
+
+(defvar wisi-elisp-parse-max-parallel-current (cons 0 0)
+  "Cons (count . point); Maximum number of parallel parsers used in most 
recent parse,
+point at which that max was spawned.")
+
+(defvar wisi-debug-identical 0
+  "Debug terminating identical parsers.
+0 - keep lower-numbered parser.
+1 - keep higher-numbered parser.
+2 - error.")
+
+(cl-defstruct (wisi-elisp-parser-state
+           (:copier nil))
+  label ;; integer identifying parser for debug
+
+  active
+  ;; 'shift  - need new token
+  ;; 'reduce - need reduce
+  ;; 'accept - parsing completed
+  ;; 'error  - failed, error not reported yet
+  ;; nil     - terminated
+  ;;
+  ;; 'pending-shift, 'pending-reduce - newly created parser
+
+  stack
+  ;; Each stack item takes two slots: wisi-tok, state
+
+  sp ;; stack pointer
+
+  pending
+  ;; list of (action-symbol stack-fragment)
+  )
+
+(cl-defstruct (wisi-elisp-parser (:include wisi-parser))
+  actions
+  gotos
+  next-token
+  )
+
+;;;###autoload
+(defun wisi-make-elisp-parser (automaton next-token)
+  "Return ‘wisi-parser’ object.
+
+- AUTOMATON is the parse table generated by `wisi-compile-grammar'.
+
+- NEXT-TOKEN is a function with no argument called by the parser to
+  obtain the next token from the current buffer after point, as a
+  ’wisi-tok’ object (normally ‘wisi-forward-token’)."
+  (make-wisi-elisp-parser
+   :actions (aref automaton 0)
+   :gotos (aref automaton 1)
+   :next-token next-token))
+
+(cl-defmethod wisi-parse-kill ((_parser wisi-elisp-parser))
+  nil)
+
+(defvar wisi-elisp-parse--indent nil
+  ;; not buffer-local; only let-bound in wisi-parse-current (elisp)
+  "A vector of indentation for all lines in buffer.
+Each element can be one of:
+- nil : no indent set yet
+
+- integer : indent
+
+- list ('anchor (start-id ...) indent)  :
+  indent for current line, base indent for following 'anchored
+  lines. Start-id is list of ids anchored at this line. For parens
+  and other uses.
+
+- list ('anchored id delta) :
+  indent = delta + 'anchor id line indent; for lines indented
+  relative to anchor.
+
+- list ('anchor (start-id ...) ('anchored id delta))
+  for nested anchors.")
+
+(cl-defmethod wisi-parse-current ((parser wisi-elisp-parser) _begin _send-end 
_parse-end)
+  "Parse entire current buffer.
+BEGIN, END are ignored"
+
+  (let ((actions (wisi-elisp-parser-actions parser))
+       (gotos   (wisi-elisp-parser-gotos parser))
+       (parser-states ;; vector of parallel parser states
+        (vector
+         (make-wisi-elisp-parser-state
+          :label 0
+          :active  'shift
+          :stack   (make-vector wisi-parse-max-stack-size nil)
+          :sp      0
+          :pending nil)))
+       (active-parser-count 1)
+       active-parser-count-prev
+       (active 'shift)
+       (token nil)
+       some-pending
+       wisi-elisp-parse--indent)
+
+    (cl-case wisi--parse-action
+      (indent
+       (let ((line-count (1+ (count-lines (point-min) (point-max)))))
+        (setq wisi-elisp-parse--indent (make-vector line-count nil))
+        (wisi-elisp-lexer-reset line-count wisi--lexer)))
+
+      (navigate
+       (setq wisi-end-caches nil))
+
+      (t nil))
+
+    (setf (wisi-parser-lexer-errors parser) nil)
+    (setf (wisi-parser-parse-errors parser) nil)
+
+    ;; We assume the lexer relies on syntax properties
+    (when (< emacs-major-version 25) (syntax-propertize (point-max)))
+
+    (goto-char (point-min))
+    (forward-comment (point-max))
+    (aset (wisi-elisp-parser-state-stack (aref parser-states 0)) 0 0)
+
+    (setq token (funcall (wisi-elisp-parser-next-token parser)))
+    (setq wisi-elisp-parse-max-parallel-current (cons 0 0))
+
+    (while (not (eq active 'accept))
+      (setq active-parser-count-prev active-parser-count)
+      (setq some-pending nil)
+      (dotimes (parser-index (length parser-states))
+       (when (eq active (wisi-elisp-parser-state-active (aref parser-states 
parser-index)))
+         (let* ((parser-state (aref parser-states parser-index))
+                (result (wisi-elisp-parse-1 token parser-state (> 
active-parser-count 1) actions gotos)))
+           (when result
+             ;; spawn a new parser
+             (when (= active-parser-count wisi-parse-max-parallel)
+               (let* ((state (aref (wisi-elisp-parser-state-stack parser-state)
+                                   (wisi-elisp-parser-state-sp parser-state)))
+                      (msg (wisi-error-msg (concat "too many parallel parsers 
required in grammar state %d;"
+                                                   " simplify grammar, or 
increase `wisi-elisp-parse-max-parallel'")
+                                           state)))
+                 (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
+                 (signal 'wisi-parse-error msg)))
+
+             (let ((j (wisi-elisp-parse-free-parser parser-states)))
+               (cond
+                ((= j -1)
+                 ;; Add to parser-states; the new parser won't be executed
+                 ;; again in this parser-index loop.
+                 (setq parser-states (vconcat parser-states (vector nil)))
+                 (setq j (1- (length parser-states))))
+                ((< j parser-index)
+                 ;; The new parser won't be executed again in this
+                 ;; parser-index loop; nothing to do.
+                 )
+                (t
+                 ;; Don't let the new parser execute again in this
+                 ;; parser-index loop.
+                 (setq some-pending t)
+                 (setf (wisi-elisp-parser-state-active result)
+                       (cl-case (wisi-elisp-parser-state-active result)
+                         (shift 'pending-shift)
+                         (reduce 'pending-reduce)
+                        )))
+                 )
+               (setq active-parser-count (1+ active-parser-count))
+               (when (> active-parser-count (car 
wisi-elisp-parse-max-parallel-current))
+                 (setq wisi-elisp-parse-max-parallel-current (cons 
active-parser-count (point))))
+               (setf (wisi-elisp-parser-state-label result) j)
+               (aset parser-states j result))
+             (when (> wisi-debug 1)
+                (message "spawn parser (%d active)" active-parser-count)))
+
+           (when (eq 'error (wisi-elisp-parser-state-active parser-state))
+             (setq active-parser-count (1- active-parser-count))
+             (when (> wisi-debug 1)
+                (message "terminate parser (%d active)" active-parser-count))
+             (cl-case active-parser-count
+               (0
+                (cond
+                 ((= active-parser-count-prev 1)
+                  ;; We were not in a parallel parse; abandon parsing, report 
the error.
+                  (let* ((state (aref (wisi-elisp-parser-state-stack 
parser-state)
+                                      (wisi-elisp-parser-state-sp 
parser-state)))
+                         (msg (wisi-error-msg "syntax error in grammar state 
%d; unexpected %s, expecting one of %s"
+                                              state
+                                              (wisi-token-text token)
+                                              (mapcar 'car (aref actions 
state)))))
+                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
+                    (signal 'wisi-parse-error msg)))
+                 (t
+                  ;; Report errors from all parsers that failed on this token.
+                  (let ((msg))
+                    (dotimes (_ (length parser-states))
+                      (let* ((parser-state (aref parser-states parser-index))
+                             (state (aref (wisi-elisp-parser-state-stack 
parser-state)
+                                          (wisi-elisp-parser-state-sp 
parser-state))))
+                        (when (eq 'error (wisi-elisp-parser-state-active 
parser-state))
+                          (setq msg
+                                (concat msg
+                                        (when msg "\n")
+                                        (wisi-error-msg
+                                         "syntax error in grammar state %d; 
unexpected %s, expecting one of %s"
+                                         state
+                                         (wisi-token-text token)
+                                         (mapcar 'car (aref actions state)))))
+                          )))
+                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
+                    (signal 'wisi-parse-error msg)))
+                 ))
+
+               (1
+                (setf (wisi-elisp-parser-state-active parser-state) nil); 
Don't save error for later.
+                (wisi-elisp-parse-execute-pending (aref parser-states 
(wisi-elisp-parse-active-parser parser-states))))
+
+               (t
+                ;; We were in a parallel parse, and this parser
+                ;; failed; mark it inactive, don't save error for
+                ;; later.
+                (setf (wisi-elisp-parser-state-active parser-state) nil)
+                )))
+           )));; end dotimes
+
+      (when some-pending
+       ;; Change pending-* parsers to *.
+       (dotimes (parser-index (length parser-states))
+         (cond
+          ((eq (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'pending-shift)
+           (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'shift))
+          ((eq (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'pending-reduce)
+           (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-index)) 'reduce))
+          )))
+
+      (setq active (wisi-elisp-parsers-active parser-states 
active-parser-count))
+      (when (eq active 'shift)
+       (when (> active-parser-count 1)
+         (setq active-parser-count (wisi-elisp-parse-elim-identical parser 
parser-states active-parser-count)))
+
+       (setq token (funcall (wisi-elisp-parser-next-token parser))))
+    )
+    (when (> active-parser-count 1)
+      (error "ambiguous parse result"))
+
+    (cl-case wisi--parse-action
+      (indent
+       (wisi-elisp-parse--indent-leading-comments)
+       (wisi-elisp-parse--resolve-anchors))
+
+      (t nil))
+
+    ;; Return region parsed.
+    (cons (point-min) (point))
+    ))
+
+(defun wisi-elisp-parsers-active-index (parser-states)
+  ;; only called when active-parser-count = 1
+  (let ((result nil)
+       (i 0))
+    (while (and (not result)
+               (< i (length parser-states)))
+      (when (wisi-elisp-parser-state-active (aref parser-states i))
+       (setq result i))
+      (setq i (1+ i)))
+    result))
+
+(defun wisi-elisp-parsers-active (parser-states active-count)
+  "Return the type of parser cycle to execute.
+PARSER-STATES[*].active is the last action a parser took. If it
+was `shift', that parser used the input token, and should not be
+executed again until another input token is available, after all
+parsers have shifted the current token or terminated.
+
+Returns one of:
+
+`accept' : all PARSER-STATES have active set to nil or `accept' -
+done parsing
+
+`shift' : all PARSER-STATES have active set to nil, `accept', or
+`shift' - get a new token, execute `shift' parsers.
+
+`reduce' : some PARSER-STATES have active set to `reduce' - no new
+token, execute `reduce' parsers."
+  (let ((result nil)
+       (i 0)
+       (shift-count 0)
+       (accept-count 0)
+       active)
+    (while (and (not result)
+               (< i (length parser-states)))
+      (setq active (wisi-elisp-parser-state-active (aref parser-states i)))
+      (cond
+       ((eq active 'shift) (setq shift-count (1+ shift-count)))
+       ((eq active 'reduce) (setq result 'reduce))
+       ((eq active 'accept) (setq accept-count (1+ accept-count)))
+       )
+      (setq i (1+ i)))
+
+    (cond
+     (result )
+     ((= accept-count active-count)
+      'accept)
+     ((= (+ shift-count accept-count) active-count)
+      'shift)
+     (t
+      ;; all parsers in error state; should not get here
+      (error "all parsers in error state; programmer error"))
+     )))
+
+(defun wisi-elisp-parse-free-parser (parser-states)
+  "Return index to a non-active parser in PARSER-STATES, -1 if there is none."
+  (let ((result nil)
+       (i 0))
+    (while (and (not result)
+               (< i (length parser-states)))
+      (when (not (wisi-elisp-parser-state-active (aref parser-states i)))
+       (setq result i))
+      (setq i (1+ i)))
+    (if result result -1)))
+
+(defun wisi-elisp-parse-active-parser (parser-states)
+  "Return index to the first active parser in PARSER-STATES."
+  (let ((result nil)
+       (i 0))
+    (while (and (not result)
+               (< i (length parser-states)))
+      (when (wisi-elisp-parser-state-active (aref parser-states i))
+       (setq result i))
+      (setq i (1+ i)))
+    (unless result
+      (error "no active parsers"))
+    result))
+
+(defun wisi-elisp-parse-elim-identical (parser parser-states 
active-parser-count)
+  "Check for parsers in PARSER-STATES that have reached identical states 
eliminate one.
+Return new ACTIVE-PARSER-COUNT. Assumes all parsers have active
+nil, `shift', or `accept'."
+  ;; parser-states passed by reference; active-parser-count by copy
+  ;; see test/ada_mode-slices.adb for example
+  (dotimes (parser-i (1- (length parser-states)))
+    (when (wisi-elisp-parser-state-active (aref parser-states parser-i))
+      (dotimes (parser-j (- (length parser-states) parser-i 1))
+       (when (wisi-elisp-parser-state-active (aref parser-states (+ parser-i 
parser-j 1)))
+         (when (eq (wisi-elisp-parser-state-sp (aref parser-states parser-i))
+                    (wisi-elisp-parser-state-sp (aref parser-states (+ 
parser-i parser-j 1))))
+           (let ((compare t)
+                 exec)
+             (dotimes (stack-i (wisi-elisp-parser-state-sp (aref parser-states 
parser-i)))
+               (setq
+                compare
+                (and compare ;; bypass expensive 'arefs' after first stack 
item compare fail
+                     (equal (aref (wisi-elisp-parser-state-stack (aref 
parser-states parser-i)) stack-i)
+                            (aref (wisi-elisp-parser-state-stack (aref 
parser-states (+ parser-i parser-j 1)))
+                                  stack-i)))))
+             (when compare
+               ;; parser stacks are identical
+               (setq active-parser-count (1- active-parser-count))
+               (when (> wisi-debug 1)
+                 (message "terminate identical parser %d (%d active)"
+                          (+ parser-i parser-j 1) active-parser-count)
+                 (let ((state-i (aref parser-states parser-i))
+                       (state-j (aref parser-states (+ parser-i parser-j 1))))
+                   (message "%d actions:" (wisi-elisp-parser-state-label 
state-i))
+                   (mapc #'wisi-elisp-parse-debug-put-action 
(wisi-elisp-parser-state-pending state-i))
+
+                   (message "%d actions:" (wisi-elisp-parser-state-label 
state-j))
+                   (mapc #'wisi-elisp-parse-debug-put-action 
(wisi-elisp-parser-state-pending state-j))
+                   ))
+               (cl-ecase wisi-debug-identical
+                 (0
+                  (setq exec parser-i)
+                  (setf (wisi-elisp-parser-state-active (aref parser-states (+ 
parser-i parser-j 1))) nil))
+
+                 (1
+                  (setq exec (+ parser-i parser-j 1))
+                  (setf (wisi-elisp-parser-state-active (aref parser-states 
parser-i)) nil))
+
+                 (2
+                  (let ((msg "identical parser stacks"))
+                    (push (make-wisi--parse-error :pos (point) :message msg) 
(wisi-parser-parse-errors parser))
+                    (signal 'wisi-parse-error msg)))
+                 )
+               (when (= active-parser-count 1)
+                 ;; The actions for the two parsers are not
+                 ;; identical, but most of the time either is good
+                 ;; enough for indentation and navigation, so we just
+                 ;; do the actions for the one that is not
+                 ;; terminating. Some times, a significant action is
+                 ;; lost. In that case, turn on
+                 ;; ‘wisi-debug-identical’ to investigate fixing it.
+                 (wisi-elisp-parse-execute-pending (aref parser-states exec)))
+               ))))
+       )))
+  active-parser-count)
+
+(defun wisi-elisp-parse-exec-action (func nonterm tokens)
+  "Execute action if TOKENS not null."
+  ;; `tokens' is null when all tokens in a grammar statement are
+  ;; optional and not present.
+  (unless wisi-action-disable
+    (if (< 0 (length tokens))
+       (when wisi--parse-action
+         (funcall func nonterm tokens))
+
+      (when (> wisi-debug 1)
+       (message "... action skipped; no tokens"))
+      )))
+
+(defvar wisi-elisp-parser-state nil
+  "Let-bound in `wisi-elisp-parse-reduce', used in `wisi-parse-find-token'.")
+
+(defun wisi-elisp-parse-debug-put-action (action)
+  ;; Action is (semantic-function nonterm [tokens])
+  (message "%s [%s]"
+          (nth 0 action)
+          (mapcar #'wisi-tok-debug-image (nth 2 action))))
+
+(defun wisi-elisp-parse-execute-pending (parser-state)
+  (let ((wisi-elisp-parser-state parser-state);; reference, for 
wisi-parse-find-token
+       (pending (wisi-elisp-parser-state-pending parser-state)))
+
+    (when (> wisi-debug 1)
+      (message "%d: pending actions:" (wisi-elisp-parser-state-label 
parser-state)))
+
+    (while pending
+      (when (> wisi-debug 1) (wisi-elisp-parse-debug-put-action (car pending)))
+
+      (let ((func-args (pop pending)))
+       (wisi-elisp-parse-exec-action (nth 0 func-args) (nth 1 func-args) 
(cl-caddr func-args)))
+      )
+    (setf (wisi-elisp-parser-state-pending parser-state) nil)
+    ))
+
+(defmacro wisi-elisp-parse-action (i al)
+  "Return the parser action.
+I is a token item number and AL is the list of (item . action)
+available at current state.  The first element of AL contains the
+default action for this state."
+  `(cdr (or (assq ,i ,al) (car ,al))))
+
+(defun wisi-elisp-parse-1 (token parser-state pendingp actions gotos)
+  "Perform one shift or reduce on PARSER-STATE.
+If PENDINGP, push actions onto PARSER-STATE.pending; otherwise execute them.
+See `wisi-elisp-parse' for full details.
+Return nil or new parser (a wisi-elisp-parser-state struct)."
+  (let* ((state (aref (wisi-elisp-parser-state-stack parser-state)
+               (wisi-elisp-parser-state-sp parser-state)))
+        (parse-action (wisi-elisp-parse-action (wisi-tok-token token) (aref 
actions state)))
+        new-parser-state)
+
+    (when (> wisi-debug 1)
+      ;; output trace info
+      (if (> wisi-debug 2)
+         (progn
+           ;; put top 10 stack items
+           (let* ((count (min 20 (wisi-elisp-parser-state-sp parser-state)))
+                  (msg (make-vector (+ 1 count) nil)))
+             (dotimes (i count)
+               (aset msg (- count i)
+                     (aref (wisi-elisp-parser-state-stack parser-state)
+                           (- (wisi-elisp-parser-state-sp parser-state) i)))
+               )
+             (message "%d: %s: %d: %s"
+                      (wisi-elisp-parser-state-label parser-state)
+                      (wisi-elisp-parser-state-active parser-state)
+                      (wisi-elisp-parser-state-sp parser-state)
+                      msg))
+           (message "   %d: %s: %s" state (wisi-tok-debug-image token) 
parse-action))
+       (message "%d: %d: %s: %s" (wisi-elisp-parser-state-label parser-state) 
state token parse-action)))
+
+    (when (and (listp parse-action)
+              (not (symbolp (car parse-action))))
+      ;; Conflict; spawn a new parser.
+      (setq new-parser-state
+           (make-wisi-elisp-parser-state
+            :active  nil
+            :stack   (vconcat (wisi-elisp-parser-state-stack parser-state))
+            :sp      (wisi-elisp-parser-state-sp parser-state)
+            :pending (wisi-elisp-parser-state-pending parser-state)))
+
+      (wisi-elisp-parse-2 (cadr parse-action) token new-parser-state t gotos)
+      (setq pendingp t)
+      (setq parse-action (car parse-action))
+      );; when
+
+    ;; current parser
+    (wisi-elisp-parse-2 parse-action token parser-state pendingp gotos)
+
+    new-parser-state))
+
+(defun wisi-elisp-parse-2 (action token parser-state pendingp gotos)
+  "Execute parser ACTION (must not be a conflict).
+Return nil."
+  (cond
+   ((eq action 'accept)
+    (setf (wisi-elisp-parser-state-active parser-state) 'accept))
+
+   ((eq action 'error)
+    (setf (wisi-elisp-parser-state-active parser-state) 'error))
+
+   ((natnump action)
+    ;; Shift token and new state (= action) onto stack
+    (let ((stack (wisi-elisp-parser-state-stack parser-state)); reference
+         (sp (wisi-elisp-parser-state-sp parser-state))); copy
+      (setq sp (+ sp 2))
+      (aset stack (1- sp) token)
+      (aset stack sp action)
+      (setf (wisi-elisp-parser-state-sp parser-state) sp))
+    (setf (wisi-elisp-parser-state-active parser-state) 'shift))
+
+   (t
+    (wisi-elisp-parse-reduce action parser-state pendingp gotos)
+    (setf (wisi-elisp-parser-state-active parser-state) 'reduce))
+   ))
+
+(defun wisi-elisp-parse-first-last (stack i j)
+  "Return a pair (FIRST . LAST), indices for the first and last
+non-empty tokens for a nonterminal; or nil if all tokens are
+empty. STACK is the parser stack.  I and J are the indices in
+STACK of the first and last tokens of the nonterminal."
+  (let ((start (car (wisi-tok-region (aref stack i))))
+        (end   (cdr (wisi-tok-region (aref stack j)))))
+    (while (and (or (not start) (not end))
+               (/= i j))
+      (cond
+       ((not start)
+       ;; item i is an empty production
+       (setq start (car (wisi-tok-region (aref stack (setq i (+ i 2)))))))
+
+       ((not end)
+       ;; item j is an empty production
+       (setq end (cdr (wisi-tok-region (aref stack (setq j (- j 2)))))))
+
+       (t (setq i j))))
+
+    (when (and start end)
+      (cons i j))
+    ))
+
+(cl-defmethod wisi-parse-find-token ((_parser wisi-elisp-parser) token-symbol)
+  "Find token with TOKEN-SYMBOL on current parser stack, return token struct.
+For use in grammar actions."
+  ;; Called from wisi-parse-exec-action in wisi-parse-reduce
+  (let* ((stack (wisi-elisp-parser-state-stack wisi-elisp-parser-state))
+        (sp (1- (wisi-elisp-parser-state-sp wisi-elisp-parser-state)))
+        (tok (aref stack sp)))
+    (while (and (> sp 0)
+               (not (eq token-symbol (wisi-tok-token tok))))
+      (setq sp (- sp 2))
+      (setq tok (aref stack sp)))
+    (if (= sp 0)
+       (error "token %s not found on parse stack" token-symbol)
+      tok)
+    ))
+
+(cl-defmethod wisi-parse-stack-peek ((_parser wisi-elisp-parser) n)
+  ;; IMPROVEME: store stack in parser
+  (let* ((stack (wisi-elisp-parser-state-stack wisi-elisp-parser-state))
+        (sp (1- (wisi-elisp-parser-state-sp wisi-elisp-parser-state)))
+        (i (- sp (* 2 n))))
+    (when (> i 0)
+      (aref stack i))))
+
+(defun wisi-elisp-parse-reduce (action parser-state pendingp gotos)
+  "Reduce PARSER-STATE.stack, and execute or pend ACTION."
+  (let* ((wisi-elisp-parser-state parser-state);; reference, for 
wisi-parse-find-token
+        (stack (wisi-elisp-parser-state-stack parser-state)); reference
+        (sp (wisi-elisp-parser-state-sp parser-state)); copy
+        (token-count (nth 2 action))
+        (nonterm (nth 0 action))
+        (first-last (when (> token-count 0)
+                      (wisi-elisp-parse-first-last stack (- sp (* 2 (1- 
token-count)) 1) (1- sp))))
+        (nonterm-region (when first-last
+                          (cons
+                           (car (wisi-tok-region (aref stack (car 
first-last))))
+                           (cdr (wisi-tok-region (aref stack (cdr 
first-last)))))))
+        (post-reduce-state (aref stack (- sp (* 2 token-count))))
+        (new-state (cdr (assoc nonterm (aref gotos post-reduce-state))))
+        (tokens (make-vector token-count nil))
+        line first comment-line comment-end)
+
+    (when (not new-state)
+      (error "no goto for %s %d" nonterm post-reduce-state))
+
+    (dotimes (i token-count) ;;  i = 0 .. (1- token-count); last token = 0, 
first token = (1- token-count)
+      (let ((tok (aref stack (- sp (* 2 i) 1))))
+       (when (nth 1 action)
+         ;; don't need wisi-tokens for a null user action
+         (aset tokens (- token-count i 1) tok))
+
+       (when (eq wisi--parse-action 'indent)
+         (setq line (or (wisi-tok-line tok) line))
+         (cond
+          ((numberp (wisi-tok-first tok))
+           (setq first (wisi-tok-first tok)))
+
+          ((wisi-tok-first tok)
+           (setq first (wisi-tok-line tok)))
+
+          ((and (not (= i 0))
+                      (wisi-tok-comment-line tok))
+           ;; comment lines following last token are not included in nonterm
+           ;; test/ada_mode-nominal.ads Object_Access_Type_5a
+           ;; test/ada_mode-parens.adb
+           (setq first (wisi-tok-comment-line tok)))
+          )
+         (when (and (= i 0)
+                    (wisi-tok-comment-line tok))
+           (setq comment-line (wisi-tok-comment-line tok))
+           (setq comment-end (wisi-tok-comment-end tok)))
+       )))
+
+    (setq sp (+ 2 (- sp (* 2 token-count))))
+    (aset stack (1- sp)
+         (make-wisi-tok
+          :token nonterm
+          :region nonterm-region
+          :nonterminal t
+          :line line
+          :first first
+          :comment-line comment-line
+          :comment-end comment-end))
+    (aset stack sp new-state)
+    (setf (wisi-elisp-parser-state-sp parser-state) sp)
+
+    (when (nth 1 action)
+      ;; nothing to do for a null user action
+      (if pendingp
+         (if (wisi-elisp-parser-state-pending parser-state)
+             (setf (wisi-elisp-parser-state-pending parser-state)
+                   (append (wisi-elisp-parser-state-pending parser-state)
+                           (list (list (nth 1 action) nonterm tokens))))
+           (setf (wisi-elisp-parser-state-pending parser-state)
+                 (list (list (nth 1 action) nonterm tokens))))
+
+       ;; Not pending.
+       (wisi-elisp-parse-exec-action (nth 1 action) nonterm tokens)
+       ))
+    ))
+
+;;;; navigate grammar actions
+
+(defun wisi-elisp-parse--set-end (start-mark end-mark)
+  "Set END-MARK on all caches in `wisi-end-caches' in range START-MARK 
END-MARK,
+delete from `wisi-end-caches'."
+  (let ((i 0)
+       pos cache)
+    (while (< i (length wisi-end-caches))
+      (setq pos (nth i wisi-end-caches))
+      (setq cache (wisi-get-cache pos))
+
+      (if (and (>= pos start-mark)
+              (<  pos end-mark))
+         (progn
+           (setf (wisi-cache-end cache) end-mark)
+           (setq wisi-end-caches (delq pos wisi-end-caches)))
+
+       ;; else not in range
+       (setq i (1+ i)))
+      )))
+
+(defvar wisi-tokens nil
+  ;; Not wisi-elisp-parse--tokens for ease in debugging actions, and
+  ;; to match lots of doc strings.
+  "Array of ‘wisi-tok’ structures for the right hand side of the current 
production.
+Let-bound in parser semantic actions.")
+
+(defvar wisi-nterm nil
+  ;; Not wisi-elisp-parse--nterm for ease in debugging actions
+  "The token id for the left hand side of the current production.
+Let-bound in parser semantic actions.")
+
+(defun wisi-statement-action (pairs)
+  ;; Not wisi-elisp-parse--statement-action to match existing grammar files
+  "Cache navigation information in text properties of tokens.
+Intended as a grammar non-terminal action.
+
+PAIRS is a vector of the form [TOKEN-NUMBER CLASS TOKEN-NUMBER
+CLASS ...] where TOKEN-NUMBER is the (1 indexed) token number in
+the production, CLASS is the wisi class of that token. Use in a
+grammar action as:
+  (wisi-statement-action [1 statement-start 7 statement-end])"
+  (when (eq wisi--parse-action 'navigate)
+    (save-excursion
+      (let ((first-item t)
+           first-keyword-mark
+           (override-start nil)
+           (i 0))
+       (while (< i (length pairs))
+         (let* ((number (1- (aref pairs i)))
+                (region (wisi-tok-region (aref wisi-tokens number)))
+                (token (wisi-tok-token (aref wisi-tokens number)))
+                (class (aref pairs (setq i (1+ i))))
+                (mark (when region (copy-marker (car region) t)))
+                cache)
+
+           (setq i (1+ i))
+
+           (unless
+               (cond
+                ((fboundp 'seq-contains)  ;; emacs < 27
+                   (seq-contains wisi-class-list class))
+                ((fboundp 'seq-contains-p) ;; emacs >= 27
+                 (seq-contains-p wisi-class-list class)))
+             (error "%s not in wisi-class-list" class))
+
+           (if region
+               (progn
+                 (if (setq cache (wisi-get-cache (car region)))
+                     ;; We are processing a previously set non-terminal; ie 
simple_statement in
+                     ;;
+                     ;; statement : label_opt simple_statement
+                     ;;
+                     ;; override nonterm, class, containing
+                     (progn
+                       (setf (wisi-cache-class cache) (or override-start 
class))
+                       (setf (wisi-cache-nonterm cache) wisi-nterm)
+                       (setf (wisi-cache-containing cache) first-keyword-mark)
+                       (if wisi-end-caches
+                           (push (car region) wisi-end-caches)
+                         (setq wisi-end-caches (list (car region)))
+                         ))
+
+                   ;; else create new cache
+                   (with-silent-modifications
+                     (put-text-property
+                      (car region)
+                      (1+ (car region))
+                      'wisi-cache
+                      (wisi-cache-create
+                       :nonterm    wisi-nterm
+                       :token      token
+                       :last       (- (cdr region) (car region))
+                       :class      (or override-start class)
+                       :containing first-keyword-mark)
+                      ))
+                   (if wisi-end-caches
+                       (push (car region) wisi-end-caches)
+                     (setq wisi-end-caches (list (car region)))
+                     ))
+
+                 (when first-item
+                   (setq first-item nil)
+                   (when (or override-start
+                             (eq class 'statement-start))
+                     (setq override-start nil)
+                     (setq first-keyword-mark mark)))
+
+                 (when (eq class 'statement-end)
+                   (wisi-elisp-parse--set-end first-keyword-mark (copy-marker 
(car region) t)))
+                 )
+
+             ;; region is nil when a production is empty; if the first
+             ;; token is a start, override the class on the next token.
+             (when (and first-item
+                        (eq class 'statement-start))
+               (setq override-start class)))
+           ))
+       ))))
+
+(defun wisi-name-action (name)
+  ;; Not wisi-elisp-parse--name-action to simplify grammar files
+  "NAME is a token number; mark that token with the 'wisi-name text property.
+Intended as a grammar action."
+  (when (eq wisi--parse-action 'navigate)
+    (let ((region (wisi-tok-region (aref wisi-tokens (1- name)))))
+      (when region
+       ;; region can be null on an optional or virtual token
+       (with-silent-modifications
+         (put-text-property (car region) (cdr region) 'wisi-name t))
+       ))))
+
+(defun wisi-containing-action (containing-token contained-token)
+  ;; Not wisi-elisp-parse--containing-action to match existing grammar files
+  "Set containing marks in all tokens in CONTAINED-TOKEN
+with null containing mark to marker pointing to CONTAINING-TOKEN.
+If CONTAINING-TOKEN is empty, the next token number is used."
+  (when (eq wisi--parse-action 'navigate)
+    (let* ((containing-tok (aref wisi-tokens (1- containing-token)))
+          (containing-region (wisi-tok-region containing-tok))
+          (contained-tok (aref wisi-tokens (1- contained-token)))
+          (contained-region (wisi-tok-region contained-tok)))
+
+      (unless containing-region
+       (signal 'wisi-parse-error
+               (wisi-error-msg
+                "wisi-containing-action: containing-region '%s' is empty. 
grammar error; bad action"
+                (wisi-tok-token containing-tok))))
+
+      (unless (or (not contained-region) ;; contained-token is empty
+                 (wisi-get-cache (car containing-region)))
+       (signal 'wisi-parse-error
+               (wisi-error-msg
+                "wisi-containing-action: containing-token '%s' has no cache. 
grammar error; missing action"
+                (wisi-token-text (aref wisi-tokens (1- containing-token))))))
+
+      (when contained-region
+         ;; nil when empty production, may not contain any caches
+         (save-excursion
+           (goto-char (cdr contained-region))
+           (let ((cache (wisi-backward-cache))
+                 (mark (copy-marker (car containing-region) t)))
+             (while cache
+
+               ;; skip blocks that are already marked
+               (while (and (>= (point) (car contained-region))
+                           (markerp (wisi-cache-containing cache)))
+                 (goto-char (wisi-cache-containing cache))
+                 (setq cache (wisi-get-cache (point))))
+
+               (if (or (and (= (car containing-region) (car contained-region))
+                            (<= (point) (car contained-region)))
+                       (< (point) (car contained-region)))
+                   ;; done
+                   (setq cache nil)
+
+                 ;; else set mark, loop
+                 (setf (wisi-cache-containing cache) mark)
+                 (setq cache (wisi-backward-cache)))
+               ))))
+      )))
+
+(defun wisi-elisp-parse--match-token (cache tokens start)
+  "Return t if CACHE has id from TOKENS and is at START or has containing 
equal to START.
+point must be at cache token start.
+TOKENS is a vector [number token_id token_id ...].
+number is ignored."
+  (let ((i 1)
+       (done nil)
+       (result nil)
+       token)
+    (when (or (= start (point))
+             (and (wisi-cache-containing cache)
+                  (= start (wisi-cache-containing cache))))
+      (while (and (not done)
+                 (< i (length tokens)))
+       (setq token (aref tokens i))
+       (if (eq token (wisi-cache-token cache))
+           (setq result t
+                 done t)
+         (setq i (1+ i)))
+       ))
+    result))
+
+(defun wisi-motion-action (token-numbers)
+  ;; Not wisi-elisp-parse--motion-action to match existing grammar files
+  "Set prev/next marks in all tokens given by TOKEN-NUMBERS.
+TOKEN-NUMBERS is a vector with each element one of:
+
+number: the token number; mark that token
+
+vector [number token_id]:
+vector [number token_id token_id ...]:
+   mark all tokens in number nonterminal matching token_id with nil prev/next."
+  (when (eq wisi--parse-action 'navigate)
+    (save-excursion
+      (let (prev-keyword-mark
+           prev-cache
+           token
+           start
+           cache
+           mark
+           (i 0))
+       (while (< i (length token-numbers))
+         (let ((token-number (aref token-numbers i))
+               region)
+           (setq i (1+ i))
+           (cond
+            ((numberp token-number)
+             (setq token (aref wisi-tokens (1- token-number)))
+             (setq region (wisi-tok-region token))
+             (when region
+               (unless start (setq start (car region)))
+               (setq cache (wisi-get-cache (car region)))
+               (unless cache (error "no cache on token %d; add to 
statement-action" token-number))
+               (setq mark (copy-marker (car region) t))
+
+               (if prev-keyword-mark
+                   (progn
+                     (setf (wisi-cache-prev cache) prev-keyword-mark)
+                     (setf (wisi-cache-next prev-cache) mark)
+                     (setq prev-keyword-mark mark)
+                     (setq prev-cache cache))
+
+                 ;; else first token; save as prev
+                 (setq prev-keyword-mark mark)
+                 (setq prev-cache cache))
+               ))
+
+            ((vectorp token-number)
+             ;; token-number may contain 1 or more token_ids
+             ;; the corresponding region may be empty
+             ;; there may not have been a prev keyword
+             (setq region (wisi-tok-region (aref wisi-tokens (1- (aref 
token-number 0)))))
+             (when region ;; not an empty token
+               ;; We must search for all targets at the same time, to
+               ;; get the motion order right.
+               (unless start (setq start (car region)))
+               (goto-char (car region))
+               (setq cache (wisi-get-cache (point)))
+               (unless cache (error "no cache at %d; add to statement-action" 
(car region)))
+               (while (< (point) (cdr region))
+                 (when (wisi-elisp-parse--match-token cache token-number start)
+                   (setq mark (copy-marker (point) t))
+
+                   (if prev-keyword-mark
+                       ;; Don't include this token if prev/next
+                       ;; already set by a lower level statement,
+                       ;; such as a nested if/then/elsif/end if.
+                       (when (and (null (wisi-cache-prev cache))
+                                  (null (wisi-cache-next prev-cache)))
+                         (setf (wisi-cache-prev cache) prev-keyword-mark)
+                         (setf (wisi-cache-next prev-cache) mark)
+                         (setq prev-keyword-mark mark)
+                         (setq prev-cache cache))
+
+                     ;; else first token; save as prev
+                     (setq prev-keyword-mark mark)
+                     (setq prev-cache cache)))
+
+                 (setq cache (wisi-forward-cache))
+                 )))
+
+            (t
+             (error "unexpected token-number %s" token-number))
+            )
+
+           ))
+       ))))
+
+;;;; Face grammar actions
+
+(defun wisi-elisp-parse--face-put-cache (region class)
+  "Put a ’wisi-face’ cache with class CLASS on REGION."
+  (when (> wisi-debug 1)
+    (message "face: put cache %s:%s" region class))
+  (with-silent-modifications
+    (put-text-property
+     (car region)
+     (1+ (car region))
+     'wisi-face
+     (wisi-cache-create
+      :last (- (cdr region) (car region))
+      :class class)
+     )))
+
+(defun wisi-face-mark-action (pairs)
+  ;; Not wisi-elisp-parse--face-mark-action to match existing grammar files
+  "PAIRS is a vector of TOKEN CLASS pairs; mark TOKEN (token number)
+as having face CLASS (prefix or suffix).
+Intended as a grammar action."
+  (when (eq wisi--parse-action 'face)
+    (let ((i 0))
+      (while (< i (length pairs))
+       (let ((region (wisi-tok-region (aref wisi-tokens (1- (aref pairs i)))))
+             (class (aref pairs (setq i (1+ i)))))
+         (setq i (1+ i))
+         (when region
+           ;; region can be null on an optional or virtual token
+           (let ((cache (get-text-property (car region) 'wisi-face)))
+             (if cache
+                 ;; previously marked; extend this cache, delete any others
+                 (progn
+                   (with-silent-modifications
+                     (remove-text-properties (+ (car region) (wisi-cache-last 
cache)) (cdr region) '(wisi-face nil)))
+                   (setf (wisi-cache-class cache) class)
+                   (setf (wisi-cache-last cache) (- (cdr region) (car 
region))))
+
+               ;; else not previously marked
+               (wisi-elisp-parse--face-put-cache region class)))
+           ))
+       ))))
+
+(defun wisi-face-remove-action (tokens)
+  ;; Not wisi-elisp-parse--face-remove-action to match existing grammar files
+  "Remove face caches and faces in TOKENS.
+Intended as a grammar action.
+
+TOKENS is a vector of token numbers."
+  (when (eq wisi--parse-action 'face)
+    (let ((i 0))
+      (while (< i (length tokens))
+       (let* ((number (1- (aref tokens i)))
+              (region (wisi-tok-region (aref wisi-tokens number)))
+              face-cache)
+
+         (setq i (1+ i))
+
+         (when region
+           (let ((pos (car region)))
+             (while (< pos (cdr region))
+               (when (setq face-cache (get-text-property pos 'wisi-face))
+                 (when (> wisi-debug 1)
+                   (message "face: remove face %s" (cons pos (+ pos 
(wisi-cache-last face-cache)))))
+                 (with-silent-modifications
+                   (remove-text-properties
+                    pos (+ pos (wisi-cache-last face-cache))
+                    (list
+                     'wisi-face nil
+                     'font-lock-face nil
+                     'fontified t))))
+               (setq pos (next-single-property-change
+                          (+ pos (or (and face-cache
+                                          (wisi-cache-last face-cache))
+                                     0))
+                          'wisi-face nil (cdr region)))
+               )))
+         )))))
+
+(defun wisi-elisp-parse--face-action-1 (face region)
+  "Apply FACE to REGION."
+  (when region
+    (when (> wisi-debug 1)
+      (message "face: add face %s:%s" region face))
+    (with-silent-modifications
+      (add-text-properties
+       (car region) (cdr region)
+       (list
+       'font-lock-face face
+       'fontified t)))
+    ))
+
+(defun wisi-face-apply-action (triples)
+  ;; Not wisi-elisp-parse--face-apply-action to match existing grammar files
+  "Set face information in `wisi-face' text properties of tokens.
+Intended as a grammar non-terminal action.
+
+TRIPLES is a vector of the form [TOKEN-NUMBER PREFIX-FACE SUFFIX-FACE ...]
+
+In the first ’wisi-face’ cache in each token region, apply
+PREFIX-FACE to class PREFIX, SUFFIX-FACE to class SUFFIX, or
+SUFFIX-FACE to all of the token region if there is no ’wisi-face’
+cache."
+  (when (eq wisi--parse-action 'face)
+    (let (number prefix-face suffix-face (i 0))
+      (while (< i (length triples))
+       (setq number (aref triples i))
+       (setq prefix-face (aref triples (setq i (1+ i))))
+       (setq suffix-face (aref triples (setq i (1+ i))))
+       (cond
+        ((integerp number)
+         (let* ((token-region (wisi-tok-region (aref wisi-tokens (1- number))))
+                (pos (car token-region))
+                (j 0)
+                (some-cache nil)
+                cache)
+           (when token-region
+             ;; region can be null for an optional or virtual token
+             (while (< j 2)
+               (setq cache (get-text-property pos 'wisi-face))
+               (cond
+                ((and (not some-cache)
+                      (null cache))
+                 ;; cache is null when applying a face to a token
+                 ;; directly, without first calling
+                 ;; wisi-face-mark-action. Or when there is a
+                 ;; previously applied face in a lower level token,
+                 ;; such as a numeric literal.
+                 (wisi-elisp-parse--face-action-1 suffix-face token-region))
+
+                ((and cache
+                      (eq 'prefix (wisi-cache-class cache)))
+                 (setq some-cache t)
+                 (wisi-elisp-parse--face-action-1 prefix-face 
(wisi-cache-region cache pos)))
+
+                ((and cache
+                      (eq 'suffix (wisi-cache-class cache)))
+                 (setq some-cache t)
+                 (wisi-elisp-parse--face-action-1 suffix-face 
(wisi-cache-region cache pos)))
+
+                (t
+                 ;; don’t apply a face
+                 nil)
+                )
+
+               (setq j (1+ j))
+               (if suffix-face
+                   (setq pos (next-single-property-change (+ 2 pos) 'wisi-face 
nil (cdr token-region)))
+                 (setq j 2))
+               ))))
+
+        (t
+         ;; catch conversion errors from previous grammar syntax
+         (error "wisi-face-apply-action with non-integer token number"))
+        )
+       (setq i (1+ i))
+       ))))
+
+(defun wisi-face-apply-list-action (triples)
+  ;; Not wisi-elisp-parse--face-apply-list-action to match existing grammar 
files
+  "Similar to ’wisi-face-apply-action’, but applies faces to all
+tokens with a `wisi-face' cache in the wisi-tokens[token-number]
+region, and does not apply a face if there are no such caches."
+  (when (eq wisi--parse-action 'face)
+    (let (number token-region face-region prefix-face suffix-face cache (i 0) 
pos)
+      (while (< i (length triples))
+       (setq number (aref triples i))
+       (setq prefix-face (aref triples (setq i (1+ i))))
+       (setq suffix-face (aref triples (setq i (1+ i))))
+       (cond
+        ((integerp number)
+         (setq token-region (wisi-tok-region (aref wisi-tokens (1- number))))
+         (when token-region
+           ;; region can be null for an optional token
+           (setq pos (car token-region))
+           (while (and pos
+                       (< pos (cdr token-region)))
+             (setq cache (get-text-property pos 'wisi-face))
+             (setq face-region (wisi-cache-region cache pos))
+             (cond
+              ((or (null (wisi-cache-class cache))
+                   (eq 'prefix (wisi-cache-class cache)))
+               (wisi-elisp-parse--face-action-1 prefix-face face-region))
+              ((eq 'suffix (wisi-cache-class cache))
+               (wisi-elisp-parse--face-action-1 suffix-face face-region))
+
+              (t
+               (error "wisi-face-apply-list-action: face cache class is not 
prefix or suffix")))
+
+             (setq pos (next-single-property-change (1+ pos) 'wisi-face nil 
(cdr token-region)))
+             )))
+        (t
+         ;; catch conversion errors from previous grammar syntax
+         (error "wisi-face-apply-list-action with non-integer token number"))
+        )
+       (setq i (1+ i))
+       ))))
+
+;;;; indent grammar actions
+
+(defvar wisi-elisp-parse-indent-hanging-function nil
+  "Language-specific implementation of `wisi-hanging', `wisi-hanging%'.
+A function taking args TOK DELTA1 DELTA2 OPTION NO-ACCUMULATE,
+and returning an indent.
+TOK is a `wisi-tok' struct for the token being indented.
+DELTA1, DELTA2 are the indents of the first and following lines
+within the nonterminal.  OPTION is non-nil if action is `wisi-hanging%'.
+point is at start of TOK, and may be moved.")
+(make-variable-buffer-local 'wisi-elisp-parse-indent-hanging-function)
+
+(defvar wisi-token-index nil
+  ;; Not wisi-elisp-parse--token-index for backward compatibility
+  "Index of current token in `wisi-tokens'.
+Let-bound in `wisi-indent-action', for grammar actions.")
+
+(defvar wisi-indent-comment nil
+  ;; Not wisi-elisp-parse--indent-comment for backward compatibility
+  "Non-nil if computing indent for comment.
+Let-bound in `wisi-indent-action', for grammar actions.")
+
+(defun wisi-elisp-parse--apply-int (i delta)
+  "Add DELTA (an integer) to the indent at index I."
+  (let ((indent (aref wisi-elisp-parse--indent i))) ;; reference if list
+
+    (cond
+     ((null indent)
+      (aset wisi-elisp-parse--indent i delta))
+
+     ((integerp indent)
+      (aset wisi-elisp-parse--indent i (+ delta indent)))
+
+     ((listp indent)
+      (cond
+       ((eq 'anchor (car indent))
+       (cond
+        ((null (nth 2 indent))
+         (setf (nth 2 indent) delta))
+
+        ((integerp (nth 2 indent))
+         (setf (nth 2 indent) (+ delta (nth 2 indent))))
+
+        ;; else anchored; not affected by this delta
+        ))
+
+       ((eq 'anchored (car indent))
+       ;; not affected by this delta
+       )))
+
+     (t
+      (error "wisi-elisp-parse--apply-int: invalid form : %s" indent))
+     )))
+
+(defun wisi-elisp-parse--apply-anchored (delta i)
+  "Apply DELTA (an anchored indent) to indent I."
+  ;; delta is from wisi-anchored; ('anchored 1 delta no-accumulate)
+  (let ((indent (aref wisi-elisp-parse--indent i))
+       (accumulate (not (nth 3 delta))))
+
+    (when delta
+      (cond
+       ((null indent)
+       (aset wisi-elisp-parse--indent i (seq-take delta 3)))
+
+       ((integerp indent)
+       (when accumulate
+         (let ((temp (seq-take delta 3)))
+           (setf (nth 2 temp) (+ indent (nth 2 temp)))
+           (aset wisi-elisp-parse--indent i temp))))
+
+       ((and (listp indent)
+            (eq 'anchor (car indent))
+            (or (null (nth 2 indent))
+                (integerp (nth 2 indent))))
+       (when (or (null (nth 2 indent))
+                 accumulate)
+         (let ((temp (seq-take delta 3)))
+           (cond
+            ((null (nth 2 indent))
+             (setf (nth 2 indent) temp))
+
+            (t
+             (setf (nth 2 temp) (+ (nth 2 indent) (nth 2 temp)))
+             (setf (nth 2 indent) temp))))
+         ))
+       ))))
+
+(defun wisi-elisp-parse--indent-null-p (indent)
+  (or (null indent)
+      (and (eq 'anchor (nth 0 indent))
+          (null (nth 2 indent)))))
+
+(defun wisi-elisp-parse--indent-token-1 (line end delta)
+  "Apply indent DELTA to all lines from LINE (a line number) thru END (a 
buffer position)."
+  (let ((i (1- line));; index to wisi-elisp-lexer-line-begin, 
wisi-elisp-parse--indent
+       (paren-first (when (and (listp delta)
+                               (eq 'hanging (car delta)))
+                      (nth 2 delta))))
+
+    (while (<= (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end)
+      (if
+         (and ;; no check for called from wisi--indent-comment;
+              ;; comments within tokens are indented by
+              ;; wisi--indent-token
+              wisi-indent-comment-col-0
+              (= 11 (syntax-class (syntax-after (aref 
(wisi-elisp-lexer-line-begin wisi--lexer) i)))))
+         (wisi-elisp-parse--apply-int i 0)
+       (cond
+        ((integerp delta)
+         (wisi-elisp-parse--apply-int i delta))
+
+        ((listp delta)
+         (cond
+          ((eq 'anchored (car delta))
+           (wisi-elisp-parse--apply-anchored delta i))
+
+          ((eq 'hanging (car delta))
+           ;; from wisi-hanging; delta is ('hanging first-line nest delta1 
delta2 no-accumulate)
+           ;; delta1, delta2 may be anchored
+           (when (or (not (nth 5 delta))
+                     (wisi-elisp-parse--indent-null-p (aref 
wisi-elisp-parse--indent i)))
+             (if (= i (1- (nth 1 delta)))
+                 ;; apply delta1
+                 (let ((delta1 (nth 3 delta)))
+                   (cond
+                    ((integerp delta1)
+                     (wisi-elisp-parse--apply-int i delta1))
+
+                    (t ;; anchored
+                     (wisi-elisp-parse--apply-anchored delta1 i))
+                    ))
+
+               ;; don't apply hanging indent in nested parens.
+               ;; test/ada_mode-parens.adb
+               ;; No_Conditional_Set : constant Ada.Strings.Maps.Character_Set 
:=
+               ;;   Ada.Strings.Maps."or"
+               ;;     (Ada.Strings.Maps.To_Set (' '),
+               (when (= paren-first
+                        (nth 0 (save-excursion (syntax-ppss (aref 
(wisi-elisp-lexer-line-begin wisi--lexer) i)))))
+                 (let ((delta2 (nth 4 delta)))
+                   (cond
+                    ((integerp delta2)
+                     (wisi-elisp-parse--apply-int i delta2))
+
+                    (t ;; anchored
+                     (wisi-elisp-parse--apply-anchored delta2 i))
+                    )))
+               )))
+
+          (t
+           (error "wisi-elisp-parse--indent-token-1: invalid delta: %s" delta))
+          )) ;; listp delta
+
+        (t
+         (error "wisi-elisp-parse--indent-token-1: invalid delta: %s" delta))
+        ))
+      (setq i (1+ i))
+      )))
+
+(defun wisi-elisp-parse--indent-token (tok token-delta)
+  "Add TOKEN-DELTA to all indents in TOK region,"
+  (let ((line (if (wisi-tok-nonterminal tok)
+                 (wisi-tok-first tok)
+               (when (wisi-tok-first tok) (wisi-tok-line tok))))
+       (end (cdr (wisi-tok-region tok))))
+    (when (and line end token-delta)
+      (wisi-elisp-parse--indent-token-1 line end token-delta))))
+
+(defun wisi-elisp-parse--indent-comment (tok comment-delta)
+  "Add COMMENT-DELTA to all indents in comment region following TOK."
+  (let ((line (wisi-tok-comment-line tok))
+       (end (wisi-tok-comment-end tok)))
+    (when (and line end comment-delta)
+      (wisi-elisp-parse--indent-token-1 line end comment-delta))))
+
+(defun wisi-elisp-parse--anchored-1 (tok offset &optional no-accumulate)
+  "Return offset of TOK relative to current indentation + OFFSET.
+For use in grammar indent actions."
+  (when (wisi-tok-region tok)
+    ;; region can be nil when token is inserted by error recovery
+    (let ((pos (car (wisi-tok-region tok)))
+         delta)
+
+      (goto-char pos)
+      (setq delta (+ offset (- (current-column) (current-indentation))))
+      (wisi-elisp-parse--anchored-2
+       (wisi-tok-line tok) ;; anchor-line
+       (if wisi-indent-comment
+          (wisi-tok-comment-end (aref wisi-tokens wisi-token-index))
+        (cdr (wisi-tok-region (aref wisi-tokens wisi-token-index))));; end
+       delta
+       no-accumulate)
+      )))
+
+(defun wisi-elisp-parse--max-anchor (begin-line end)
+  (let ((i (1- begin-line))
+       (max-i (length (wisi-elisp-lexer-line-begin wisi--lexer)))
+       (result 0))
+    (while (and (< i max-i)
+               (<= (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end))
+      (let ((indent (aref wisi-elisp-parse--indent i)))
+       (when (and indent (listp indent))
+         (cond
+          ((eq 'anchor (car indent))
+           (setq result (max result (car (nth 1 indent))))
+           (when (and (nth 2 indent) (listp (nth 2 indent)))
+             (setq result (max result (nth 1 (nth 2 indent))))
+             ))
+          (t ;; anchored
+           (setq result (max result (nth 1 indent))))
+          )))
+      (setq i (1+ i)))
+    result
+    ))
+
+(defun wisi-elisp-parse--anchored-2 (anchor-line end delta no-accumulate)
+  "Set ANCHOR-LINE as anchor, increment anchors thru END, return anchored 
delta."
+  ;; Typically, we use anchored to indent relative to a token buried in a line:
+  ;;
+  ;; test/ada_mode-parens.adb
+  ;; Local_2 : Integer := (1 + 2 +
+  ;;                         3);
+  ;; line starting with '3' is anchored to '('
+  ;;
+  ;; If the anchor is a nonterminal, and the first token in the anchor
+  ;; is also first on a line, we don't need anchored to compute the
+  ;; delta:
+  ;;
+  ;; test/ada_mode-parens.adb
+  ;; Local_5 : Integer :=
+  ;;   (1 + 2 +
+  ;;      3);
+  ;; delta for line starting with '3' can just be '3'.
+  ;;
+  ;; However, in some places we need anchored to prevent later
+  ;; deltas from accumulating:
+  ;;
+  ;; test/ada_mode-parens.adb
+  ;; No_Conditional_Set : constant Ada.Strings.Maps.Character_Set :=
+  ;;   Ada.Strings.Maps."or"
+  ;;     (Ada.Strings.Maps.To_Set (' '),
+  ;;
+  ;; here the function call actual parameter part is indented first
+  ;; by 'name' and later by 'expression'; we use anchored to keep the
+  ;; 'name' delta and ignore the later delta.
+  ;;
+  ;; So we apply anchored whether the anchor token is first or not.
+
+  (let* ((i (1- anchor-line))
+        (indent (aref wisi-elisp-parse--indent i)) ;; reference if list
+        (anchor-id (1+ (wisi-elisp-parse--max-anchor anchor-line end))))
+
+    ;; Set anchor
+    (cond
+     ((or
+       (null indent)
+       (integerp indent))
+      (aset wisi-elisp-parse--indent i (list 'anchor (list anchor-id) indent)))
+
+     ((and (listp indent)
+          (eq 'anchor (car indent)))
+      (push anchor-id (nth 1 indent)))
+
+     ((and (listp indent)
+          (eq 'anchored (car indent)))
+      (aset wisi-elisp-parse--indent i (list 'anchor (list anchor-id) 
(copy-sequence indent))))
+
+     (t
+      (error "wisi-anchored-delta: invalid form in indent: %s" indent)))
+
+    (list 'anchored anchor-id delta no-accumulate)
+    ))
+
+(defun wisi-anchored (token-number offset &optional no-accumulate)
+  ;; Not wisi-elisp-parse--anchored to match existing grammar files
+  "Return offset of token TOKEN-NUMBER in `wisi-tokens'.relative to current 
indentation + OFFSET.
+For use in grammar indent actions."
+  (wisi-elisp-parse--anchored-1 (aref wisi-tokens (1- token-number)) offset 
no-accumulate))
+
+(defun wisi-anchored* (token-number offset)
+  ;; Not wisi-elisp-parse--anchored* to match existing grammar files
+  "If TOKEN-NUMBER token in `wisi-tokens' is first on a line,
+call ’wisi-anchored OFFSET’. Otherwise return 0.
+For use in grammar indent actions."
+  (if (wisi-tok-first (aref wisi-tokens (1- token-number)))
+      (wisi-anchored token-number offset)
+    0))
+
+(defun wisi-anchored*- (token-number offset)
+  ;; Not wisi-elisp-parse--anchored*- to match existing grammar files
+  "If existing indent is zero, and TOKEN-NUMBER token in `wisi-tokens' is 
first on a line,
+call ’wisi-anchored OFFSET’. Otherwise return 0.
+For use in grammar indent actions."
+  (if (wisi-tok-first (aref wisi-tokens (1- token-number)))
+      (wisi-anchored token-number offset t)
+    0))
+
+(defun wisi-elisp-parse--paren-in-anchor-line (anchor-tok offset)
+  "If there is an opening paren containing ANCHOR-TOK in the same line as 
ANCHOR-TOK,
+return OFFSET plus the delta from the line indent to the paren
+position. Otherwise return OFFSET."
+  (let* ((tok-syntax (syntax-ppss (car (wisi-tok-region anchor-tok))))
+        (paren-pos (nth 1 tok-syntax))
+        (anchor-line (wisi-tok-line anchor-tok)))
+
+    (when (and paren-pos ;; in paren
+             (< paren-pos (aref (wisi-elisp-lexer-line-begin wisi--lexer) (1- 
anchor-line))))
+      ;; paren not in anchor line
+      (setq paren-pos nil))
+
+    (if paren-pos
+       (progn
+         (goto-char paren-pos)
+         (+ 1 (- (current-column) (current-indentation)) offset))
+      offset)
+    ))
+
+(defun wisi-anchored% (token-number offset &optional no-accumulate)
+  ;; Not wisi-elisp-parse--anchored% to match existing grammar files
+  "Return either an anchor for the current token at OFFSET from an enclosing 
paren on
+the line containing TOKEN-NUMBER, or OFFSET.
+For use in grammar indent actions."
+  (let* ((indent-tok (aref wisi-tokens wisi-token-index))
+        ;; indent-tok is a nonterminal; this function makes no sense for 
terminals
+        (anchor-tok (aref wisi-tokens (1- token-number))))
+
+    (wisi-elisp-parse--anchored-2
+     (wisi-tok-line anchor-tok)
+
+     (if wisi-indent-comment
+        (wisi-tok-comment-end indent-tok)
+       (cdr (wisi-tok-region indent-tok))) ;; end
+
+     (wisi-elisp-parse--paren-in-anchor-line anchor-tok offset)
+     no-accumulate)
+    ))
+
+(defun wisi-anchored%- (token-number offset)
+  ;; Not wisi-elisp-parse--anchored%- to match existing grammar files
+  "If existing indent is zero, anchor the current token at OFFSET
+from the first token on the line containing TOKEN-NUMBER in `wisi-tokens'.
+Return the delta.
+For use in grammar indent actions."
+  (wisi-anchored% token-number offset t))
+
+(defun wisi-elisp-parse--hanging-1 (delta1 delta2 option no-accumulate)
+  "If OPTION is nil, implement `wisi-hanging'; otherwise `wisi-hanging%'."
+  (let ((tok (aref wisi-tokens wisi-token-index)))
+    ;; tok is a nonterminal; this function makes no sense for terminals
+    ;; syntax-ppss moves point to start of tok
+
+    (cond
+     ((functionp wisi-elisp-parse-indent-hanging-function)
+      (funcall wisi-elisp-parse-indent-hanging-function tok delta1 delta2 
option no-accumulate))
+
+     (t
+      (let ((tok-syntax (syntax-ppss (car (wisi-tok-region tok))))
+           (first-tok-first-on-line
+            ;; first token in tok is first on line
+            (and (numberp (wisi-tok-first tok))
+                 (= (wisi-tok-line tok) (wisi-tok-first tok)))))
+       (list 'hanging
+             (wisi-tok-line tok) ;; first line of token
+             (nth 0 tok-syntax) ;; paren nest level at tok
+             delta1
+             (if (or (not option) first-tok-first-on-line)
+                 delta2
+               delta1)
+             no-accumulate))
+      ))
+    ))
+
+(defun wisi-hanging (delta1 delta2)
+  ;; Not wisi-elisp-parse--hanging to match existing grammar files
+  "Use DETLA1 for first line, DELTA2 for following lines.
+For use in grammar indent actions."
+  (wisi-elisp-parse--hanging-1 delta1 delta2 nil nil))
+
+(defun wisi-hanging% (delta1 delta2)
+  ;; Not wisi-elisp-parse--hanging% to match existing grammar files
+  "If first token is first in line, use DETLA1 for first line, DELTA2 for 
following lines.
+Otherwise use DELTA1 for all lines.
+For use in grammar indent actions."
+  (wisi-elisp-parse--hanging-1 delta1 delta2 t nil))
+
+(defun wisi-hanging%- (delta1 delta2)
+  ;; Not wisi-elisp-parse--hanging%- to match existing grammar files
+  "If existing indent is non-zero, do nothing.
+Else if first token is first in line, use DETLA1 for first line,
+DELTA2 for following lines.  Otherwise use DELTA1 for all lines.
+For use in grammar indent actions."
+  (wisi-elisp-parse--hanging-1 delta1 delta2 t t))
+
+(defun wisi-elisp-parse--indent-offset (token offset)
+  "Return offset from beginning of first token on line containing TOKEN,
+   to beginning of TOKEN, plus OFFSET."
+  (save-excursion
+    (goto-char (aref (wisi-elisp-lexer-line-begin wisi--lexer) (1- 
(wisi-tok-line token))))
+    (back-to-indentation)
+    (+ offset (- (car (wisi-tok-region token)) (point)))
+    ))
+
+(defun wisi-elisp-parse--indent-compute-delta (delta tok)
+  "Return evaluation of DELTA."
+  (cond
+   ((integerp delta)
+    delta)
+
+   ((symbolp delta)
+    (symbol-value delta))
+
+   ((vectorp delta)
+    ;; [token comment]
+    ;; if wisi-indent-comment, we are indenting the comments of the
+    ;; previous token; they should align with the 'token' delta.
+    (wisi-elisp-parse--indent-compute-delta (aref delta 0) tok))
+
+   (t ;; form
+    (cond
+     ((eq 'anchored (car delta))
+      delta)
+
+     (t
+      (save-excursion
+       (goto-char (car (wisi-tok-region tok)))
+       (eval delta)))))
+   ))
+
+(defun wisi-indent-action (deltas)
+  ;; Not wisi-elisp-parse--indent-action to match existing grammar files
+  "Accumulate `wisi--indents' from DELTAS.
+DELTAS is a vector; each element can be:
+- an integer
+- a symbol
+- a lisp form
+- a vector.
+
+The first three are evaluated to give an integer delta. A vector must
+have two elements, giving the code and following comment
+deltas. Otherwise the comment delta is the following delta in
+DELTAS."
+  (when (eq wisi--parse-action 'indent)
+    (dotimes (wisi-token-index (length wisi-tokens))
+      (let* ((tok (aref wisi-tokens wisi-token-index))
+            (token-delta (aref deltas wisi-token-index))
+            (comment-delta
+             (cond
+              ((vectorp token-delta)
+               (aref token-delta 1))
+
+              ((< wisi-token-index (1- (length wisi-tokens)))
+               (aref deltas (1+ wisi-token-index)))
+              )))
+       (when (wisi-tok-region tok)
+         ;; region is null when optional nonterminal is empty
+         (let ((wisi-indent-comment nil))
+           (setq token-delta
+                 (when (and token-delta
+                            (wisi-tok-first tok))
+                   (wisi-elisp-parse--indent-compute-delta token-delta tok)))
+
+           (when token-delta
+             (wisi-elisp-parse--indent-token tok token-delta))
+
+           (setq wisi-indent-comment t)
+           (setq comment-delta
+                 (when (and comment-delta
+                            (wisi-tok-comment-line tok))
+                   (wisi-elisp-parse--indent-compute-delta comment-delta tok)))
+
+           (when comment-delta
+             (wisi-elisp-parse--indent-comment tok comment-delta))
+           )
+         )))))
+
+(defun wisi-indent-action* (n deltas)
+  ;; Not wisi-elisp-parse--indent-action* to match existing grammar files
+  "If any of the first N tokens in `wisi-tokens' is first on a line,
+call `wisi-indent-action' with DELTAS.  Otherwise do nothing."
+  (when (eq wisi--parse-action 'indent)
+    (let ((done nil)
+         (i 0)
+         tok)
+      (while (and (not done)
+                 (< i n))
+       (setq tok (aref wisi-tokens i))
+       (setq i (1+ i))
+       (when (and (wisi-tok-region tok)
+                  (wisi-tok-first tok))
+         (setq done t)
+         (wisi-indent-action deltas))
+       ))))
+
+;;;; non-grammar indent functions
+
+(defconst wisi-elisp-parse--max-anchor-depth 20) ;; IMRPOVEME: can compute in 
actions
+
+(defun wisi-elisp-parse--indent-leading-comments ()
+  "Set `wisi-elisp-parse--indent to 0 for comment lines before first token in 
buffer.
+Leave point at first token (or eob)."
+  (save-excursion
+    (goto-char (point-min))
+    (forward-comment (point-max))
+    (let ((end (point))
+         (i 0)
+         (max-i (length wisi-elisp-parse--indent)))
+      (while (and (< i max-i)
+                 (< (aref (wisi-elisp-lexer-line-begin wisi--lexer) i) end))
+       (aset wisi-elisp-parse--indent i 0)
+       (setq i (1+ i)))
+      )))
+
+(defun wisi-elisp-parse--resolve-anchors ()
+  (let ((anchor-indent (make-vector wisi-elisp-parse--max-anchor-depth 0))
+       pos)
+
+    (dotimes (i (length wisi-elisp-parse--indent))
+      (let ((indent (aref wisi-elisp-parse--indent i)))
+
+       (cond
+        ((or (null indent)
+             (integerp indent)))
+
+        ((listp indent)
+         (let ((anchor-ids (nth 1 indent))
+               (indent2 (nth 2 indent)))
+           (cond
+            ((eq 'anchor (car indent))
+             (cond
+              ((null indent2))
+
+              ((integerp indent2)
+               (dotimes (i (length anchor-ids))
+                 (aset anchor-indent (nth i anchor-ids) indent2))
+               (setq indent indent2))
+
+              ((listp indent2) ;; 'anchored
+               (setq indent (+ (aref anchor-indent (nth 1 indent2)) (nth 2 
indent2)))
+
+               (dotimes (i (length anchor-ids))
+                 (aset anchor-indent (nth i anchor-ids) indent)))
+
+              (t
+               (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
+              ));; 'anchor
+
+            ((eq 'anchored (car indent))
+             (setq indent (+ (aref anchor-indent (nth 1 indent)) indent2)))
+
+            (t
+             (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
+            )));; listp indent
+
+        (t
+         (error "wisi-indent-region: invalid form in wisi-ind-indent %s" 
indent))
+        );; cond indent
+
+       (when (> i 0)
+         (setq pos (aref (wisi-elisp-lexer-line-begin wisi--lexer) i))
+         (with-silent-modifications
+           (put-text-property (1- pos) pos 'wisi-indent indent)))
+       )) ;; dotimes lines
+
+    ))
+
+(provide 'wisi-elisp-parse)
+;;; wisi-elisp-parse.el ends here
diff --git a/packages/wisi/wisi-parse-common.el 
b/packages/wisi/wisi-parse-common.el
index bb559a6..895e899 100644
--- a/packages/wisi/wisi-parse-common.el
+++ b/packages/wisi/wisi-parse-common.el
@@ -61,11 +61,39 @@ for the language-specific parser options."
 
 (cl-defgeneric wisi-parse-expand-region ((parser wisi-parser) begin end)
   "Return a cons SEND-BEGIN . SEND-END that is an expansion of
-region BEGIN END that starts at a valid parse start point,
-contains END, and ends at a point the parser can handle
-gracefully."
+region BEGIN END that starts and ends at points the parser can
+handle gracefully."
   (cons begin end))
 
+(defun wisi-search-backward-skip (regexp skip-p)
+  "Search backward for REGEXP. If SKIP-P returns non-nil, search again.
+SKIP-P is a function taking no parameters.
+Return nil if no match found before bob."
+  (let ((maybe-found-p (search-backward-regexp regexp nil t)))
+    (while (and maybe-found-p
+               (funcall skip-p)
+               (setq maybe-found-p (search-backward-regexp regexp nil t))))
+    maybe-found-p))
+
+(defun wisi-search-forward-skip (regexp skip-p)
+  "Search forward for REGEXP. If SKIP-P returns non-nil, search again.
+SKIP-P is a function taking no parameters.
+Return nil if no match found before eob."
+  (let ((maybe-found-p (search-forward-regexp regexp nil t)))
+    (while (and maybe-found-p
+               (funcall skip-p)
+               (setq maybe-found-p (search-forward-regexp regexp nil t))))
+    maybe-found-p))
+
+(defun wisi-show-expanded-region ()
+  "For debugging. Expand currently selected region."
+  (interactive)
+  (let ((region (wisi-parse-expand-region wisi--parser (region-beginning) 
(region-end))))
+    (message "pre (%d . %d) post %s" (region-beginning) (region-end) region)
+    (set-mark (car region))
+    (goto-char (cdr region))
+    ))
+
 (cl-defgeneric wisi-parse-adjust-indent ((parser wisi-parser) indent _repair)
   "Adjust INDENT for REPAIR (a wisi--parse-error-repair struct). Return new 
indent."
   indent)
@@ -101,7 +129,7 @@ For use in grammar actions.")
 
   containing
   ;; Marker at the start of the containing statement for this token.
-  ;; nil only for first token in buffer
+  ;; nil for outermost containing.
 
   prev ;; marker at previous motion token in statement; nil if none
   next ;; marker at next motion token in statement; nil if none
@@ -201,15 +229,6 @@ value from grammar file."
   :safe 'integerp)
 (make-variable-buffer-local 'wisi-mckenzie-task-count)
 
-(defcustom wisi-mckenzie-cost-limit nil
-  "If integer, sets McKenzie error recovery algorithm cost limit.
-Higher value has more recover power, but takes longer.  If nil,
-uses value from grammar file."
-  :type 'integer
-  :group 'wisi
-  :safe 'integerp)
-(make-variable-buffer-local 'wisi-mckenzie-cost-limit)
-
 (defcustom wisi-mckenzie-check-limit nil
   "If integer, sets McKenzie error recovery algorithm token check limit.
 This sets the number of tokens past the error point that must be
@@ -232,11 +251,14 @@ If nil, uses value from grammar file."
   :safe 'integerp)
 (make-variable-buffer-local 'wisi-mckenzie-enqueue-limit)
 
-(defvar wisi-parse-max-parallel 15
+(defcustom wisi-parse-max-parallel 15
   "Maximum number of parallel parsers during regular parsing.
 Parallel parsers are used to resolve redundancy in the grammar.
 If a file needs more than this, it's probably an indication that
-the grammar is excessively redundant.")
+the grammar is excessively redundant."
+  :type 'integer
+  :group 'wisi
+  :safe 'integerp)
 
 (defvar wisi-parse-max-stack-size 500
   "Maximum parse stack size.
@@ -263,7 +285,6 @@ Normally set from a language-specific option.")
 
 (defconst wisi-class-list
   [motion ;; motion-action
-   name ;; for which-function
    statement-end
    statement-override
    statement-start
diff --git a/packages/wisi/wisi-process-parse.el 
b/packages/wisi/wisi-process-parse.el
index 154b75f..d941781 100644
--- a/packages/wisi/wisi-process-parse.el
+++ b/packages/wisi/wisi-process-parse.el
@@ -26,22 +26,24 @@
   "Options for Wisi package."
   :group 'programming)
 
-(defcustom wisi-process-time-out 1.0
+(defcustom wisi-process-time-out 5.0
   "Time out waiting for parser response. An error occurs if there
-  is no response from the parser after waiting this amount 5
-  times."
+  is no response from the parser after waiting this amount (in
+  seconds)."
   :type 'float
   :safe 'floatp)
 (make-variable-buffer-local 'wisi-process-time-out)
 
+(defconst wisi-process-parse-protocol-version "3"
+  "Defines data exchanged between this package and the background process.
+Must match emacs_wisi_common_parse.ads Protocol_Version.")
+
 (defconst wisi-process-parse-prompt "^;;> "
   "Regexp matching executable prompt; indicates previous command is complete.")
 
 (defconst wisi-process-parse-quit-cmd "004quit\n"
   "Command to external process telling it to quit.")
 
-(defvar wisi-process-parse-debug 0)
-
 ;;;;; sessions
 
 ;; The executable builds internal parser structures on startup,
@@ -54,6 +56,7 @@
 
 (cl-defstruct (wisi-process--parser (:include wisi-parser))
   (label nil)             ;; string uniquely identifying parser
+  language-protocol-version ;; string identifying language-specific params
   (exec-file nil)        ;; absolute file name of executable
   (exec-opts nil)         ;; list of process start options for executable
   (token-table nil)       ;; vector of token symbols, indexed by integer
@@ -65,6 +68,7 @@
   (total-wait-time 0.0)   ;; total time during last parse spent waiting for 
subprocess output.
   (response-count 0)      ;; responses received from subprocess during last 
parse; for profiling.
   end-pos                 ;; last character position parsed
+  language-action-table   ;; array of function pointers, each taking an sexp 
sent by the process
   )
 
 (defvar wisi-process--alist nil
@@ -93,6 +97,24 @@ Otherwise add PARSER to ‘wisi-process--alist’, return it."
       (wisi-parse-kill parser)
       (setf (wisi-process--parser-exec-file parser) exec-file))))
 
+(defun wisi-process-parse--check-version (parser)
+  "Verify protocol version reported by process."
+  ;; The process has just started; the first non-comment line in the
+  ;; process buffer contains the process and language protocol versions.
+  (with-current-buffer (wisi-process--parser-buffer parser)
+    (goto-char (point-min))
+    (search-forward-regexp "protocol: process version \\([0-9]+\\) language 
version \\([0-9]+\\)")
+    (unless (and (match-string 1)
+                (string-equal (match-string 1) 
wisi-process-parse-protocol-version)
+                (match-string 2)
+                (string-equal (match-string 2) 
(wisi-process--parser-language-protocol-version parser)))
+      (wisi-parse-kill parser)
+      (error "%s parser process protocol version mismatch: elisp %s %s, 
process %s %s"
+            (wisi-process--parser-label parser)
+            wisi-process-parse-protocol-version 
(wisi-process--parser-language-protocol-version parser)
+            (match-string 1) (match-string 2)))
+    ))
+
 (defun wisi-process-parse--require-process (parser)
   "Start the process for PARSER if not already started."
   (unless (process-live-p (wisi-process--parser-process parser))
@@ -108,26 +130,17 @@ Otherwise add PARSER to ‘wisi-process--alist’, return it."
        (erase-buffer)); delete any previous messages, prompt
 
       (setf (wisi-process--parser-process parser)
-           (if (fboundp 'make-process)
-               ;; emacs >= 25
-               (make-process
-                :name process-name
-                :buffer (wisi-process--parser-buffer parser)
-                :command (append (list (wisi-process--parser-exec-file parser))
-                                 (wisi-process--parser-exec-opts parser)))
-             ;; emacs < 25
-             (start-process
-              process-name
-              (wisi-process--parser-buffer parser)
-              (wisi-process--parser-exec-file parser)
-              (wisi-process--parser-exec-opts parser)
-              )))
+           (make-process
+            :name process-name
+            :buffer (wisi-process--parser-buffer parser)
+            :command (append (list (wisi-process--parser-exec-file parser))
+                             (wisi-process--parser-exec-opts parser))))
 
       (set-process-query-on-exit-flag (wisi-process--parser-process parser) 
nil)
       (setf (wisi-process--parser-busy parser) nil)
 
-      ;; IMPROVEME: check protocol and version numbers
       (wisi-process-parse--wait parser)
+      (wisi-process-parse--check-version parser)
       )))
 
 (defun wisi-process-parse--wait (parser)
@@ -145,16 +158,9 @@ Otherwise add PARSER to ‘wisi-process--alist’, return it."
                    (not (setq found (re-search-forward 
wisi-process-parse-prompt (point-max) t)))))
        (setq search-start (point));; don't search same text again
        (setq wait-count (1+ wait-count))
-       (when (> wisi-process-parse-debug 0)
-           (message "wisi-process-parse--wait: %d" wait-count))
        (accept-process-output process 0.1))
 
-      (if found
-         (when (> wisi-process-parse-debug 0)
-           (message "wisi-process-parse--wait: %d" wait-count)
-           (when (> wisi-process-parse-debug 2)
-             (message "'%s'" (buffer-substring-no-properties (point-min) 
(point-max)))))
-
+      (unless found
        (wisi-process-parse-show-buffer parser)
        (error "%s process died" (wisi-process--parser-exec-file parser)))
       )))
@@ -193,17 +199,15 @@ parse region."
                      wisi-trace-mckenzie
                      wisi-trace-action
                      (if wisi-mckenzie-disable 1 0)
-                     (if wisi-mckenzie-task-count wisi-mckenzie-task-count -1)
-                     (if wisi-mckenzie-cost-limit wisi-mckenzie-cost-limit -1)
-                     (if wisi-mckenzie-check-limit wisi-mckenzie-check-limit 
-1)
-                     (if wisi-mckenzie-enqueue-limit 
wisi-mckenzie-enqueue-limit -1)
+                     (or wisi-mckenzie-task-count -1)
+                     (or wisi-mckenzie-check-limit -1)
+                     (or wisi-mckenzie-enqueue-limit -1)
+                     (or wisi-parse-max-parallel -1)
                      (- (position-bytes send-end) (position-bytes begin)) ;; 
send-end is after last byte
                      (wisi-parse-format-language-options parser)
                      ))
         (msg (format "%03d%s" (length cmd) cmd))
         (process (wisi-process--parser-process parser)))
-    (when (> wisi-process-parse-debug 0)
-      (message msg))
     (with-current-buffer (wisi-process--parser-buffer parser)
       (erase-buffer))
 
@@ -221,8 +225,6 @@ complete."
   (let* ((cmd (format "noop %d" (1- (position-bytes (point-max)))))
         (msg (format "%03d%s" (length cmd) cmd))
         (process (wisi-process--parser-process parser)))
-    (when (> wisi-process-parse-debug 0)
-      (message msg))
     (with-current-buffer (wisi-process--parser-buffer parser)
       (erase-buffer))
 
@@ -254,6 +256,13 @@ complete."
        )))
     ))
 
+(defun wisi-process-parse--Name_Property (parser sexp)
+  ;; sexp is [Name_Property first-pos last-pos]
+  ;; see ‘wisi-process-parse--execute’
+  ;; implements wisi-name-action
+  (with-silent-modifications
+    (put-text-property (aref sexp 1) (1+ (aref sexp 2)) 'wisi-name t)))
+
 (defun wisi-process-parse--Face_Property (parser sexp)
   ;; sexp is [Face_Property first-pos last-pos face-index]
   ;; see ‘wisi-process-parse--execute’
@@ -366,6 +375,10 @@ complete."
   ;; see ‘wisi-process-parse--execute’
   (setf (wisi-process--parser-end-pos parser) (aref sexp 1)))
 
+(defun wisi-process-parse--Language (parser sexp)
+  ;; sexp is [Language language-action ...]
+  (funcall (aref (wisi-process--parser-language-action-table parser) (aref 
sexp 1)) sexp))
+
 (defun wisi-process-parse--execute (parser sexp)
   "Execute encoded SEXP sent from external process."
   ;; sexp is [action arg ...]; an encoded instruction that we need to execute
@@ -379,6 +392,8 @@ complete."
   ;;    length        : integer character count
   ;;    class         : integer index into wisi-class-list
   ;;
+  ;; [Name_Property first-pos last-pos]
+  ;;
   ;; [Face_Property first-pos last-pos face-index]
   ;;    Set a font-lock-face text-property
   ;;    face-index: integer index into parser-elisp-face-table
@@ -418,6 +433,10 @@ complete."
   ;;    Args are token ids; index into parser-token-table. Save the information
   ;;    for later use by ’wisi-repair-error’.
   ;;
+  ;; [Language ...]
+  ;;    Dispatch to a language-specific action, via
+  ;;    `wisi-process--parser-language-action-table'.
+  ;;
   ;;
   ;; Numeric action codes are given in the case expression below
 
@@ -430,6 +449,8 @@ complete."
     (6  (wisi-process-parse--Check_Error parser sexp))
     (7  (wisi-process-parse--Recover parser sexp))
     (8  (wisi-process-parse--End parser sexp))
+    (9  (wisi-process-parse--Name_Property parser sexp))
+    (10 (wisi-process-parse--Language parser sexp))
     ))
 
 ;;;;; main
@@ -462,14 +483,14 @@ Send BEGIN thru SEND-END to external parser."
   ;; wisi-indent-region, we signal an error here.
   (if (wisi-process--parser-busy parser)
       (progn
-       (setf (wisi-parser-parse-errors parser)
+       (setf (wisi-parser-parse-errors parser)
              (list
               (make-wisi--parse-error
                :pos 0
                :message (format "%s:%d:%d: parser busy (try 
’wisi-kill-parser’)"
                                 (if (buffer-file-name) (file-name-nondirectory 
(buffer-file-name)) "") 1 1))
               ))
-       (error "%s parse abandoned; parser busy" wisi--parse-action)
+       (error "%s parse abandoned; parser busy - use partial parse?" 
wisi--parse-action)
        )
 
     ;; It is not possible for a background elisp function (ie
@@ -487,7 +508,6 @@ Send BEGIN thru SEND-END to external parser."
               response-end
               (response-count 0)
               (sexp-start (point-min))
-              (wait-count 0)
               (need-more nil) ;; point-max if need more, to check for new input
               (done nil)
               start-wait-time)
@@ -568,6 +588,9 @@ Send BEGIN thru SEND-END to external parser."
 
                     ((equal 'parse_error (car response))
                      ;; Parser detected some other error non-fatal error, so 
signal it.
+                     (push
+                        (make-wisi--parse-error :pos 0 :message (cadr 
response))
+                        (wisi-parser-parse-errors parser))
                      (signal 'wisi-parse-error (cdr response)))
 
                     ((and (eq 'error (car response))
@@ -596,12 +619,13 @@ Send BEGIN thru SEND-END to external parser."
                       (push (make-wisi--parse-error :pos (point) :message 
(cadr err)) (wisi-parser-parse-errors parser))
                       (signal (car err) (cdr err)))
 
-                     (error ;; ie from [C:\Windows\system32\KERNEL32.DLL]
+                     (error ;; ie from [C:\Windows\system32\KERNEL32.DLL], or 
bug in action code above.
                       (set-buffer response-buffer)
                       (let ((content (buffer-substring-no-properties 
(point-min) (point-max)))
                             (buf-name (concat (buffer-name) "-save-error")))
                         (set-buffer (get-buffer-create buf-name))
                         (insert content)
+                        (insert (format "%s" err))
                         (error "parser failed; error messages in %s" 
buf-name)))
                      ))
                   )
@@ -626,7 +650,6 @@ Send BEGIN thru SEND-END to external parser."
                  (insert content)
                  (error "parser failed; error messages in %s" buf-name)))
 
-             (setq wait-count (1+ wait-count))
              (setq start-wait-time (float-time))
 
              ;; If we specify no time-out here, we get messages about
@@ -646,7 +669,7 @@ Send BEGIN thru SEND-END to external parser."
                       (- (float-time) start-wait-time)))
 
              (when (and (= (point-max) need-more)
-                        (> wait-count 5))
+                        (> (wisi-process--parser-total-wait-time parser) 
wisi-process-time-out))
                (error "wisi-process-parse not getting more text (or bad syntax 
in process output)"))
 
              (setq need-more nil))
diff --git a/packages/wisi/wisi-run-indent-test.el 
b/packages/wisi/wisi-run-indent-test.el
new file mode 100644
index 0000000..ce5b355
--- /dev/null
+++ b/packages/wisi/wisi-run-indent-test.el
@@ -0,0 +1,300 @@
+;;; wisi-run-indent-test.el --- utils for automating indentation and casing 
tests
+;;
+;; Copyright (C) 2018 - 2019  Free Software Foundation, Inc.
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+(require 'wisi-tests)
+
+;; user can set these to t in an EMACSCMD
+(defvar skip-cmds nil)
+(defvar skip-reindent-test nil)
+(defvar skip-recase-test nil)
+(defvar skip-write nil)
+
+(defun test-in-comment-p ()
+  (nth 4 (syntax-ppss)))
+
+(defun test-face (token face)
+  "Test if all of TOKEN in next code line has FACE.
+FACE may be a list."
+  (save-excursion
+    (when (test-in-comment-p)
+      (beginning-of-line); forward-comment doesn't move if inside a comment!
+      (forward-comment (point-max)))
+    (condition-case err
+       (search-forward token (line-end-position 5))
+      (error
+       (error "can't find '%s'" token)))
+
+    (save-match-data
+      (wisi-validate-cache (line-beginning-position 0) (line-end-position 5) 
nil 'face))
+
+    ;; We don't use face-at-point, because it doesn't respect
+    ;; font-lock-face set by the parser! And we want to check for
+    ;; conflicts between font-lock-keywords and the parser.
+
+    ;; font-lock-keywords sets 'face property, parser sets 'font-lock-face.
+
+    ;; In emacs < 27, if we use (get-text-property (point) 'face), we
+    ;; also get 'font-lock-face, but not vice-versa. So we have to use
+    ;; text-properties-at to check for both.
+    (let* ((token (match-string 0))
+          (props (text-properties-at (match-beginning 0)))
+          key
+          token-face)
+
+      (cond
+       ((plist-get props 'font-lock-face)
+       (setq key 'font-lock-face)
+       (setq token-face (plist-get props 'font-lock-face)))
+
+       ((plist-get props 'face)
+       (setq key 'face)
+       (setq token-face (plist-get props 'face)))
+       )
+
+      (when (and (memq 'font-lock-face props)
+                (memq 'face props))
+       (describe-text-properties (match-beginning 0))
+       (error "mixed font-lock-keyword and parser faces for '%s'" token))
+
+      (unless (not (text-property-not-all 0 (length token) key token-face 
token))
+       (error "mixed faces, expecting %s for '%s'" face token))
+
+      (unless (or (and (listp face)
+                      (memq token-face face))
+                 (eq token-face face))
+       (error "found face %s, expecting %s for '%s'" token-face face token))
+    )))
+
+(defun test-face-1 (search token face)
+  "Move to end of comment, search for SEARCH, call `test-face'."
+  (save-excursion
+    (when (test-in-comment-p)
+      (beginning-of-line); forward-comment doesn't move if inside a comment!
+      (forward-comment (point-max)))
+    (search-forward search)
+    (test-face token face)
+    ))
+
+(defun test-cache-class (token class)
+  "Test if TOKEN in next code line has wisi-cache with class CLASS."
+  (save-excursion
+    (wisi-validate-cache (line-beginning-position 0) (line-end-position 3) nil 
'navigate)
+    (beginning-of-line); forward-comment doesn't move if inside a comment!
+    (forward-comment (point-max))
+    (condition-case err
+       (search-forward token (line-end-position 5))
+      (error
+       (error "can't find '%s'" token)))
+
+    (let ((cache (get-text-property (match-beginning 0) 'wisi-cache)))
+
+      (unless cache (error "no cache"))
+      (unless (eq (wisi-cache-class cache) class)
+       (error "expecting class %s, found '%s'" class (wisi-cache-class cache)))
+    )))
+
+(defun test-cache-containing (containing contained)
+  "Test if CONTAINING in next code line has wisi-cache with that contains 
CONTAINED."
+  (save-excursion
+    (wisi-validate-cache (line-beginning-position 0) (line-end-position 3) nil 
'navigate)
+    (beginning-of-line)
+    (forward-comment (point-max))
+    (let (containing-pos contained-cache)
+      (condition-case err
+         (search-forward containing (line-end-position 5))
+       (error
+        (error "can't find '%s'" containing)))
+      (setq containing-pos (match-beginning 0))
+
+      (condition-case err
+         (search-forward contained (line-end-position 5))
+       (error
+        (error "can't find '%s'" contained)))
+      (setq contained-cache (get-text-property (match-beginning 0) 
'wisi-cache))
+
+      (unless contained-cache (error "no cache on %s" contained))
+      (unless (= containing-pos (wisi-cache-containing contained-cache))
+       (error "expecting %d, got %d" containing-pos (wisi-cache-containing 
contained-cache)))
+    )))
+
+(defun run-test-here ()
+  "Run an indentation and casing test on the current buffer."
+  (interactive)
+  (setq indent-tabs-mode nil)
+  (setq jit-lock-context-time 0.0);; for test-face
+
+  (let ((error-count 0)
+       (test-buffer (current-buffer))
+       cmd-line
+       last-result last-cmd expected-result)
+    ;; Look for EMACS* comments in the file:
+    ;;
+    ;; EMACSCMD: <form>
+    ;;    Executes the lisp form inside a save-excursion, saves the result as 
a lisp object.
+    ;;
+    ;; EMACSRESULT: <form>
+    ;;    point is moved to end of line, <form> is evaluated inside
+    ;;    save-excursion and compared (using `equal') with the result
+    ;;    of the previous EMACSCMD, and the test fails if they don't
+    ;;    match.
+    ;;
+    ;; EMACS_SKIP_UNLESS: <form>
+    ;;   skip entire test if form evals nil
+    ;;
+    ;; EMACSDEBUG: <form>
+    ;;    Eval form, display result. Also used for setting breakpoint.
+
+    (goto-char (point-min))
+    (while (and (not skip-cmds)
+               (re-search-forward (concat comment-start "EMACS\\([^:]+\\):") 
nil t))
+      (cond
+       ((string= (match-string 1) "CMD")
+       (looking-at ".*$")
+       (save-excursion
+         (setq cmd-line (line-number-at-pos)
+               last-cmd (match-string 0)
+               last-result
+               (condition-case-unless-debug err
+                   (eval (car (read-from-string last-cmd)))
+                 (error
+                    (setq error-count (1+ error-count))
+                    (message "%s:%d: command: %s"
+                             (buffer-file-name) cmd-line last-cmd)
+                    (message "%s:%d: %s: %s"
+                             (buffer-file-name)
+                             (line-number-at-pos)
+                             (car err)
+                             (cdr err))))
+               )
+         ;; save-excursion does not preserve mapping of buffer to
+         ;; window, but some tests depend on that. For example,
+         ;; execute-kbd-macro doesn’t work properly if current buffer
+         ;; is not visible..
+         (pop-to-buffer test-buffer)))
+
+       ((string= (match-string 1) "RESULT")
+       (looking-at ".*$")
+       (setq expected-result (save-excursion (end-of-line 1) (eval (car 
(read-from-string (match-string 0))))))
+       (unless (equal expected-result last-result)
+         (when debug-on-error (debug))
+         (setq error-count (1+ error-count))
+         (message
+          (concat
+           (format "error: %s:%d:\n" (buffer-file-name) (line-number-at-pos))
+           (format "Result of '%s' does not match.\nGot    '%s',\nexpect '%s'"
+                   last-cmd
+                   last-result
+                   expected-result)
+           ))))
+
+       ((string= (match-string 1) "_SKIP_UNLESS")
+       (looking-at ".*$")
+       (unless (eval (car (read-from-string (match-string 0))))
+         (setq skip-cmds t)
+         (setq skip-reindent-test t)
+         (setq skip-recase-test t)
+         ;; We don’t set ‘skip-write’ t here, so the *.diff Make target 
succeeds.
+         ))
+
+       ((string= (match-string 1) "DEBUG")
+       (looking-at ".*$")
+       (message "DEBUG: %s:%d %s"
+                (current-buffer)
+                (line-number-at-pos)
+                (save-excursion
+                 (eval (car (read-from-string (match-string 0)))))))
+
+       (t
+       (setq error-count (1+ error-count))
+       (error (concat "Unexpected EMACS test command " (match-string 1))))))
+
+    (when (> error-count 0)
+      (error
+       "%s:%d: aborting due to previous errors (%d)"
+       (buffer-file-name) (line-number-at-pos (point)) error-count))
+    )
+
+  (when (not skip-reindent-test)
+    ;; Reindent the buffer
+    (message "indenting")
+
+    ;; first unindent; if the indentation rules do nothing, the test
+    ;; would pass, otherwise!  Only unindent by 1 column, so comments
+    ;; not currently in column 0 are still not in column 0, in case
+    ;; the mode supports a special case for comments in column 0.
+    (indent-rigidly (point-min) (point-max) -1)
+
+    ;; indent-region uses save-excursion, so we can't goto an error location
+    (indent-region (point-min) (point-max))
+
+    ;; Cleanup the buffer; indenting often leaves trailing whitespace;
+    ;; files must be saved without any.
+    (delete-trailing-whitespace)
+    )
+  )
+
+(defun run-test (file-name)
+  "Run an indentation and casing test on FILE-NAME."
+  (interactive "f")
+  ;; we'd like to run emacs from a makefile as:
+  ;;
+  ;; emacs -Q --batch -l runtest.el -f run-test-here <filename>
+  ;;
+  ;; However, the function specified with -f is run _before_
+  ;; <filename> is visited. So we try this instead:
+  ;;
+  ;; emacs -Q --batch -l runtest.el --eval '(run-test "<filename>")'
+  ;;
+  ;; And then we discover that processes spawned with start-process
+  ;; don't run when emacs is in --batch mode. So we try this:
+  ;;
+  ;; emacs -Q -l runtest.el --eval '(progn (run-test 
"<filename>")(kill-emacs))'
+  ;;
+  ;; Then we have problems with font lock defaulting to jit-lock; that
+  ;; screws up font-lock tests because the test runs before jit-lock
+  ;; does. This forces default font-lock, which fontifies the whole
+  ;; buffer when (font-lock-fontify-buffer) is called, which tests
+  ;; that rely on font-lock do explicitly.
+  (setq font-lock-support-mode nil)
+
+  (let ((dir default-directory))
+    (find-file file-name) ;; sets default-directory
+
+    (when (eq major-mode 'fundamental-mode)
+      ;; Running a grammar in test/wisi
+      (add-to-list 'load-path (expand-file-name "."))
+      (wisi-tests-setup (file-name-sans-extension (file-name-nondirectory 
file-name))))
+
+    (run-test-here)
+
+    (unless skip-write
+      ;; Write the result file; makefile will diff.
+      (when skip-reindent-test
+       ;; user sets skip-reindent-test when testing interactive editing
+       ;; commands, so the diff would fail. Revert to the original file,
+       ;; save a copy of that.
+       (revert-buffer t t))
+
+      (delete-trailing-whitespace)
+      (write-file (concat dir (file-name-nondirectory file-name) ".tmp")) )
+    )
+  )
+
+(provide 'wisi-run-indent-test)
+;; end of file
diff --git a/packages/wisi/wisi-tests.el b/packages/wisi/wisi-tests.el
new file mode 100644
index 0000000..d1468ef
--- /dev/null
+++ b/packages/wisi/wisi-tests.el
@@ -0,0 +1,146 @@
+;;; wisi-tests.el --- Common utils for wisi tests -*- lexical-binding:t -*-
+;;
+;; Copyright (C) 2012 - 2019  Free Software Foundation, Inc.
+;;
+;; Author: Stephen Leake <address@hidden>
+;; Maintainer: Stephen Leake <address@hidden>
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+;;
+
+(require 'cl-lib)
+(require 'wisi)
+
+(defvar wisi-test-parser 'elisp
+  "Set to ’process to test external process parser.")
+
+(defvar test-syntax-table
+  (let ((table (make-syntax-table)))
+    ;; make-syntax-table sets all alphanumeric to w, etc; so we only
+    ;; have to add test-specific things.
+
+    ;; operator symbols
+    (modify-syntax-entry ?&  "." table)
+    (modify-syntax-entry ?*  "." table)
+    (modify-syntax-entry ?+  "." table)
+    (modify-syntax-entry ?-  "." table)
+    (modify-syntax-entry ?/  "." table)
+    (modify-syntax-entry ?<  "." table)
+    (modify-syntax-entry ?=  "." table)
+    (modify-syntax-entry ?>  "." table)
+    (modify-syntax-entry ?|  "." table)
+
+    ;; \f and \n end a comment - see test-syntax-propertize for comment start
+    (modify-syntax-entry ?\f  ">   " table)
+    (modify-syntax-entry ?\n  ">   " table)
+    table
+    ))
+
+(defun test-syntax-propertize (start end)
+  "Assign `syntax-table' properties in accessible part of buffer."
+  ;; (info "(elisp)Syntax Properties")
+  (let ((modified (buffer-modified-p))
+       (buffer-undo-list t)
+       (inhibit-read-only t)
+       (inhibit-point-motion-hooks t)
+       (inhibit-modification-hooks t))
+    (goto-char start)
+    (while (re-search-forward
+            "\\(--\\)"; 1: comment start
+           end t)
+      ;; The help for syntax-propertize-extend-region-functions
+      ;; implies that 'start end' will always include whole lines, in
+      ;; which case we don't need
+      ;; syntax-propertize-extend-region-functions
+      (cond
+       ((match-beginning 1)
+       (put-text-property
+        (match-beginning 1) (match-end 1) 'syntax-table '(11 . nil)))
+       ))
+    (unless modified
+      (restore-buffer-modified-p nil))))
+
+(defun wisi-tests-setup (grammar-name)
+  ;; grammar-elisp file must be on load-path
+  ;; use Ada style comments in source
+  (set-syntax-table test-syntax-table)
+  (set (make-local-variable 'syntax-propertize-function) 
'test-syntax-propertize)
+  (syntax-ppss-flush-cache (point-min));; force re-evaluate with hook.
+
+  (cl-ecase wisi-test-parser
+    (elisp
+     (require 'wisi-elisp-parse)
+     (let* ((grammar-file-root (concat grammar-name "-lalr-elisp"))
+           (grammar-file-name (concat grammar-file-root ".el"))
+           (grammar-file-abs (locate-file grammar-file-name load-path)))
+       (unless grammar-file-abs
+        (error "can’t find ’%s’ on ’%s’" grammar-file-name load-path))
+       (require (intern grammar-file-root)))
+
+     (wisi-setup
+      :indent-calculate nil
+      :post-indent-fail nil
+      :parser (wisi-make-elisp-parser
+              (symbol-value (intern-soft (concat grammar-name 
"-lalr-elisp-parse-table")))
+              `wisi-forward-token)
+      :lexer (wisi-make-elisp-lexer
+             :token-table-raw (symbol-value (intern-soft (concat grammar-name 
"-lalr-elisp-token-table-raw")))
+             :keyword-table-raw (symbol-value (intern-soft (concat 
grammar-name "-lalr-elisp-keyword-table-raw")))
+             :string-quote-escape-doubled nil
+             :string-quote-escape nil)))
+
+    (process
+     (require 'wisi-process-parse)
+     (require (intern (concat grammar-name "-process"))) ;; generated by 
wisi-generate
+     (require (intern grammar-name)) ;; declares parser cl-defstruct
+     (add-to-list 'exec-path default-directory)
+     (wisi-setup
+      :indent-calculate nil
+      :post-indent-fail nil
+      :parser
+      (wisi-process-parse-get
+       (funcall
+       (intern-soft (concat "make-" grammar-name "-wisi-parser"))
+       :label grammar-name
+       :exec-file (concat grammar-name "_wisi_parse.exe")
+       :face-table (symbol-value (intern-soft (concat grammar-name 
"-process-face-table")))
+       :token-table (symbol-value (intern-soft (concat grammar-name 
"-process-token-table")))
+       ))
+      :lexer (wisi-make-elisp-lexer
+             :token-table-raw (symbol-value (intern-soft (concat grammar-name 
"-lalr-elisp-token-table-raw")))
+             :keyword-table-raw (symbol-value (intern-soft (concat 
grammar-name "-lalr-elisp-keyword-table-raw")))
+             :string-quote-escape-doubled nil
+             :string-quote-escape nil))
+     (setq wisi-mckenzie-disable nil)
+     )
+    )
+
+  ;; Not clear why this is not being done automatically
+  (syntax-propertize (point-max))
+  )
+
+;;; Initialization
+
+;; Default includes mtn, among others, which is broken in Emacs 22.2
+(setq vc-handled-backends '(CVS))
+
+(setq eval-expression-debug-on-error nil)
+
+;; ’package-initialize’ is not here; it must be run as part of one of the
+;; -l or --eval command line options
+
+(provide 'wisi-tests)
+;; end of file
diff --git a/packages/wisi/wisi.adb b/packages/wisi/wisi.adb
index 4031df0..b65bbee 100644
--- a/packages/wisi/wisi.adb
+++ b/packages/wisi/wisi.adb
@@ -17,27 +17,31 @@
 
 pragma License (Modified_GPL);
 
+with Ada.Exceptions;
 with Ada.Strings.Bounded;
 with Ada.Text_IO;
+with SAL;
 with WisiToken.Semantic_Checks;
 package body Wisi is
    use WisiToken;
 
-   Navigate_Cache_Code : constant String := "1 ";
-   Face_Property_Code  : constant String := "2 ";
-   Indent_Code         : constant String := "3 ";
-   Lexer_Error_Code    : constant String := "4";
-   Parser_Error_Code   : constant String := "5";
-   Check_Error_Code    : constant String := "6";
-   Recover_Code        : constant String := "7 ";
-   End_Code            : constant String := "8";
+   Navigate_Cache_Code  : constant String := "1";
+   Face_Property_Code   : constant String := "2";
+   Indent_Code          : constant String := "3";
+   Lexer_Error_Code     : constant String := "4";
+   Parser_Error_Code    : constant String := "5";
+   Check_Error_Code     : constant String := "6";
+   Recover_Code         : constant String := "7 ";
+   End_Code             : constant String := "8";
+   Name_Property_Code   : constant String := "9";
+   Language_Action_Code : constant String := "10 ";
 
    Chars_Per_Int : constant Integer := Integer'Width;
 
    ----------
    --  body subprogram specs (as needed), alphabetical
 
-   function Indent_Zero_P (Indent : in Indent_Type) return Boolean;
+   function Indent_Nil_P (Indent : in Indent_Type) return Boolean;
 
    function Max_Anchor_ID
      (Data       : in out Parse_Data_Type;
@@ -79,42 +83,53 @@ package body Wisi is
       when Int =>
          return "(" & Indent_Label'Image (Indent.Label) & Integer'Image 
(Indent.Int_Indent) & ")";
 
-      when Anchor =>
-         return "(" & Indent_Label'Image (Indent.Label) & Image 
(Indent.Anchor_IDs) & ", " & Integer'Image
-           (Indent.Anchor_Indent) & ")";
+      when Anchor_Nil =>
+         return "(" & Indent_Label'Image (Indent.Label) & ", " & Image 
(Indent.Anchor_Nil_IDs) & ", nil)";
+
+      when Anchor_Int =>
+         return "(" & Indent_Label'Image (Indent.Label) & ", " & Image 
(Indent.Anchor_Int_IDs) & ", " & Integer'Image
+           (Indent.Anchor_Int_Indent) & ")";
 
       when Anchored =>
-         return "(" & Indent_Label'Image (Indent.Label) & Integer'Image 
(Indent.Anchored_ID) & ", " & Integer'Image
-           (Indent.Anchored_Delta) & ")";
+         return "(" & Indent_Label'Image (Indent.Label) & ", " & Integer'Image 
(Indent.Anchored_ID) & ", " &
+           Integer'Image (Indent.Anchored_Delta) & ")";
 
       when Anchor_Anchored =>
-         return "(" & Indent_Label'Image (Indent.Label) & Image 
(Indent.Anchor_Anchored_IDs) & Integer'Image
+         return "(" & Indent_Label'Image (Indent.Label) & ", " & Image 
(Indent.Anchor_Anchored_IDs) & Integer'Image
            (Indent.Anchor_Anchored_ID) & ", " & Integer'Image 
(Indent.Anchor_Anchored_Delta) & ")";
       end case;
    end Image;
 
    procedure Indent_Apply_Anchored
-     (Delta_Indent : in     Anchored_Delta;
+     (Delta_Indent : in     Simple_Delta_Type;
       Indent       : in out Indent_Type)
+   with Pre => Delta_Indent.Label = Anchored
    is begin
-      --  [2] wisi-elisp-parse--apply-anchored
+      --  [2] wisi-elisp-parse--apply-anchored; add Delta_Indent to Indent
 
       case Indent.Label is
       when Not_Set =>
          Indent := (Anchored, Delta_Indent.Anchored_ID, 
Delta_Indent.Anchored_Delta);
 
       when Int =>
-         if Indent.Int_Indent = 0 or Delta_Indent.Anchored_Accumulate then
+         if Delta_Indent.Anchored_Accumulate then
             Indent := (Anchored, Delta_Indent.Anchored_ID, Indent.Int_Indent + 
Delta_Indent.Anchored_Delta);
          end if;
 
-      when Anchor =>
-         if Delta_Indent.Anchored_Accumulate or Indent.Anchor_Indent = 0 then
+      when Anchor_Nil =>
+         Indent :=
+           (Anchor_Anchored,
+            Indent.Anchor_Nil_IDs,
+            Delta_Indent.Anchored_ID,
+            Delta_Indent.Anchored_Delta);
+
+      when Anchor_Int =>
+         if Delta_Indent.Anchored_Accumulate then
             Indent :=
               (Anchor_Anchored,
-               Indent.Anchor_IDs,
+               Indent.Anchor_Int_IDs,
                Delta_Indent.Anchored_ID,
-               Delta_Indent.Anchored_Delta + Indent.Anchor_Indent);
+               Delta_Indent.Anchored_Delta + Indent.Anchor_Int_Indent);
          end if;
 
       when Anchored | Anchor_Anchored =>
@@ -125,7 +140,7 @@ package body Wisi is
 
    procedure Indent_Apply_Int (Indent : in out Indent_Type; Offset : in 
Integer)
    is begin
-      --  [2] wisi-elisp-parse--apply-int
+      --  [2] wisi-elisp-parse--apply-int; add an Int indent to Indent
       case Indent.Label is
       when Not_Set =>
          Indent := (Int, Offset);
@@ -133,8 +148,14 @@ package body Wisi is
       when Int =>
          Indent.Int_Indent := Indent.Int_Indent + Offset;
 
-      when Anchor =>
-         Indent.Anchor_Indent := Indent.Anchor_Indent + Offset;
+      when Anchor_Nil         =>
+         Indent :=
+           (Label             => Anchor_Int,
+            Anchor_Int_IDs    => Indent.Anchor_Nil_IDs,
+            Anchor_Int_Indent => Offset);
+
+      when Anchor_Int =>
+         Indent.Anchor_Int_Indent := Indent.Anchor_Int_Indent + Offset;
 
       when Anchored | Anchor_Anchored =>
          null;
@@ -152,6 +173,9 @@ package body Wisi is
       case Delta_Indent.Label is
       when Simple =>
          case Delta_Indent.Simple_Delta.Label is
+         when None =>
+            null;
+
          when Int =>
             Indent_Apply_Int (Indent, Delta_Indent.Simple_Delta.Int_Delta);
 
@@ -160,10 +184,12 @@ package body Wisi is
          end case;
 
       when Hanging =>
-         if Delta_Indent.Hanging_Accumulate or Indent_Zero_P (Data.Indents 
(Line)) then
+         if Delta_Indent.Hanging_Accumulate or Indent_Nil_P (Data.Indents 
(Line)) then
             if Line = Delta_Indent.Hanging_First_Line then
                --  Apply delta_1
                case Delta_Indent.Hanging_Delta_1.Label is
+               when None =>
+                  null;
                when Int =>
                   Indent_Apply_Int (Indent, 
Delta_Indent.Hanging_Delta_1.Int_Delta);
                when Anchored =>
@@ -172,6 +198,8 @@ package body Wisi is
             else
                if Delta_Indent.Hanging_Paren_State = Data.Line_Paren_State 
(Line) then
                   case Delta_Indent.Hanging_Delta_2.Label is
+                  when None =>
+                     null;
                   when Int =>
                      Indent_Apply_Int (Indent, 
Delta_Indent.Hanging_Delta_2.Int_Delta);
                   when Anchored =>
@@ -181,29 +209,18 @@ package body Wisi is
             end if;
          end if;
       end case;
+
+      if Trace_Action > Extra then
+         Ada.Text_IO.Put_Line (";; indent_line: " & Line_Number_Type'Image 
(Line) & " => " & Image (Indent));
+      end if;
+
       Data.Indents.Replace_Element (Line, Indent);
    end Indent_Line;
 
-   function Indent_Zero_P (Indent : in Indent_Type) return Boolean
+   function Indent_Nil_P (Indent : in Indent_Type) return Boolean
    is begin
-      --  wisi-elisp-parse--indent-zero-p
-      case Indent.Label is
-      when Not_Set =>
-         return True;
-
-      when Int =>
-         return Indent.Int_Indent = 0;
-
-      when Anchor =>
-         return Indent.Anchor_Indent = 0;
-
-      when Anchored =>
-         return Indent.Anchored_Delta = 0;
-
-      when Anchor_Anchored =>
-         return Indent.Anchor_Anchored_Delta = 0;
-      end case;
-   end Indent_Zero_P;
+      return Indent.Label in Not_Set | Anchor_Nil;
+   end Indent_Nil_P;
 
    function Max_Anchor_ID
      (Data       : in out Parse_Data_Type;
@@ -220,8 +237,10 @@ package body Wisi is
             case Indent.Label is
             when Not_Set | Int =>
                null;
-            when Anchor =>
-               Result := Integer'Max (Result, Indent.Anchor_IDs 
(Indent.Anchor_IDs.First_Index));
+            when Anchor_Nil =>
+               Result := Integer'Max (Result, Indent.Anchor_Nil_IDs 
(Indent.Anchor_Nil_IDs.First_Index));
+            when Anchor_Int =>
+               Result := Integer'Max (Result, Indent.Anchor_Int_IDs 
(Indent.Anchor_Int_IDs.First_Index));
             when Anchored =>
                Result := Integer'Max (Result, Indent.Anchored_ID);
             when Anchor_Anchored =>
@@ -238,8 +257,8 @@ package body Wisi is
       Offset       : in     Integer)
      return Integer
    is
-      Left_Paren_ID  : Token_ID renames Data.Descriptor.Left_Paren_ID;
-      Right_Paren_ID : Token_ID renames Data.Descriptor.Right_Paren_ID;
+      Left_Paren_ID  : Token_ID renames Data.Left_Paren_ID;
+      Right_Paren_ID : Token_ID renames Data.Right_Paren_ID;
 
       I              : Base_Token_Index := Anchor_Token.First_Terminals_Index;
       Paren_Count    : Integer          := 0;
@@ -308,6 +327,12 @@ package body Wisi is
       Ada.Text_IO.Put_Line (To_String (Line));
    end Put;
 
+   procedure Put (Cache : in WisiToken.Buffer_Region)
+   is begin
+      Ada.Text_IO.Put_Line
+        ("[" & Name_Property_Code & Buffer_Pos'Image (Cache.First) & 
Buffer_Pos'Image (Cache.Last) & "]");
+   end Put;
+
    procedure Put (Cache : in Face_Cache_Type)
    is
       package Bounded is new Ada.Strings.Bounded.Generic_Bounded_Length (Max 
=> 2 + 4 * Chars_Per_Int);
@@ -341,25 +366,26 @@ package body Wisi is
             Ind : constant Integer := Integer'Max (0, Item.Int_Indent);
          begin
             Ada.Text_IO.Put_Line
-              ('[' & Indent_Code & Trimmed_Image (Integer (Line_Number)) & 
Integer'Image (Ind) & ']');
+              ('[' & Indent_Code & Line_Number_Type'Image (Line_Number) & 
Integer'Image (Ind) & ']');
          end;
 
-      when Anchor | Anchored | Anchor_Anchored =>
+      when Anchor_Nil | Anchor_Int | Anchored | Anchor_Anchored =>
          raise SAL.Programmer_Error with "Indent item has non-int label: " & 
Indent_Label'Image (Item.Label);
       end case;
    end Put;
 
    procedure Put
-     (Item       : in Parse.LR.Configuration;
-      Terminals  : in Augmented_Token_Arrays.Vector;
-      Descriptor : in WisiToken.Descriptor)
+     (Item                          : in Parse.LR.Configuration;
+      Terminals                     : in Augmented_Token_Arrays.Vector;
+      Descriptor                    : in WisiToken.Descriptor;
+      Embedded_Quote_Escape_Doubled : in Boolean)
    is
       use Ada.Containers;
       use Ada.Strings.Unbounded;
       use Parse.LR;
 
       Line    : Unbounded_String := To_Unbounded_String ("[");
-      Last_Op : Config_Op        := (Fast_Forward, Token_Index'Last);
+      Last_Op : Config_Op        := (Fast_Forward, WisiToken.Token_Index'Last);
 
    begin
       if Trace_Action > Detail then
@@ -391,19 +417,19 @@ package body Wisi is
                when Insert =>
                   if Last_Op.Op = Fast_Forward then
                      Append (Line, "[");
-                     Append (Line, Buffer_Pos'Image (Terminals 
(Op.Token_Index).Char_Region.First));
+                     Append (Line, Buffer_Pos'Image (Terminals 
(Op.Ins_Token_Index).Char_Region.First));
                      Append (Line, "[");
 
                   elsif Last_Op.Op = Delete then
                      Append (Line, "]][");
-                     Append (Line, Buffer_Pos'Image (Terminals 
(Op.Token_Index).Char_Region.First));
+                     Append (Line, Buffer_Pos'Image (Terminals 
(Op.Ins_Token_Index).Char_Region.First));
                      Append (Line, "[");
 
                   else
                      --  Last_Op.Op = Insert
                      null;
                   end if;
-                  Append (Line, Token_ID'Image (Op.ID));
+                  Append (Line, Token_ID'Image (Op.Ins_ID));
 
                   Last_Op := Op;
 
@@ -413,20 +439,20 @@ package body Wisi is
                   begin
                      if Last_Op.Op = Fast_Forward then
                         Append (Line, "[");
-                        Append (Line, Buffer_Pos'Image (Terminals 
(Op.Token_Index).Char_Region.First));
+                        Append (Line, Buffer_Pos'Image (Terminals 
(Op.Del_Token_Index).Char_Region.First));
                         Append (Line, "[][");
 
                      elsif Last_Op.Op = Insert then
                         Append (Line, "][");
 
                      elsif Last_Op.Op = Delete then
-                        if Descriptor.Embedded_Quote_Escape_Doubled and then
-                          ((Last_Op.ID = Descriptor.String_1_ID and Op.ID = 
Descriptor.String_1_ID) or
-                             (Last_Op.ID = Descriptor.String_2_ID and Op.ID = 
Descriptor.String_2_ID))
+                        if Embedded_Quote_Escape_Doubled and then
+                          ((Last_Op.Del_ID = Descriptor.String_1_ID and 
Op.Del_ID = Descriptor.String_1_ID) or
+                             (Last_Op.Del_ID = Descriptor.String_2_ID and 
Op.Del_ID = Descriptor.String_2_ID))
                         then
                            declare
-                              Tok_1 : Augmented_Token renames Terminals 
(Last_Op.Token_Index);
-                              Tok_2 : Augmented_Token renames Terminals 
(Op.Token_Index);
+                              Tok_1 : Augmented_Token renames Terminals 
(Last_Op.Del_Token_Index);
+                              Tok_2 : Augmented_Token renames Terminals 
(Op.Del_Token_Index);
                            begin
                               if Tok_1.Char_Region.Last + 1 = 
Tok_2.Char_Region.First then
                                  --  Buffer text was '"""', lexer repair 
changed it to '""""'. The
@@ -441,7 +467,7 @@ package body Wisi is
                      end if;
 
                      if not Skip then
-                        Append (Line, Token_ID'Image (Op.ID));
+                        Append (Line, Token_ID'Image (Op.Del_ID));
                      end if;
                   end;
                   Last_Op := Op;
@@ -474,8 +500,9 @@ package body Wisi is
          Ada.Text_IO.New_Line;
          Ada.Text_IO.Put_Line (";; Begin_Indent: " & Integer'Image 
(Data.Begin_Indent));
          for I in Data.Indents.First_Index .. Data.Indents.Last_Index loop
-            Ada.Text_IO.Put_Line (Line_Number_Type'Image (I) & ", " & Image 
(Data.Indents (I)));
+            Ada.Text_IO.Put_Line (";; " & Line_Number_Type'Image (I) & ", " & 
Image (Data.Indents (I)));
          end loop;
+         Ada.Text_IO.Put_Line (";; resolve anchors");
       end if;
 
       for I in Data.Indents.First_Index .. Data.Indents.Last_Index loop
@@ -490,11 +517,17 @@ package body Wisi is
             when Int =>
                Data.Indents.Replace_Element (I, (Int, Indent.Int_Indent + 
Begin_Indent));
 
-            when Anchor =>
-               for I of Indent.Anchor_IDs loop
-                  Anchor_Indent (I) := Indent.Anchor_Indent + Begin_Indent;
+            when Anchor_Nil =>
+               for I of Indent.Anchor_Nil_IDs loop
+                  Anchor_Indent (I) := Begin_Indent;
                end loop;
-               Data.Indents.Replace_Element (I, (Int, Indent.Anchor_Indent + 
Begin_Indent));
+               Data.Indents.Replace_Element (I, (Int, Begin_Indent));
+
+            when Anchor_Int =>
+               for I of Indent.Anchor_Int_IDs loop
+                  Anchor_Indent (I) := Indent.Anchor_Int_Indent + Begin_Indent;
+               end loop;
+               Data.Indents.Replace_Element (I, (Int, Indent.Anchor_Int_Indent 
+ Begin_Indent));
 
             when Anchored =>
                Data.Indents.Replace_Element
@@ -589,6 +622,10 @@ package body Wisi is
       end case;
 
       Data.Reset;
+   exception
+   when E : others =>
+      raise SAL.Programmer_Error with "wisi.initialize: " & 
Ada.Exceptions.Exception_Name (E) & ": " &
+        Ada.Exceptions.Exception_Message (E);
    end Initialize;
 
    overriding procedure Reset (Data : in out Parse_Data_Type)
@@ -607,6 +644,9 @@ package body Wisi is
       Data.Navigate_Caches.Initialize;
       Data.End_Positions.Clear;
 
+      Data.Name_Caches.Finalize;
+      Data.Name_Caches.Initialize;
+
       Data.Face_Caches.Finalize;
       Data.Face_Caches.Initialize;
 
@@ -642,16 +682,16 @@ package body Wisi is
          then
             --  Previous token contains multiple lines; ie %code in 
wisitoken_grammar.wy
             declare
-               First_Unset_Line : Line_Number_Type;
+               First_Set_Line : Line_Number_Type;
             begin
                for Line in reverse Data.Line_Begin_Pos.First_Index .. 
Token.Line - 1 loop
                   if Data.Line_Begin_Pos (Line) /= Invalid_Buffer_Pos then
-                     First_Unset_Line := Line;
+                     First_Set_Line := Line;
                      exit;
                   end if;
                end loop;
-               for Line in First_Unset_Line .. Token.Line - 1 loop
-                  Data.Line_Begin_Pos (Line) := Data.Line_Begin_Pos 
(First_Unset_Line); -- good enough
+               for Line in First_Set_Line + 1 .. Token.Line - 1 loop
+                  Data.Line_Begin_Pos (Line) := Data.Line_Begin_Pos 
(First_Set_Line); -- good enough
                end loop;
             end;
          end if;
@@ -676,7 +716,10 @@ package body Wisi is
                     Containing_Token.Non_Grammar
                       (Containing_Token.Non_Grammar.Last_Index).ID = 
Data.Descriptor.New_Line_ID);
             begin
-               if Lexer.First and (Token.ID = Data.Descriptor.Comment_ID or 
Trailing_Blank) then
+               if Lexer.First and
+                 (Token.ID in Data.First_Comment_ID .. Data.Last_Comment_ID or
+                    Trailing_Blank)
+               then
                   if Containing_Token.First_Trailing_Comment_Line = 
Invalid_Line_Number then
                      Containing_Token.First_Trailing_Comment_Line := 
Token.Line;
                   end if;
@@ -707,10 +750,10 @@ package body Wisi is
                Last_Trailing_Comment_Line  => Invalid_Line_Number,
                Non_Grammar                 => <>);
          begin
-            if Token.ID = Data.Descriptor.Left_Paren_ID then
+            if Token.ID = Data.Left_Paren_ID then
                Data.Current_Paren_State := Data.Current_Paren_State + 1;
 
-            elsif Token.ID = Data.Descriptor.Right_Paren_ID then
+            elsif Token.ID = Data.Right_Paren_ID then
                Data.Current_Paren_State := Data.Current_Paren_State - 1;
             end if;
 
@@ -899,34 +942,67 @@ package body Wisi is
       Tokens  : in     Syntax_Trees.Valid_Node_Index_Array;
       Params  : in     Statement_Param_Array)
    is
-      First_Item         : Boolean     := True;
-      Override_Start_Set : Boolean     := False;
-      Override_Start     : Navigate_Class_Type;
+      First_Item         : Boolean        := True;
+      Start_Set          : Boolean        := False;
+      Override_Start_Set : Boolean        := False;
       Containing_Pos     : Nil_Buffer_Pos := Nil; --  wisi first-keyword-pos
    begin
       for Pair of Params loop
-         if Tree.Byte_Region (Tokens (Pair.Index)) /= Null_Buffer_Region then
+         if not (Pair.Index in Tokens'Range) then
             declare
-               Token  : constant Aug_Token_Ref      := Get_Aug_Token (Data, 
Tree, Tokens (Pair.Index));
-               Cursor : Navigate_Cache_Trees.Cursor := 
Navigate_Cache_Trees.Find
-                 (Data.Navigate_Caches.Iterate, Token.Char_Region.First,
+               Nonterm_Tok : constant Aug_Token_Ref := Get_Aug_Token (Data, 
Tree, Nonterm);
+            begin
+               raise Fatal_Error with Error_Message
+                 (File_Name => -Data.Source_File_Name,
+                  Line      => Nonterm_Tok.Line,
+                  Column    => Nonterm_Tok.Column,
+                  Message   => "wisi-statement-action: " & Trimmed_Image 
(Tree.Production_ID (Nonterm)) &
+                    " token index" & SAL.Peek_Type'Image (Pair.Index) &
+                    " not in tokens range (" & SAL.Peek_Type'Image 
(Tokens'First) & " .." &
+                    SAL.Peek_Type'Image (Tokens'Last) & "); bad grammar 
action.");
+            end;
+
+         elsif Tree.Byte_Region (Tokens (Pair.Index)) /= Null_Buffer_Region 
then
+            declare
+               use all type WisiToken.Syntax_Trees.Node_Label;
+               Token  : constant Aug_Token_Ref :=
+                  (if Pair.Class = Statement_End and then
+                    Tree.Label (Tokens (Pair.Index)) = 
WisiToken.Syntax_Trees.Nonterm
+                  then Data.Terminals.Variable_Ref (Tree.Max_Terminal_Index 
(Tokens (Pair.Index)))
+                  else Get_Aug_Token (Data, Tree, Tokens (Pair.Index)));
+
+               Cache_Pos : constant Buffer_Pos         := 
Token.Char_Region.First;
+               Cursor    : Navigate_Cache_Trees.Cursor := 
Navigate_Cache_Trees.Find
+                 (Data.Navigate_Caches.Iterate, Cache_Pos,
                   Direction => Navigate_Cache_Trees.Unknown);
             begin
                if Navigate_Cache_Trees.Has_Element (Cursor) then
                   declare
                      Cache : Navigate_Cache_Type renames Data.Navigate_Caches 
(Cursor);
                   begin
-                     Cache.Class          := (if Override_Start_Set then 
Override_Start else Pair.Class);
+                     if Pair.Class = Statement_Start then
+                        if Start_Set then
+                           Cache.Class := Motion;
+                        else
+                           Cache.Class := Statement_Start;
+                           Start_Set   := True;
+                        end if;
+                     elsif Override_Start_Set then
+                        Cache.Class := Statement_Start;
+                        Start_Set   := True;
+                     else
+                        Cache.Class := Pair.Class;
+                     end if;
                      Cache.Statement_ID   := Tree.ID (Nonterm);
                      Cache.Containing_Pos := Containing_Pos;
                   end;
                else
                   Cursor := Data.Navigate_Caches.Insert
-                    ((Pos            => Token.Char_Region.First,
+                    ((Pos            => Cache_Pos,
                       Statement_ID   => Tree.ID (Nonterm),
                       ID             => Token.ID,
                       Length         => Length (Token.Char_Region),
-                      Class          => (if Override_Start_Set then 
Override_Start else Pair.Class),
+                      Class          => (if Override_Start_Set then 
Statement_Start else Pair.Class),
                       Containing_Pos => Containing_Pos,
                       others         => Nil));
                end if;
@@ -942,22 +1018,67 @@ package body Wisi is
                end if;
 
                if Pair.Class = Statement_End and Containing_Pos.Set then
-                  Set_End (Data, Containing_Pos.Item, Token.Char_Region.First);
+                  Set_End (Data, Containing_Pos.Item, Cache_Pos);
                end if;
             end;
 
          else
             --  Token.Byte_Region is null
             if First_Item and Pair.Class = Statement_Start then
-               --  We don't reset First_Item here; next token may also be a 
start, if
-               --  this one is empty.
                Override_Start_Set := True;
-               Override_Start     := Pair.Class;
             end if;
          end if;
       end loop;
    end Statement_Action;
 
+   procedure Name_Action
+     (Data    : in out Parse_Data_Type;
+      Tree    : in     WisiToken.Syntax_Trees.Tree;
+      Nonterm : in     Syntax_Trees.Valid_Node_Index;
+      Tokens  : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array;
+      Name    : in     WisiToken.Positive_Index_Type)
+   is
+      use all type WisiToken.Syntax_Trees.Node_Label;
+   begin
+      if not (Name in Tokens'Range) then
+         declare
+            Token : constant Aug_Token_Ref := Get_Aug_Token (Data, Tree, 
Tokens (Tokens'First));
+         begin
+            raise Fatal_Error with Error_Message
+              (File_Name => -Data.Source_File_Name,
+               Line      => Token.Line,
+               Column    => Token.Column,
+               Message   => "wisi-name-action: " & Trimmed_Image 
(Tree.Production_ID (Nonterm)) & " name (" &
+                 Trimmed_Image (Name) & ") not in Tokens range (" & 
SAL.Peek_Type'Image (Tokens'First) & " .." &
+                    SAL.Peek_Type'Image (Tokens'Last) & "); bad grammar 
action.");
+         end;
+      end if;
+
+      if Tree.Label (Tokens (Name)) = Syntax_Trees.Virtual_Terminal then
+         return;
+      end if;
+
+      declare
+         use Name_Cache_Trees;
+         Name_Token : constant Aug_Token_Ref           := Get_Aug_Token (Data, 
Tree, Tokens (Name));
+         Cursor     : constant Name_Cache_Trees.Cursor := Find
+           (Data.Name_Caches.Iterate, Name_Token.Char_Region.First,
+            Direction => Name_Cache_Trees.Unknown);
+      begin
+         if Name_Token.Char_Region = Null_Buffer_Region then
+            return;
+         elsif Has_Element (Cursor) then
+            raise Fatal_Error with Error_Message
+              (File_Name => -Data.Source_File_Name,
+               Line      => Name_Token.Line,
+               Column    => Name_Token.Column,
+               Message   => "wisi-name-action: name set twice.");
+         else
+            Data.Name_Caches.Insert (Name_Token.Char_Region);
+         end if;
+      end;
+   end Name_Action;
+
    procedure Containing_Action
      (Data       : in out Parse_Data_Type;
       Tree       : in     Syntax_Trees.Tree;
@@ -1071,8 +1192,6 @@ package body Wisi is
       Tokens  : in     Syntax_Trees.Valid_Node_Index_Array;
       Params  : in     Motion_Param_Array)
    is
-      pragma Unreferenced (Nonterm);
-
       --  [2] wisi-motion-action
       use Navigate_Cache_Trees;
       use all type Ada.Containers.Count_Type;
@@ -1122,8 +1241,9 @@ package body Wisi is
                         Line      => Token.Line,
                         Column    => Token.Column,
                         Message   => "wisi-motion-action: token " &
-                          Token.Image (Data.Descriptor.all) &
-                          " has no cache; add to statement-action.");
+                          WisiToken.Image (Token.ID, Data.Descriptor.all) &
+                          " has no cache; add to statement-action for " &
+                          Trimmed_Image (Tree.Production_ID (Nonterm)) & ".");
                   end if;
                end if;
 
@@ -1373,6 +1493,7 @@ package body Wisi is
    is begin
       return "(" & Simple_Indent_Param_Label'Image (Item.Label) &
         (case Item.Label is
+         when None => "",
          when Int => Integer'Image (Item.Int_Delta),
          when Anchored_Label => Positive_Index_Type'Image 
(Item.Anchored_Index) & "," &
               Integer'Image (Item.Anchored_Delta),
@@ -1409,7 +1530,9 @@ package body Wisi is
 
       --  [2] wisi-indent-action
       for I in Tokens'Range loop
-         if Tree.Byte_Region (Tokens (I)) /= Null_Buffer_Region then
+         if Tree.Byte_Region (Tokens (I)) /= Null_Buffer_Region and
+           I in Params'Range -- in some translated EBNF, not every token has 
an indent param
+         then
             declare
                use all type WisiToken.Syntax_Trees.Node_Index;
                use all type SAL.Base_Peek_Type;
@@ -1513,6 +1636,15 @@ package body Wisi is
       end if;
    end Indent_Hanging_1;
 
+   procedure Put_Language_Action
+     (Data    : in Parse_Data_Type;
+      Content : in String)
+   is
+      pragma Unreferenced (Data);
+   begin
+      Ada.Text_IO.Put_Line ("[" & Language_Action_Code & Content & "]");
+   end Put_Language_Action;
+
    procedure Put (Data : in out Parse_Data_Type; Parser : in 
Parse.Base_Parser'Class)
    is
       use all type Ada.Containers.Count_Type;
@@ -1552,8 +1684,15 @@ package body Wisi is
       function Get_Last_Line return Line_Number_Type
       is begin
          for I in Data.Line_Begin_Pos.First_Index .. 
Data.Line_Begin_Pos.Last_Index loop
+            if Data.Line_Begin_Pos (I) = Invalid_Buffer_Pos then
+               raise SAL.Programmer_Error with "line_begin_pos" & 
Line_Number_Type'Image (I) & " invalid";
+            end if;
             if Data.Line_Begin_Pos (I) > Last_Char_Pos then
-               return I - 1;
+               if I > Line_Number_Type'First then
+                  return I - 1;
+               else
+                  return I;
+               end if;
             end if;
          end loop;
          return Data.Line_Begin_Pos.Last_Index;
@@ -1574,6 +1713,9 @@ package body Wisi is
          for Cache of Data.Navigate_Caches loop
             Put (Cache);
          end loop;
+         for Cache of Data.Name_Caches loop
+            Put (Cache);
+         end loop;
 
       when Face =>
          for Cache of Data.Face_Caches loop
@@ -1706,7 +1848,7 @@ package body Wisi is
          end case;
 
          if Item.Recover.Stack.Depth > 0 then
-            Put (Item.Recover, Data.Terminals, Data.Descriptor.all);
+            Put (Item.Recover, Data.Terminals, Data.Descriptor.all, 
Data.Embedded_Quote_Escape_Doubled);
          end if;
       end loop;
    end Put;
@@ -1725,9 +1867,11 @@ package body Wisi is
    is begin
       return "(" & Simple_Delta_Labels'Image (Item.Label) &
         (case Item.Label is
+         when None => "",
          when Int => Integer'Image (Item.Int_Delta),
          when Anchored => Integer'Image (Item.Anchored_ID) & Integer'Image 
(Item.Anchored_Delta) & " " &
-              Boolean'Image (Item.Anchored_Accumulate) & ")");
+              Boolean'Image (Item.Anchored_Accumulate))
+        & ")";
    end Image;
 
    function Image (Item : in Delta_Type) return String
@@ -1792,6 +1936,7 @@ package body Wisi is
         (case Tree.Label (Tree_Index) is
          when Shared_Terminal => Data.Terminals.Variable_Ref (Tree.Terminal 
(Tree_Index)),
          when Virtual_Terminal => raise SAL.Programmer_Error with 
"wisi_runtime.get_aug_token virtual terminal",
+         when Virtual_Identifier => raise SAL.Programmer_Error with 
"wisi_runtime.get_aug_token virtual identifier",
          when Nonterm => (Element => Augmented_Token_Access (Tree.Augmented 
(Tree_Index))));
    end Get_Aug_Token;
 
@@ -1842,6 +1987,7 @@ package body Wisi is
       Accumulate  : in     Boolean)
      return Delta_Type
    is
+      --  [2] wisi-elisp-parse--anchored-2; return an anchored delta
       use Anchor_ID_Vectors;
       --  We can't use a Reference here, because the Element in reference
       --  types is constrained (as are all allocated objects of access
@@ -1849,18 +1995,30 @@ package body Wisi is
       Indent    : Indent_Type      := Data.Indents (Anchor_Line);
       Anchor_ID : constant Integer := 1 + Max_Anchor_ID (Data, Anchor_Line, 
Last_Line);
    begin
-      --  [2] wisi-elisp-parse--anchored-2
       Data.Max_Anchor_ID := Integer'Max (Data.Max_Anchor_ID, Anchor_ID);
 
       case Indent.Label is
       when Not_Set =>
-         Indent := (Anchor, To_Vector (Anchor_ID, 1), 0);
+         Indent := (Anchor_Nil, To_Vector (Anchor_ID, 1));
+
+         if Trace_Action > Extra then
+            Ada.Text_IO.Put_Line
+              (";; indent_anchored: " & Line_Number_Type'Image (Anchor_Line) & 
" => " & Image (Indent));
+         end if;
 
       when Int =>
-         Indent := (Anchor, To_Vector (Anchor_ID, 1), Indent.Int_Indent);
+         Indent := (Anchor_Int, To_Vector (Anchor_ID, 1), Indent.Int_Indent);
+
+         if Trace_Action > Extra then
+            Ada.Text_IO.Put_Line
+              (";; indent_anchored: " & Line_Number_Type'Image (Anchor_Line) & 
" => " & Image (Indent));
+         end if;
 
-      when Anchor =>
-         Indent.Anchor_IDs := Anchor_ID & Indent.Anchor_IDs;
+      when Anchor_Nil =>
+         Indent.Anchor_Nil_IDs := Anchor_ID & Indent.Anchor_Nil_IDs;
+
+      when Anchor_Int =>
+         Indent.Anchor_Int_IDs := Anchor_ID & Indent.Anchor_Int_IDs;
 
       when Anchored =>
          Indent := (Anchor_Anchored, To_Vector (Anchor_ID, 1), 
Indent.Anchored_ID, Indent.Anchored_Delta);
@@ -1889,6 +2047,9 @@ package body Wisi is
       case Param.Label is
       when Simple =>
          case Param.Param.Label is
+         when None =>
+            return (Simple, (Label => None));
+
          when Int =>
             return (Simple, (Int, Param.Param.Int_Delta));
 
@@ -1970,12 +2131,17 @@ package body Wisi is
               (Data, Tree, Tokens, Tree_Indenting, Indenting_Comment, 
Param.Hanging_Delta_1,
                Param.Hanging_Delta_2,
                Option => False, Accumulate => True);
-         when Hanging_1 => -- wisi-hanging%
+         when Hanging_1 => -- wisi-hanging-
+            return Indent_Hanging_1
+              (Data, Tree, Tokens, Tree_Indenting, Indenting_Comment, 
Param.Hanging_Delta_1,
+               Param.Hanging_Delta_2,
+               Option => False, Accumulate => False);
+         when Hanging_2 => -- wisi-hanging%
             return Indent_Hanging_1
               (Data, Tree, Tokens, Tree_Indenting, Indenting_Comment, 
Param.Hanging_Delta_1,
                Param.Hanging_Delta_2,
                Option => True, Accumulate => True);
-         when Hanging_2 => -- wisi-hanging%-
+         when Hanging_3 => -- wisi-hanging%-
             return Indent_Hanging_1
               (Data, Tree, Tokens, Tree_Indenting, Indenting_Comment, 
Param.Hanging_Delta_1,
                Param.Hanging_Delta_2,
@@ -1990,6 +2156,7 @@ package body Wisi is
       Delta_Indent      : in     Delta_Type;
       Indenting_Comment : in     Boolean)
    is
+      --  Aplly Delta_Indent to Indenting_Token
       First_Line : constant Line_Number_Type := Indenting_Token.First_Line 
(Indenting_Comment);
       Last_Line  : constant Line_Number_Type := Indenting_Token.Last_Line 
(Indenting_Comment);
    begin
@@ -2009,7 +2176,7 @@ package body Wisi is
                if Data.Line_Begin_Token.all (Line - 1) /= 
Augmented_Token_Arrays.No_Index then
                   for Tok of Data.Terminals (Data.Line_Begin_Token.all (Line - 
1)).Non_Grammar loop
                      if Tok.Line = Line and then
-                       Tok.ID = Data.Descriptor.Comment_ID and then
+                       Tok.ID in Data.First_Comment_ID .. Data.Last_Comment_ID 
and then
                        Tok.Column = 0
                      then
                         Indent := False;
@@ -2021,7 +2188,7 @@ package body Wisi is
                if Indent then
                   Indent_Line (Data, Line, Delta_Indent);
                else
-                  Indent_Line (Data, Line, Null_Delta);
+                  Indent_Line (Data, Line, (Simple, (Int, 0)));
                end if;
             end;
          else
diff --git a/packages/wisi/wisi.ads b/packages/wisi/wisi.ads
index d3f1214..818a7cc 100644
--- a/packages/wisi/wisi.ads
+++ b/packages/wisi/wisi.ads
@@ -79,7 +79,7 @@ package Wisi is
       Nonterm : in     WisiToken.Syntax_Trees.Valid_Node_Index;
       Tokens  : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
 
-   type Navigate_Class_Type is (Motion, Name, Statement_End, 
Statement_Override, Statement_Start, Misc);
+   type Navigate_Class_Type is (Motion, Statement_End, Statement_Override, 
Statement_Start, Misc);
    --  Matches [1] wisi-class-list.
 
    type Index_Navigate_Class is record
@@ -96,6 +96,13 @@ package Wisi is
       Tokens  : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array;
       Params  : in     Statement_Param_Array);
 
+   procedure Name_Action
+     (Data    : in out Parse_Data_Type;
+      Tree    : in     WisiToken.Syntax_Trees.Tree;
+      Nonterm : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+      Tokens  : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array;
+      Name    : in     WisiToken.Positive_Index_Type);
+
    procedure Containing_Action
      (Data       : in out Parse_Data_Type;
       Tree       : in     WisiToken.Syntax_Trees.Tree;
@@ -191,7 +198,8 @@ package Wisi is
    --  evaluated by wisi-elisp-parse--indent-compute-delta.
 
    type Simple_Indent_Param_Label is -- not hanging
-     (Int,
+     (None,
+      Int,
       Anchored_0, -- wisi-anchored
       Anchored_1, -- wisi-anchored%
       Anchored_2, -- wisi-anchored%-
@@ -224,9 +232,12 @@ package Wisi is
 
    Null_Args : Indent_Arg_Arrays.Vector renames Indent_Arg_Arrays.Empty_Vector;
 
-   type Simple_Indent_Param (Label : Simple_Indent_Param_Label := Int) is
+   type Simple_Indent_Param (Label : Simple_Indent_Param_Label := None) is
    record
       case Label is
+      when None =>
+         null;
+
       when Int =>
          Int_Delta : Integer;
 
@@ -245,10 +256,11 @@ package Wisi is
    type Indent_Param_Label is
      (Simple,
       Hanging_0, -- wisi-hanging
-      Hanging_1, -- wisi-hanging%
-      Hanging_2  -- wisi-hanging%-
+      Hanging_1, -- wisi-hanging-
+      Hanging_2, -- wisi-hanging%
+      Hanging_3  -- wisi-hanging%-
      );
-   subtype Hanging_Label is Indent_Param_Label range Hanging_0 .. Hanging_2;
+   subtype Hanging_Label is Indent_Param_Label range Hanging_0 .. Hanging_3;
 
    type Indent_Param (Label : Indent_Param_Label := Simple) is
    record
@@ -313,6 +325,13 @@ package Wisi is
    --  Language specific child packages override this to implement
    --  wisi-elisp-parse-indent-hanging-function.
 
+   type Arg_Index_Array is array (Positive range <>) of 
WisiToken.Positive_Index_Type;
+
+   procedure Put_Language_Action
+     (Data    : in Parse_Data_Type;
+      Content : in String);
+   --  Send a Language_Action message to Emacs.
+
    procedure Put (Data : in out Parse_Data_Type; Parser : in 
WisiToken.Parse.Base_Parser'Class);
    --  Perform additional post-parse actions, then put result to
    --  Ada.Text_IO.Current_Output, as encoded responses as defined in [3]
@@ -442,15 +461,15 @@ private
    Nil : constant Nil_Buffer_Pos := (Set => False);
 
    type Navigate_Cache_Type is record
-      Pos            : WisiToken.Buffer_Pos;          -- implicit in wisi-cache
-      Statement_ID   : WisiToken.Token_ID;  -- wisi-cache-nonterm
-      ID             : WisiToken.Token_ID;  -- wisi-cache-token
-      Length         : Natural;             -- wisi-cache-last
-      Class          : Navigate_Class_Type; -- wisi-cache-class; one of 
wisi-class-list
-      Containing_Pos : Nil_Buffer_Pos;      -- wisi-cache-containing
-      Prev_Pos       : Nil_Buffer_Pos;      -- wisi-cache-prev
-      Next_Pos       : Nil_Buffer_Pos;      -- wisi-cache-next
-      End_Pos        : Nil_Buffer_Pos;      -- wisi-cache-end
+      Pos            : WisiToken.Buffer_Pos; -- implicit in wisi-cache
+      Statement_ID   : WisiToken.Token_ID;   -- wisi-cache-nonterm
+      ID             : WisiToken.Token_ID;   -- wisi-cache-token
+      Length         : Natural;              -- wisi-cache-last
+      Class          : Navigate_Class_Type;  -- wisi-cache-class
+      Containing_Pos : Nil_Buffer_Pos;       -- wisi-cache-containing
+      Prev_Pos       : Nil_Buffer_Pos;       -- wisi-cache-prev
+      Next_Pos       : Nil_Buffer_Pos;       -- wisi-cache-next
+      End_Pos        : Nil_Buffer_Pos;       -- wisi-cache-end
    end record;
 
    function Key (Cache : in Navigate_Cache_Type) return WisiToken.Buffer_Pos 
is (Cache.Pos);
@@ -463,6 +482,11 @@ private
    package Navigate_Cache_Trees is new 
SAL.Gen_Unbounded_Definite_Red_Black_Trees
      (Navigate_Cache_Type, WisiToken.Buffer_Pos);
 
+   function Key (Cache : in WisiToken.Buffer_Region) return 
WisiToken.Buffer_Pos is (Cache.First);
+
+   package Name_Cache_Trees is new SAL.Gen_Unbounded_Definite_Red_Black_Trees
+     (WisiToken.Buffer_Region, WisiToken.Buffer_Pos);
+
    type Nil_Integer (Set : Boolean := False) is record
       case Set is
       when True =>
@@ -482,7 +506,7 @@ private
 
    package Face_Cache_Trees is new SAL.Gen_Unbounded_Definite_Red_Black_Trees 
(Face_Cache_Type, WisiToken.Buffer_Pos);
 
-   type Indent_Label is (Not_Set, Int, Anchor, Anchored, Anchor_Anchored);
+   type Indent_Label is (Not_Set, Int, Anchor_Nil, Anchor_Int, Anchored, 
Anchor_Anchored);
 
    package Anchor_ID_Vectors is new Ada.Containers.Vectors (Natural, Positive);
 
@@ -496,9 +520,12 @@ private
       when Int =>
          Int_Indent : Integer;
 
-      when Anchor =>
-         Anchor_IDs    : Anchor_ID_Vectors.Vector; --  Largest ID first.
-         Anchor_Indent : Integer;
+      when Anchor_Nil =>
+         Anchor_Nil_IDs : Anchor_ID_Vectors.Vector; --  Largest ID first.
+
+      when Anchor_Int =>
+         Anchor_Int_IDs    : Anchor_ID_Vectors.Vector; --  Largest ID first.
+         Anchor_Int_Indent : Integer;
 
       when Anchored =>
          Anchored_ID    : Positive;
@@ -521,6 +548,14 @@ private
      (Line_Begin_Token : not null access constant 
WisiToken.Line_Begin_Token_Vectors.Vector)
      is new WisiToken.Syntax_Trees.User_Data_Type with
    record
+      --  Aux token info
+      First_Comment_ID : WisiToken.Token_ID := WisiToken.Invalid_Token_ID;
+      Last_Comment_ID  : WisiToken.Token_ID := WisiToken.Invalid_Token_ID;
+      Left_Paren_ID    : WisiToken.Token_ID := WisiToken.Invalid_Token_ID;
+      Right_Paren_ID   : WisiToken.Token_ID := WisiToken.Invalid_Token_ID;
+
+      Embedded_Quote_Escape_Doubled : Boolean := False;
+
       --  Data from parsing
 
       Terminals : Augmented_Token_Arrays.Vector;
@@ -548,6 +583,7 @@ private
       Source_File_Name  : Ada.Strings.Unbounded.Unbounded_String;
       Post_Parse_Action : Post_Parse_Action_Type;
       Navigate_Caches   : Navigate_Cache_Trees.Tree;  -- Set by Navigate.
+      Name_Caches       : Name_Cache_Trees.Tree;      -- Set by Navigate.
       End_Positions     : Navigate_Cursor_Lists.List; -- Dynamic data for 
Navigate.
       Face_Caches       : Face_Cache_Trees.Tree;      -- Set by Face.
       Indents           : Indent_Vectors.Vector;      -- Set by Indent.
@@ -560,11 +596,29 @@ private
       Max_Anchor_ID : Integer;
    end record;
 
-   type Simple_Delta_Labels is (Int, Anchored);
+   type Simple_Delta_Labels is (None, Int, Anchored);
+
+   --  subtype Non_Anchored_Delta_Labels is Simple_Delta_Labels range None .. 
Int;
 
-   type Simple_Delta_Type (Label : Simple_Delta_Labels := Int) is
+   --  type Non_Anchored_Delta (Label : Non_Anchored_Delta_Labels := None) is
+   --  record
+   --     case Label is
+   --     when None =>
+   --        null;
+   --     when Int =>
+   --        Int_Delta : Integer;
+   --     end case;
+   --  end record;
+
+   --  function Image (Item : in Non_Anchored_Delta) return String;
+   --  For debugging
+
+   type Simple_Delta_Type (Label : Simple_Delta_Labels := None) is
    record
       case Label is
+      when None =>
+         null;
+
       when Int =>
          Int_Delta : Integer;
 
@@ -575,7 +629,6 @@ private
 
       end case;
    end record;
-   subtype Anchored_Delta is Simple_Delta_Type (Anchored);
 
    function Image (Item : in Simple_Delta_Type) return String;
    --  For debugging
@@ -598,7 +651,7 @@ private
       end case;
    end record;
 
-   Null_Delta : constant Delta_Type := (Simple, (Int, 0));
+   Null_Delta : constant Delta_Type := (Simple, (Label => None));
 
    function Image (Item : in Delta_Type) return String;
    --  For debugging
diff --git a/packages/wisi/wisi.el b/packages/wisi/wisi.el
index 3aa522c..5ea8d5a 100644
--- a/packages/wisi/wisi.el
+++ b/packages/wisi/wisi.el
@@ -1,1517 +1,1640 @@
-;;; wisi.el --- Utilities for implementing an indentation/navigation engine 
using a generalized LALR parser -*- lexical-binding:t -*-
-;;
-;; Copyright (C) 2012 - 2019  Free Software Foundation, Inc.
-;;
-;; Author: Stephen Leake <address@hidden>
-;; Maintainer: Stephen Leake <address@hidden>
-;; Keywords: parser
-;;  indentation
-;;  navigation
-;; Version: 2.1.0
-;; package-requires: ((cl-lib "1.0") (emacs "25.0") (seq "2.20"))
-;; URL: http://stephe-leake.org/ada/wisitoken.html
-;;
-;; This file is part of GNU Emacs.
-;;
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-;;
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-;;
-
-;;; Commentary:
-
-;;;; History: see NEWS-wisi.text
-;;
-;;;; Design:
-;;
-;; 'wisi' was originally short for "wisent indentation engine", but
-;; now is just a name. wisi was developed to support Emacs ada-mode
-;; 5.0 indentation, font-lock, and navigation, which are parser based.
-;;
-;; The approach to indenting a given token is to parse the buffer,
-;; computing a delta indent at each parse action.
-;;
-;; The parser actions also cache face and navigation information
-;; as text properties on tokens in statements.
-;;
-;; The three reasons to run the parser (indent, face, navigate) occur
-;; at different times (user indent, font-lock, user navigate), so only
-;; the relevant parser actions are run.
-;;
-;; Parsing can be noticeably slow in large files, so sometimes we do a
-;; partial parse, and keep a list of parsed regions.
-;;
-;; Since we have a cache (the text properties), we need to consider
-;; when to invalidate it.  Ideally, we invalidate only when a change
-;; to the buffer would change the result of a parse that crosses that
-;; change, or starts after that change.  Changes in whitespace
-;; (indentation and newlines) do not affect an Ada parse.  Other
-;; languages are sensitive to newlines (Bash for example) or
-;; indentation (Python).  Adding comments does not change a parse,
-;; unless code is commented out.
-;;
-;; For navigate, we expect fully accurate results, and can tolerate
-;; one initial delay, so we always parse the entire file.
-;;
-;; For font-lock, we only parse the portion of the file requested by
-;; font-lock, so we keep a list of regions, and edit that list when
-;; the buffer is changed..
-;;
-;; For indenting, we expect fast results, and can tolerate some
-;; inaccuracy until the editing is done, so we allow partial parse. We
-;; cache the indent for each line in a text property on the newline
-;; char preceding the line. `wisi-indent-region' sets the cache on all
-;; the lines computed (part of the buffer in large files), but
-;; performs the indent only on the lines in the indent
-;; region. Subsequent calls to `wisi-indent-region' apply the cached
-;; indents. Non-whitespace edits to the buffer invalidate the indent
-;; caches in the edited region and after. Since we can do partial
-;; parse, we keep a list of parsed regions.
-;;
-;; See `wisi--post-change' for the details of what we check for
-;; invalidating.
-;;
-;;;; Choice of grammar compiler and parser
-;;
-;; There are two other parsing engines available in Emacs:
-;;
-;; - SMIE
-;;
-;;   We don't use this because it is designed to parse small snippets
-;;   of code. For Ada indentation, we always need to parse the entire
-;;   buffer.
-;;
-;; - semantic
-;;
-;;   The Ada grammar as given in the Ada language reference manual is
-;;   not LALR(1). So we use a generalized parser. In addition, the
-;;   semantic lexer is more complex, and gives different information
-;;   than we need. Finally, the semantic parser does not support error
-;;   correction, and thus fails in most editing situations.
-;;
-;; We use wisitoken wisi-generate to compile BNF to Elisp source, and
-;; wisi-compile-grammar to compile that to the parser table. See
-;; ada-mode info for more information on the developer tools used for
-;; ada-mode and wisi.
-;;
-;; Alternately, to gain speed and error handling, we use wisi-generate
-;; to generate Ada source, and run that in an external process. That
-;; supports error correction while parsing.
-;;
-;;;; syntax-propertize
-;;
-;; `wisi-forward-token' relies on syntax properties, so
-;; `syntax-propertize' must be called on the text to be lexed before
-;; wisi-forward-token is called.
-;;
-;; Emacs >= 25 calls syntax-propertize transparently in the low-level
-;; lexer functions.
-;;
-;; In Emacs < 25, we call syntax-propertize in wisi-setup, and in
-;; `wisi--post-change'.
-;;
-;;;;;
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'compile)
-(require 'seq)
-(require 'semantic/lex)
-(require 'wisi-parse-common)
-(require 'wisi-elisp-lexer)
-(require 'wisi-fringe)
-
-(defcustom wisi-size-threshold most-positive-fixnum
-  "Max size (in characters) for using wisi parser results for anything."
-  :type 'integer
-  :group 'wisi
-  :safe 'integerp)
-(make-variable-buffer-local 'wisi-size-threshold)
-
-(defcustom wisi-partial-parse-threshold 100001
-  "Min size (in characters) for using partial wisi parser.
-The partial parser finds a nearby start point, and parses a small
-portion of the file containing the region to parse. For indent,
-it assumes the start point is properly indented."
-  :type 'integer
-  :group 'wisi
-  :safe 'integerp)
-(make-variable-buffer-local 'wisi-partial-parse-threshold)
-
-(defvar wisi-inhibit-parse nil
-  "When non-nil, don't run the parser.
-Language code can set this non-nil when syntax is known to be
-invalid temporarily, or when making lots of changes.")
-
-(defcustom wisi-disable-face nil
-  "When non-nil, `wisi-setup' does not enable use of parser for font-lock.
-Useful when debugging parser or parser actions."
-  :type 'boolean
-  :group 'wisi
-  :safe 'booleanp)
-
-(defconst wisi-error-buffer-name "*wisi syntax errors*"
-  "Name of buffer for displaying syntax errors.")
-
-(defvar wisi-error-buffer nil
-  "Buffer for displaying syntax errors.")
-
-(defun wisi-safe-marker-pos (pos)
-  "Return an integer buffer position from POS, an integer or marker"
-  (cond
-   ((markerp pos)
-    (marker-position pos))
-
-   (t pos)))
-
-;;;; token info cache
-
-(defvar-local wisi-parse-failed nil
-  "Non-nil when a recent parse has failed - cleared when parse succeeds.")
-
-(defvar-local wisi--parse-try
-  (list
-   (cons 'face t)
-   (cons 'navigate t)
-   (cons 'indent t))
-  "Non-nil when parse is needed - cleared when parse succeeds.")
-
-(defun wisi-parse-try (&optional parse-action)
-  (cdr (assoc (or parse-action wisi--parse-action) wisi--parse-try)))
-
-(defun wisi-set-parse-try (value &optional parse-action)
-  (setcdr (assoc (or parse-action wisi--parse-action) wisi--parse-try) value))
-
-(defvar-local wisi--cached-regions
-  (list
-   (cons 'face nil)
-   (cons 'navigate nil)
-   (cons 'indent nil))
-  "Alist of lists of regions in buffer where parser text properties are valid.
-Regions in a list are in random order.")
-
-(defun wisi--contained-region (begin end region)
-  "Non-nil if BEGIN END (buffer positions) is contained in REGION (a cons of 
positions)."
-  ;; We assume begin < end
-  (and (<= (car region) begin)
-       (<= end (cdr region))))
-
-(defun wisi--contained-pos (pos region)
-  "Non-nil if POS (a buffer position) is contained in REGION (a cons of 
positions)."
-  (and (<= (car region) pos)
-       (<= pos (cdr region))))
-
-(defun wisi-cache-covers-region (begin end &optional parse-action)
-  "Non-nil if BEGIN END is contained in a parsed region."
-  (let ((region-list (cdr (assoc (or parse-action wisi--parse-action) 
wisi--cached-regions)))
-       region)
-    (while (and region-list
-               (not (wisi--contained-region begin end (car region-list))))
-      (pop region-list))
-
-    (when region-list
-      ;; return a nice value for verbosity in wisi-validate-cache
-      (setq region (car region-list))
-      (cons (marker-position (car region)) (marker-position (cdr region))))))
-
-(defun wisi-cache-covers-pos (parse-action pos)
-  "Non-nil if POS is contained in a PARSE-ACTION parsed region."
-  (let ((region-list (cdr (assoc parse-action wisi--cached-regions))))
-    (while (and region-list
-               (not (wisi--contained-pos pos (car region-list))))
-      (pop region-list))
-
-    (when region-list
-      t)))
-
-(defun wisi-cache-contains-pos (parse-action pos)
-  "Non-nil if POS is at or before the end of any PARSE-ACTION parsed region."
-  (let ((region-list (cdr (assoc parse-action wisi--cached-regions)))
-       result)
-    (while (and (not result) region-list)
-      (when (<= pos (cdr (car region-list)))
-       (setq result t))
-      (pop region-list))
-
-    result))
-
-(defun wisi-cache-set-region (region)
-  "Set the cached region list for `wisi--parse-action' to REGION."
-  (setcdr (assoc wisi--parse-action wisi--cached-regions)
-         (list (cons (copy-marker (car region))
-                     (copy-marker (cdr region))))))
-
-(defun wisi-cache-add-region (region)
-  "Add REGION to the cached region list for `wisi--parse-action'."
-  (push (cons (copy-marker (car region))
-             (copy-marker (cdr region)))
-       (cdr (assoc wisi--parse-action wisi--cached-regions))))
-
-(defun wisi-cache-delete-regions-after (parse-action pos)
-  "Delete any PARSE-ACTION parsed region at or after POS.
-Truncate any region that overlaps POS."
-  (let ((region-list (cdr (assoc parse-action wisi--cached-regions)))
-       result)
-    (while (and (not result) region-list)
-      (cond
-       ((and (> pos (car (car region-list)))
-            (<= pos (cdr (car region-list))))
-       ;; region contains POS; keep truncated
-       (push (cons (car (car region-list)) (copy-marker pos)) result))
-
-       ((> pos (car (car region-list)))
-       ;; region is entirely before POS; keep
-       (push (car region-list) result))
-
-       ;; else region is entirely after POS; delete
-       )
-
-      (pop region-list))
-    (setcdr (assoc parse-action wisi--cached-regions) result)
-    ))
-
-(defun wisi--delete-face-cache (after)
-  (with-silent-modifications
-    (remove-text-properties after (point-max) '(font-lock-face nil))
-    )
-  (wisi-cache-delete-regions-after 'face after))
-
-(defun wisi--delete-navigate-cache (after)
-  (with-silent-modifications
-    ;; This text property is 'wisi-cache', not 'wisi-navigate', for
-    ;; historical reasons.
-    (remove-text-properties after (point-max) '(wisi-cache nil))
-    )
-  (wisi-cache-delete-regions-after 'navigate after))
-
-(defun wisi--delete-indent-cache (after)
-  (with-silent-modifications
-    (remove-text-properties after (point-max) '(wisi-indent nil))
-    )
-  (wisi-cache-delete-regions-after 'indent after))
-
-(defun wisi-invalidate-cache (action after)
-  "Invalidate ACTION caches for the current buffer from AFTER to end of 
buffer."
-  (when (wisi-cache-contains-pos action after)
-    (when (> wisi-debug 0) (message "wisi-invalidate-cache %s:%s:%d" action 
(current-buffer) after))
-    (cond
-     ((eq 'face action)
-      (wisi--delete-face-cache after))
-
-     ((eq 'navigate action)
-      (when (wisi-cache-covers-pos 'navigate after)
-       ;; We goto statement start to ensure that motion within nested
-       ;; structures is properly done (ie prev/next on ’elsif’ is not
-       ;; set by wisi-motion-action if already set by a lower level
-       ;; statement). We don’t do it for ’face or ’indent, because that
-       ;; might require a parse, and they don’t care about nested
-       ;; structures.
-       (save-excursion
-         (goto-char after)
-
-         ;; This is copied from ‘wisi-goto-statement-start’; we can’t
-         ;; call that because it would call ‘wisi-validate-cache’,
-         ;; which would call ‘wisi-invalidate-cache’; infinite loop.
-         ;; If this needed a navigate parse to succeed, we would not
-         ;; get here.
-         (let ((cache (or (wisi-get-cache (point))
-                          (wisi-backward-cache))))
-           (cond
-            ((null cache)
-             ;; at bob
-             nil)
-
-            ((eq 'statement-end (wisi-cache-class cache))
-             ;; If the change did affect part of a structure statement,
-             ;; this is a lower level statement. Otherwise, we are
-             ;; invalidating more than necessary; not a problem.
-             (wisi-goto-start cache)
-             (setq cache (wisi-backward-cache))
-             (when cache ;; else bob
-               (wisi-goto-start cache)))
-
-            (t
-             (wisi-goto-start cache))
-            ))
-
-         (setq after (point))))
-      (wisi--delete-navigate-cache after))
-
-     ((eq 'indent action)
-      ;; The indent cache is stored on newline before line being
-      ;; indented. We delete that, because changing text on a line can
-      ;; change the indent of that line.
-      (setq after
-           (save-excursion
-             (goto-char after)
-             (line-beginning-position)))
-      (wisi--delete-indent-cache (max 1 (1- after))))
-     )
-    ))
-
-(defun wisi-reset-parser ()
-  "Force a parse."
-  (interactive)
-  (wisi-invalidate-cache 'indent (point-min))
-  (wisi-invalidate-cache 'face (point-min))
-  (wisi-invalidate-cache 'navigate (point-min))
-  (wisi-set-parse-try t 'indent)
-  (wisi-set-parse-try t 'face)
-  (wisi-set-parse-try t 'navigate)
-  (wisi-fringe-clean))
-
-;; wisi--change-* keep track of buffer modifications.
-;; If wisi--change-end comes before wisi--change-beg, it means there were
-;; no modifications.
-(defvar-local wisi--change-beg most-positive-fixnum
-  "First position where a change may have taken place.")
-
-(defvar-local wisi--change-end nil
-  "Marker pointing to the last position where a change may have taken place.")
-
-(defvar-local wisi--deleted-syntax nil
-  "Worst syntax class of characters deleted in changes.
-One of:
-nil - no deletions since reset
-0   - only whitespace or comment deleted
-2   - some other syntax deleted
-
-Set by `wisi-before-change', used and reset by `wisi--post-change'.")
-
-(defvar-local wisi-indenting-p nil
-  "Non-nil when `wisi-indent-region' is actively indenting.
-Used to ignore whitespace changes in before/after change hooks.")
-
-(defvar-local wisi--parser nil
-  "Choice of wisi parser implementation; a ‘wisi-parser’ object.")
-
-(defvar-local wisi--last-parse-action nil
-  "Last value of `wisi--parse-action' when `wisi-validate-cache' was run.")
-
-(defun wisi-before-change (begin end)
-  "For `before-change-functions'."
-  ;; begin . (1- end) is range of text being deleted
-  (unless wisi-indenting-p
-    ;; We set wisi--change-beg, -end even if only inserting, so we
-    ;; don't have to do it again in wisi-after-change.
-    (setq wisi--change-beg (min wisi--change-beg begin))
-
-    (cond
-     ((null wisi--change-end)
-      (setq wisi--change-end (copy-marker end)))
-
-     ((> end wisi--change-end)
-      ;; `buffer-base-buffer' deals with edits in indirect buffers
-      ;; created by ediff-regions-*
-      (set-marker wisi--change-end end (buffer-base-buffer)))
-     )
-
-    (unless (= begin end)
-      (cond
-       ((or (null wisi--deleted-syntax)
-           (= 0 wisi--deleted-syntax))
-       (save-excursion
-         (if (or (nth 4 (syntax-ppss begin)) ; in comment, moves point to begin
-                 (= end (skip-syntax-forward " " end)));; whitespace
-             (setq wisi--deleted-syntax 0)
-           (setq wisi--deleted-syntax 2))))
-
-       (t
-       ;; wisi--deleted-syntax is 2; no change.
-       )
-       ))))
-
-(defun wisi-after-change (begin end _length)
-  "For `after-change-functions'"
-  ;; begin . end is range of text being inserted (empty if equal);
-  ;; length is the size of the deleted text.
-
-  ;; Remove caches on inserted text, which could have caches from
-  ;; anywhere, and are in any case invalid.
-
-  ;; If the insertion changes a word that has wisi fontification,
-  ;; remove fontification from the entire word, so it is all
-  ;; refontified consistently.
-
-  (let (word-begin word-end)
-    (save-excursion
-      (goto-char end)
-      (skip-syntax-forward "w_")
-      (setq word-end (point))
-      (goto-char begin)
-      (skip-syntax-backward "w_")
-      (setq word-begin (point)))
-    (if (get-text-property word-begin 'font-lock-face)
-       (with-silent-modifications
-         (remove-text-properties
-          word-begin word-end
-          '(font-lock-face nil wisi-cache nil wisi-indent nil fontified nil)))
-
-      ;; No point in removing
-      ;; 'fontified here; that's already handled by jit-lock.
-      (with-silent-modifications
-       (remove-text-properties
-        begin end
-        '(font-lock-face nil wisi-cache nil wisi-indent nil))))
-    ))
-
-(defun wisi--post-change (begin end)
-  "Update wisi text properties for changes in region BEG END."
-  ;; (syntax-ppss-flush-cache begin) is in before-change-functions
-
-  ;; see comments above on syntax-propertize
-  (when (< emacs-major-version 25) (syntax-propertize end))
-
-  (save-excursion
-    (let ((need-invalidate t)
-         (done nil)
-         ;; non-nil if require a parse because the syntax may have
-         ;; changed.
-
-         (begin-state (syntax-ppss begin))
-         (end-state (syntax-ppss end)))
-         ;; (info "(elisp)Parser State")
-         ;; syntax-ppss has moved point to "end"; might be eob.
-
-      ;; consider deletion
-      (cond
-       ((null wisi--deleted-syntax)
-       ;; no deletions
-       )
-
-       ((= 0 wisi--deleted-syntax)
-       ;; Only deleted whitespace; may have joined two words
-       (when
-           (and (= begin end) ;; no insertions
-                (or
-                 (= (point-min) begin)
-                 (= 0 (syntax-class (syntax-after (1- begin))))
-                 (= (point-max) end)
-                 (= 0 (syntax-class (syntax-after end)))))
-         ;; More whitespace on at least one side of deletion; did not
-         ;; join two words.
-         (setq need-invalidate nil)
-         (setq done t)
-         ))
-
-       (t
-       ;; wisi--deleted-syntax is 2; need invalidate and parse for all
-       ;; parse actions
-       (setq done t)
-       ))
-
-      (setq wisi--deleted-syntax nil)
-
-      (unless done
-       ;; consider insertion
-       (cond
-        ((= begin end)
-         ;; no insertions
-         nil)
-
-        ((and
-          (nth 3 begin-state);; in string
-          (nth 3 end-state)
-          (= (nth 8 begin-state) (nth 8 end-state)));; no intervening 
non-string
-         (setq need-invalidate nil))
-
-        ((and
-          (nth 4 begin-state) ; in comment
-          (nth 4 end-state)
-          (= (nth 8 begin-state) (nth 8 end-state))) ;; no intervening 
non-comment
-         (setq need-invalidate nil))
-
-        ((and
-          (or
-           (= (point-min) begin)
-           (= 0 (syntax-class (syntax-after (1- begin)))); whitespace
-           (= (point-max) end)
-           (= 0 (syntax-class (syntax-after end))))
-          (progn
-            (goto-char begin)
-            (= (- end begin) (skip-syntax-forward " " end))
-            ))
-         ;; Inserted only whitespace, there is more whitespace on at
-         ;; least one side, and we are not in a comment or string
-         ;; (checked above).  This may affect indentation, but not
-         ;; the indentation cache.
-         (setq need-invalidate nil))
-        ))
-
-      (when need-invalidate
-       (wisi-set-parse-try t 'face)
-       (wisi-set-parse-try t 'navigate)
-       (wisi-set-parse-try t 'indent)
-
-       (wisi-invalidate-cache 'face begin)
-       (wisi-invalidate-cache 'navigate begin)
-       (wisi-invalidate-cache 'indent begin))
-      )))
-
-(defun wisi-goto-error ()
-  "Move point to position in last error message (if any)."
-  (cond
-   ((wisi-parser-parse-errors wisi--parser)
-    (let ((data (car (wisi-parser-parse-errors wisi--parser))))
-      (cond
-       ((wisi--parse-error-pos data)
-       (push-mark)
-       (goto-char (wisi--parse-error-pos data)))
-
-       ((string-match ":\\([0-9]+\\):\\([0-9]+\\):" (wisi--parse-error-message 
data))
-       (let* ((msg (wisi--parse-error-message data))
-              (line (string-to-number (match-string 1 msg)))
-              (col (string-to-number (match-string 2 msg))))
-         (push-mark)
-         (goto-char (point-min))
-         (condition-case nil
-             (progn
-               ;; line can be wrong if parser screws up, or user edits buffer
-               (forward-line (1- line))
-               (forward-char col))
-           (error
-            ;; just stay at eob.
-            nil))))
-       )))
-   ((wisi-parser-lexer-errors wisi--parser)
-    (push-mark)
-    (goto-char (wisi--lexer-error-pos (car (wisi-parser-lexer-errors 
wisi--parser)))))
-   ))
-
-(defun wisi-show-parse-error ()
-  "Show current wisi-parse errors."
-  (interactive)
-  (cond
-   ((or (wisi-parser-lexer-errors wisi--parser)
-       (wisi-parser-parse-errors wisi--parser))
-    (if (and (= 1 (+ (length (wisi-parser-lexer-errors wisi--parser))
-                    (length (wisi-parser-parse-errors wisi--parser))))
-            (or (and (wisi-parser-parse-errors wisi--parser)
-                     (not (wisi--parse-error-repair (car 
(wisi-parser-parse-errors wisi--parser)))))
-                (and (wisi-parser-lexer-errors wisi--parser)
-                     (not (wisi--lexer-error-inserted (car 
(wisi-parser-lexer-errors wisi--parser)))))))
-       ;; There is exactly one error; if there is error correction
-       ;; information, use a ’compilation’ buffer, so
-       ;; *-fix-compiler-error will call
-       ;; wisi-repair-error. Otherwise, just position cursor at
-       ;; error.
-       (progn
-         (wisi-goto-error)
-         (message (or (and (wisi-parser-parse-errors wisi--parser)
-                           (wisi--parse-error-message (car 
(wisi-parser-parse-errors wisi--parser))))
-                      (and (wisi-parser-lexer-errors wisi--parser)
-                           (wisi--lexer-error-message (car 
(wisi-parser-lexer-errors wisi--parser)))))
-                  ))
-
-      ;; else show all errors in a ’compilation’ buffer
-      (setq wisi-error-buffer (get-buffer-create wisi-error-buffer-name))
-
-      (let ((lexer-errs (nreverse (cl-copy-seq (wisi-parser-lexer-errors 
wisi--parser))))
-           (parse-errs (nreverse (cl-copy-seq (wisi-parser-parse-errors 
wisi--parser)))))
-       (with-current-buffer wisi-error-buffer
-         (compilation-mode)
-         (setq next-error-last-buffer (current-buffer))
-         (setq buffer-read-only nil)
-         (erase-buffer)
-         ;; compilation-nex-error-function assumes there is not an
-         ;; error at point min, so we need a comment.
-         (insert "wisi syntax errors")
-         (newline)
-         (dolist (err lexer-errs)
-           (insert (wisi--lexer-error-message err))
-           (put-text-property (line-beginning-position) (1+ 
(line-beginning-position)) 'wisi-error-data err)
-           (newline 2))
-         (dolist (err parse-errs)
-           (insert (wisi--parse-error-message err))
-           (put-text-property (line-beginning-position) (1+ 
(line-beginning-position)) 'wisi-error-data err)
-           (newline 2))
-         (compilation--flush-parse (point-min) (point-max))
-         (compilation--ensure-parse (point-max))
-         (when compilation-filter-hook
-           (let ((compilation-filter-start (point-min)))
-             (run-hooks 'compilation-filter-hook)))
-
-         (setq buffer-read-only t)
-         (goto-char (point-min)))
-
-       (display-buffer wisi-error-buffer
-                       (cons #'display-buffer-at-bottom
-                             (list (cons 'window-height 
#'shrink-window-if-larger-than-buffer))))
-       (next-error))
-      ))
-
-   ((wisi-parse-try wisi--last-parse-action)
-    (message "need parse"))
-
-   (t
-    (message "parse succeeded"))
-   ))
-
-(defun wisi-kill-parser ()
-  "Kill the background process running the parser for the current buffer.
-Usefull if the parser appears to be hung."
-  (interactive)
-  (wisi-parse-kill wisi--parser)
-  ;; also force re-parse
-  (dolist (parse-action '(face navigate indent))
-    (wisi-set-parse-try t parse-action)
-    (wisi-invalidate-cache parse-action (point-min)))
-  )
-
-(defun wisi-partial-parse-p (begin end)
-  (and (wisi-process--parser-p wisi--parser)
-       (not (and (= begin (point-min))
-                (= end (point-max))))
-       (>= (point-max) wisi-partial-parse-threshold)))
-
-(defun wisi--run-parse (begin parse-end)
-  "Run the parser, on at least region BEGIN PARSE-END."
-  (unless (or (buffer-narrowed-p)
-             (= (point-min) (point-max))) ;; some parsers can’t handle an 
empty buffer.
-    (let* ((partial-parse-p (wisi-partial-parse-p begin parse-end))
-          (msg (when (> wisi-debug 0)
-                 (format "wisi: %sparsing %s %s:%d %d %d ..."
-                         (if partial-parse-p "partial " "")
-                         wisi--parse-action
-                         (buffer-name)
-                         begin
-                         (if (markerp parse-end) (marker-position parse-end) 
parse-end)
-                         (line-number-at-pos begin))))
-          (parsed-region nil))
-
-      (when msg
-       (message msg))
-
-      (setq wisi--last-parse-action wisi--parse-action)
-
-      (unless (eq wisi--parse-action 'face)
-       (when (buffer-live-p wisi-error-buffer)
-         (with-current-buffer wisi-error-buffer
-           (setq buffer-read-only nil)
-           (erase-buffer)
-           (setq buffer-read-only t))))
-
-      (condition-case-unless-debug err
-         (save-excursion
-           (if partial-parse-p
-             (let ((send-region (wisi-parse-expand-region wisi--parser begin 
parse-end)))
-               (setq parsed-region (wisi-parse-current wisi--parser (car 
send-region) (cdr send-region) parse-end))
-               (wisi-cache-add-region parsed-region))
-
-             ;; parse full buffer
-             (setq parsed-region (cons (point-min) (point-max)))
-             (wisi-cache-set-region (wisi-parse-current wisi--parser 
(point-min) (point-max) (point-max))))
-
-           (when (> wisi-debug 0) (message "... parsed %s" parsed-region))
-           (setq wisi-parse-failed nil))
-       (wisi-parse-error
-        (cl-ecase wisi--parse-action
-          (face
-           ;; caches set by failed elisp parse are ok
-           (wisi--delete-face-cache (cdr parsed-region)))
-
-          (navigate
-           ;; elisp parse partially resets caches
-           (wisi--delete-navigate-cache (point-min)))
-
-          (indent
-           ;; parse does not set caches; see `wisi-indent-region'
-           nil))
-        (setq wisi-parse-failed t)
-        ;; parser should have stored this error message in parser-error-msgs
-        )
-       (error
-        ;; parser failed for other reason
-        (setq wisi-parse-failed t)
-        (signal (car err) (cdr err)))
-       )
-
-      (unless partial-parse-p
-       (wisi-fringe-display-errors
-        (append
-         (seq-map (lambda (err) (wisi--lexer-error-pos err)) 
(wisi-parser-lexer-errors wisi--parser))
-         (seq-map (lambda (err) (wisi--parse-error-pos err)) 
(wisi-parser-parse-errors wisi--parser)))))
-
-      (when (> wisi-debug 1)
-       (if (or (wisi-parser-lexer-errors wisi--parser)
-               (wisi-parser-parse-errors wisi--parser))
-           (progn
-             (message "%s error" msg)
-             (wisi-goto-error)
-             (error (or (and (wisi-parser-lexer-errors wisi--parser)
-                             (wisi--lexer-error-message (car 
(wisi-parser-lexer-errors wisi--parser))))
-                        (and (wisi-parser-parse-errors wisi--parser)
-                             (wisi--parse-error-message (car 
(wisi-parser-parse-errors wisi--parser))))
-                        )))
-
-         ;; no error
-         (message "%s done" msg))
-       ))))
-
-(defun wisi--check-change ()
-  "Process `wisi--change-beg', `wisi--change-end'.
-`wisi--parse-action' must be bound."
-  (when (and wisi--change-beg
-            wisi--change-end
-            (<= wisi--change-beg wisi--change-end))
-    (wisi--post-change wisi--change-beg (marker-position wisi--change-end))
-    (setq wisi--change-beg most-positive-fixnum)
-    (move-marker wisi--change-end (point-min))
-    ))
-
-(defun wisi-validate-cache (begin end error-on-fail parse-action)
-  "Ensure cached data for PARSE-ACTION is valid in region BEGIN END in current 
buffer."
-  (if (and (not wisi-inhibit-parse)
-          (< (point-max) wisi-size-threshold))
-      (let ((wisi--parse-action parse-action))
-       (wisi--check-change)
-
-       ;; Now we can rely on wisi-cache-covers-region
-
-       (if (and (or (not wisi-parse-failed)
-                    (wisi-parse-try))
-               (not (wisi-cache-covers-region begin end)))
-           (progn
-             ;; Don't keep retrying failed parse until text changes again.
-             (wisi-set-parse-try nil)
-             (wisi--run-parse begin end))
-
-         (when (> wisi-debug 0)
-           (message "parse %s skipped: parse-failed %s parse-try %s 
cache-covers-region %s %s.%s"
-                    parse-action
-                    wisi-parse-failed
-                    (wisi-parse-try)
-                    (wisi-cache-covers-region begin end)
-                    begin end)))
-
-       ;; We want this error even if we did not try to parse; it means
-       ;; the parse results are not valid.
-       (when (and error-on-fail wisi-parse-failed)
-         (error "parse %s failed" parse-action))
-       )
-    (when (> wisi-debug 0)
-      (message "parse %s skipped inihibit-parse %s wisi-size-threshold %d"
-              parse-action
-              wisi-inhibit-parse
-              wisi-size-threshold))))
-
-(defun wisi-fontify-region (begin end)
-  "For `jit-lock-functions'."
-  (wisi-validate-cache begin end nil 'face))
-
-(defun wisi-get-containing-cache (cache)
-  "Return cache from (wisi-cache-containing CACHE)."
-  (when cache
-    (let ((containing (wisi-cache-containing cache)))
-      (and containing
-          (wisi-get-cache containing)))))
-
-(defun wisi-cache-text (cache)
-  "Return property-less buffer substring designated by cache.
-Point must be at cache."
-  (buffer-substring-no-properties (point) (+ (point) (wisi-cache-last cache))))
-
-;;;; navigation
-
-(defun wisi-forward-find-class (class limit)
-  "Search at point or forward for a token that has a cache with CLASS.
-Return cache, or nil if at end of buffer.
-If LIMIT (a buffer position) is reached, throw an error."
-  (let ((cache (or (wisi-get-cache (point))
-                  (wisi-forward-cache))))
-    (while (not (eq class (wisi-cache-class cache)))
-      (setq cache (wisi-forward-cache))
-      (when (>= (point) limit)
-       (error "cache with class %s not found" class)))
-    cache))
-
-(defun wisi-forward-find-token (token limit &optional noerror)
-  "Search forward for TOKEN.
-If point is at a matching token, return that token.  TOKEN may be
-a list; stop on any member of the list.  Return `wisi-tok'
-struct, or if LIMIT (a buffer position) is reached, then if
-NOERROR is nil, throw an error, if non-nil, return nil."
-  (let ((token-list (cond
-                    ((listp token) token)
-                    (t (list token))))
-       (tok (wisi-forward-token))
-       (done nil))
-    (while (not (or done
-                   (memq (wisi-tok-token tok) token-list)))
-      (setq tok (wisi-forward-token))
-      (when (or (>= (point) limit)
-               (eobp))
-       (goto-char limit)
-       (setq tok nil)
-       (if noerror
-           (setq done t)
-         (error "token %s not found" token))))
-    tok))
-
-(defun wisi-forward-find-cache-token (ids limit)
-  "Search forward for a cache with token in IDS (a list of token ids).
-Return cache, or nil if at LIMIT or end of buffer."
-  (let ((cache (wisi-forward-cache)))
-    (while (and (< (point) limit)
-               (not (eobp))
-               (not (memq (wisi-cache-token cache) ids)))
-      (setq cache (wisi-forward-cache)))
-    cache))
-
-(defun wisi-forward-find-nonterm (nonterm limit)
-  "Search forward for a token that has a cache with NONTERM.
-NONTERM may be a list; stop on any cache that has a member of the list.
-Return cache, or nil if at end of buffer.
-If LIMIT (a buffer position) is reached, throw an error."
-  (let ((nonterm-list (cond
-                      ((listp nonterm) nonterm)
-                      (t (list nonterm))))
-       (cache (wisi-forward-cache)))
-    (while (not (memq (wisi-cache-nonterm cache) nonterm-list))
-      (setq cache (wisi-forward-cache))
-      (when (>= (point) limit)
-       (error "cache with nonterm %s not found" nonterm)))
-    cache))
-
-(defun wisi-goto-cache-next (cache)
-  (goto-char (wisi-cache-next cache))
-  (wisi-get-cache (point))
-  )
-
-(defun wisi-forward-statement-keyword ()
-  "If not at a cached token, move forward to next
-cache. Otherwise move to cache-next, or cache-end, or next cache
-if both nil.  Return cache found."
-  (unless (eobp)
-    (wisi-validate-cache (point-min) (point-max) t 'navigate)
-    (let ((cache (wisi-get-cache (point))))
-      (if (and cache
-              (not (eq (wisi-cache-class cache) 'statement-end)))
-         (let ((next (or (wisi-cache-next cache)
-                         (wisi-cache-end cache))))
-           (if next
-               (goto-char next)
-             (wisi-forward-cache)))
-       (wisi-forward-cache))
-      )
-    (wisi-get-cache (point))
-    ))
-
-(defun wisi-backward-statement-keyword ()
-  "If not at a cached token, move backward to prev
-cache. Otherwise move to cache-prev, or prev cache if nil."
-  (wisi-validate-cache (point-min) (point-max) t 'navigate)
-  (let ((cache (wisi-get-cache (point)))
-       prev)
-    (when cache
-      (setq prev (wisi-cache-prev cache))
-      (unless prev
-       (unless (eq 'statement-start (wisi-cache-class cache))
-         (setq prev (wisi-cache-containing cache)))))
-    (if prev
-       (goto-char prev)
-      (wisi-backward-cache))
-  ))
-
-(defun wisi-forward-sexp (&optional arg)
-  "For `forward-sexp-function'."
-  (interactive "^p")
-  (or arg (setq arg 1))
-  (cond
-   ((and (> arg 0) (= 4 (syntax-class (syntax-after (point)))))  ;; on open 
paren
-    (let ((forward-sexp-function nil))
-      (forward-sexp arg)))
-
-   ((and (< arg 0) (= 5 (syntax-class (syntax-after (1- (point)))))) ;; after 
close paren
-    (let ((forward-sexp-function nil))
-      (forward-sexp arg)))
-
-   ((and (> arg 0) (= 7 (syntax-class (syntax-after (point)))))  ;; on (open) 
string quote
-    (let ((forward-sexp-function nil))
-      (forward-sexp arg)))
-
-   ((and (< arg 0) (= 7 (syntax-class (syntax-after (1- (point)))))) ;; after 
(close) string quote
-    (let ((forward-sexp-function nil))
-      (forward-sexp arg)))
-
-   (t
-    (dotimes (_i (abs arg))
-      (if (> arg 0)
-         (wisi-forward-statement-keyword)
-       (wisi-backward-statement-keyword))))
-   ))
-
-(defun wisi-goto-containing (cache &optional error)
-  "Move point to containing token for CACHE, return cache at that point.
-If ERROR, throw error when CACHE has no container; else return nil."
-  (cond
-   ((and (markerp (wisi-cache-containing cache))
-
-        (not (= (wisi-cache-containing cache) (point))))
-    ;; This check is only needed if some cache points to itself as a
-    ;; container. Apparently that happend once that I caught in the
-    ;; debugger; emacs hung because we got here in the font-lock
-    ;; timer.
-
-    (goto-char (wisi-cache-containing cache))
-    (wisi-get-cache (point)))
-   (t
-    (when error
-      (error "already at outermost containing token")))
-   ))
-
-(defun wisi-goto-containing-paren (cache)
-  "Move point to just after the open-paren containing CACHE.
-Return cache for paren, or nil if no containing paren."
-  (while (and cache
-             (not (eq (wisi-cache-class cache) 'open-paren)))
-    (setq cache (wisi-goto-containing cache)))
-  (when cache
-    (forward-char 1))
-  cache)
-
-(defun wisi-goto-start (cache)
-  "Move point to containing ancestor of CACHE that has class statement-start.
-Return start cache."
-  ;; cache nil at bob, or on cache in partially parsed statement
-  (while (and cache
-             (not (eq (wisi-cache-class cache) 'statement-start)))
-    (setq cache (wisi-goto-containing cache)))
-  cache)
-
-(defun wisi-goto-end-1 (cache)
-  (goto-char (wisi-cache-end cache)))
-
-(defun wisi-goto-statement-start ()
-  "Move point to token at start of statement point is in or after.
-Return start cache."
-  (interactive)
-  (wisi-validate-cache (point-min) (point-max) t 'navigate)
-  (wisi-goto-start (or (wisi-get-cache (point))
-                      (wisi-backward-cache))))
-
-(defun wisi-goto-statement-end ()
-  "Move point to token at end of statement point is in or before."
-  (interactive)
-  (wisi-validate-cache (point-min) (point-max) t 'navigate)
-  (let ((cache (or (wisi-get-cache (point))
-                  (wisi-forward-cache))))
-    (when (wisi-cache-end cache)
-      ;; nil when cache is statement-end
-      (wisi-goto-end-1 cache))
-    ))
-
-(defun wisi-next-statement-cache (cache)
-  "Move point to CACHE-next, return cache; error if nil."
-  (when (not (markerp (wisi-cache-next cache)))
-    (error "no next statement cache"))
-  (goto-char (wisi-cache-next cache))
-  (wisi-get-cache (point)))
-
-(defun wisi-prev-statement-cache (cache)
-  "Move point to CACHE-prev, return cache; error if nil."
-  (when (not (markerp (wisi-cache-prev cache)))
-    (error "no prev statement cache"))
-  (goto-char (wisi-cache-prev cache))
-  (wisi-get-cache (point)))
-
-;;;; indentation
-
-(defun wisi-comment-indent ()
-  "For `comment-indent-function'. Indent single line comment to
-the comment on the previous line."
-  ;; Called from `comment-indent', either to insert a new comment, or
-  ;; to indent the first line of an existing one.  In either case, the
-  ;; comment may be after code on the same line.  For an existing
-  ;; comment, point is at the start of the starting delimiter.
-  (or
-   (save-excursion
-     ;; Check for a preceding comment line; fail if comment follows code.
-     (when (forward-comment -1)
-       ;; For the case:
-       ;;
-       ;; code;-- comment
-       ;;
-       ;; point is on '--', and 'forward-comment' does not move point,
-       ;; returns nil.
-       (when (looking-at comment-start)
-         (current-column))))
-
-   (save-excursion
-     (back-to-indentation)
-     (if (looking-at comment-start)
-         ;; An existing comment, no code preceding comment, and
-         ;; no comment on preceding line. Return nil, so
-         ;; `comment-indent' will call `indent-according-to-mode'
-         nil
-
-       ;; A comment after code on the same line.
-       comment-column))
-   ))
-
-(defun wisi-indent-statement ()
-  "Indent region given by `wisi-goto-start', `wisi-cache-end'."
-  (wisi-validate-cache (point-min) (point-max) t 'navigate)
-
-  (save-excursion
-    (let ((cache (or (wisi-get-cache (point))
-                    (wisi-backward-cache))))
-      (when cache
-       ;; can be nil if in header comment
-       (let ((start (progn (wisi-goto-start cache) (point)))
-             (end (if (wisi-cache-end cache)
-                        ;; nil when cache is statement-end
-                        (wisi-cache-end cache)
-                      (point))))
-         (indent-region start end)
-         ))
-      )))
-
-(defvar-local wisi-indent-calculate-functions nil
-  "Functions to compute indentation special cases.
-Called with point at current indentation of a line; return
-indentation column, or nil if function does not know how to
-indent that line. Run after parser indentation, so other lines
-are indented correctly.")
-
-(defvar-local wisi-post-indent-fail-hook
-  "Function to reindent portion of buffer.
-Called from `wisi-indent-region' when a parse succeeds after
-failing; assumes user was editing code that is now syntactically
-correct. Must leave point at indentation of current line.")
-
-(defvar-local wisi-indent-failed nil
-  "Non-nil when wisi-indent-region fails due to parse failing; cleared when 
indent succeeds.")
-
-(defvar-local wisi-indent-region-fallback 'wisi-indent-region-fallback-default
-  "Function to compute indent for lines in region when wisi parse fails.
-Called with BEGIN END.")
-
-(defun wisi-indent-region-fallback-default (begin end)
-  ;; Assume there is no indent info at point; user is editing. Indent
-  ;; to previous lines.
-  (goto-char begin)
-  (forward-line -1);; safe at bob
-  (back-to-indentation)
-  (let ((col (current-column)))
-    (while (and (not (eobp))
-               (< (point) end))
-      (forward-line 1)
-      (indent-line-to col)
-      (when (bobp)
-       ;; single line in buffer; terminate loop
-       (goto-char (point-max))))))
-
-(defun wisi-list-memq (a b)
-  "Return non-nil if any member of A is a memq of B."
-  (let ((temp (copy-sequence a))
-       result)
-    (while (and (not result)
-               temp)
-      (when (memq (pop temp) b)
-       (setq result t)))
-    result))
-
-(defun wisi--get-cached-indent (begin end)
-  "Return cached indent for point (must be bol), after correcting
-for parse errors. BEGIN, END is the parsed region."
-  (let ((indent (get-text-property (1- (point)) 'wisi-indent)))
-    (unless indent
-      (error "nil indent for line %d" (line-number-at-pos (point))))
-    (when (and (wisi-partial-parse-p begin end)
-              (< 0 (length (wisi-parser-parse-errors wisi--parser))))
-      (dolist (err (wisi-parser-parse-errors wisi--parser))
-       (dolist (repair (wisi--parse-error-repair err))
-         ;; point is at bol; error pos may be at first token on same line.
-         (save-excursion
-           (back-to-indentation)
-           (when (>= (point) (wisi--parse-error-repair-pos repair))
-             (setq indent (max 0 (wisi-parse-adjust-indent wisi--parser indent 
repair))))
-           ))))
-    indent))
-
-(defun wisi-indent-region (begin end &optional indent-blank-lines)
-  "For `indent-region-function', using the wisi indentation engine.
-If INDENT-BLANK-LINES is non-nil, also indent blank lines (for use as
-`indent-line-function')."
-  (when (< 0 wisi-debug)
-    (message "wisi-indent-region %d %d"
-            (wisi-safe-marker-pos begin)
-            (wisi-safe-marker-pos end)))
-
-  (let ((wisi--parse-action 'indent)
-       (parse-required nil)
-       (end-mark (copy-marker end))
-       (prev-indent-failed wisi-indent-failed))
-
-    (wisi--check-change)
-
-    ;; BEGIN is inclusive; END is exclusive.
-    (save-excursion
-      (goto-char begin)
-      (setq begin (line-beginning-position))
-
-      (when (bobp) (forward-line))
-      (while (and (not parse-required)
-                 (or (and (= begin end) (= (point) end))
-                     (< (point) end))
-                 (not (eobp)))
-       (unless (get-text-property (1- (point)) 'wisi-indent)
-         (setq parse-required t))
-       (forward-line))
-      )
-
-    ;; A parse either succeeds and sets the indent cache on all
-    ;; lines in the parsed region, or fails and leaves valid caches
-    ;; untouched.
-    (when (and parse-required
-              (or (not wisi-parse-failed)
-                  (wisi-parse-try 'indent)))
-
-      (wisi-set-parse-try nil)
-
-      (wisi--run-parse begin end)
-
-      ;; If there were errors corrected, the indentation is
-      ;; potentially ambiguous; see
-      ;; test/ada_mode-interactive_2.adb. Or it was a partial parse,
-      ;; where errors producing bad indent are pretty much expected.
-      (unless (wisi-partial-parse-p begin end)
-       (setq wisi-indent-failed (< 0 (+ (length (wisi-parser-lexer-errors 
wisi--parser))
-                                        (length (wisi-parser-parse-errors 
wisi--parser))))))
-      )
-
-    (if wisi-parse-failed
-       (progn
-         ;; primary indent failed
-         (setq wisi-indent-failed t)
-         (when (functionp wisi-indent-region-fallback)
-           (when (< 0 wisi-debug)
-             (message "wisi-indent-region fallback"))
-           (funcall wisi-indent-region-fallback begin end)))
-
-      (save-excursion
-       ;; Apply cached indents.
-       (goto-char begin)
-       (let ((wisi-indenting-p t))
-         (while (and (not (eobp))
-                     (or (and (= begin end) (= (point) end))
-                         (< (point) end-mark))) ;; end-mark is exclusive
-           (when (or indent-blank-lines (not (eolp)))
-             ;; ’indent-region’ doesn’t indent an empty line; ’indent-line’ 
does
-             (let ((indent (if (bobp) 0 (wisi--get-cached-indent begin end))))
-                   (indent-line-to indent))
-             )
-           (forward-line 1))
-
-         ;; Run wisi-indent-calculate-functions
-         (when wisi-indent-calculate-functions
-           (goto-char begin)
-           (while (and (not (eobp))
-                       (< (point) end-mark))
-             (back-to-indentation)
-             (let ((indent
-                    (run-hook-with-args-until-success 
'wisi-indent-calculate-functions)))
-               (when indent
-                 (indent-line-to indent)))
-
-             (forward-line 1)))
-         )
-
-       (when
-           (and prev-indent-failed
-                (not wisi-indent-failed))
-         ;; Previous parse failed or indent was potentially
-         ;; ambiguous, this one is not.
-         (goto-char end-mark)
-         (when (< 0 wisi-debug)
-           (message "wisi-indent-region post-parse-fail-hook"))
-         (run-hooks 'wisi-post-indent-fail-hook))
-       ))
-    ))
-
-(defun wisi-indent-line ()
-  "For `indent-line-function'."
-  (let ((savep (copy-marker (point)))
-       (to-indent nil))
-    (back-to-indentation)
-    (when (>= (point) savep)
-      (setq to-indent t))
-
-    (wisi-indent-region (line-beginning-position) (line-end-position) t)
-
-    (goto-char savep)
-    (when to-indent (back-to-indentation))
-    ))
-
-(defun wisi-repair-error-1 (data)
-  "Repair error reported in DATA (a ’wisi--parse-error’ or 
’wisi--lexer-error’)"
-  (let ((wisi--parse-action 'navigate) ;; tell wisi-forward-token not to 
compute indent stuff.
-       tok-2)
-    (cond
-     ((wisi--lexer-error-p data)
-      (goto-char (1+ (wisi--lexer-error-pos data)))
-      (insert (wisi--lexer-error-inserted data)))
-     ((wisi--parse-error-p data)
-      (dolist (repair (wisi--parse-error-repair data))
-       (goto-char (wisi--parse-error-repair-pos repair))
-       (dolist (tok-1 (wisi--parse-error-repair-deleted repair))
-         (setq tok-2 (wisi-forward-token))
-         (if (eq tok-1 (wisi-tok-token tok-2))
-             (delete-region (car (wisi-tok-region tok-2)) (cdr 
(wisi-tok-region tok-2)))
-           (error "mismatched tokens: %d: parser %s, buffer %s %s"
-                  (point) tok-1 (wisi-tok-token tok-2) (wisi-tok-region 
tok-2))))
-
-       (dolist (id (wisi--parse-error-repair-inserted repair))
-         (insert (cdr (assoc id (wisi-elisp-lexer-id-alist wisi--lexer))))
-         (insert " "))
-       ))
-     )))
-
-(defun wisi-repair-error ()
-  "Repair the current error."
-  (interactive)
-  (let ((wisi-inhibit-parse t)) ;; don’t let the error list change while we 
are processing it.
-    (if (= 1 (+ (length (wisi-parser-lexer-errors wisi--parser))
-               (length (wisi-parser-parse-errors wisi--parser))))
-       (progn
-         (wisi-goto-error)
-         (wisi-repair-error-1 (or (car (wisi-parser-lexer-errors wisi--parser))
-                                  (car (wisi-parser-parse-errors 
wisi--parser)))))
-      (if (buffer-live-p wisi-error-buffer)
-         (let ((err
-                (with-current-buffer wisi-error-buffer
-                  (get-text-property (point) 'wisi-error-data))))
-           (wisi-repair-error-1 err))
-       (error "no current error found")
-       ))))
-
-(defun wisi-repair-errors (&optional beg end)
-  "Repair errors reported by last parse.
-If non-nil, only repair errors in BEG END region."
-  (interactive)
-  (let ((wisi-inhibit-parse t)) ;; don’t let the error list change while we 
are processing it.
-    (dolist (data (wisi-parser-lexer-errors wisi--parser))
-      (when (or (null beg)
-               (and (not (= 0 (wisi--lexer-error-inserted data)))
-                    (wisi--lexer-error-pos data)
-                    (<= beg (wisi--lexer-error-pos data))
-                    (<= (wisi--lexer-error-pos data) end)))
-       (wisi-repair-error-1 data)))
-
-    (dolist (data (wisi-parser-parse-errors wisi--parser))
-      (when (or (null beg)
-               (and (wisi--parse-error-pos data)
-                    (<= beg (wisi--parse-error-pos data))
-                    (<= (wisi--parse-error-pos data) end)))
-       (wisi-repair-error-1 data)))
-    ))
-
-;;;; debugging
-
-(defun wisi-show-region (string)
-  (interactive "Mregion: ")
-  (when (not (= ?\( (aref string 0)))
-    (setq string (concat "(" string ")")))
-
-  (let ((region (read string)))
-    (cond
-     ((consp (cdr region))
-      ;; region is a list; (begin end)
-      (set-mark  (nth 0 region))
-      (goto-char (nth 1 region)))
-
-     ((consp region)
-      ;; region is a cons; (begin . end)
-      (set-mark  (car region))
-      (goto-char (cdr region)))
-     )))
-
-(defun wisi-debug-keys ()
-  "Add debug key definitions to `global-map'."
-  (interactive)
-  (define-key global-map "\M-h" 'wisi-show-containing-or-previous-cache)
-  (define-key global-map "\M-i" 'wisi-show-indent)
-  (define-key global-map "\M-j" 'wisi-show-cache)
-  )
-
-(defun wisi-read-parse-action ()
-  "Read a parse action symbol from the minibuffer."
-  (intern-soft (completing-read "parse action (indent): " '(face navigate 
indent) nil t nil nil 'indent)))
-
-(defun wisi-parse-buffer (&optional parse-action begin end)
-  (interactive)
-  (unless parse-action
-    (setq parse-action (wisi-read-parse-action)))
-  (if (use-region-p)
-      (progn
-       (setq begin (region-beginning))
-       (setq end   (region-end)))
-
-    (unless begin (setq begin (point-min)))
-    (unless end (setq end (point-max))))
-
-  (wisi-set-parse-try t parse-action)
-  (wisi-invalidate-cache parse-action begin)
-
-  (cl-ecase parse-action
-    (face
-     (with-silent-modifications
-       (remove-text-properties
-       begin end
-       (list
-        'font-lock-face nil
-        'fontified nil)))
-     (wisi-validate-cache begin end t parse-action)
-     (when (fboundp 'font-lock-ensure) (font-lock-ensure))) ;; emacs < 25
-
-    (navigate
-     (wisi-validate-cache begin end t parse-action))
-
-    (indent
-     (wisi-indent-region begin end))
-    ))
-
-(defun wisi-time (func count &optional report-wait-time)
-  "call FUNC COUNT times, show total time"
-  (interactive "afunction \nncount ")
-
-  (let ((start-time (float-time))
-       (start-gcs gcs-done)
-       (cum-wait-time 0.0)
-        (i 0)
-        diff-time
-       diff-gcs)
-    (while (not (eq (1+ count) (setq i (1+ i))))
-      (save-excursion
-        (funcall func))
-      (when report-wait-time
-       (setq cum-wait-time (+ cum-wait-time 
(wisi-process--parser-total-wait-time wisi--parser)))))
-    (setq diff-time (- (float-time) start-time))
-    (setq diff-gcs (- gcs-done start-gcs))
-    (if report-wait-time
-       (progn
-         (message "Total %f seconds, %d gcs; per iteration %f seconds %d gcs 
%d responses %f wait"
-                  diff-time
-                  diff-gcs
-                  (/ diff-time count)
-                  (/ (float diff-gcs) count)
-                  (wisi-process--parser-response-count wisi--parser)
-                  (/ cum-wait-time count)))
-
-      (message "Total %f seconds, %d gcs; per iteration %f seconds %d gcs"
-              diff-time
-              diff-gcs
-              (/ diff-time count)
-              (/ (float diff-gcs) count))
-      ))
-  nil)
-
-(defun wisi-time-indent-middle-line-cold-cache (count &optional 
report-wait-time)
-  (goto-char (point-min))
-  (forward-line (1- (/ (count-lines (point-min) (point-max)) 2)))
-  (let ((cum-wait-time 0.0))
-    (wisi-time
-     (lambda ()
-       (wisi-set-parse-try t 'indent)
-       (wisi-invalidate-cache 'indent (point-min))
-       (wisi-indent-line)
-       (when (wisi-process--parser-p wisi--parser)
-        (setq cum-wait-time (+ cum-wait-time 
(wisi-process--parser-total-wait-time wisi--parser)))))
-     count
-     report-wait-time)
-    ))
-
-(defun wisi-time-indent-middle-line-warm-cache (count)
-  (wisi-set-parse-try t 'indent)
-  (wisi-invalidate-cache 'indent (point-min))
-  (goto-char (point-min))
-  (forward-line (/ (count-lines (point-min) (point-max)) 2))
-  (wisi-indent-line)
-  (wisi-time #'wisi-indent-line count))
-
-(defun wisi-show-indent ()
-  "Show indent cache for current line."
-  (interactive)
-  (message "%s" (get-text-property (1- (line-beginning-position)) 
'wisi-indent)))
-
-(defun wisi-show-cache ()
-  "Show navigation cache, and applied faces, at point."
-  (interactive)
-  (message "%s:%s:%s"
-          (wisi-get-cache (point))
-          (get-text-property (point) 'face)
-          (get-text-property (point) 'font-lock-face)
-          ))
-
-(defun wisi-show-containing-or-previous-cache ()
-  (interactive)
-  (let ((cache (wisi-get-cache (point))))
-    (if cache
-       (message "containing %s" (wisi-goto-containing cache t))
-      (message "previous %s" (wisi-backward-cache)))
-    ))
-
-;;;;; setup
-
-(cl-defun wisi-setup (&key indent-calculate post-indent-fail parser lexer)
-  "Set up a buffer for parsing files with wisi."
-  (when wisi--parser
-    (wisi-kill-parser))
-
-  (setq wisi--parser parser)
-  (setq wisi--lexer lexer)
-  (setq wisi--cached-regions
-       (list
-        (cons 'face nil)
-        (cons 'navigate nil)
-        (cons 'indent nil)))
-
-  (setq wisi--parse-try
-       (list
-        (cons 'face t)
-        (cons 'navigate t)
-        (cons 'indent t)))
-
-  ;; file local variables may have added opentoken, gnatprep
-  (setq wisi-indent-calculate-functions (append 
wisi-indent-calculate-functions indent-calculate))
-  (set (make-local-variable 'indent-line-function) #'wisi-indent-line)
-  (set (make-local-variable 'indent-region-function) #'wisi-indent-region)
-  (set (make-local-variable 'forward-sexp-function) #'wisi-forward-sexp)
-
-  (setq wisi-post-indent-fail-hook post-indent-fail)
-  (setq wisi-indent-failed nil)
-
-  (add-hook 'before-change-functions #'wisi-before-change 'append t)
-  (add-hook 'after-change-functions #'wisi-after-change nil t)
-  (setq wisi--change-end (copy-marker (point-min) t))
-
-  ;; See comments above on syntax-propertize.
-  (when (< emacs-major-version 25) (syntax-propertize (point-max)))
-
-  ;; In Emacs >= 26, ‘run-mode-hooks’ (in the major mode function)
-  ;; runs ‘hack-local-variables’ after ’*-mode-hooks’; we need
-  ;; ‘wisi-post-local-vars’ to run after ‘hack-local-variables’.
-  (add-hook 'hack-local-variables-hook 'wisi-post-local-vars nil t)
-  )
-
-(defun wisi-post-local-vars ()
-  "See wisi-setup."
-  (setq hack-local-variables-hook (delq 'wisi-post-local-vars 
hack-local-variables-hook))
-
-  (unless wisi-disable-face
-    (jit-lock-register #'wisi-fontify-region)))
-
-
-(provide 'wisi)
-;;; wisi.el ends here
+;;; wisi.el --- Utilities for implementing an indentation/navigation engine 
using a generalized LALR parser -*- lexical-binding:t -*-
+;;
+;; Copyright (C) 2012 - 2019  Free Software Foundation, Inc.
+;;
+;; Author: Stephen Leake <address@hidden>
+;; Maintainer: Stephen Leake <address@hidden>
+;; Keywords: parser
+;;  indentation
+;;  navigation
+;; Version: 2.1.1
+;; package-requires: ((cl-lib "1.0") (emacs "25.0") (seq "2.20"))
+;; URL: http://stephe-leake.org/ada/wisitoken.html
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+;;
+
+;;; Commentary:
+
+;;;; History: see NEWS-wisi.text
+;;
+;;;; Design:
+;;
+;; 'wisi' was originally short for "wisent indentation engine", but
+;; now is just a name. wisi was developed to support Emacs ada-mode
+;; 5.0 indentation, font-lock, and navigation, which are parser based.
+;;
+;; The approach to indenting a given token is to parse the buffer,
+;; computing a delta indent at each parse action.
+;;
+;; The parser actions also cache face and navigation information
+;; as text properties on tokens in statements.
+;;
+;; The three reasons to run the parser (indent, face, navigate) occur
+;; at different times (user indent, font-lock, user navigate), so only
+;; the relevant parser actions are run.
+;;
+;; Parsing can be noticeably slow in large files, so sometimes we do a
+;; partial parse, and keep a list of parsed regions.
+;;
+;; Since we have a cache (the text properties), we need to consider
+;; when to invalidate it.  Ideally, we invalidate only when a change
+;; to the buffer would change the result of a parse that crosses that
+;; change, or starts after that change.  Changes in whitespace
+;; (indentation and newlines) do not affect an Ada parse.  Other
+;; languages are sensitive to newlines (Bash for example) or
+;; indentation (Python).  Adding comments does not change a parse,
+;; unless code is commented out.
+;;
+;; For navigate, we expect fully accurate results, and can tolerate
+;; one initial delay, so we always parse the entire file.
+;;
+;; For font-lock, we only parse the portion of the file requested by
+;; font-lock, so we keep a list of regions, and edit that list when
+;; the buffer is changed..
+;;
+;; For indenting, we expect fast results, and can tolerate some
+;; inaccuracy until the editing is done, so we allow partial parse. We
+;; cache the indent for each line in a text property on the newline
+;; char preceding the line. `wisi-indent-region' sets the cache on all
+;; the lines computed (part of the buffer in large files), but
+;; performs the indent only on the lines in the indent
+;; region. Subsequent calls to `wisi-indent-region' apply the cached
+;; indents. Non-whitespace edits to the buffer invalidate the indent
+;; caches in the edited region and after. Since we can do partial
+;; parse, we keep a list of parsed regions.
+;;
+;; See `wisi--post-change' for the details of what we check for
+;; invalidating.
+;;
+;;;; Choice of grammar compiler and parser
+;;
+;; There are two other parsing engines available in Emacs:
+;;
+;; - SMIE
+;;
+;;   We don't use this because it is designed to parse small snippets
+;;   of code. For Ada indentation, we always need to parse the entire
+;;   buffer.
+;;
+;; - semantic
+;;
+;;   The Ada grammar as given in the Ada language reference manual is
+;;   not LALR(1). So we use a generalized parser. In addition, the
+;;   semantic lexer is more complex, and gives different information
+;;   than we need. Finally, the semantic parser does not support error
+;;   correction, and thus fails in most editing situations.
+;;
+;; We use wisitoken wisi-generate to compile BNF to Elisp source, and
+;; wisi-compile-grammar to compile that to the parser table. See
+;; ada-mode info for more information on the developer tools used for
+;; ada-mode and wisi.
+;;
+;; Alternately, to gain speed and error handling, we use wisi-generate
+;; to generate Ada source, and run that in an external process. That
+;; supports error correction while parsing.
+;;
+;;;; syntax-propertize
+;;
+;; `wisi-forward-token' relies on syntax properties, so
+;; `syntax-propertize' must be called on the text to be lexed before
+;; wisi-forward-token is called. Emacs >= 25 calls syntax-propertize
+;; transparently in the low-level lexer functions.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'compile)
+(require 'seq)
+(require 'semantic/lex)
+(require 'wisi-parse-common)
+(require 'wisi-elisp-lexer)
+(require 'wisi-fringe)
+(require 'xref)
+
+(defcustom wisi-size-threshold most-positive-fixnum
+  "Max size (in characters) for using wisi parser results for anything."
+  :type 'integer
+  :group 'wisi
+  :safe 'integerp)
+(make-variable-buffer-local 'wisi-size-threshold)
+
+(defcustom wisi-partial-parse-threshold 100001
+  "Minimum size that will be parsed by each call to the parser.
+A parse is always requested at a point (or on a region); the
+point is first expanded to a start point before the region and an
+end point after the region, that the parser can gracefully
+handle. If the final region covers the entire buffer, a complete
+parse is done. Indent assumes the start point of the parse region
+is properly indented. Most navigate parses ignore this setting
+and parse the whole buffer."
+  :type 'integer
+  :group 'wisi
+  :safe 'integerp)
+(make-variable-buffer-local 'wisi-partial-parse-threshold)
+
+(defvar wisi-inhibit-parse nil
+  "When non-nil, don't run the parser.
+Language code can set this non-nil when syntax is known to be
+invalid temporarily, or when making lots of changes.")
+
+(defcustom wisi-disable-face nil
+  "When non-nil, `wisi-setup' does not enable use of parser for font-lock.
+Useful when debugging parser or parser actions."
+  :type 'boolean
+  :group 'wisi
+  :safe 'booleanp)
+
+(defconst wisi-error-buffer-name "*wisi syntax errors*"
+  "Name of buffer for displaying syntax errors.")
+
+(defvar wisi-error-buffer nil
+  "Buffer for displaying syntax errors.")
+
+(defun wisi-safe-marker-pos (pos)
+  "Return an integer buffer position from POS, an integer or marker"
+  (cond
+   ((markerp pos)
+    (marker-position pos))
+
+   (t pos)))
+
+;;;; token info cache
+
+(defvar-local wisi-parse-failed nil
+  "Non-nil when a recent parse has failed - cleared when parse succeeds.")
+
+(defvar-local wisi--parse-try
+  (list
+   (cons 'face t)
+   (cons 'navigate t)
+   (cons 'indent t))
+  "Non-nil when parse is needed - cleared when parse succeeds.")
+
+(defun wisi-parse-try (&optional parse-action)
+  (cdr (assoc (or parse-action wisi--parse-action) wisi--parse-try)))
+
+(defun wisi-set-parse-try (value &optional parse-action)
+  (setcdr (assoc (or parse-action wisi--parse-action) wisi--parse-try) value))
+
+(defvar-local wisi--cached-regions
+  (list
+   (cons 'face nil)
+   (cons 'navigate nil)
+   (cons 'indent nil))
+  "Alist of lists of regions in buffer where parser text properties are valid.
+Regions in a list are in random order.")
+
+(defun wisi--contained-region (begin end region)
+  "Non-nil if BEGIN and END (buffer positions) are both contained in REGION (a 
cons of positions)."
+  ;; We assume begin < end
+  (and (<= (car region) begin)
+       (<= end (cdr region))))
+
+(defun wisi--contained-pos (pos region)
+  "Non-nil if POS (a buffer position) is contained in REGION (a cons of 
positions)."
+  (and (<= (car region) pos)
+       (<= pos (cdr region))))
+
+(defun wisi-cache-covers-region (begin end &optional parse-action)
+  "Non-nil if BEGIN END is contained in a parsed region."
+  (let ((region-list (cdr (assoc (or parse-action wisi--parse-action) 
wisi--cached-regions)))
+       region)
+    (while (and region-list
+               (not (wisi--contained-region begin end (car region-list))))
+      (pop region-list))
+
+    (when region-list
+      ;; return a nice value for verbosity in wisi-validate-cache
+      (setq region (car region-list))
+      (cons (marker-position (car region)) (marker-position (cdr region))))))
+
+(defun wisi-cache-covers-pos (parse-action pos)
+  "Non-nil if POS is contained in a PARSE-ACTION parsed region."
+  (let ((region-list (cdr (assoc parse-action wisi--cached-regions))))
+    (while (and region-list
+               (not (wisi--contained-pos pos (car region-list))))
+      (pop region-list))
+
+    (when region-list
+      t)))
+
+(defun wisi-cache-contains-pos (parse-action pos)
+  "Non-nil if POS is at or before the end of any PARSE-ACTION parsed region."
+  (let ((region-list (cdr (assoc parse-action wisi--cached-regions)))
+       result)
+    (while (and (not result) region-list)
+      (when (<= pos (cdr (car region-list)))
+       (setq result t))
+      (pop region-list))
+
+    result))
+
+(defun wisi-cache-set-region (region)
+  "Set the cached region list for `wisi--parse-action' to REGION."
+  (setcdr (assoc wisi--parse-action wisi--cached-regions)
+         (list (cons (copy-marker (car region))
+                     (copy-marker (cdr region))))))
+
+(defun wisi-cache-add-region (region)
+  "Add REGION to the cached region list for `wisi--parse-action'."
+  (push (cons (copy-marker (car region))
+             (copy-marker (cdr region)))
+       (cdr (assoc wisi--parse-action wisi--cached-regions))))
+
+(defun wisi-cache-delete-regions-after (parse-action pos)
+  "Delete any PARSE-ACTION parsed region at or after POS.
+Truncate any region that overlaps POS."
+  (let ((region-list (cdr (assoc parse-action wisi--cached-regions)))
+       result)
+    (while (and (not result) region-list)
+      (cond
+       ((and (> pos (car (car region-list)))
+            (<= pos (cdr (car region-list))))
+       ;; region contains POS; keep truncated
+       (push (cons (car (car region-list)) (copy-marker pos)) result))
+
+       ((> pos (car (car region-list)))
+       ;; region is entirely before POS; keep
+       (push (car region-list) result))
+
+       ;; else region is entirely after POS; delete
+       )
+
+      (pop region-list))
+    (setcdr (assoc parse-action wisi--cached-regions) result)
+    ))
+
+(defun wisi--delete-face-cache (after)
+  (with-silent-modifications
+    (remove-text-properties after (point-max) '(font-lock-face nil))
+    )
+  (wisi-cache-delete-regions-after 'face after))
+
+(defun wisi--delete-navigate-cache (after)
+  (with-silent-modifications
+    ;; This text property is 'wisi-cache', not 'wisi-navigate', for
+    ;; historical reasons.
+    (remove-text-properties after (point-max) '(wisi-cache nil wisi-name nil))
+    )
+  (wisi-cache-delete-regions-after 'navigate after))
+
+(defun wisi--delete-indent-cache (after)
+  (with-silent-modifications
+    (remove-text-properties after (point-max) '(wisi-indent nil))
+    )
+  (wisi-cache-delete-regions-after 'indent after))
+
+(defun wisi-invalidate-cache (action after)
+  "Invalidate ACTION caches for the current buffer from AFTER to end of 
buffer."
+  (when (wisi-cache-contains-pos action after)
+    (when (> wisi-debug 0) (message "wisi-invalidate-cache %s:%s:%d" action 
(current-buffer) after))
+    (cond
+     ((eq 'face action)
+      (wisi--delete-face-cache after))
+
+     ((eq 'navigate action)
+      (when (wisi-cache-covers-pos 'navigate after)
+       ;; We goto statement start to ensure that motion within nested
+       ;; structures is properly done (ie prev/next on ’elsif’ is not
+       ;; set by wisi-motion-action if already set by a lower level
+       ;; statement). We don’t do it for ’face or ’indent, because that
+       ;; might require a parse, and they don’t care about nested
+       ;; structures.
+       (save-excursion
+         (goto-char after)
+
+         ;; This is copied from ‘wisi-goto-statement-start’; we can’t
+         ;; call that because it would call ‘wisi-validate-cache’,
+         ;; which would call ‘wisi-invalidate-cache’; infinite loop.
+         ;; If this needed a navigate parse to succeed, we would not
+         ;; get here.
+         (let ((cache (or (wisi-get-cache (point))
+                          (wisi-backward-cache))))
+           (cond
+            ((null cache)
+             ;; at bob
+             nil)
+
+            ((eq 'statement-end (wisi-cache-class cache))
+             ;; If the change did affect part of a structure statement,
+             ;; this is a lower level statement. Otherwise, we are
+             ;; invalidating more than necessary; not a problem.
+             (wisi-goto-start cache)
+             (setq cache (wisi-backward-cache))
+             (when cache ;; else bob
+               (wisi-goto-start cache)))
+
+            (t
+             (wisi-goto-start cache))
+            ))
+
+         (setq after (point))))
+      (wisi--delete-navigate-cache after))
+
+     ((eq 'indent action)
+      ;; The indent cache is stored on newline before line being
+      ;; indented. We delete that, because changing text on a line can
+      ;; change the indent of that line.
+      (setq after
+           (save-excursion
+             (goto-char after)
+             (line-beginning-position)))
+      (wisi--delete-indent-cache (max 1 (1- after))))
+     )
+    ))
+
+(defun wisi-reset-parser ()
+  "Force a parse."
+  (interactive)
+  (wisi-invalidate-cache 'indent (point-min))
+  (wisi-invalidate-cache 'face (point-min))
+  (wisi-invalidate-cache 'navigate (point-min))
+  (wisi-set-parse-try t 'indent)
+  (wisi-set-parse-try t 'face)
+  (wisi-set-parse-try t 'navigate)
+  (wisi-fringe-clean))
+
+;; wisi--change-* keep track of buffer modifications.
+;; If wisi--change-end comes before wisi--change-beg, it means there were
+;; no modifications.
+(defvar-local wisi--change-beg most-positive-fixnum
+  "First position where a change may have taken place.")
+
+(defvar-local wisi--change-end nil
+  "Marker pointing to the last position where a change may have taken place.")
+
+(defvar-local wisi--deleted-syntax nil
+  "Worst syntax class of characters deleted in changes.
+One of:
+nil - no deletions since reset
+0   - only whitespace or comment deleted
+2   - some other syntax deleted
+
+Set by `wisi-before-change', used and reset by `wisi--post-change'.")
+
+(defvar-local wisi-indenting-p nil
+  "Non-nil when `wisi-indent-region' is actively indenting.
+Used to ignore whitespace changes in before/after change hooks.")
+
+(defvar-local wisi--parser nil
+  "Choice of wisi parser implementation; a ‘wisi-parser’ object.")
+
+(defvar-local wisi--last-parse-action nil
+  "Last value of `wisi--parse-action' when `wisi-validate-cache' was run.")
+
+(defun wisi-before-change (begin end)
+  "For `before-change-functions'."
+  ;; begin . (1- end) is range of text being deleted
+  (unless wisi-indenting-p
+    ;; We set wisi--change-beg, -end even if only inserting, so we
+    ;; don't have to do it again in wisi-after-change.
+    (setq wisi--change-beg (min wisi--change-beg begin))
+
+    (cond
+     ((null wisi--change-end)
+      (setq wisi--change-end (copy-marker end)))
+
+     ((> end wisi--change-end)
+      ;; `buffer-base-buffer' deals with edits in indirect buffers
+      ;; created by ediff-regions-*
+      (set-marker wisi--change-end end (buffer-base-buffer)))
+     )
+
+    (unless (= begin end)
+      (cond
+       ((or (null wisi--deleted-syntax)
+           (= 0 wisi--deleted-syntax))
+       (save-excursion
+         (if (or (nth 4 (syntax-ppss begin)) ; in comment, moves point to begin
+                 (= end (skip-syntax-forward " " end)));; whitespace
+             (setq wisi--deleted-syntax 0)
+           (setq wisi--deleted-syntax 2))))
+
+       (t
+       ;; wisi--deleted-syntax is 2; no change.
+       )
+       ))))
+
+(defun wisi-after-change (begin end _length)
+  "For `after-change-functions'"
+  ;; begin . end is range of text being inserted (empty if equal);
+  ;; length is the size of the deleted text.
+
+  ;; Remove caches on inserted text, which could have caches from
+  ;; anywhere, and are in any case invalid.
+
+  ;; If the insertion changes a word that has wisi fontification,
+  ;; remove fontification from the entire word, so it is all
+  ;; refontified consistently.
+
+  (let (word-begin word-end)
+    (save-excursion
+      (goto-char end)
+      (skip-syntax-forward "w_")
+      (setq word-end (point))
+      (goto-char begin)
+      (skip-syntax-backward "w_")
+      (setq word-begin (point)))
+    (if (get-text-property word-begin 'font-lock-face)
+       (with-silent-modifications
+         (remove-text-properties
+          word-begin word-end
+          '(font-lock-face nil wisi-cache nil wisi-indent nil fontified nil)))
+
+      ;; No point in removing
+      ;; 'fontified here; that's already handled by jit-lock.
+      (with-silent-modifications
+       (remove-text-properties
+        begin end
+        '(font-lock-face nil wisi-cache nil wisi-indent nil))))
+    ))
+
+(defun wisi--post-change (begin end)
+  "Update wisi text properties for changes in region BEG END."
+  ;; (syntax-ppss-flush-cache begin) is in before-change-functions
+
+  (save-excursion
+    (let ((need-invalidate t)
+         (done nil)
+         ;; non-nil if require a parse because the syntax may have
+         ;; changed.
+
+         (begin-state (syntax-ppss begin))
+         (end-state (syntax-ppss end)))
+         ;; (info "(elisp)Parser State")
+         ;; syntax-ppss has moved point to "end"; might be eob.
+
+      ;; consider deletion
+      (cond
+       ((null wisi--deleted-syntax)
+       ;; no deletions
+       )
+
+       ((= 0 wisi--deleted-syntax)
+       ;; Only deleted whitespace; may have joined two words
+       (when
+           (and (= begin end) ;; no insertions
+                (or
+                 (= (point-min) begin)
+                 (= 0 (syntax-class (syntax-after (1- begin))))
+                 (= (point-max) end)
+                 (= 0 (syntax-class (syntax-after end)))))
+         ;; More whitespace on at least one side of deletion; did not
+         ;; join two words.
+         (setq need-invalidate nil)
+         (setq done t)
+         ))
+
+       (t
+       ;; wisi--deleted-syntax is 2; need invalidate and parse for all
+       ;; parse actions
+       (setq done t)
+       ))
+
+      (setq wisi--deleted-syntax nil)
+
+      (unless done
+       ;; consider insertion
+       (cond
+        ((= begin end)
+         ;; no insertions
+         nil)
+
+        ((and
+          (nth 3 begin-state);; in string
+          (nth 3 end-state)
+          (= (nth 8 begin-state) (nth 8 end-state)));; no intervening 
non-string
+         (setq need-invalidate nil))
+
+        ((and
+          (nth 4 begin-state) ;; in comment
+          (nth 4 end-state)
+          (= (nth 8 begin-state) (nth 8 end-state))) ;; no intervening 
non-comment
+
+         (if (and
+              (= 11 (car (syntax-after begin)))
+              (progn (goto-char begin)
+                     (skip-syntax-backward "<")
+                     (not (= (point) begin))))
+
+             ;; Either inserted last char of a multi-char comment
+             ;; start, or inserted extra comment-start chars.
+             (setq need-invalidate begin)
+           (setq need-invalidate nil)))
+
+        ((and
+          (or
+           (= (point-min) begin)
+           (= 0 (syntax-class (syntax-after (1- begin)))); whitespace
+           (= (point-max) end)
+           (= 0 (syntax-class (syntax-after end))))
+          (progn
+            (goto-char begin)
+            (= (- end begin) (skip-syntax-forward " " end))
+            ))
+         ;; Inserted only whitespace, there is more whitespace on at
+         ;; least one side, and we are not in a comment or string
+         ;; (checked above).  This may affect indentation, but not
+         ;; the indentation cache.
+         (setq need-invalidate nil))
+        ))
+
+      (when need-invalidate
+       (wisi-set-parse-try t 'face)
+       (wisi-set-parse-try t 'navigate)
+       (wisi-set-parse-try t 'indent)
+
+       (wisi-invalidate-cache 'face begin)
+       (wisi-invalidate-cache 'navigate begin)
+       (wisi-invalidate-cache 'indent begin))
+      )))
+
+(defun wisi-goto-error ()
+  "Move point to position in last error message (if any)."
+  (cond
+   ((wisi-parser-parse-errors wisi--parser)
+    (let ((data (car (wisi-parser-parse-errors wisi--parser))))
+      (cond
+       ((wisi--parse-error-pos data)
+       (push-mark)
+       (goto-char (wisi--parse-error-pos data)))
+
+       ((string-match ":\\([0-9]+\\):\\([0-9]+\\):" (wisi--parse-error-message 
data))
+       (let* ((msg (wisi--parse-error-message data))
+              (line (string-to-number (match-string 1 msg)))
+              (col (string-to-number (match-string 2 msg))))
+         (push-mark)
+         (goto-char (point-min))
+         (condition-case nil
+             (progn
+               ;; line can be wrong if parser screws up, or user edits buffer
+               (forward-line (1- line))
+               (forward-char col))
+           (error
+            ;; just stay at eob.
+            nil))))
+       )))
+   ((wisi-parser-lexer-errors wisi--parser)
+    (push-mark)
+    (goto-char (wisi--lexer-error-pos (car (wisi-parser-lexer-errors 
wisi--parser)))))
+   ))
+
+(defun wisi-show-parse-error ()
+  "Show current wisi-parse errors."
+  (interactive)
+  (cond
+   ((or (wisi-parser-lexer-errors wisi--parser)
+       (wisi-parser-parse-errors wisi--parser))
+    (if (and (= 1 (+ (length (wisi-parser-lexer-errors wisi--parser))
+                    (length (wisi-parser-parse-errors wisi--parser))))
+            (or (and (wisi-parser-parse-errors wisi--parser)
+                     (not (wisi--parse-error-repair (car 
(wisi-parser-parse-errors wisi--parser)))))
+                (and (wisi-parser-lexer-errors wisi--parser)
+                     (not (wisi--lexer-error-inserted (car 
(wisi-parser-lexer-errors wisi--parser)))))))
+       ;; There is exactly one error; if there is error correction
+       ;; information, use a ’compilation’ buffer, so
+       ;; *-fix-compiler-error will call
+       ;; wisi-repair-error. Otherwise, just position cursor at
+       ;; error.
+       (progn
+         (wisi-goto-error)
+         (message (or (and (wisi-parser-parse-errors wisi--parser)
+                           (wisi--parse-error-message (car 
(wisi-parser-parse-errors wisi--parser))))
+                      (and (wisi-parser-lexer-errors wisi--parser)
+                           (wisi--lexer-error-message (car 
(wisi-parser-lexer-errors wisi--parser)))))
+                  ))
+
+      ;; else show all errors in a ’compilation’ buffer
+      (setq wisi-error-buffer (get-buffer-create wisi-error-buffer-name))
+
+      (let ((lexer-errs (nreverse (cl-copy-seq (wisi-parser-lexer-errors 
wisi--parser))))
+           (parse-errs (nreverse (cl-copy-seq (wisi-parser-parse-errors 
wisi--parser))))
+           (dir default-directory))
+       (with-current-buffer wisi-error-buffer
+         (setq window-size-fixed nil)
+         (compilation-mode)
+         (setq-local compilation-search-path (list dir))
+         (setq default-directory dir)
+         (setq next-error-last-buffer (current-buffer))
+         (setq buffer-read-only nil)
+         (erase-buffer)
+         ;; compilation-nex-error-function assumes there is not an
+         ;; error at point-min, so we need a comment.
+         (insert "wisi syntax errors")
+         (newline)
+         (dolist (err lexer-errs)
+           (insert (wisi--lexer-error-message err))
+           (put-text-property (line-beginning-position) (1+ 
(line-beginning-position)) 'wisi-error-data err)
+           (newline 2))
+         (dolist (err parse-errs)
+           (insert (wisi--parse-error-message err))
+           (put-text-property (line-beginning-position) (1+ 
(line-beginning-position)) 'wisi-error-data err)
+           (newline 2))
+         (compilation--flush-parse (point-min) (point-max))
+         (compilation--ensure-parse (point-max))
+         (when compilation-filter-hook
+           (let ((compilation-filter-start (point-min)))
+             (run-hooks 'compilation-filter-hook)))
+
+         (setq buffer-read-only t)
+         (goto-char (point-min)))
+
+       (let ((win (display-buffer
+                   wisi-error-buffer
+                   (cons #'display-buffer-at-bottom
+                         (list (cons 'window-height 
#'shrink-window-if-larger-than-buffer))))))
+         (set-window-dedicated-p win t))
+
+       (with-current-buffer wisi-error-buffer
+         (setq window-size-fixed t))
+       (next-error))
+      ))
+
+   ((wisi-parse-try wisi--last-parse-action)
+    (message "need parse"))
+
+   (t
+    (message "parse succeeded"))
+   ))
+
+(defun wisi-kill-parser ()
+  "Kill the background process running the parser for the current buffer.
+Usefull if the parser appears to be hung."
+  (interactive)
+  (wisi-parse-kill wisi--parser)
+  ;; also force re-parse
+  (dolist (parse-action '(face navigate indent))
+    (wisi-set-parse-try t parse-action)
+    (wisi-invalidate-cache parse-action (point-min)))
+  )
+
+(defun wisi-partial-parse-p (begin end)
+  (and (wisi-process--parser-p wisi--parser)
+       (not (and (= begin (point-min))
+                (= end (point-max))))
+       (>= (point-max) wisi-partial-parse-threshold)))
+
+(defun wisi--run-parse (begin parse-end)
+  "Run the parser, on at least region BEGIN PARSE-END."
+  (unless (or (buffer-narrowed-p)
+             (= (point-min) (point-max))) ;; some parsers can’t handle an 
empty buffer.
+    (let* ((partial-parse-p (wisi-partial-parse-p begin parse-end))
+          (msg (when (> wisi-debug 0)
+                 (format "wisi: %sparsing %s %s:%d %d %d ..."
+                         (if partial-parse-p "partial " "")
+                         wisi--parse-action
+                         (buffer-name)
+                         begin
+                         (if (markerp parse-end) (marker-position parse-end) 
parse-end)
+                         (line-number-at-pos begin))))
+          (parsed-region nil))
+
+      (when msg
+       (message msg))
+
+      (setq wisi--last-parse-action wisi--parse-action)
+
+      (unless (eq wisi--parse-action 'face)
+       (when (buffer-live-p wisi-error-buffer)
+         (with-current-buffer wisi-error-buffer
+           (setq buffer-read-only nil)
+           (erase-buffer)
+           (setq buffer-read-only t))))
+
+      (condition-case-unless-debug err
+         (save-excursion
+           (if partial-parse-p
+             (let ((send-region (wisi-parse-expand-region wisi--parser begin 
parse-end)))
+               (setq parsed-region (wisi-parse-current wisi--parser (car 
send-region) (cdr send-region) parse-end))
+               (wisi-cache-add-region parsed-region))
+
+             ;; parse full buffer
+             (setq parsed-region (cons (point-min) (point-max)))
+             (wisi-cache-set-region (wisi-parse-current wisi--parser 
(point-min) (point-max) (point-max))))
+
+           (when (> wisi-debug 0) (message "... parsed %s" parsed-region))
+           (setq wisi-parse-failed nil))
+       (wisi-parse-error
+        (cl-ecase wisi--parse-action
+          (face
+           ;; Caches set by failed elisp parse are ok, but some parse
+           ;; failures return 'nil' in parse-region.
+           (when (cdr parsed-region)
+             (wisi--delete-face-cache (cdr parsed-region))))
+
+          (navigate
+           ;; elisp parse partially resets caches
+           (wisi--delete-navigate-cache (point-min)))
+
+          (indent
+           ;; parse does not set caches; see `wisi-indent-region'
+           nil))
+        (setq wisi-parse-failed t)
+        ;; parser should have stored this error message in parser-error-msgs
+        )
+       (error
+        ;; parser failed for other reason
+        (setq wisi-parse-failed t)
+        (signal (car err) (cdr err)))
+       )
+
+      (unless partial-parse-p
+       (wisi-fringe-display-errors
+        (append
+         (seq-map (lambda (err) (wisi--lexer-error-pos err)) 
(wisi-parser-lexer-errors wisi--parser))
+         (seq-map (lambda (err) (wisi--parse-error-pos err)) 
(wisi-parser-parse-errors wisi--parser)))))
+
+      (when (> wisi-debug 1)
+       (if (or (wisi-parser-lexer-errors wisi--parser)
+               (wisi-parser-parse-errors wisi--parser))
+           (progn
+             (message "%s error" msg)
+             (wisi-goto-error)
+             (error (or (and (wisi-parser-lexer-errors wisi--parser)
+                             (wisi--lexer-error-message (car 
(wisi-parser-lexer-errors wisi--parser))))
+                        (and (wisi-parser-parse-errors wisi--parser)
+                             (wisi--parse-error-message (car 
(wisi-parser-parse-errors wisi--parser))))
+                        )))
+
+         ;; no error
+         (message "%s done" msg))
+       ))))
+
+(defun wisi--check-change ()
+  "Process `wisi--change-beg', `wisi--change-end'.
+`wisi--parse-action' must be bound."
+  (when (and wisi--change-beg
+            wisi--change-end
+            (<= wisi--change-beg wisi--change-end))
+    (wisi--post-change wisi--change-beg (marker-position wisi--change-end))
+    (setq wisi--change-beg most-positive-fixnum)
+    (move-marker wisi--change-end (point-min))
+    ))
+
+(defun wisi-validate-cache (begin end error-on-fail parse-action)
+  "Ensure cached data for PARSE-ACTION is valid in region BEGIN END in current 
buffer."
+  (if (and (not wisi-inhibit-parse)
+          (< (point-max) wisi-size-threshold))
+      (let ((wisi--parse-action parse-action))
+       (wisi--check-change)
+
+       ;; Now we can rely on wisi-cache-covers-region
+
+       (if (and (or (not wisi-parse-failed)
+                    (wisi-parse-try))
+               (not (wisi-cache-covers-region begin end)))
+           (progn
+             ;; Don't keep retrying failed parse until text changes again.
+             (wisi-set-parse-try nil)
+             (wisi--run-parse begin end))
+
+         (when (> wisi-debug 0)
+           (message "parse %s skipped: parse-failed %s parse-try %s 
cache-covers-region %s %s.%s"
+                    parse-action
+                    wisi-parse-failed
+                    (wisi-parse-try)
+                    (wisi-cache-covers-region begin end)
+                    begin end)))
+
+       ;; We want this error even if we did not try to parse; it means
+       ;; the parse results are not valid.
+       (when (and error-on-fail wisi-parse-failed)
+         (error "parse %s failed" parse-action))
+       )
+    (when (> wisi-debug 0)
+      (message "parse %s skipped inihibit-parse %s wisi-size-threshold %d"
+              parse-action
+              wisi-inhibit-parse
+              wisi-size-threshold))))
+
+(defun wisi-fontify-region (begin end)
+  "For `jit-lock-functions'."
+  (wisi-validate-cache begin end nil 'face))
+
+(defun wisi-get-containing-cache (cache)
+  "Return cache from (wisi-cache-containing CACHE)."
+  (when cache
+    (let ((containing (wisi-cache-containing cache)))
+      (and containing
+          (wisi-get-cache containing)))))
+
+(defun wisi-cache-text (cache)
+  "Return property-less buffer substring designated by cache.
+Point must be at cache."
+  (buffer-substring-no-properties (point) (+ (point) (wisi-cache-last cache))))
+
+;;;; navigation
+
+(defun wisi-forward-find-class (class limit)
+  "Search at point or forward for a token that has a cache with CLASS.
+Return cache, or nil if at end of buffer.
+If LIMIT (a buffer position) is reached, throw an error."
+  (let ((cache (or (wisi-get-cache (point))
+                  (wisi-forward-cache))))
+    (while (not (eq class (wisi-cache-class cache)))
+      (setq cache (wisi-forward-cache))
+      (when (>= (point) limit)
+       (error "cache with class %s not found" class)))
+    cache))
+
+(defun wisi-forward-find-token (token limit &optional noerror)
+  "Search forward for TOKEN.
+If point is at a matching token, return that token.  TOKEN may be
+a list; stop on any member of the list.  Return `wisi-tok'
+struct, or if LIMIT (a buffer position) is reached, then if
+NOERROR is nil, throw an error, if non-nil, return nil."
+  (let ((token-list (cond
+                    ((listp token) token)
+                    (t (list token))))
+       (tok (wisi-forward-token))
+       (done nil))
+    (while (not (or done
+                   (memq (wisi-tok-token tok) token-list)))
+      (setq tok (wisi-forward-token))
+      (when (or (>= (point) limit)
+               (eobp))
+       (goto-char limit)
+       (setq tok nil)
+       (if noerror
+           (setq done t)
+         (error "token %s not found" token))))
+    tok))
+
+(defun wisi-forward-find-cache-token (ids limit)
+  "Search forward for a cache with token in IDS (a list of token ids).
+Return cache, or nil if at LIMIT or end of buffer."
+  (let ((cache (wisi-forward-cache)))
+    (while (and (< (point) limit)
+               (not (eobp))
+               (not (memq (wisi-cache-token cache) ids)))
+      (setq cache (wisi-forward-cache)))
+    cache))
+
+(defun wisi-forward-find-nonterm (nonterm limit)
+  "Search forward for a token that has a cache with NONTERM.
+NONTERM may be a list; stop on any cache that has a member of the list.
+Return cache, or nil if at end of buffer.
+If LIMIT (a buffer position) is reached, throw an error."
+  (let ((nonterm-list (cond
+                      ((listp nonterm) nonterm)
+                      (t (list nonterm))))
+       (cache (wisi-forward-cache)))
+    (while (not (memq (wisi-cache-nonterm cache) nonterm-list))
+      (setq cache (wisi-forward-cache))
+      (when (>= (point) limit)
+       (error "cache with nonterm %s not found" nonterm)))
+    cache))
+
+(defun wisi-goto-cache-next (cache)
+  (goto-char (wisi-cache-next cache))
+  (wisi-get-cache (point))
+  )
+
+(defun wisi-forward-statement-keyword ()
+  "If not at a cached token, move forward to next
+cache. Otherwise move to cache-next, or cache-end, or next cache
+if both nil.  Return cache found."
+  (unless (eobp)
+    (wisi-validate-cache (point-min) (point-max) t 'navigate)
+    (let ((cache (wisi-get-cache (point))))
+      (if (and cache
+              (not (eq (wisi-cache-class cache) 'statement-end)))
+         (let ((next (or (wisi-cache-next cache)
+                         (wisi-cache-end cache))))
+           (if next
+               (goto-char next)
+             (wisi-forward-cache)))
+       (wisi-forward-cache))
+      )
+    (wisi-get-cache (point))
+    ))
+
+(defun wisi-backward-statement-keyword ()
+  "If not at a cached token, move backward to prev
+cache. Otherwise move to cache-prev, or prev cache if nil."
+  (wisi-validate-cache (point-min) (point-max) t 'navigate)
+  (let ((cache (wisi-get-cache (point)))
+       prev)
+    (when cache
+      (setq prev (wisi-cache-prev cache))
+      (unless prev
+       (unless (eq 'statement-start (wisi-cache-class cache))
+         (setq prev (wisi-cache-containing cache)))))
+    (if prev
+       (goto-char prev)
+      (wisi-backward-cache))
+  ))
+
+(defun wisi-forward-sexp (&optional arg)
+  "For `forward-sexp-function'."
+  (interactive "^p")
+  (or arg (setq arg 1))
+  (cond
+   ((and (> arg 0) (= 4 (syntax-class (syntax-after (point)))))  ;; on open 
paren
+    (let ((forward-sexp-function nil))
+      (forward-sexp arg)))
+
+   ((and (< arg 0) (= 5 (syntax-class (syntax-after (1- (point)))))) ;; after 
close paren
+    (let ((forward-sexp-function nil))
+      (forward-sexp arg)))
+
+   ((and (> arg 0) (= 7 (syntax-class (syntax-after (point)))))  ;; on (open) 
string quote
+    (let ((forward-sexp-function nil))
+      (forward-sexp arg)))
+
+   ((and (< arg 0) (= 7 (syntax-class (syntax-after (1- (point)))))) ;; after 
(close) string quote
+    (let ((forward-sexp-function nil))
+      (forward-sexp arg)))
+
+   (t
+    (dotimes (_i (abs arg))
+      (if (> arg 0)
+         (wisi-forward-statement-keyword)
+       (wisi-backward-statement-keyword))))
+   ))
+
+(defun wisi-goto-containing (cache &optional error)
+  "Move point to containing token for CACHE, return cache at that point.
+If ERROR, throw error when CACHE has no container; else return nil."
+  (cond
+   ((and (markerp (wisi-cache-containing cache))
+
+        (not (= (wisi-cache-containing cache) (point))))
+    ;; This check is only needed if some cache points to itself as a
+    ;; container. Apparently that happend once that I caught in the
+    ;; debugger; emacs hung because we got here in the font-lock
+    ;; timer.
+
+    (goto-char (wisi-cache-containing cache))
+    (wisi-get-cache (point)))
+   (t
+    (when error
+      (error "already at outermost containing token")))
+   ))
+
+(defun wisi-goto-containing-paren (cache)
+  "Move point to just after the open-paren containing CACHE.
+Return cache for paren, or nil if no containing paren."
+  (while (and cache
+             (not (eq (wisi-cache-class cache) 'open-paren)))
+    (setq cache (wisi-goto-containing cache)))
+  (when cache
+    (forward-char 1))
+  cache)
+
+(defun wisi-goto-start (cache)
+  "Move point to containing ancestor of CACHE that has class statement-start.
+Return start cache."
+  ;; cache nil at bob, or on cache in partially parsed statement
+  (while (and cache
+             (not (eq (wisi-cache-class cache) 'statement-start)))
+    (setq cache (wisi-goto-containing cache)))
+  cache)
+
+(defun wisi-goto-end-1 (cache)
+  (goto-char (wisi-cache-end cache)))
+
+(defun wisi-goto-statement-start ()
+  "Move point to token at start of statement point is in or after.
+Return start cache."
+  (interactive)
+  (wisi-validate-cache (point-min) (point-max) t 'navigate)
+  (wisi-goto-start (or (wisi-get-cache (point))
+                      (wisi-backward-cache))))
+
+(defun wisi-goto-statement-end ()
+  "Move point to token at end of statement point is in or before."
+  (interactive)
+  (wisi-validate-cache (point-min) (point-max) t 'navigate)
+  (let ((cache (or (wisi-get-cache (point))
+                  (wisi-forward-cache))))
+    (when (wisi-cache-end cache)
+      ;; nil when cache is statement-end
+      (wisi-goto-end-1 cache))
+    ))
+
+(defun wisi-next-statement-cache (cache)
+  "Move point to CACHE-next, return cache; error if nil."
+  (when (not (markerp (wisi-cache-next cache)))
+    (error "no next statement cache"))
+  (goto-char (wisi-cache-next cache))
+  (wisi-get-cache (point)))
+
+(defun wisi-prev-statement-cache (cache)
+  "Move point to CACHE-prev, return cache; error if nil."
+  (when (not (markerp (wisi-cache-prev cache)))
+    (error "no prev statement cache"))
+  (goto-char (wisi-cache-prev cache))
+  (wisi-get-cache (point)))
+
+;;;; indentation
+
+(defun wisi-comment-indent ()
+  "For `comment-indent-function'. Indent single line comment to
+the comment on the previous line."
+  ;; Called from `comment-indent', either to insert a new comment, or
+  ;; to indent the first line of an existing one.  In either case, the
+  ;; comment may be after code on the same line.  For an existing
+  ;; comment, point is at the start of the starting delimiter.
+  (or
+   (save-excursion
+     ;; Check for a preceding comment line; fail if comment follows code.
+     (when (forward-comment -1)
+       ;; For the case:
+       ;;
+       ;; code;-- comment
+       ;;
+       ;; point is on '--', and 'forward-comment' does not move point,
+       ;; returns nil.
+       (when (looking-at comment-start)
+         (current-column))))
+
+   (save-excursion
+     (back-to-indentation)
+     (if (looking-at comment-start)
+         ;; An existing comment, no code preceding comment, and
+         ;; no comment on preceding line. Return nil, so
+         ;; `comment-indent' will call `indent-according-to-mode'
+         nil
+
+       ;; A comment after code on the same line.
+       comment-column))
+   ))
+
+(defun wisi-indent-statement ()
+  "Indent region given by `wisi-goto-start', `wisi-cache-end'."
+  (interactive)
+  (wisi-validate-cache (point-min) (point-max) t 'navigate)
+
+  (save-excursion
+    (let ((cache (or (wisi-get-cache (point))
+                    (wisi-backward-cache))))
+      (when cache
+       ;; can be nil if in header comment
+       (let ((start (progn (wisi-goto-start cache) (point)))
+             (end (if (wisi-cache-end cache)
+                        ;; nil when cache is statement-end
+                        (wisi-cache-end cache)
+                      (point))))
+         (indent-region start end)
+         ))
+      )))
+
+(defvar-local wisi-indent-calculate-functions nil
+  "Functions to compute indentation special cases.
+Called with point at current indentation of a line; return
+indentation column, or nil if function does not know how to
+indent that line. Run after parser indentation, so other lines
+are indented correctly.")
+
+(defvar-local wisi-post-indent-fail-hook
+  "Function to reindent portion of buffer.
+Called from `wisi-indent-region' when a parse succeeds after
+failing; assumes user was editing code that is now syntactically
+correct. Must leave point at indentation of current line.")
+
+(defvar-local wisi-indent-failed nil
+  "Non-nil when wisi-indent-region fails due to parse failing; cleared when 
indent succeeds.")
+
+(defvar-local wisi-indent-region-fallback 'wisi-indent-region-fallback-default
+  "Function to compute indent for lines in region when wisi parse fails.
+Called with BEGIN END.")
+
+(defun wisi-indent-region-fallback-default (begin end)
+  ;; Assume there is no indent info at point; user is editing. Indent
+  ;; to previous lines.
+  (goto-char begin)
+  (forward-line -1);; safe at bob
+  (back-to-indentation)
+  (let ((col (current-column)))
+    (while (and (not (eobp))
+               (< (point) end))
+      (forward-line 1)
+      (indent-line-to col)
+      (when (bobp)
+       ;; single line in buffer; terminate loop
+       (goto-char (point-max))))))
+
+(defun wisi-list-memq (a b)
+  "Return non-nil if any member of A is a memq of B."
+  (let ((temp (copy-sequence a))
+       result)
+    (while (and (not result)
+               temp)
+      (when (memq (pop temp) b)
+       (setq result t)))
+    result))
+
+(defun wisi--get-cached-indent (begin end)
+  "Return cached indent for point (must be bol), after correcting
+for parse errors. BEGIN, END is the parsed region."
+  (let ((indent (get-text-property (1- (point)) 'wisi-indent)))
+    (if indent
+       (when (and (wisi-partial-parse-p begin end)
+                  (< 0 (length (wisi-parser-parse-errors wisi--parser))))
+         (dolist (err (wisi-parser-parse-errors wisi--parser))
+           (dolist (repair (wisi--parse-error-repair err))
+             ;; point is at bol; error pos may be at first token on same line.
+             (save-excursion
+               (back-to-indentation)
+               (when (>= (point) (wisi--parse-error-repair-pos repair))
+                 (setq indent (max 0 (wisi-parse-adjust-indent wisi--parser 
indent repair))))
+               ))))
+      ;; parse did not compute indent for point. Assume the error will
+      ;; go away soon as the user edits the code, so just return 0.
+      (if (= wisi-debug 0)
+         (setq indent 0)
+       (error "nil indent for line %d" (line-number-at-pos (point)))))
+
+    indent))
+
+(defun wisi-indent-region (begin end &optional indent-blank-lines)
+  "For `indent-region-function', using the wisi indentation engine.
+If INDENT-BLANK-LINES is non-nil, also indent blank lines (for use as
+`indent-line-function')."
+  (when (< 0 wisi-debug)
+    (message "wisi-indent-region %d %d"
+            (wisi-safe-marker-pos begin)
+            (wisi-safe-marker-pos end)))
+
+  (let ((wisi--parse-action 'indent)
+       (parse-required nil)
+       (end-mark (copy-marker end))
+       (prev-indent-failed wisi-indent-failed))
+
+    (wisi--check-change)
+
+    ;; BEGIN is inclusive; END is exclusive.
+    (save-excursion
+      (goto-char begin)
+      (setq begin (line-beginning-position))
+
+      (when (bobp) (forward-line))
+      (while (and (not parse-required)
+                 (or (and (= begin end) (= (point) end))
+                     (< (point) end))
+                 (not (eobp)))
+       (unless (get-text-property (1- (point)) 'wisi-indent)
+         (setq parse-required t))
+       (forward-line))
+      )
+
+    ;; A parse either succeeds and sets the indent cache on all
+    ;; lines in the parsed region, or fails and leaves valid caches
+    ;; untouched.
+    (when (and parse-required
+              (or (not wisi-parse-failed)
+                  (wisi-parse-try 'indent)))
+
+      (wisi-set-parse-try nil)
+
+      (wisi--run-parse begin end)
+
+      ;; If there were errors corrected, the indentation is
+      ;; potentially ambiguous; see
+      ;; test/ada_mode-interactive_2.adb. Or it was a partial parse,
+      ;; where errors producing bad indent are pretty much expected.
+      (unless (wisi-partial-parse-p begin end)
+       (setq wisi-indent-failed (< 0 (+ (length (wisi-parser-lexer-errors 
wisi--parser))
+                                        (length (wisi-parser-parse-errors 
wisi--parser))))))
+      )
+
+    (if wisi-parse-failed
+       (progn
+         ;; primary indent failed
+         (setq wisi-indent-failed t)
+         (when (functionp wisi-indent-region-fallback)
+           (when (< 0 wisi-debug)
+             (message "wisi-indent-region fallback"))
+           (funcall wisi-indent-region-fallback begin end)))
+
+      (save-excursion
+       ;; Apply cached indents.
+       (goto-char begin)
+       (let ((wisi-indenting-p t))
+         (while (and (not (eobp))
+                     (or (and (= begin end) (= (point) end))
+                         (< (point) end-mark))) ;; end-mark is exclusive
+           (when (or indent-blank-lines (not (eolp)))
+             ;; ’indent-region’ doesn’t indent an empty line; ’indent-line’ 
does
+             (let ((indent (if (bobp) 0 (wisi--get-cached-indent begin end))))
+                   (indent-line-to indent))
+             )
+           (forward-line 1))
+
+         ;; Run wisi-indent-calculate-functions
+         (when wisi-indent-calculate-functions
+           (goto-char begin)
+           (while (and (not (eobp))
+                       (< (point) end-mark))
+             (back-to-indentation)
+             (let ((indent
+                    (run-hook-with-args-until-success 
'wisi-indent-calculate-functions)))
+               (when indent
+                 (indent-line-to indent)))
+
+             (forward-line 1)))
+         )
+
+       (when
+           (and prev-indent-failed
+                (not wisi-indent-failed))
+         ;; Previous parse failed or indent was potentially
+         ;; ambiguous, this one is not.
+         (goto-char end-mark)
+         (when (< 0 wisi-debug)
+           (message "wisi-indent-region post-parse-fail-hook"))
+         (run-hooks 'wisi-post-indent-fail-hook))
+       ))
+    ))
+
+(defun wisi-indent-line ()
+  "For `indent-line-function'."
+  (let ((savep (copy-marker (point)))
+       (to-indent nil))
+    (back-to-indentation)
+    (when (>= (point) savep)
+      (setq to-indent t))
+
+    (wisi-indent-region (line-beginning-position) (line-end-position) t)
+
+    (goto-char savep)
+    (when to-indent (back-to-indentation))
+    ))
+
+(defun wisi-repair-error-1 (data)
+  "Repair error reported in DATA (a ’wisi--parse-error’ or 
’wisi--lexer-error’)"
+  (let ((wisi--parse-action 'navigate) ;; tell wisi-forward-token not to 
compute indent stuff.
+       tok-2)
+    (cond
+     ((wisi--lexer-error-p data)
+      (goto-char (1+ (wisi--lexer-error-pos data)))
+      (insert (wisi--lexer-error-inserted data)))
+     ((wisi--parse-error-p data)
+      (dolist (repair (wisi--parse-error-repair data))
+       (goto-char (wisi--parse-error-repair-pos repair))
+       (dolist (tok-1 (wisi--parse-error-repair-deleted repair))
+         (setq tok-2 (wisi-forward-token))
+         (if (eq tok-1 (wisi-tok-token tok-2))
+             (delete-region (car (wisi-tok-region tok-2)) (cdr 
(wisi-tok-region tok-2)))
+           (error "mismatched tokens: %d: parser %s, buffer %s %s"
+                  (point) tok-1 (wisi-tok-token tok-2) (wisi-tok-region 
tok-2))))
+
+       (dolist (id (wisi--parse-error-repair-inserted repair))
+         (insert (cdr (assoc id (wisi-elisp-lexer-id-alist wisi--lexer))))
+         (insert " "))
+       ))
+     )))
+
+(defun wisi-repair-error ()
+  "Repair the current error."
+  (interactive)
+  (let ((wisi-inhibit-parse t)) ;; don’t let the error list change while we 
are processing it.
+    (if (= 1 (+ (length (wisi-parser-lexer-errors wisi--parser))
+               (length (wisi-parser-parse-errors wisi--parser))))
+       (progn
+         (wisi-goto-error)
+         (wisi-repair-error-1 (or (car (wisi-parser-lexer-errors wisi--parser))
+                                  (car (wisi-parser-parse-errors 
wisi--parser)))))
+      (if (buffer-live-p wisi-error-buffer)
+         (let ((err
+                (with-current-buffer wisi-error-buffer
+                  (get-text-property (point) 'wisi-error-data))))
+           (wisi-repair-error-1 err))
+       (error "no current error found")
+       ))))
+
+(defun wisi-repair-errors (&optional beg end)
+  "Repair errors reported by last parse.
+If non-nil, only repair errors in BEG END region."
+  (interactive)
+  (let ((wisi-inhibit-parse t)) ;; don’t let the error list change while we 
are processing it.
+    (dolist (data (wisi-parser-lexer-errors wisi--parser))
+      (when (or (null beg)
+               (and (not (= 0 (wisi--lexer-error-inserted data)))
+                    (wisi--lexer-error-pos data)
+                    (<= beg (wisi--lexer-error-pos data))
+                    (<= (wisi--lexer-error-pos data) end)))
+       (wisi-repair-error-1 data)))
+
+    (dolist (data (wisi-parser-parse-errors wisi--parser))
+      (when (or (null beg)
+               (and (wisi--parse-error-pos data)
+                    (<= beg (wisi--parse-error-pos data))
+                    (<= (wisi--parse-error-pos data) end)))
+       (wisi-repair-error-1 data)))
+    ))
+
+;;; xref integration
+(defconst wisi-xref-ident-regexp "\\([^<]*\\)\\(?:<\\([0-9]+\\)>\\)?"
+  "Match line number encoded into identifier by 
`wisi-xref-identifier-at-point'.")
+
+(defun wisi-xref-ident-make (identifier &optional other-function)
+  (let* ((t-prop (get-text-property 0 'xref-identifier identifier))
+        ;; If t-prop is non-nil: identifier is from
+        ;; identifier-at-point, the desired location is the ’other’
+        ;; (spec/body).
+        ;;
+        ;; If t-prop is nil: identifier is from prompt/completion,
+        ;; the line number may be included in the identifier
+        ;; wrapped in <>, and the desired file is the current file.
+        (ident
+         (if t-prop
+             (substring-no-properties identifier 0 nil)
+           (string-match wisi-xref-ident-regexp identifier)
+           (match-string 1 identifier)
+           ))
+        (file
+         (if t-prop
+             (plist-get t-prop ':file)
+           (buffer-file-name)))
+        (line
+         (if t-prop
+             (plist-get t-prop ':line)
+           (when (match-string 2 identifier)
+             (string-to-number (match-string 2 identifier)))))
+        (column
+         (if t-prop
+             (plist-get t-prop ':column)
+           0))
+        )
+
+    (if t-prop
+       (funcall other-function ident file line column)
+
+      (list (xref-make ident (xref-make-file-location file (or line 1) 
column)))
+      )))
+
+(defun wisi-xref-identifier-at-point ()
+  (let ((ident (thing-at-point 'symbol)))
+    (when ident
+      (put-text-property
+       0 1
+       'xref-identifier
+       (list ':file (buffer-file-name)
+            ':line (line-number-at-pos)
+            ':column (current-column))
+       ident)
+      ident)))
+
+(defun wisi-next-name-region ()
+  "Return the next region at or after point with text property 'wisi-name'."
+  (let* ((begin
+         (if (get-text-property (point) 'wisi-name)
+             (point)
+           (next-single-property-change (point) 'wisi-name)))
+        (end (next-single-property-change begin 'wisi-name)))
+    (cons begin end)))
+
+(defun wisi-prev-name-region ()
+  "Return the prev region at or before point with text property 'wisi-name'."
+  (let* ((end
+         (if (get-text-property (point) 'wisi-name)
+             (point)
+           (previous-single-property-change (point) 'wisi-name)))
+        (begin (previous-single-property-change end 'wisi-name)))
+    (cons begin end)))
+
+(defun wisi-next-name ()
+  "Return the text at or after point with text property 'wisi-name'."
+  (let ((region (wisi-next-name-region)))
+    (buffer-substring-no-properties (car region) (cdr region))))
+
+(defun wisi-prev-name ()
+  "Return the text at or before point with text property 'wisi-name'."
+  (let ((region (wisi-prev-name-region)))
+    (buffer-substring-no-properties (car region) (cdr region))))
+
+(defun wisi-xref-identifier-completion-table ()
+  (wisi-validate-cache (point-min) (point-max) t 'navigate)
+  (let ((table nil)
+       (pos (point-min))
+       end-pos)
+    (while (setq pos (next-single-property-change pos 'wisi-name))
+      ;; We can’t store location data in a string text property -
+      ;; it does not survive completion. So we include the line
+      ;; number in the identifier string. This also serves to
+      ;; disambiguate overloaded identifiers.
+      (setq end-pos (next-single-property-change pos 'wisi-name))
+      (push
+       (format "%s<%d>"
+              (buffer-substring-no-properties pos end-pos)
+              (line-number-at-pos pos))
+       table)
+      (setq pos end-pos)
+      )
+    table))
+
+;;;; debugging
+
+(defun wisi-show-region (string)
+  (interactive "Mregion: ")
+  (when (not (= ?\( (aref string 0)))
+    (setq string (concat "(" string ")")))
+
+  (let ((region (read string)))
+    (cond
+     ((consp (cdr region))
+      ;; region is a list; (begin end)
+      (set-mark  (nth 0 region))
+      (goto-char (nth 1 region)))
+
+     ((consp region)
+      ;; region is a cons; (begin . end)
+      (set-mark  (car region))
+      (goto-char (cdr region)))
+     )))
+
+(defun wisi-debug-keys ()
+  "Add debug key definitions to `global-map'."
+  (interactive)
+  (define-key global-map "\M-h" 'wisi-show-containing-or-previous-cache)
+  (define-key global-map "\M-i" 'wisi-show-indent)
+  (define-key global-map "\M-j" 'wisi-show-cache)
+  )
+
+(defun wisi-read-parse-action ()
+  "Read a parse action symbol from the minibuffer."
+  (intern-soft (completing-read "parse action (indent): " '(face navigate 
indent) nil t nil nil 'indent)))
+
+(defun wisi-parse-buffer (&optional parse-action begin end)
+  (interactive)
+  (unless parse-action
+    (setq parse-action (wisi-read-parse-action)))
+  (if (use-region-p)
+      (progn
+       (setq begin (region-beginning))
+       (setq end   (region-end)))
+
+    (unless begin (setq begin (point-min)))
+    (unless end (setq end (point-max))))
+
+  (wisi-set-parse-try t parse-action)
+  (wisi-invalidate-cache parse-action begin)
+
+  (cl-ecase parse-action
+    (face
+     (with-silent-modifications
+       (remove-text-properties
+       begin end
+       (list
+        'font-lock-face nil
+        'fontified nil)))
+     (wisi-validate-cache begin end t parse-action)
+     (when (fboundp 'font-lock-ensure) (font-lock-ensure))) ;; emacs < 25
+
+    (navigate
+     (wisi-validate-cache begin end t parse-action))
+
+    (indent
+     (wisi-indent-region begin end))
+    ))
+
+(defun wisi-time (func count &optional report-wait-time)
+  "call FUNC COUNT times, show total time"
+  (interactive "afunction \nncount ")
+
+  (let ((start-time (float-time))
+       (start-gcs gcs-done)
+       (cum-wait-time 0.0)
+        (i 0)
+        diff-time
+       diff-gcs)
+    (while (not (eq (1+ count) (setq i (1+ i))))
+      (save-excursion
+        (funcall func))
+      (when report-wait-time
+       (setq cum-wait-time (+ cum-wait-time 
(wisi-process--parser-total-wait-time wisi--parser)))))
+    (setq diff-time (- (float-time) start-time))
+    (setq diff-gcs (- gcs-done start-gcs))
+    (if report-wait-time
+       (progn
+         (message "Total %f seconds, %d gcs; per iteration %f seconds %d gcs 
%d responses %f wait"
+                  diff-time
+                  diff-gcs
+                  (/ diff-time count)
+                  (/ (float diff-gcs) count)
+                  (wisi-process--parser-response-count wisi--parser)
+                  (/ cum-wait-time count)))
+
+      (message "Total %f seconds, %d gcs; per iteration %f seconds %d gcs"
+              diff-time
+              diff-gcs
+              (/ diff-time count)
+              (/ (float diff-gcs) count))
+      ))
+  nil)
+
+(defun wisi-time-indent-middle-line-cold-cache (count &optional 
report-wait-time)
+  (goto-char (point-min))
+  (forward-line (1- (/ (count-lines (point-min) (point-max)) 2)))
+  (let ((cum-wait-time 0.0))
+    (wisi-time
+     (lambda ()
+       (wisi-set-parse-try t 'indent)
+       (wisi-invalidate-cache 'indent (point-min))
+       (wisi-indent-line)
+       (when (wisi-process--parser-p wisi--parser)
+        (setq cum-wait-time (+ cum-wait-time 
(wisi-process--parser-total-wait-time wisi--parser)))))
+     count
+     report-wait-time)
+    ))
+
+(defun wisi-time-indent-middle-line-warm-cache (count)
+  (wisi-set-parse-try t 'indent)
+  (wisi-invalidate-cache 'indent (point-min))
+  (goto-char (point-min))
+  (forward-line (/ (count-lines (point-min) (point-max)) 2))
+  (wisi-indent-line)
+  (wisi-time #'wisi-indent-line count))
+
+(defun wisi-show-indent ()
+  "Show indent cache for current line."
+  (interactive)
+  (message "%s" (get-text-property (1- (line-beginning-position)) 
'wisi-indent)))
+
+(defun wisi-show-cache ()
+  "Show wisi text properties at point."
+  (interactive)
+  (message "%s:%s:%s:%s"
+          (wisi-get-cache (point))
+          (get-text-property (point) 'face)
+          (get-text-property (point) 'font-lock-face)
+          (get-text-property (point) 'wisi-name)
+          ))
+
+(defun wisi-show-containing-or-previous-cache ()
+  (interactive)
+  (let ((cache (wisi-get-cache (point))))
+    (if cache
+       (message "containing %s" (wisi-goto-containing cache t))
+      (message "previous %s" (wisi-backward-cache)))
+    ))
+
+;;;;; setup
+
+(cl-defun wisi-setup (&key indent-calculate post-indent-fail parser lexer)
+  "Set up a buffer for parsing files with wisi."
+  (when wisi--parser
+    (wisi-kill-parser))
+
+  (setq wisi--parser parser)
+  (setq wisi--lexer lexer)
+  (setq wisi--cached-regions
+       (list
+        (cons 'face nil)
+        (cons 'navigate nil)
+        (cons 'indent nil)))
+
+  (setq wisi--parse-try
+       (list
+        (cons 'face t)
+        (cons 'navigate t)
+        (cons 'indent t)))
+
+  ;; file local variables may have added opentoken, gnatprep
+  (setq wisi-indent-calculate-functions (append 
wisi-indent-calculate-functions indent-calculate))
+  (set (make-local-variable 'indent-line-function) #'wisi-indent-line)
+  (set (make-local-variable 'indent-region-function) #'wisi-indent-region)
+  (set (make-local-variable 'forward-sexp-function) #'wisi-forward-sexp)
+
+  (setq wisi-post-indent-fail-hook post-indent-fail)
+  (setq wisi-indent-failed nil)
+
+  (add-hook 'before-change-functions #'wisi-before-change 'append t)
+  (add-hook 'after-change-functions #'wisi-after-change nil t)
+  (setq wisi--change-end (copy-marker (point-min) t))
+
+  ;; See comments above on syntax-propertize.
+  (when (< emacs-major-version 25) (syntax-propertize (point-max)))
+
+  ;; In Emacs >= 26, ‘run-mode-hooks’ (in the major mode function)
+  ;; runs ‘hack-local-variables’ after ’*-mode-hooks’; we need
+  ;; ‘wisi-post-local-vars’ to run after ‘hack-local-variables’.
+  (add-hook 'hack-local-variables-hook 'wisi-post-local-vars nil t)
+  )
+
+(defun wisi-post-local-vars ()
+  "See wisi-setup."
+  (setq hack-local-variables-hook (delq 'wisi-post-local-vars 
hack-local-variables-hook))
+
+  (unless wisi-disable-face
+    (jit-lock-register #'wisi-fontify-region)))
+
+
+(provide 'wisi)
+;;; wisi.el ends here
diff --git a/packages/wisi/wisitoken-bnf-generate.adb 
b/packages/wisi/wisitoken-bnf-generate.adb
index d74b4a5..ca98c75 100644
--- a/packages/wisi/wisitoken-bnf-generate.adb
+++ b/packages/wisi/wisitoken-bnf-generate.adb
@@ -34,19 +34,18 @@ with WisiToken.BNF.Output_Ada_Common;
 with WisiToken.BNF.Output_Ada_Emacs;
 with WisiToken.BNF.Output_Elisp;
 with WisiToken.BNF.Output_Elisp_Common;
-with WisiToken.Generate.Packrat;
 with WisiToken.Generate.LR.LALR_Generate;
 with WisiToken.Generate.LR.LR1_Generate;
+with WisiToken.Generate.Packrat;
 with WisiToken.Parse.LR.Parser_No_Recover; -- for reading BNF file
 with WisiToken.Productions;
+with WisiToken.Syntax_Trees;
 with WisiToken.Text_IO_Trace;
 with WisiToken_Grammar_Runtime;
 with Wisitoken_Grammar_Actions;
 with Wisitoken_Grammar_Main;
 procedure WisiToken.BNF.Generate
 is
-   use all type Ada.Containers.Count_Type;
-
    procedure Put_Usage
    is
       use Ada.Text_IO;
@@ -54,7 +53,7 @@ is
    begin
       --  verbosity meaning is actually determined by output choice;
       --  they should be consistent with this description.
-      Put_Line (Standard_Error, "version 1.1.0");
+      Put_Line (Standard_Error, "version 1.2.0");
       Put_Line (Standard_Error, "wisi-generate [options] {wisi grammar file}");
       Put_Line (Standard_Error, "Generate source code implementing a parser 
for the grammar.");
       New_Line (Standard_Error);
@@ -111,7 +110,9 @@ is
       Put_Line (Standard_Error, "     1 - add diagnostics to standard out");
       Put_Line (Standard_Error, "     2 - more diagnostics to standard out, 
ignore unused tokens, unknown conflicts");
       Put_Line (Standard_Error, "  --generate ...: override grammar file 
%generate directive");
+      Put_Line (Standard_Error, "  --output_bnf <file_name> : output 
translated BNF source to file_name");
       Put_Line (Standard_Error, "  --suffix <string>; appended to grammar file 
name");
+      Put_Line (Standard_Error, "  --ignore_conflicts; ignore excess/unknown 
conflicts");
       Put_Line (Standard_Error,
                 "  --test_main; generate standalone main program for running 
the generated parser, modify file names");
       Put_Line (Standard_Error, "  --time; output execution time of various 
stages");
@@ -121,12 +122,16 @@ is
    Language_Name         : Ada.Strings.Unbounded.Unbounded_String; -- The 
language the grammar defines
    Output_File_Name_Root : Ada.Strings.Unbounded.Unbounded_String;
    Suffix                : Ada.Strings.Unbounded.Unbounded_String;
+   BNF_File_Name         : Ada.Strings.Unbounded.Unbounded_String;
+   Output_BNF            : Boolean := False;
+   Ignore_Conflicts      : Boolean := False;
    Test_Main             : Boolean := False;
 
    Command_Generate_Set : Generate_Set_Access; -- override grammar file 
declarations
 
    Trace          : aliased WisiToken.Text_IO_Trace.Trace 
(Wisitoken_Grammar_Actions.Descriptor'Access);
    Input_Data     : aliased WisiToken_Grammar_Runtime.User_Data_Type;
+   Elisp_Tokens   : WisiToken.BNF.Tokens;
    Grammar_Parser : WisiToken.Parse.LR.Parser_No_Recover.Parser;
 
    Do_Time : Boolean := False;
@@ -183,6 +188,10 @@ begin
             WisiToken.Trace_Generate := Integer'Value (Argument (Arg_Next));
             Arg_Next  := Arg_Next + 1;
 
+         elsif Argument (Arg_Next) = "--ignore_conflicts" then
+            Ignore_Conflicts := True;
+            Arg_Next         := Arg_Next + 1;
+
          elsif Argument (Arg_Next) = "--generate" then
             Arg_Next  := Arg_Next + 1;
             declare
@@ -196,39 +205,46 @@ begin
                when Constraint_Error =>
                   raise User_Error with "invalid value for 
generator_algorithm: '" & Argument (Arg_Next) & ";";
                end;
-               begin
-                  Tuple.Out_Lang := To_Output_Language (Argument (Arg_Next));
-                  Arg_Next       := Arg_Next + 1;
-               end;
-
-               loop
-                  exit when Done;
-                  declare
-                     Text : constant String := Argument (Arg_Next);
+               if Tuple.Gen_Alg /= None then
                   begin
-                     if Text = "text_rep" then
-                        Tuple.Text_Rep := True;
-                        Arg_Next := Arg_Next + 1;
-
-                     elsif (for some I of Lexer_Image => To_Lower (Text) =  
I.all) then
-                        Tuple.Lexer := To_Lexer (Text);
-                        Arg_Next := Arg_Next + 1;
-
-                     elsif (for some I in Valid_Interface =>
-                              To_Lower (Text) = To_Lower 
(Valid_Interface'Image (I)))
-                     then
-                        Tuple.Interface_Kind := 
WisiToken.BNF.Valid_Interface'Value (Text);
-                        Arg_Next := Arg_Next + 1;
-
-                     else
-                        Done := True;
-                     end if;
+                     Tuple.Out_Lang := To_Output_Language (Argument 
(Arg_Next));
+                     Arg_Next       := Arg_Next + 1;
                   end;
-               end loop;
 
+                  loop
+                     exit when Done;
+                     declare
+                        Text : constant String := Argument (Arg_Next);
+                     begin
+                        if Text = "text_rep" then
+                           Tuple.Text_Rep := True;
+                           Arg_Next := Arg_Next + 1;
+
+                        elsif (for some I of Lexer_Image => To_Lower (Text) =  
I.all) then
+                           Tuple.Lexer := To_Lexer (Text);
+                           Arg_Next := Arg_Next + 1;
+
+                        elsif (for some I in Valid_Interface =>
+                                 To_Lower (Text) = To_Lower 
(Valid_Interface'Image (I)))
+                        then
+                           Tuple.Interface_Kind := 
WisiToken.BNF.Valid_Interface'Value (Text);
+                           Arg_Next := Arg_Next + 1;
+
+                        else
+                           Done := True;
+                        end if;
+                     end;
+                  end loop;
+               end if;
                Add (Command_Generate_Set, Tuple);
             end;
 
+         elsif Argument (Arg_Next) = "--output_bnf" then
+            Output_BNF    := True;
+            Arg_Next      := Arg_Next + 1;
+            BNF_File_Name := +Argument (Arg_Next);
+            Arg_Next      := Arg_Next + 1;
+
          elsif Argument (Arg_Next) = "--suffix" then
             Arg_Next := Arg_Next + 1;
             Suffix   := +Argument (Arg_Next);
@@ -286,28 +302,83 @@ begin
       --  cache results in those cases; they only happen in test grammars,
       --  which are small.
 
-      procedure Parse_Check (Lexer : in Lexer_Type; Parser : in 
Generate_Algorithm)
-      is begin
+      procedure Parse_Check
+        (Lexer  : in Lexer_Type;
+         Parser : in Generate_Algorithm;
+         Phase  : in WisiToken_Grammar_Runtime.Action_Phase)
+      is
+         use all type Ada.Containers.Count_Type;
+         use all type WisiToken_Grammar_Runtime.Action_Phase;
+         use all type WisiToken_Grammar_Runtime.Meta_Syntax;
+      begin
          Input_Data.User_Parser := Parser;
          Input_Data.User_Lexer  := Lexer;
          --  Specifying the parser and lexer can change the parsed grammar, due
          --  to %if {parser | lexer}.
 
-         Input_Data.Reset;
+         Input_Data.Reset; -- only resets Other data
+
+         Input_Data.Phase := Phase;
          Grammar_Parser.Execute_Actions;
-         --  Ensures Input_Data.User_{Parser|Lexer} are set if needed.
 
-         if Input_Data.Rule_Count = 0 or Input_Data.Tokens.Rules.Length = 0 
then
-            raise WisiToken.Grammar_Error with "no rules";
-         end if;
+         case Phase is
+         when Meta =>
+            case Input_Data.Meta_Syntax is
+            when Unknown =>
+               Input_Data.Meta_Syntax := BNF_Syntax;
+
+            when BNF_Syntax =>
+               null;
+
+            when EBNF_Syntax =>
+               declare
+                  Tree  : WisiToken.Syntax_Trees.Tree renames 
Grammar_Parser.Parsers.First_State_Ref.Tree;
+               begin
+                  if Trace_Generate > Outline then
+                     Ada.Text_IO.Put_Line ("Translate EBNF tree to BNF");
+                  end if;
+
+                  if Trace_Generate > Detail then
+                     Ada.Text_IO.Put_Line ("EBNF tree:");
+                     Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor);
+                     Ada.Text_IO.New_Line;
+                  end if;
+
+                  WisiToken_Grammar_Runtime.Translate_EBNF_To_BNF (Tree, 
Input_Data);
+
+                  if Trace_Generate > Detail then
+                     Ada.Text_IO.New_Line;
+                     Ada.Text_IO.Put_Line ("BNF tree:");
+                     Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor);
+                  end if;
+
+                  if Output_BNF then
+                     WisiToken_Grammar_Runtime.Print_Source (-BNF_File_Name, 
Tree, Input_Data);
+                  end if;
+
+                  if WisiToken.Generate.Error then
+                     raise WisiToken.Grammar_Error with "errors during 
translating EBNF to BNF: aborting";
+                  end if;
+               end;
+            end case;
 
+         when Other =>
+            if Input_Data.Rule_Count = 0 or Input_Data.Tokens.Rules.Length = 0 
then
+               raise WisiToken.Grammar_Error with "no rules";
+            end if;
+         end case;
+      exception
+      when E : WisiToken.Syntax_Error | WisiToken.Parse_Error =>
+         Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, 
Ada.Exceptions.Exception_Message (E));
+         Grammar_Parser.Put_Errors;
+         raise;
       end Parse_Check;
 
    begin
-      if Command_Generate_Set = null then
-         --  Get the first quad from the input file
-         Parse_Check (None, None);
+      --  Get the the input file quads, translate EBNF
+      Parse_Check (None, None, WisiToken_Grammar_Runtime.Meta);
 
+      if Command_Generate_Set = null then
          if Input_Data.Generate_Set = null then
             raise User_Error with
               WisiToken.Generate.Error_Message
@@ -315,10 +386,7 @@ begin
                  "generate algorithm, output_language, lexer, interface not 
specified");
          end if;
 
-         --  Input_Data.Generate_Set will be free'd and regenerated if
-         --  Parse_Check is called, but the content won't change. So make a
-         --  copy.
-         Generate_Set := new 
WisiToken.BNF.Generate_Set'(Input_Data.Generate_Set.all);
+         Generate_Set := Input_Data.Generate_Set;
       else
          Generate_Set := Command_Generate_Set;
       end if;
@@ -326,11 +394,10 @@ begin
       Multiple_Tuples := Generate_Set'Length > 1;
 
       for Tuple of Generate_Set.all loop
-
-         Input_Data.User_Parser := Tuple.Gen_Alg;
-         Input_Data.User_Lexer  := Tuple.Lexer;
-
-         Parse_Check (Input_Data.User_Lexer, Input_Data.User_Parser);
+         Parse_Check
+           (Lexer  => Tuple.Lexer,
+            Parser => Tuple.Gen_Alg,
+            Phase  => WisiToken_Grammar_Runtime.Other);
 
          declare
             use Ada.Real_Time;
@@ -339,21 +406,33 @@ begin
             Time_End   : Time;
 
             Generate_Data : aliased WisiToken.BNF.Generate_Utils.Generate_Data 
:=
-              WisiToken.BNF.Generate_Utils.Initialize (Input_Data);
+              WisiToken.BNF.Generate_Utils.Initialize (Input_Data, 
Ignore_Conflicts);
 
             Packrat_Data : WisiToken.Generate.Packrat.Data
               (Generate_Data.Descriptor.First_Terminal, 
Generate_Data.Descriptor.First_Nonterminal,
                Generate_Data.Descriptor.Last_Nonterminal);
+
+            Do_Parse_Table_File : constant Boolean := WisiToken.Trace_Generate 
= 0 and
+              Tuple.Gen_Alg in LALR .. Packrat_Proc;
          begin
             if not Lexer_Done (Input_Data.User_Lexer) then
                Lexer_Done (Input_Data.User_Lexer) := True;
-               if Input_Data.User_Lexer = re2c_Lexer then
+               case Input_Data.User_Lexer is
+               when re2c_Lexer =>
                   WisiToken.BNF.Output_Ada_Common.Create_re2c
                     (Input_Data, Tuple, Generate_Data, -Output_File_Name_Root);
-               end if;
+                  if Tuple.Out_Lang = Ada_Emacs_Lang and 
Elisp_Tokens.Keywords.Is_Empty then
+                     --  elisp code needs keywords for font-lock.
+                     Elisp_Tokens.Keywords := Input_Data.Tokens.Keywords;
+                  end if;
+               when Elisp_Lexer =>
+                  Elisp_Tokens := Input_Data.Tokens;
+               when others =>
+                  null;
+               end case;
             end if;
 
-            if WisiToken.Trace_Generate = 0 and Tuple.Gen_Alg /= External then
+            if Do_Parse_Table_File then
                Create
                  (Parse_Table_File, Out_File,
                   -Output_File_Name_Root & "_" & To_Lower 
(Generate_Algorithm'Image (Tuple.Gen_Alg)) &
@@ -365,6 +444,10 @@ begin
             end if;
 
             case Tuple.Gen_Alg is
+            when None =>
+               --  Just translate EBNF to BNF, done in Parse_Check
+               null;
+
             when LALR =>
 
                Time_Start := Clock;
@@ -374,9 +457,11 @@ begin
                   Generate_Data.Descriptor.all,
                   Generate_Utils.To_Conflicts
                     (Generate_Data, Input_Data.Conflicts, 
Input_Data.Grammar_Lexer.File_Name),
-                  Generate_Utils.To_McKenzie_Param
-                    (Generate_Data, Input_Data.McKenzie_Recover, 
Input_Data.Grammar_Lexer.File_Name),
-                  Put_Parse_Table => True);
+                  Generate_Utils.To_McKenzie_Param (Generate_Data, 
Input_Data.McKenzie_Recover),
+                  Put_Parse_Table   => True,
+                  Include_Extra     => Test_Main,
+                  Ignore_Conflicts  => Ignore_Conflicts,
+                  Partial_Recursion => 
Input_Data.Language_Params.Partial_Recursion);
 
                if Do_Time then
                   Time_End := Clock;
@@ -400,9 +485,11 @@ begin
                   Generate_Data.Descriptor.all,
                   Generate_Utils.To_Conflicts
                     (Generate_Data, Input_Data.Conflicts, 
Input_Data.Grammar_Lexer.File_Name),
-                  Generate_Utils.To_McKenzie_Param
-                    (Generate_Data, Input_Data.McKenzie_Recover, 
Input_Data.Grammar_Lexer.File_Name),
-                  Put_Parse_Table => True);
+                  Generate_Utils.To_McKenzie_Param (Generate_Data, 
Input_Data.McKenzie_Recover),
+                  Put_Parse_Table   => True,
+                  Include_Extra     => Test_Main,
+                  Ignore_Conflicts  => Ignore_Conflicts,
+                  Partial_Recursion => 
Input_Data.Language_Params.Partial_Recursion);
 
                if Do_Time then
                   Time_End := Clock;
@@ -438,7 +525,7 @@ begin
                null;
             end case;
 
-            if WisiToken.Trace_Generate = 0 and Tuple.Gen_Alg /= External then
+            if Do_Parse_Table_File then
                Set_Output (Standard_Output);
                Close (Parse_Table_File);
             end if;
@@ -455,27 +542,33 @@ begin
                      -Output_File_Name_Root & "_" &
                        To_Lower (Generate_Algorithm_Image (Tuple.Gen_Alg).all) 
&
                        "_parse_table.txt",
-                    Generate_Data.Action_Names.all, 
Generate_Data.Check_Names.all);
+                     Generate_Data.Action_Names.all, 
Generate_Data.Check_Names.all);
                end if;
 
             when others =>
                null;
             end case;
 
-            case Tuple.Out_Lang is
-            when Ada_Lang =>
-               WisiToken.BNF.Output_Ada
-                 (Input_Data, -Output_File_Name_Root, Generate_Data, 
Packrat_Data, Tuple, Test_Main, Multiple_Tuples);
+            if Tuple.Gen_Alg /= None then
+               case Tuple.Out_Lang is
+               when Ada_Lang =>
+                  WisiToken.BNF.Output_Ada
+                    (Input_Data, -Output_File_Name_Root, Generate_Data, 
Packrat_Data, Tuple, Test_Main,
+                     Multiple_Tuples);
 
-            when Ada_Emacs_Lang =>
-               WisiToken.BNF.Output_Ada_Emacs
-                 (Input_Data, -Output_File_Name_Root, Generate_Data, 
Packrat_Data, Tuple, Test_Main, Multiple_Tuples,
-                  -Language_Name);
+               when Ada_Emacs_Lang =>
+                  WisiToken.BNF.Output_Ada_Emacs
+                    (Input_Data, Elisp_Tokens, -Output_File_Name_Root, 
Generate_Data, Packrat_Data, Tuple,
+                     Test_Main, Multiple_Tuples, -Language_Name);
 
-            when Elisp_Lang =>
-               WisiToken.BNF.Output_Elisp (Input_Data, -Output_File_Name_Root, 
Generate_Data, Packrat_Data, Tuple);
+               when Elisp_Lang =>
+                  WisiToken.BNF.Output_Elisp (Input_Data, 
-Output_File_Name_Root, Generate_Data, Packrat_Data, Tuple);
 
-            end case;
+               end case;
+               if WisiToken.Generate.Error then
+                  raise WisiToken.Grammar_Error with "errors: aborting";
+               end if;
+            end if;
          end;
       end loop;
    end;
diff --git a/packages/wisi/wisitoken-bnf-generate_grammar.adb 
b/packages/wisi/wisitoken-bnf-generate_grammar.adb
index 2264dcf..165f00f 100644
--- a/packages/wisi/wisitoken-bnf-generate_grammar.adb
+++ b/packages/wisi/wisitoken-bnf-generate_grammar.adb
@@ -1,86 +1,86 @@
---  Abstract :
---
---  Output Ada source code to recreate Grammar.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Text_IO; use Ada.Text_IO;
-with WisiToken.Generate;
-with WisiToken.Productions;
-procedure WisiToken.BNF.Generate_Grammar
-  (Grammar      : in WisiToken.Productions.Prod_Arrays.Vector;
-   Action_Names : in WisiToken.Names_Array_Array)
-is
-   use all type Ada.Containers.Count_Type;
-   use Ada.Strings.Unbounded;
-   use WisiToken.Generate;
-   use WisiToken.Productions;
-   Text : Unbounded_String;
-   Need_Comma : Boolean := False;
-begin
-   Indent_Line ("Grammar.Set_First (" & Trimmed_Image (Grammar.First_Index) & 
");");
-   Indent_Line ("Grammar.Set_Last (" & Trimmed_Image (Grammar.Last_Index) & 
");");
-
-   for Prod of Grammar loop
-      Indent_Line ("declare");
-      Indent_Line ("   Prod : Instance;");
-      Indent_Line ("begin");
-      Indent := Indent + 3;
-      Indent_Line ("Prod.LHS := " & Trimmed_Image (Prod.LHS) & ";");
-      Indent_Line ("Prod.RHSs.Set_First (0);");
-      Indent_Line ("Prod.RHSs.Set_Last (" & Trimmed_Image 
(Prod.RHSs.Last_Index) & ");");
-      for RHS_Index in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index loop
-         declare
-            RHS : Right_Hand_Side renames Prod.RHSs (RHS_Index);
-         begin
-            Indent_Line ("declare");
-            Indent_Line ("   RHS : Right_Hand_Side;");
-            Indent_Line ("begin");
-            Indent := Indent + 3;
-            if RHS.Tokens.Length > 0 then
-               Indent_Line ("RHS.Tokens.Set_First (1);");
-               Indent_Line ("RHS.Tokens.Set_Last (" & Trimmed_Image (Prod.RHSs 
(RHS_Index).Tokens.Last_Index) & ");");
-
-               if RHS.Tokens.Length = 1 then
-                  Indent_Line ("To_Vector ((1 => " & Trimmed_Image (RHS.Tokens 
(1)) & "), RHS.Tokens);");
-               else
-                  Need_Comma := False;
-                  Text := +"To_Vector ((";
-                  for ID of RHS.Tokens  loop
-                     if Need_Comma then
-                        Text := Text & ", ";
-                     else
-                        Need_Comma := True;
-                     end if;
-                     Text := Text & Trimmed_Image (ID);
-                  end loop;
-                  Text := Text & "), RHS.Tokens);";
-                  Indent_Wrap (-Text);
-               end if;
-            end if;
-            if Action_Names (Prod.LHS) /= null and then Action_Names 
(Prod.LHS)(RHS_Index) /= null then
-               Indent_Line ("RHS.Action     := " & Action_Names 
(Prod.LHS)(RHS_Index).all & "'Access;");
-            end if;
-            Indent_Line ("Prod.RHSs (" & Trimmed_Image (RHS_Index) & ") := 
RHS;");
-            Indent := Indent - 3;
-            Indent_Line ("end;");
-         end;
-      end loop;
-      Indent_Line ("Grammar (" & Trimmed_Image (Prod.LHS) & ") := Prod;");
-      Indent := Indent - 3;
-      Indent_Line ("end;");
-   end loop;
-end WisiToken.BNF.Generate_Grammar;
+--  Abstract :
+--
+--  Output Ada source code to recreate Grammar.
+--
+--  Copyright (C) 2018 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Text_IO; use Ada.Text_IO;
+with WisiToken.Generate;
+with WisiToken.Productions;
+procedure WisiToken.BNF.Generate_Grammar
+  (Grammar      : in WisiToken.Productions.Prod_Arrays.Vector;
+   Action_Names : in WisiToken.Names_Array_Array)
+is
+   use all type Ada.Containers.Count_Type;
+   use Ada.Strings.Unbounded;
+   use WisiToken.Generate;
+   use WisiToken.Productions;
+   Text : Unbounded_String;
+   Need_Comma : Boolean := False;
+begin
+   Indent_Line ("Grammar.Set_First (" & Trimmed_Image (Grammar.First_Index) & 
");");
+   Indent_Line ("Grammar.Set_Last (" & Trimmed_Image (Grammar.Last_Index) & 
");");
+
+   for Prod of Grammar loop
+      Indent_Line ("declare");
+      Indent_Line ("   Prod : Instance;");
+      Indent_Line ("begin");
+      Indent := Indent + 3;
+      Indent_Line ("Prod.LHS := " & Trimmed_Image (Prod.LHS) & ";");
+      Indent_Line ("Prod.RHSs.Set_First (0);");
+      Indent_Line ("Prod.RHSs.Set_Last (" & Trimmed_Image 
(Prod.RHSs.Last_Index) & ");");
+      for RHS_Index in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index loop
+         declare
+            RHS : Right_Hand_Side renames Prod.RHSs (RHS_Index);
+         begin
+            Indent_Line ("declare");
+            Indent_Line ("   RHS : Right_Hand_Side;");
+            Indent_Line ("begin");
+            Indent := Indent + 3;
+            if RHS.Tokens.Length > 0 then
+               Indent_Line ("RHS.Tokens.Set_First (1);");
+               Indent_Line ("RHS.Tokens.Set_Last (" & Trimmed_Image (Prod.RHSs 
(RHS_Index).Tokens.Last_Index) & ");");
+
+               if RHS.Tokens.Length = 1 then
+                  Indent_Line ("To_Vector ((1 => " & Trimmed_Image (RHS.Tokens 
(1)) & "), RHS.Tokens);");
+               else
+                  Need_Comma := False;
+                  Text := +"To_Vector ((";
+                  for ID of RHS.Tokens  loop
+                     if Need_Comma then
+                        Text := Text & ", ";
+                     else
+                        Need_Comma := True;
+                     end if;
+                     Text := Text & Trimmed_Image (ID);
+                  end loop;
+                  Text := Text & "), RHS.Tokens);";
+                  Indent_Wrap (-Text);
+               end if;
+            end if;
+            if Action_Names (Prod.LHS) /= null and then Action_Names 
(Prod.LHS)(RHS_Index) /= null then
+               Indent_Line ("RHS.Action     := " & Action_Names 
(Prod.LHS)(RHS_Index).all & "'Access;");
+            end if;
+            Indent_Line ("Prod.RHSs (" & Trimmed_Image (RHS_Index) & ") := 
RHS;");
+            Indent := Indent - 3;
+            Indent_Line ("end;");
+         end;
+      end loop;
+      Indent_Line ("Grammar (" & Trimmed_Image (Prod.LHS) & ") := Prod;");
+      Indent := Indent - 3;
+      Indent_Line ("end;");
+   end loop;
+end WisiToken.BNF.Generate_Grammar;
diff --git a/packages/wisi/wisitoken-bnf-generate_utils.adb 
b/packages/wisi/wisitoken-bnf-generate_utils.adb
index 8e52ca4..0f84547 100644
--- a/packages/wisi/wisitoken-bnf-generate_utils.adb
+++ b/packages/wisi/wisitoken-bnf-generate_utils.adb
@@ -2,7 +2,7 @@
 --
 --  see spec
 --
---  Copyright (C) 2014, 2015, 2017, 2018  All Rights Reserved.
+--  Copyright (C) 2014, 2015, 2017 - 2019  All Rights Reserved.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -47,7 +47,7 @@ package body WisiToken.BNF.Generate_Utils is
 
    function Name_1 (Cursor : in Token_Cursor) return String
    is begin
-      --   This function is used to compute LR1_descriptor.Image
+      --   This function is used to compute Descriptor.Image
       case Cursor.Kind is
       when Non_Grammar_Kind =>
          declare
@@ -128,7 +128,8 @@ package body WisiToken.BNF.Generate_Utils is
       when Not_Found =>
          Put_Error
            (Error_Message
-              (Source_File_Name, 1, "start token '" & (Start_Token) & "' not 
found; need %start?"));
+              (Source_File_Name, 1,
+               "start token '" & (Start_Token) & "' not found; need %start?"));
       end;
 
       for Rule of Data.Tokens.Rules loop
@@ -138,8 +139,8 @@ package body WisiToken.BNF.Generate_Utils is
             LHS              : Token_ID; -- not initialized for exception 
handler
             Action_Names     : Names_Array (0 .. Integer 
(Rule.Right_Hand_Sides.Length) - 1);
             Action_All_Empty : Boolean := True;
-            Check_Names     : Names_Array (0 .. Integer 
(Rule.Right_Hand_Sides.Length) - 1);
-            Check_All_Empty : Boolean := True;
+            Check_Names      : Names_Array (0 .. Integer 
(Rule.Right_Hand_Sides.Length) - 1);
+            Check_All_Empty  : Boolean := True;
          begin
             LHS := Find_Token_ID (Data, -Rule.Left_Hand_Side);
 
@@ -161,7 +162,7 @@ package body WisiToken.BNF.Generate_Utils is
                      Tokens.Set_First (I);
                      Tokens.Set_Last (Integer (Right_Hand_Side.Tokens.Length));
                      for Token of Right_Hand_Side.Tokens loop
-                        Tokens (I) := Find_Token_ID (Data, Token);
+                        Tokens (I) := Find_Token_ID (Data, -Token.Identifier);
                         I := I + 1;
                      end loop;
                   end if;
@@ -211,7 +212,10 @@ package body WisiToken.BNF.Generate_Utils is
    ----------
    --  Public subprograms, declaration order
 
-   function Initialize (Input_Data : aliased in 
WisiToken_Grammar_Runtime.User_Data_Type) return Generate_Data
+   function Initialize
+     (Input_Data       : aliased in WisiToken_Grammar_Runtime.User_Data_Type;
+      Ignore_Conflicts :         in Boolean := False)
+     return Generate_Data
    is
       EOI_ID : constant Token_ID := Token_ID
         (Count (Input_Data.Tokens.Non_Grammar) + Count 
(Input_Data.Tokens.Tokens)) + Token_ID
@@ -235,21 +239,16 @@ package body WisiToken.BNF.Generate_Utils is
       do
          Result.Descriptor.Case_Insensitive := 
Input_Data.Language_Params.Case_Insensitive;
          Result.Descriptor.New_Line_ID      := Find_Kind (Result, "new-line");
-         Result.Descriptor.Comment_ID       := Find_Kind (Result, "comment");
-         Result.Descriptor.Left_Paren_ID    := Find_Kind (Result, 
"left-paren");
-         Result.Descriptor.Right_Paren_ID   := Find_Kind (Result, 
"right-paren");
          Result.Descriptor.String_1_ID      := Find_Kind (Result, 
"string-single");
          Result.Descriptor.String_2_ID      := Find_Kind (Result, 
"string-double");
 
-         Result.Descriptor.Embedded_Quote_Escape_Doubled := 
Input_Data.Language_Params.Embedded_Quote_Escape_Doubled;
-
          --  Image set in loop below, which also updates these widths.
          Result.Descriptor.Terminal_Image_Width := 0;
          Result.Descriptor.Image_Width          := 0;
 
          Result.Descriptor.Last_Lookahead       :=
            (case (Input_Data.User_Parser) is
-            when None                                  => raise 
SAL.Programmer_Error,
+            when None                                  => Invalid_Token_ID,
             when LR1                                   => 
Result.Descriptor.Last_Terminal,
             when LALR                                  => 
Result.Descriptor.First_Nonterminal,
             when Packrat_Generate_Algorithm | External => Invalid_Token_ID);
@@ -271,6 +270,7 @@ package body WisiToken.BNF.Generate_Utils is
          end loop;
 
          To_Grammar (Result, Input_Data.Grammar_Lexer.File_Name, 
-Input_Data.Language_Params.Start_Token);
+         Result.Ignore_Conflicts := Ignore_Conflicts;
       end return;
    end Initialize;
 
@@ -416,6 +416,7 @@ package body WisiToken.BNF.Generate_Utils is
          end if;
 
       when Terminals_Others =>
+
          Cursor :=
            (Data        => Cursor.Data,
             Kind        => EOI,
@@ -448,6 +449,7 @@ package body WisiToken.BNF.Generate_Utils is
          end if;
 
       when WisiToken_Accept =>
+
          Cursor :=
            (Data        => Cursor.Data,
             Kind        => Nonterminal,
@@ -462,7 +464,6 @@ package body WisiToken.BNF.Generate_Utils is
 
       when Nonterminal =>
          Cursor.Kind := Done;
-
          return True;
 
       when Done =>
@@ -574,10 +575,15 @@ package body WisiToken.BNF.Generate_Utils is
 
       when Nonterminal =>
          Rule_Lists.Next (Cursor.Nonterminal);
-         if not Rule_Lists.Has_Element (Cursor.Nonterminal) then
-            Cursor.Kind := Done;
+         if Rule_Lists.Has_Element (Cursor.Nonterminal) then
+            return;
          end if;
 
+         loop
+            exit when Next_Kind_Internal (Cursor, Nonterminals);
+         end loop;
+         return;
+
       when Done =>
          null;
       end case;
@@ -672,14 +678,9 @@ package body WisiToken.BNF.Generate_Utils is
      return WisiToken.Generate.LR.Conflict_Lists.List
    is
       use WisiToken.Generate.LR;
-      use all type WisiToken.Parse.LR.Parse_Action_Verbs;
       Result   : WisiToken.Generate.LR.Conflict_Lists.List;
       Conflict : WisiToken.Generate.LR.Conflict;
    begin
-      Data.Accept_Reduce_Conflict_Count := 0;
-      Data.Shift_Reduce_Conflict_Count  := 0;
-      Data.Reduce_Reduce_Conflict_Count := 0;
-
       for Item of Conflicts loop
          begin
             Conflict :=
@@ -690,21 +691,14 @@ package body WisiToken.BNF.Generate_Utils is
                -1,
                Find_Token_ID (Data, -Item.On));
 
-            case Conflict.Action_A is
-            when Shift =>
-               Data.Shift_Reduce_Conflict_Count := 
Data.Shift_Reduce_Conflict_Count + 1;
-            when Reduce =>
-               Data.Reduce_Reduce_Conflict_Count := 
Data.Reduce_Reduce_Conflict_Count + 1;
-            when Accept_It =>
-               Data.Accept_Reduce_Conflict_Count := 
Data.Reduce_Reduce_Conflict_Count + 1;
-            end case;
-
             Result.Append (Conflict);
          exception
          when E : Not_Found =>
-            Put_Error
-              (Error_Message
-                 (Source_File_Name, Item.Source_Line, 
Ada.Exceptions.Exception_Message (E)));
+            if not Data.Ignore_Conflicts then
+               Put_Error
+                 (Error_Message
+                    (Source_File_Name, Item.Source_Line, 
Ada.Exceptions.Exception_Message (E)));
+            end if;
          end;
       end loop;
       return Result;
@@ -724,9 +718,8 @@ package body WisiToken.BNF.Generate_Utils is
    end To_Nonterminal_ID_Set;
 
    function To_McKenzie_Param
-     (Data             : aliased in Generate_Data;
-      Item             :         in McKenzie_Recover_Param_Type;
-      Source_File_Name :         in String)
+     (Data : aliased in Generate_Data;
+      Item :         in McKenzie_Recover_Param_Type)
      return WisiToken.Parse.LR.McKenzie_Param_Type
    is
       use Ada.Strings.Unbounded;
@@ -738,28 +731,21 @@ package body WisiToken.BNF.Generate_Utils is
          Data.Descriptor.Last_Terminal,
          Data.Descriptor.First_Nonterminal,
          Data.Descriptor.Last_Nonterminal,
-         Insert            => (others => Item.Default_Insert),
-         Delete            => (others => Item.Default_Delete_Terminal),
-         Push_Back         => (others => Item.Default_Push_Back),
-         Ignore_Check_Fail => Item.Ignore_Check_Fail,
-         Task_Count        => 0,
-         Cost_Limit        => Item.Cost_Limit,
-         Check_Limit       => Item.Check_Limit,
-         Check_Delta_Limit => Item.Check_Delta_Limit,
-         Enqueue_Limit     => Item.Enqueue_Limit);
-
-      ID : Token_ID;
+         Insert                      => (others => Item.Default_Insert),
+         Delete                      => (others => 
Item.Default_Delete_Terminal),
+         Push_Back                   => (others => Item.Default_Push_Back),
+         Undo_Reduce                 => (others => Item.Default_Push_Back), -- 
no separate default for undo_reduce
+         Minimal_Complete_Cost_Delta => Item.Minimal_Complete_Cost_Delta,
+         Fast_Forward                => Item.Fast_Forward,
+         Matching_Begin              => Item.Matching_Begin,
+         Ignore_Check_Fail           => Item.Ignore_Check_Fail,
+         Task_Count                  => 0,
+         Check_Limit                 => Item.Check_Limit,
+         Check_Delta_Limit           => Item.Check_Delta_Limit,
+         Enqueue_Limit               => Item.Enqueue_Limit);
    begin
       for Pair of Item.Delete loop
-         ID := Find_Token_ID (Data, -Pair.Name);
-         if ID in Result.Delete'Range then
-            Result.Delete (ID) := Natural'Value (-Pair.Value);
-         else
-            Put_Error
-              (Error_Message
-                 (Source_File_Name, Item.Source_Line, "delete cost is only 
valid for terminals (" &
-                    WisiToken.Image (ID, Data.Descriptor.all) & ")"));
-         end if;
+         Result.Delete (Find_Token_ID (Data, -Pair.Name)) := Natural'Value 
(-Pair.Value);
       end loop;
       for Pair of Item.Insert loop
          Result.Insert (Find_Token_ID (Data, -Pair.Name)) := Natural'Value 
(-Pair.Value);
@@ -767,6 +753,9 @@ package body WisiToken.BNF.Generate_Utils is
       for Pair of Item.Push_Back loop
          Result.Push_Back (Find_Token_ID (Data, -Pair.Name)) := Natural'Value 
(-Pair.Value);
       end loop;
+      for Pair of Item.Undo_Reduce loop
+         Result.Undo_Reduce (Find_Token_ID (Data, -Pair.Name)) := 
Natural'Value (-Pair.Value);
+      end loop;
 
       return Result;
    end To_McKenzie_Param;
@@ -793,10 +782,6 @@ package body WisiToken.BNF.Generate_Utils is
            Integer'Image (Input_Data.Check_Count) & " checks," &
            WisiToken.State_Index'Image (Generate_Data.Parser_State_Count) & " 
states," &
            Integer'Image (Generate_Data.Table_Actions_Count) & " parse 
actions");
-      Put_Line
-        (Integer'Image (Generate_Data.Accept_Reduce_Conflict_Count) & " 
accept/reduce conflicts," &
-           Integer'Image (Generate_Data.Shift_Reduce_Conflict_Count) & " 
shift/reduce conflicts," &
-           Integer'Image (Generate_Data.Reduce_Reduce_Conflict_Count) & " 
reduce/reduce conflicts");
    end Put_Stats;
 
    function Actions_Length (State : in Parse.LR.Parse_State) return Integer
diff --git a/packages/wisi/wisitoken-bnf-generate_utils.ads 
b/packages/wisi/wisitoken-bnf-generate_utils.ads
index 7720e21..bcf599f 100644
--- a/packages/wisi/wisitoken-bnf-generate_utils.ads
+++ b/packages/wisi/wisitoken-bnf-generate_utils.ads
@@ -3,7 +3,7 @@
 --  Utilities for translating input file structures to WisiToken
 --  structures needed for LALR.Generate.
 --
---  Copyright (C) 2014, 2015, 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2014, 2015, 2017 - 2019 Free Software Foundation, Inc.
 --
 --  The WisiToken package is free software; you can redistribute it
 --  and/or modify it under terms of the GNU General Public License as
@@ -35,11 +35,11 @@ package WisiToken.BNF.Generate_Utils is
 
    type Generate_Data is limited record
       Tokens     : access constant WisiToken.BNF.Tokens;
-      Descriptor : access WisiToken.Descriptor;
+      Descriptor : WisiToken.Descriptor_Access;
       Grammar    : WisiToken.Productions.Prod_Arrays.Vector;
 
-      Action_Names : access Names_Array_Array;
-      Check_Names  : access Names_Array_Array;
+      Action_Names : Names_Array_Array_Access;
+      Check_Names  : Names_Array_Array_Access;
       --  Names of subprograms for each grammar semantic action and check;
       --  non-null only if there is an action or check in the grammar.
 
@@ -49,16 +49,17 @@ package WisiToken.BNF.Generate_Utils is
       --  The following fields are LR specific; so far, it's not worth
       --  splitting them out.
 
-      Conflicts                    : WisiToken.Generate.LR.Conflict_Lists.List;
-      LR_Parse_Table               : WisiToken.Parse.LR.Parse_Table_Ptr;
-      Table_Actions_Count          : Integer                       := -1; -- 
parse, not user, actions
-      Parser_State_Count           : WisiToken.Unknown_State_Index := 0;
-      Accept_Reduce_Conflict_Count : Integer                       := 0;
-      Shift_Reduce_Conflict_Count  : Integer                       := 0;
-      Reduce_Reduce_Conflict_Count : Integer                       := 0;
+      Ignore_Conflicts    : Boolean                       := False;
+      Conflicts           : WisiToken.Generate.LR.Conflict_Lists.List;
+      LR_Parse_Table      : WisiToken.Parse.LR.Parse_Table_Ptr;
+      Table_Actions_Count : Integer                       := -1; -- parse, not 
user, actions
+      Parser_State_Count  : WisiToken.Unknown_State_Index := 0;
    end record;
 
-   function Initialize (Input_Data : aliased in 
WisiToken_Grammar_Runtime.User_Data_Type) return Generate_Data;
+   function Initialize
+     (Input_Data       : aliased in WisiToken_Grammar_Runtime.User_Data_Type;
+      Ignore_Conflicts :         in Boolean := False)
+     return Generate_Data;
 
    function Find_Token_ID (Data : aliased in Generate_Data; Token : in String) 
return Token_ID;
 
@@ -129,7 +130,7 @@ package WisiToken.BNF.Generate_Utils is
    --  Return the token value from the .wy file:
    --  Keywords: Keywords (i).value
    --  Tokens  : Tokens (i).Tokens (j).Value
-   --  Rules   : "" - they have no Value
+   --  Rules   : empty string (they have no Value)
 
    function To_Conflicts
      (Data             : aliased in out Generate_Data;
@@ -144,9 +145,8 @@ package WisiToken.BNF.Generate_Utils is
      return Token_ID_Set;
 
    function To_McKenzie_Param
-     (Data             : aliased in Generate_Data;
-      Item             :         in McKenzie_Recover_Param_Type;
-      Source_File_Name :         in String)
+     (Data : aliased in Generate_Data;
+      Item :         in McKenzie_Recover_Param_Type)
      return WisiToken.Parse.LR.McKenzie_Param_Type;
 
    procedure Count_Actions (Data : in out Generate_Utils.Generate_Data);
diff --git a/packages/wisi/wisitoken-bnf-output_ada.adb 
b/packages/wisi/wisitoken-bnf-output_ada.adb
index d27c602..944e216 100644
--- a/packages/wisi/wisitoken-bnf-output_ada.adb
+++ b/packages/wisi/wisitoken-bnf-output_ada.adb
@@ -58,14 +58,15 @@ is
    procedure Create_Ada_Actions_Body
      (Action_Names : not null access WisiToken.Names_Array_Array;
       Check_Names  : not null access WisiToken.Names_Array_Array;
+      Label_Count  : in              Ada.Containers.Count_Type;
       Package_Name : in              String)
    is
+      use all type Ada.Containers.Count_Type;
       use GNAT.Regexp;
       use Generate_Utils;
       use WisiToken.Generate;
 
       File_Name : constant String := Output_File_Name_Root & "_actions.adb";
-      --  No generate_algorithm when Test_Main; the generated actions file is 
independent of that.
 
       User_Data_Regexp : constant Regexp := Compile (Symbol_Regexp 
("User_Data"), Case_Sensitive => False);
       Tree_Regexp      : constant Regexp := Compile (Symbol_Regexp ("Tree"), 
Case_Sensitive      => False);
@@ -82,6 +83,10 @@ is
       Put_Raw_Code (Ada_Comment, Input_Data.Raw_Code (Actions_Body_Context));
       New_Line;
 
+      if Label_Count > 0 then
+         Put_Line ("with SAL;");
+      end if;
+
       Put_Line ("package body " & Package_Name & " is");
       Indent := Indent + 3;
       New_Line;
@@ -111,6 +116,42 @@ is
                     Slice (Action, 1, 5) = "wisi-");
             end Is_Elisp;
 
+            procedure Put_Labels (RHS : in RHS_Type; Line : in String)
+            is
+               Output : array (Rule.Labels.First_Index .. 
Rule.Labels.Last_Index) of Boolean := (others => False);
+
+               procedure Update_Output (Label : in String)
+               is begin
+                  for I in Rule.Labels.First_Index .. Rule.Labels.Last_Index 
loop
+                     if Label = Rule.Labels (I) then
+                        Output (I) := True;
+                     end if;
+                  end loop;
+               end Update_Output;
+            begin
+               for I in RHS.Tokens.First_Index .. RHS.Tokens.Last_Index loop
+                  if Length (RHS.Tokens (I).Label) > 0 then
+                     declare
+                        Label : constant String := -RHS.Tokens (I).Label;
+                     begin
+                        if Match (Line, Compile (Symbol_Regexp (Label), 
Case_Sensitive => False)) then
+                           Indent_Line
+                             (Label & " : constant SAL.Peek_Type :=" & 
SAL.Peek_Type'Image (I) & ";");
+                           Update_Output (Label);
+                        end if;
+                     end;
+                  end if;
+               end loop;
+
+               for I in Rule.Labels.First_Index .. Rule.Labels.Last_Index loop
+                  if not Output (I) and
+                    Match (Line, Compile (Symbol_Regexp (-Rule.Labels (I)), 
Case_Sensitive => False))
+                  then
+                     Indent_Line (-Rule.Labels (I) & " : constant 
SAL.Base_Peek_Type := SAL.Base_Peek_Type'First;");
+                  end if;
+               end loop;
+            end Put_Labels;
+
          begin
             for RHS of Rule.Right_Hand_Sides loop
                if Length (RHS.Action) > 0 and then not Is_Elisp (RHS.Action) 
then
@@ -141,7 +182,6 @@ is
                            Unref_Tokens := False;
                         end if;
                      end Check_Unref;
-
                   begin
                      Check_Unref (Line);
                      Indent_Line ("procedure " & Name);
@@ -151,11 +191,12 @@ is
                      Indent_Line ("  Tokens    : in     
WisiToken.Syntax_Trees.Valid_Node_Index_Array)");
                      Indent_Line ("is");
 
+                     Indent := Indent + 3;
                      if Unref_User_Data or Unref_Tree or Unref_Nonterm or 
Unref_Tokens then
-                        Indent_Start ("   pragma Unreferenced (");
+                        Indent_Start ("pragma Unreferenced (");
 
                         if Unref_User_Data then
-                           Put ((if Need_Comma then ", " else "") & 
"User_Data");
+                           Put ("User_Data");
                            Need_Comma := True;
                         end if;
                         if Unref_Tree then
@@ -173,6 +214,8 @@ is
                         Put_Line (");");
                      end if;
 
+                     Put_Labels (RHS, Line);
+                     Indent := Indent - 3;
                      Indent_Line ("begin");
                      Indent := Indent + 3;
 
@@ -192,6 +235,7 @@ is
                      Unref_Nonterm : constant Boolean := 0 = Index (Line, 
"Nonterm");
                      Unref_Tokens  : constant Boolean := 0 = Index (Line, 
"Tokens");
                      Unref_Recover : constant Boolean := 0 = Index (Line, 
"Recover_Active");
+                     Need_Comma    : Boolean          := False;
                   begin
                      Indent_Line ("function " & Name);
                      Indent_Line (" (Lexer          : access constant 
WisiToken.Lexer.Instance'Class;");
@@ -201,19 +245,32 @@ is
                      Indent_Line (" return 
WisiToken.Semantic_Checks.Check_Status");
                      Indent_Line ("is");
 
-                     if Unref_Lexer then
-                        Indent_Line ("   pragma Unreferenced (Lexer);");
-                     end if;
-                     if Unref_Nonterm then
-                        Indent_Line ("   pragma Unreferenced (Nonterm);");
-                     end if;
-                     if Unref_Tokens then
-                        Indent_Line ("   pragma Unreferenced (Tokens);");
-                     end if;
-                     if Unref_Recover then
-                        Indent_Line ("   pragma Unreferenced 
(Recover_Active);");
+                     Indent := Indent + 3;
+                     if Unref_Lexer or Unref_Nonterm or Unref_Tokens or 
Unref_Recover then
+                        Indent_Start ("pragma Unreferenced (");
+
+                        if Unref_Lexer then
+                           Put ("Lexer");
+                           Need_Comma := True;
+                        end if;
+                        if Unref_Nonterm then
+                           Put ((if Need_Comma then ", " else "") & "Nonterm");
+                           Need_Comma := True;
+                        end if;
+                        if Unref_Tokens then
+                           Put ((if Need_Comma then ", " else "") & "Tokens");
+                           Need_Comma := True;
+                        end if;
+                        if Unref_Recover then
+                           Put ((if Need_Comma then ", " else "") & 
"Recover_Active");
+                           Need_Comma := True;
+                        end if;
+                        Put_Line (");");
                      end if;
 
+                     Put_Labels (RHS, Line);
+                     Indent := Indent - 3;
+
                      Indent_Line ("begin");
                      Indent := Indent + 3;
                      Indent_Line (Line);
@@ -274,9 +331,7 @@ is
 
       case Common_Data.Generate_Algorithm is
       when LR_Generate_Algorithm =>
-         if Tuple.Text_Rep then
-            Put_Line ("with WisiToken.Productions;");
-         end if;
+         null;
 
       when Packrat_Gen =>
          Put_Line ("with WisiToken.Parse.Packrat.Generated;");
@@ -351,7 +406,7 @@ is
       Unit_Name : constant String := File_Name_To_Ada (Output_File_Name_Root) &
         "_" & Generate_Algorithm'Image (Common_Data.Generate_Algorithm) & 
"_Run";
 
-      Language_Package_Name : constant String := 
"WisiToken.Parse.LR.McKenzie_Recover." & File_Name_To_Ada
+      Default_Language_Runtime_Package : constant String := 
"WisiToken.Parse.LR.McKenzie_Recover." & File_Name_To_Ada
         (Output_File_Name_Root);
 
       File_Name : constant String := To_Lower (Unit_Name) & ".ads";
@@ -369,8 +424,19 @@ is
       Put_Line ("with " & Generic_Package_Name & ";");
       Put_Line ("with " & Actions_Package_Name & ";");
       Put_Line ("with " & Main_Package_Name & ";");
-      if Input_Data.Language_Params.Error_Recover then
-         Put_Line ("with " & Language_Package_Name & "; use " & 
Language_Package_Name & ";");
+      if Input_Data.Language_Params.Error_Recover and
+        Input_Data.Language_Params.Use_Language_Runtime
+      then
+         declare
+            Pkg : constant String :=
+              (if -Input_Data.Language_Params.Language_Runtime_Name = ""
+               then Default_Language_Runtime_Package
+               else -Input_Data.Language_Params.Language_Runtime_Name);
+         begin
+            --  For language-specific names in actions, checks.
+            Put_Line ("with " & Pkg & ";");
+            Put_Line ("use " & Pkg & ";");
+         end;
       end if;
 
       Put_Line ("procedure " & Unit_Name & " is new " & Generic_Package_Name);
@@ -381,7 +447,11 @@ is
                      "_parse_table.txt"",");
       end if;
       if Input_Data.Language_Params.Error_Recover then
-         Put_Line ("Fixes'Access, Use_Minimal_Complete_Actions'Access, 
String_ID_Set'Access,");
+         if Input_Data.Language_Params.Use_Language_Runtime then
+            Put_Line ("Fixes'Access, Matching_Begin_Tokens'Access, 
String_ID_Set'Access,");
+         else
+            Put_Line ("null, null, null,");
+         end if;
       end if;
       Put_Line (Main_Package_Name & ".Create_Parser);");
       Close (File);
@@ -414,7 +484,8 @@ begin
    begin
       if Input_Data.Action_Count > 0 or Input_Data.Check_Count > 0 then
          --  Some WisiToken tests have no actions or checks.
-         Create_Ada_Actions_Body (Generate_Data.Action_Names, 
Generate_Data.Check_Names, Actions_Package_Name);
+         Create_Ada_Actions_Body
+           (Generate_Data.Action_Names, Generate_Data.Check_Names, 
Input_Data.Label_Count, Actions_Package_Name);
       end if;
 
       Create_Ada_Actions_Spec
diff --git a/packages/wisi/wisitoken-bnf-output_ada_common.adb 
b/packages/wisi/wisitoken-bnf-output_ada_common.adb
index cbd36b7..b3d7dea 100644
--- a/packages/wisi/wisitoken-bnf-output_ada_common.adb
+++ b/packages/wisi/wisitoken-bnf-output_ada_common.adb
@@ -133,23 +133,18 @@ package body WisiToken.BNF.Output_Ada_Common is
       Put_Raw_Code (Ada_Comment, Input_Data.Raw_Code (Actions_Spec_Pre));
 
       Indent_Line ("Descriptor : aliased WisiToken.Descriptor :=");
-      Indent_Line ("  (First_Terminal                =>" & 
WisiToken.Token_ID'Image (Descriptor.First_Terminal) & ",");
+      Indent_Line ("  (First_Terminal    =>" & WisiToken.Token_ID'Image 
(Descriptor.First_Terminal) & ",");
       Indent := Indent + 3;
-      Indent_Line ("Last_Terminal                 =>" & 
WisiToken.Token_ID'Image (Descriptor.Last_Terminal) & ",");
-      Indent_Line ("First_Nonterminal             =>" & 
WisiToken.Token_ID'Image (Descriptor.First_Nonterminal) & ",");
-      Indent_Line ("Last_Nonterminal              =>" & 
WisiToken.Token_ID'Image (Descriptor.Last_Nonterminal) & ",");
-      Indent_Line ("EOI_ID                        =>" & 
WisiToken.Token_ID'Image (Descriptor.EOI_ID) & ",");
-      Indent_Line ("Accept_ID                     =>" & 
WisiToken.Token_ID'Image (Descriptor.Accept_ID) & ",");
-      Indent_Line ("Case_Insensitive              => " & Image 
(Input_Data.Language_Params.Case_Insensitive) & ",");
-      Indent_Line ("New_Line_ID                   =>" & 
WisiToken.Token_ID'Image (Descriptor.New_Line_ID) & ",");
-      Indent_Line ("Comment_ID                    =>" & 
WisiToken.Token_ID'Image (Descriptor.Comment_ID) & ",");
-      Indent_Line ("Left_Paren_ID                 =>" & 
WisiToken.Token_ID'Image (Descriptor.Left_Paren_ID) & ",");
-      Indent_Line ("Right_Paren_ID                =>" & 
WisiToken.Token_ID'Image (Descriptor.Right_Paren_ID) & ",");
-      Indent_Line ("String_1_ID                   =>" & 
WisiToken.Token_ID'Image (Descriptor.String_1_ID) & ",");
-      Indent_Line ("String_2_ID                   =>" & 
WisiToken.Token_ID'Image (Descriptor.String_2_ID) & ",");
-      Indent_Line ("Embedded_Quote_Escape_Doubled => " & Image
-                     
(Input_Data.Language_Params.Embedded_Quote_Escape_Doubled) & ",");
-      Indent_Line ("Image                         =>");
+      Indent_Line ("Last_Terminal     =>" & WisiToken.Token_ID'Image 
(Descriptor.Last_Terminal) & ",");
+      Indent_Line ("First_Nonterminal =>" & WisiToken.Token_ID'Image 
(Descriptor.First_Nonterminal) & ",");
+      Indent_Line ("Last_Nonterminal  =>" & WisiToken.Token_ID'Image 
(Descriptor.Last_Nonterminal) & ",");
+      Indent_Line ("EOI_ID            =>" & WisiToken.Token_ID'Image 
(Descriptor.EOI_ID) & ",");
+      Indent_Line ("Accept_ID         =>" & WisiToken.Token_ID'Image 
(Descriptor.Accept_ID) & ",");
+      Indent_Line ("Case_Insensitive  => " & Image 
(Input_Data.Language_Params.Case_Insensitive) & ",");
+      Indent_Line ("New_Line_ID       =>" & WisiToken.Token_ID'Image 
(Descriptor.New_Line_ID) & ",");
+      Indent_Line ("String_1_ID       =>" & WisiToken.Token_ID'Image 
(Descriptor.String_1_ID) & ",");
+      Indent_Line ("String_2_ID       =>" & WisiToken.Token_ID'Image 
(Descriptor.String_2_ID) & ",");
+      Indent_Line ("Image             =>");
       Indent_Start ("  (");
       Indent := Indent + 3;
       loop
@@ -264,12 +259,12 @@ package body WisiToken.BNF.Output_Ada_Common is
       is begin
          Indent_Line ("procedure Create_Parser");
          if Input_Data.Language_Params.Error_Recover then
-            Indent_Line ("  (Parser                       :    out 
WisiToken.Parse.LR.Parser.Parser;");
-            Indent_Line ("   Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;");
-            Indent_Line ("   Language_Use_Minimal_Complete_Actions : in");
-            Indent_Line ("  
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;");
-            Indent_Line
-              ("   Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;");
+            Indent_Line ("  (Parser                         :    out 
WisiToken.Parse.LR.Parser.Parser;");
+            Indent_Line ("   Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;");
+            Indent_Line ("   Language_Matching_Begin_Tokens : in     " &
+                           
"WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;");
+            Indent_Line ("   Language_String_ID_Set         : in     " &
+                           
"WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;");
          else
             Indent_Line ("  (Parser                       :    out 
WisiToken.Parse.LR.Parser_No_Recover.Parser;");
          end if;
@@ -418,7 +413,6 @@ package body WisiToken.BNF.Output_Ada_Common is
       Generate_Data : in WisiToken.BNF.Generate_Utils.Generate_Data)
    is
       use Ada.Strings.Unbounded;
-      use all type Ada.Containers.Count_Type;
 
       subtype Nonterminal_ID is Token_ID range
         Generate_Data.Grammar.First_Index .. Generate_Data.Grammar.Last_Index;
@@ -461,10 +455,14 @@ package body WisiToken.BNF.Output_Ada_Common is
       Put ("Insert", Table.McKenzie_Param.Insert);
       Put ("Delete", Table.McKenzie_Param.Delete);
       Put ("Push_Back", Table.McKenzie_Param.Push_Back);
+      Put ("Undo_Reduce", Table.McKenzie_Param.Undo_Reduce);
+      Indent_Line
+        ("Minimal_Complete_Cost_Delta => " & Integer'Image 
(Table.McKenzie_Param.Minimal_Complete_Cost_Delta) & ",");
+      Indent_Line ("Fast_Forward => " & Integer'Image 
(Table.McKenzie_Param.Fast_Forward) & ",");
+      Indent_Line ("Matching_Begin => " & Integer'Image 
(Table.McKenzie_Param.Matching_Begin) & ",");
       Indent_Line ("Ignore_Check_Fail  =>" & Integer'Image 
(Table.McKenzie_Param.Ignore_Check_Fail) & ",");
       Indent_Line ("Task_Count  =>" & System.Multiprocessors.CPU_Range'Image
                      (Table.McKenzie_Param.Task_Count) & ",");
-      Indent_Line ("Cost_Limit  =>" & Integer'Image 
(Table.McKenzie_Param.Cost_Limit) & ",");
       Indent_Line ("Check_Limit =>" & Token_Index'Image 
(Table.McKenzie_Param.Check_Limit) & ",");
       Indent_Line ("Check_Delta_Limit =>" & Integer'Image 
(Table.McKenzie_Param.Check_Delta_Limit) & ",");
       Indent_Line ("Enqueue_Limit =>" & Integer'Image 
(Table.McKenzie_Param.Enqueue_Limit) & ");");
@@ -472,62 +470,48 @@ package body WisiToken.BNF.Output_Ada_Common is
       New_Line;
 
       if Common_Data.Text_Rep then
-         Indent_Line ("function Productions return 
WisiToken.Productions.Prod_Arrays.Vector");
+         Indent_Line ("function Actions return 
WisiToken.Parse.LR.Semantic_Action_Array_Arrays.Vector");
          Indent_Line ("is begin");
          Indent := Indent + 3;
-         Indent_Line ("return Prods : WisiToken.Productions.Prod_Arrays.Vector 
do");
+         Indent_Line ("return Acts : 
WisiToken.Parse.LR.Semantic_Action_Array_Arrays.Vector do");
          Indent := Indent + 3;
          Indent_Line
-           ("Prods.Set_First (" & Trimmed_Image 
(Generate_Data.Grammar.First_Index) & ");");
-         Indent_Line
-           ("Prods.Set_Last (" & Trimmed_Image 
(Generate_Data.Grammar.Last_Index) & ");");
+           ("Acts.Set_First_Last (" & Trimmed_Image 
(Generate_Data.Grammar.First_Index) & ", " &
+              Trimmed_Image (Generate_Data.Grammar.Last_Index) & ");");
 
          for I in Nonterminal_ID loop
             declare
                P : Productions.Instance renames Generate_Data.Grammar (I);
             begin
-               Indent_Line
-                 ("Set_Production (Prods (" & Trimmed_Image (P.LHS) & "), " &
-                    Trimmed_Image (P.LHS) & "," & Integer'Image 
(P.RHSs.Last_Index) & ");");
-
-               for J in P.RHSs.First_Index .. P.RHSs.Last_Index loop
-                  Line := +"Set_RHS (Prods (" & Trimmed_Image (P.LHS) & ")," & 
Natural'Image (J) & ", (";
-                  declare
-                     RHS : Productions.Right_Hand_Side renames P.RHSs (J);
-                  begin
-                     if RHS.Tokens.Length = 0 then
-                        Append ("1 .. 0 => <>");
-                     elsif RHS.Tokens.Length = 1 then
-                        Append ("1 => " & Trimmed_Image (RHS.Tokens (1)));
-                     else
-                        for I in RHS.Tokens.First_Index .. 
RHS.Tokens.Last_Index loop
-                           Append (Trimmed_Image (RHS.Tokens (I)));
-                           if I < RHS.Tokens.Last_Index then
-                              Append (", ");
-                           end if;
-                        end loop;
+               if Generate_Data.Action_Names (P.LHS) /= null or 
Generate_Data.Check_Names (P.LHS) /= null then
+                  Indent_Line
+                    ("Acts (" & Trimmed_Image (P.LHS) & ").Set_First_Last (0," 
&
+                       Integer'Image (P.RHSs.Last_Index) & ");");
+
+                  for J in P.RHSs.First_Index .. P.RHSs.Last_Index loop
+                     if (Generate_Data.Action_Names (P.LHS) /= null and then
+                           Generate_Data.Action_Names (P.LHS)(J) /= null)
+                       or
+                       (Generate_Data.Check_Names (P.LHS) /= null and then
+                          Generate_Data.Check_Names (P.LHS) /= null)
+                     then
+                        Indent_Wrap
+                          ("Acts (" & Trimmed_Image (P.LHS) & ")(" & 
Trimmed_Image (J) & ") := (" &
+                             (if Generate_Data.Action_Names (P.LHS) = null 
then "null"
+                              elsif Generate_Data.Action_Names (P.LHS)(J) = 
null then "null"
+                              else Generate_Data.Action_Names (P.LHS)(J).all & 
"'Access") & ", " &
+                             (if Generate_Data.Check_Names (P.LHS) = null then 
"null"
+                              elsif Generate_Data.Check_Names (P.LHS)(J) = 
null then "null"
+                              else Generate_Data.Check_Names (P.LHS)(J).all & 
"'Access") & ");");
                      end if;
-
-                     Append ("), ");
-                     Append
-                       ((if Generate_Data.Action_Names (P.LHS) = null then 
"null"
-                         elsif Generate_Data.Action_Names (P.LHS)(J) = null 
then "null"
-                         else Generate_Data.Action_Names (P.LHS)(J).all & 
"'Access"));
-                     Append (", ");
-                     Append
-                       ((if Generate_Data.Check_Names (P.LHS) = null then 
"null"
-                         elsif Generate_Data.Check_Names (P.LHS)(J) = null 
then "null"
-                         else Generate_Data.Check_Names (P.LHS)(J).all & 
"'Access"));
-                  end;
-                  Append (");");
-                  Indent_Wrap (-Line);
-               end loop;
+                  end loop;
+               end if;
             end;
          end loop;
          Indent := Indent - 3;
          Indent_Line ("end return;");
          Indent := Indent - 3;
-         Indent_Line ("end Productions;");
+         Indent_Line ("end Actions;");
          New_Line;
       end if;
    end Create_LR_Parser_Core_1;
@@ -536,7 +520,8 @@ package body WisiToken.BNF.Output_Ada_Common is
      (Input_Data    : in WisiToken_Grammar_Runtime.User_Data_Type;
       Generate_Data : in WisiToken.BNF.Generate_Utils.Generate_Data)
    is
-      use all type WisiToken.Parse.LR.All_Parse_Action_Verbs;
+      use all type Ada.Containers.Count_Type;
+      use WisiToken.Parse.LR;
       use Ada.Strings.Unbounded;
 
       Table            : WisiToken.Parse.LR.Parse_Table_Ptr renames 
Generate_Data.LR_Parse_Table;
@@ -566,17 +551,9 @@ package body WisiToken.BNF.Output_Ada_Common is
 
       Declare_Subroutines :
       for State_Index in Table.States'Range loop
-
-         if Input_Data.Language_Params.Error_Recover then
-            Indent_Wrap
-              ("Table.States (" & Trimmed_Image (State_Index) & ").Productions 
:= WisiToken.To_Vector (" &
-                 Image (Table.States (State_Index).Productions, Strict => 
True) & ");");
-         end if;
-
          Actions :
          declare
             use Ada.Containers;
-            use WisiToken.Parse.LR;
             Base_Indent : constant Ada.Text_IO.Count := Indent;
             Node        : Action_Node_Ptr := Table.States 
(State_Index).Action_List;
          begin
@@ -622,6 +599,7 @@ package body WisiToken.BNF.Output_Ada_Common is
                           Trimmed_Image (Node.Symbol);
                         Append (", ");
                         Append (Trimmed_Image (Action_Node.Item.State));
+                        Append (");");
 
                      when Reduce | Accept_It =>
                         Line := +"Add_Action (Table.States (" & Trimmed_Image 
(State_Index) & "), " &
@@ -651,18 +629,23 @@ package body WisiToken.BNF.Output_Ada_Common is
                             else Generate_Data.Check_Names
                               
(Action_Node.Item.Production.LHS)(Action_Node.Item.Production.RHS).all &
                                "'Access"));
+                        Append (");");
 
                      when Parse.LR.Error =>
-                        Line := +"Add_Error (Table.States (" & Trimmed_Image 
(State_Index) & ")";
+                        Line := +"Add_Error (Table.States (" & Trimmed_Image 
(State_Index) & "));";
                      end case;
+                     Indent_Wrap (-Line);
+                     Line_Count := Line_Count + 1;
 
-                     Action_Node := Action_Node.Next;
-                     if Action_Node /= null then
+                     loop
+                        Action_Node := Action_Node.Next;
+                        exit when Action_Node = null;
                         --  There is a conflict; must be Shift/{Reduce|Accept} 
or Reduce/{Reduce|Accept}.
                         --  The added parameters are the same in either case.
                         case Action_Node.Item.Verb is
                         when Reduce | Accept_It =>
-                           Append (", ");
+                           Line := +"Add_Conflict (Table.States (" & 
Trimmed_Image (State_Index) & "), " &
+                             Trimmed_Image (Node.Symbol) & ", ";
                            Append (Image (Action_Node.Item.Production) & ",");
                            Append (Count_Type'Image 
(Action_Node.Item.Token_Count) & ", ");
                            Append
@@ -682,24 +665,23 @@ package body WisiToken.BNF.Output_Ada_Common is
                                else Generate_Data.Check_Names
                                  
(Action_Node.Item.Production.LHS)(Action_Node.Item.Production.RHS).all &
                                   "'Access"));
+                           Indent_Wrap (-Line & ");");
+                           Line_Count := Line_Count + 1;
 
                         when others =>
-                           raise SAL.Programmer_Error with "conflict second 
action verb: " &
+                           raise SAL.Programmer_Error with "invalid conflict 
action verb: " &
                              Parse.LR.Parse_Action_Verbs'Image 
(Action_Node.Item.Verb);
                         end case;
-                     end if;
+                     end loop;
                   end;
-                  Indent_Wrap (-Line & ");");
-                  Line_Count := Line_Count + 1;
-                  Indent     := Base_Indent;
-                  Node       := Node.Next;
+                  Indent := Base_Indent;
+                  Node   := Node.Next;
                end loop;
             end if;
          end Actions;
 
          Gotos :
          declare
-            use WisiToken.Parse.LR;
             Node : Goto_Node_Ptr := Table.States (State_Index).Goto_List;
          begin
             loop
@@ -712,12 +694,21 @@ package body WisiToken.BNF.Output_Ada_Common is
             end loop;
          end Gotos;
 
-         if Input_Data.Language_Params.Error_Recover and
-           Table.States (State_Index).Minimal_Complete_Action.Verb /= 
Parse.LR.Pause
-         then
-            Indent_Wrap
-              ("Table.States (" & Trimmed_Image (State_Index) & 
").Minimal_Complete_Action := " &
-                 WisiToken.Parse.LR.Strict_Image (Table.States 
(State_Index).Minimal_Complete_Action) & ";");
+         if Input_Data.Language_Params.Error_Recover then
+            if Table.States (State_Index).Kernel.Length > 0 then
+               Indent_Wrap
+                 ("Table.States (" & Trimmed_Image (State_Index) & ").Kernel 
:= To_Vector (" &
+                    Image (Table.States (State_Index).Kernel, Strict => True) 
& ");");
+            end if;
+            if Table.States (State_Index).Minimal_Complete_Actions.Length > 0 
then
+               Indent_Wrap
+                 ("Table.States (" & Trimmed_Image (State_Index) & 
").Minimal_Complete_Actions := To_Vector (" &
+                    Strict_Image (Table.States 
(State_Index).Minimal_Complete_Actions, Strict => True) & ");");
+               if Table.States 
(State_Index).Minimal_Complete_Actions_Recursive then
+                  Indent_Wrap
+                    ("Table.States (" & Trimmed_Image (State_Index) & 
").Minimal_Complete_Actions_Recursive := True;");
+               end if;
+            end if;
          end if;
 
          if Line_Count > Lines_Per_Subr then
@@ -765,14 +756,14 @@ package body WisiToken.BNF.Output_Ada_Common is
       case Common_Data.Interface_Kind is
       when Process =>
          if Input_Data.Language_Params.Error_Recover then
-            Indent_Line ("  (Parser                       :    out 
WisiToken.Parse.LR.Parser.Parser;");
-            Indent_Line ("   Language_Fixes               : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;");
-            Indent_Line ("   Language_Use_Minimal_Complete_Actions : in");
-            Indent_Line ("  
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;");
+            Indent_Line ("  (Parser                         :    out 
WisiToken.Parse.LR.Parser.Parser;");
+            Indent_Line ("   Language_Fixes                 : in     
WisiToken.Parse.LR.Parser.Language_Fixes_Access;");
+            Indent_Line ("   Language_Matching_Begin_Tokens : in     " &
+                           
"WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;");
             Indent_Line
               ("   Language_String_ID_Set       : in     
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;");
          else
-            Indent_Line ("  (Parser                       :    out 
WisiToken.Parse.LR.Parser_No_Recover.Parser;");
+            Indent_Line ("  (Parser                         :    out 
WisiToken.Parse.LR.Parser_No_Recover.Parser;");
          end if;
          Indent_Line ("   Trace                        : not null access 
WisiToken.Trace'Class;");
          Indent_Start ("   User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access");
@@ -798,7 +789,7 @@ package body WisiToken.BNF.Output_Ada_Common is
       if Common_Data.Text_Rep then
          Create_LR_Parser_Core_1 (Common_Data, Generate_Data);
          Indent_Line ("Table : constant Parse_Table_Ptr := Get_Text_Rep");
-         Indent_Line ("  (Text_Rep_File_Name, McKenzie_Param, Productions);");
+         Indent_Line ("  (Text_Rep_File_Name, McKenzie_Param, Actions);");
          Indent := Indent - 3;
          Indent_Line ("begin");
          Indent := Indent + 3;
@@ -841,7 +832,7 @@ package body WisiToken.BNF.Output_Ada_Common is
          Indent_Line ("   Table,");
          if Input_Data.Language_Params.Error_Recover then
             Indent_Line ("   Language_Fixes,");
-            Indent_Line ("   Language_Use_Minimal_Complete_Actions,");
+            Indent_Line ("   Language_Matching_Begin_Tokens,");
             Indent_Line ("   Language_String_ID_Set,");
          end if;
          Indent_Line ("   User_Data,");
diff --git a/packages/wisi/wisitoken-bnf-output_ada_emacs.adb 
b/packages/wisi/wisitoken-bnf-output_ada_emacs.adb
index a16d289..ae109fa 100644
--- a/packages/wisi/wisitoken-bnf-output_ada_emacs.adb
+++ b/packages/wisi/wisitoken-bnf-output_ada_emacs.adb
@@ -40,6 +40,7 @@ with WisiToken.Generate.Packrat;
 with WisiToken_Grammar_Runtime;
 procedure WisiToken.BNF.Output_Ada_Emacs
   (Input_Data            :         in WisiToken_Grammar_Runtime.User_Data_Type;
+   Elisp_Tokens          :         in WisiToken.BNF.Tokens;
    Output_File_Name_Root :         in String;
    Generate_Data         : aliased in 
WisiToken.BNF.Generate_Utils.Generate_Data;
    Packrat_Data          :         in WisiToken.Generate.Packrat.Data;
@@ -50,9 +51,10 @@ procedure WisiToken.BNF.Output_Ada_Emacs
 is
    use all type Ada.Containers.Count_Type;
 
-   Language_Runtime_Package : constant String := "Wisi." & Language_Name;
+   Default_Language_Runtime_Package : constant String := "Wisi." & 
Language_Name;
 
    Blank_Set : constant Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.To_Set (" ");
+   Numeric   : constant Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.To_Set ("0123456789");
 
    Common_Data : Output_Ada_Common.Common_Data := 
WisiToken.BNF.Output_Ada_Common.Initialize
      (Input_Data, Tuple, Output_File_Name_Root, Check_Interface => True);
@@ -155,7 +157,9 @@ is
    procedure Create_Ada_Action
      (Name          : in String;
       RHS           : in RHS_Type;
+      Prod_ID       : in WisiToken.Production_ID;
       Unsplit_Lines : in Ada.Strings.Unbounded.Unbounded_String;
+      Labels        : in String_Arrays.Vector;
       Check         : in Boolean)
    is
       --  Create Action (if Check = False; Lines must be RHS.Action) or
@@ -180,9 +184,63 @@ is
       Indent_Action_Line : Unbounded_String;
       Check_Line         : Unbounded_String;
 
+      Label_Needed   : array (Labels.First_Index .. Labels.Last_Index) of 
Boolean := (others => False);
+      Nonterm_Needed : Boolean := False;
+
+      function Label_Used (Label : in String) return Boolean
+      is
+         Found : Boolean := False;
+      begin
+         for Tok of RHS.Tokens loop
+            if -Tok.Label = Label then
+               Found := True;
+               exit;
+            end if;
+         end loop;
+
+         if not Found then
+            return False;
+         end if;
+
+         for I in Labels.First_Index .. Labels.Last_Index loop
+            if Label = Labels (I) then
+               Label_Needed (I) := True;
+               return True;
+            end if;
+         end loop;
+         raise SAL.Programmer_Error;
+      end Label_Used;
+
+      function Count_Label_Needed return Ada.Containers.Count_Type
+      is
+         use Ada.Containers;
+         Result : Count_Type := 0;
+      begin
+         for B of Label_Needed loop
+            if B then Result := Result + 1; end if;
+         end loop;
+         return Result;
+      end Count_Label_Needed;
+
+      function Find_Token_Index (I : in Base_Identifier_Index) return 
SAL.Base_Peek_Type
+      is
+         Rule_Label : constant String := -Labels (I);
+      begin
+         for I in RHS.Tokens.First_Index .. RHS.Tokens.Last_Index loop
+            if Length (RHS.Tokens (I).Label) > 0 and then
+              -RHS.Tokens (I).Label = Rule_Label
+            then
+               return I;
+            end if;
+         end loop;
+         return SAL.Base_Peek_Type'First;
+      end Find_Token_Index;
+
       function Statement_Params (Params : in String) return String
       is
          --  Input looks like: [1 function 2 other ...]
+         --  Numbers can be token labels.
+
          Last       : Integer := Index_Non_Blank (Params); -- skip [
          First      : Integer;
          Second     : Integer;
@@ -195,30 +253,46 @@ is
             Second := Index (Params, Blank_Set, First);
             exit when Second = 0;
 
-            Count := Count + 1;
-            Last  := Index (Params, Space_Paren_Set, Second + 1);
+            Last := Index (Params, Space_Paren_Set, Second + 1);
 
-            Result := Result & (if Need_Comma then ", " else "") &
-              "(" & Params (First .. Second - 1) & ", " &
-              Elisp_Name_To_Ada (Params (Second + 1 .. Last - 1), Append_ID => 
False, Trim => 0) & ")";
+            declare
+               Label : constant String := Params (First .. Second - 1);
+            begin
+               if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                  Count := Count + 1;
+                  Result := Result & (if Need_Comma then ", " else "") &
+                    "(" & Label & ", " &
+                    Elisp_Name_To_Ada (Params (Second + 1 .. Last - 1), 
Append_ID => False, Trim => 0) & ")";
 
-            Need_Comma := True;
+                  Need_Comma := True;
+               --  else skip
+               end if;
+            end;
          end loop;
-         if Count = 1 then
-            return " (Parse_Data, Tree, Nonterm, Tokens, (1 => " & (-Result) & 
"))";
-         else
-            return " (Parse_Data, Tree, Nonterm, Tokens, (" & (-Result) & "))";
-         end if;
+         Nonterm_Needed := True;
+         return " (Parse_Data, Tree, Nonterm, Tokens, " &
+           (case Count is
+            when 0 => "(1 .. 0 => (1, Motion)))",
+            when 1 => "(1 => " & (-Result) & "))",
+            when others =>  "(" & (-Result) & "))");
       end Statement_Params;
 
       function Containing_Params (Params : in String) return String
       is
          --  Input looks like: 1 2)
-         First  : constant Integer := Index_Non_Blank (Params);
-         Second : constant Integer := Index (Params, Blank_Set, First);
+         First        : constant Integer := Index_Non_Blank (Params);
+         Second       : constant Integer := Index (Params, Blank_Set, First);
+         First_Label  : constant String  := Params (First .. Second - 1);
+         Second_Label : constant String  := Params (Second + 1 .. Params'Last 
- 1);
       begin
-         return " (Parse_Data, Tree, Nonterm, Tokens, " &
-           Params (First .. Second - 1) & ',' & Params (Second .. Params'Last);
+         if (0 = Index (First_Label, Numeric, Outside) or else Label_Used 
(First_Label)) and
+           (0 = Index (Second_Label, Numeric, Outside) or else Label_Used 
(Second_Label))
+         then
+            Nonterm_Needed := True;
+            return " (Parse_Data, Tree, Nonterm, Tokens, " & First_Label & ", 
" & Second_Label & ")";
+         else
+            return "";
+         end if;
       end Containing_Params;
 
       function Motion_Params (Params : in String) return String
@@ -273,14 +347,27 @@ is
                   end;
                end loop;
 
-               Result := Result & (if Need_Comma_1 then " & " else "") & "(" &
-                 Params (Index_First .. Index_Last) & ", " &
-                 (if IDs_Count = 1 then "+" else "") & IDs & ")";
+               declare
+                  Label : constant String := Params (Index_First .. 
Index_Last);
+               begin
+                  if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                     Nonterm_Needed := True;
+                     Result := Result & (if Need_Comma_1 then " & " else "") & 
"(" &
+                       Label & ", " &
+                       (if IDs_Count = 1 then "+" else "") & IDs & ")";
+                  end if;
+               end;
             else
                First  := Index_Non_Blank (Params, Last);
                Last   := Index (Params, Delim, First);
-               Result := Result & (if Need_Comma_1 then " & " else "") &
-                 "(" & Params (First .. Last - 1) & ", Empty_IDs)";
+               declare
+                  Label : constant String := Params (First .. Last - 1);
+               begin
+                  if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                     Nonterm_Needed := True;
+                     Result := Result & (if Need_Comma_1 then " & " else "") & 
"(" & Label & ", Empty_IDs)";
+                  end if;
+               end;
             end if;
             Need_Comma_1 := True;
          end loop;
@@ -290,6 +377,8 @@ is
       function Face_Apply_Params (Params : in String) return String
       is
          --  Params is a vector of triples: [1 nil font-lock-keyword-face 3 
nil font-lock-function-name-face ...]
+         --  Each triple is <token_number> <prefix-face> <suffix-face>.
+         --  The token_number can be a label; faces are "nil" or an elisp name.
          --  Result: ((1, 3, 1), (3, 3, 2), ...)
          use Ada.Strings.Maps;
          Delim : constant Character_Set := To_Set ("]") or Blank_Set;
@@ -299,46 +388,55 @@ is
          Result     : Unbounded_String;
          Need_Comma : Boolean          := False;
          Count      : Integer          := 0;
-      begin
-         loop
-            Last := Index_Non_Blank (Params, Last + 1);
-
-            exit when Params (Last) = ']' or Params (Last) = ')';
-
-            Count  := Count + 1;
-            First  := Last;
-            Last   := Index (Params, Delim, First);
-            Result := Result & (if Need_Comma then ", (" else "(") & Params 
(First .. Last - 1);
 
+         procedure Elisp_Param (Skip : in Boolean)
+         is begin
             if Params (Last) = ']' then
                Put_Error
                  (Error_Message
                     (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"invalid wisi-face-apply argument"));
-               exit;
+               return;
             end if;
 
             First  := Index_Non_Blank (Params, Last + 1);
             Last   := Index (Params, Delim, First);
-            Result := Result & ',' & Integer'Image
-              (Find_Elisp_ID (Input_Data.Tokens.Faces, Params (First .. Last - 
1)));
-
-            if Params (Last) = ']' then
-               Put_Error
-                 (Error_Message
-                    (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"invalid wisi-face-apply argument"));
-               exit;
+            if not Skip then
+               Result := Result & ',' & Integer'Image
+                 (Find_Elisp_ID (Input_Data.Tokens.Faces, Params (First .. 
Last - 1)));
             end if;
+         end Elisp_Param;
 
-            First  := Index_Non_Blank (Params, Last + 1);
-            Last   := Index (Params, Delim, First);
-            Result := Result & ',' &
-              Integer'Image (Find_Elisp_ID (Input_Data.Tokens.Faces, Params 
(First .. Last - 1))) & ")";
+      begin
+         loop
+            Last := Index_Non_Blank (Params, Last + 1);
 
-            Need_Comma := True;
+            exit when Params (Last) = ']' or Params (Last) = ')';
+
+            First := Last;
+            Last  := Index (Params, Delim, First);
+            declare
+               Label : constant String := Params (First .. Last - 1);
+            begin
+               if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                  Count  := Count + 1;
+                  Result := Result & (if Need_Comma then ", (" else "(") & 
Label;
+                  Need_Comma := True;
+                  Elisp_Param (Skip => False);
+                  Elisp_Param (Skip => False);
+                  Result := Result  & ")";
+               else
+                  Elisp_Param (Skip => True);
+                  Elisp_Param (Skip => True);
+               end if;
+            end;
          end loop;
-         if Count = 1 then
+         if Count = 0 then
+            return "";
+         elsif Count = 1 then
+               Nonterm_Needed := True;
             return " (Parse_Data, Tree, Nonterm, Tokens, (1 => " & (-Result) & 
"))";
          else
+               Nonterm_Needed := True;
             return " (Parse_Data, Tree, Nonterm, Tokens, (" & (-Result) & "))";
          end if;
       exception
@@ -353,25 +451,36 @@ is
       function Face_Mark_Params (Params : in String) return String
       is
          --  Params is a vector of pairs: [1 prefix 3 suffix ...]
+         --  The token_number can be a label; faces are "nil" or an elisp name.
          --  Result: ((1, Prefix), (3, Suffix), ...)
          use Ada.Strings.Maps;
          Delim : constant Character_Set := To_Set ("]") or Blank_Set;
 
-         Last       : Integer          := Index_Non_Blank (Params); -- skip [
+         Last       : Integer := Index_Non_Blank (Params); -- skip [
          First      : Integer;
          Result     : Unbounded_String;
-         Need_Comma : Boolean          := False;
-         Count      : Integer          := 0;
+         Need_Comma : Boolean := False;
+         Count      : Integer := 0;
+         Skip       : Boolean;
       begin
          loop
             Last := Index_Non_Blank (Params, Last + 1);
 
             exit when Params (Last) = ']' or Params (Last) = ')';
 
-            Count  := Count + 1;
-            First  := Last;
-            Last   := Index (Params, Delim, First);
-            Result := Result & (if Need_Comma then ", (" else "(") & Params 
(First .. Last - 1);
+            First := Last;
+            Last  := Index (Params, Delim, First);
+            declare
+               Label : constant String := Params (First .. Last - 1);
+            begin
+               if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                  Count  := Count + 1;
+                  Skip   := False;
+                  Result := Result & (if Need_Comma then ", (" else "(") & 
Label;
+               else
+                  Skip := True;
+               end if;
+            end;
 
             if Params (Last) = ']' then
                Put_Error
@@ -382,15 +491,17 @@ is
 
             First  := Index_Non_Blank (Params, Last + 1);
             Last   := Index (Params, Delim, First);
-            Result := Result & ", " & Elisp_Name_To_Ada (Params (First .. Last 
- 1), False, 0) & ")";
-
-            Need_Comma := True;
+            if not Skip then
+               Result := Result & ", " & Elisp_Name_To_Ada (Params (First .. 
Last - 1), False, 0) & ")";
+               Need_Comma := True;
+            end if;
          end loop;
-         if Count = 1 then
-            return " (Parse_Data, Tree, Nonterm, Tokens, (1 => " & (-Result) & 
"))";
-         else
-            return " (Parse_Data, Tree, Nonterm, Tokens, (" & (-Result) & "))";
-         end if;
+         Nonterm_Needed := True;
+         return " (Parse_Data, Tree, Nonterm, Tokens, " &
+           (case Count is
+            when 0 => "(1 .. 0 => (1, Prefix))",
+            when 1 => "(1 => " & (-Result) & "))",
+            when others => "(" & (-Result) & "))");
       exception
       when E : others =>
          Put_Error
@@ -425,6 +536,7 @@ is
 
             Need_Comma := True;
          end loop;
+         Nonterm_Needed := True;
          if Count = 1 then
             return " (Parse_Data, Tree, Nonterm, Tokens, (1 => " & (-Result) & 
"))";
          else
@@ -447,11 +559,13 @@ is
          --
          --  - an integer; copy to output
          --
-         --  - a symbol; convert to Ada name syntax
+         --  - a symbol; convert to Ada name syntax, except 'nil' => None
          --
          --  - a lisp function call with arbitrary args; convert to 
Indent_Param type
          --
          --  - a vector with two elements [code_indent comment_indent]; 
convert to Indent_Pair.
+         --
+         --  - a cons of a token label with any of the above.
 
          use Ada.Strings.Maps;
          use Ada.Containers;
@@ -466,7 +580,7 @@ is
          Need_Comma    : Boolean         := False;
          Param_Count   : Count_Type      := 0;            -- in Params
 
-         function Indent_Label (Elisp_Name : in String) return String
+         function Indent_Function (Elisp_Name : in String) return String
          is begin
             if    Elisp_Name = "wisi-anchored"   then return "Anchored_0";
             elsif Elisp_Name = "wisi-anchored%"  then return "Anchored_1";
@@ -474,8 +588,9 @@ is
             elsif Elisp_Name = "wisi-anchored*"  then return "Anchored_3";
             elsif Elisp_Name = "wisi-anchored*-" then return "Anchored_4";
             elsif Elisp_Name = "wisi-hanging"    then return "Hanging_0";
-            elsif Elisp_Name = "wisi-hanging%"   then return "Hanging_1";
-            elsif Elisp_Name = "wisi-hanging%-"  then return "Hanging_2";
+            elsif Elisp_Name = "wisi-hanging-"   then return "Hanging_1";
+            elsif Elisp_Name = "wisi-hanging%"   then return "Hanging_2";
+            elsif Elisp_Name = "wisi-hanging%-"  then return "Hanging_3";
             else
                Put_Error
                  (Error_Message
@@ -483,7 +598,20 @@ is
                     Elisp_Name & "'"));
                return "";
             end if;
-         end Indent_Label;
+         end Indent_Function;
+
+         function Check_Cons return Integer
+         is
+            --  Params (Last) = '('; check for "(label .", return label'last
+            Blank : constant Integer := Index (Params, " ", Last);
+         begin
+            if Blank = 0 then return 0; end if;
+            if Params'Last > Blank + 1 and then Params (Blank + 1) = '.' then
+               return Blank - 1;
+            else
+               return 0;
+            end if;
+         end Check_Cons;
 
          function Ensure_Simple_Indent (Item : in String) return String
          is begin
@@ -494,6 +622,9 @@ is
                --  Anchored or Language
                return Item;
 
+            elsif Item = "nil" then
+               return "(Label => None)";
+
             else
                --  simple integer
                return "(Int, " & Item & ")";
@@ -507,6 +638,8 @@ is
             --
             --  Handles this syntax:
             --
+            --  nil => nil
+            --
             --  integer literal:
             --  2 => 2
             --  -1 => -1
@@ -599,7 +732,7 @@ is
 
                else
                   --  wisi lisp function call
-                  Function_Name := +Indent_Label (-Function_Name);
+                  Function_Name := +Indent_Function (-Function_Name);
                   if Length (Function_Name) = 0 then
                      --  not a recognized function
                      Last := 1 + Index (Params, ")", Last);
@@ -621,10 +754,15 @@ is
                end if;
 
             else
-               --  Assume it is a language-specific integer indent option, 
like "ada-indent",
-               --  declared in Language_Runtime_Package, which is use-visible.
+               --  Assume it is 'nil' or a language-specific integer indent 
option,
+               --  like "ada-indent", declared in Language_Runtime_Package, 
which is
+               --  use-visible.
                Last  := Index (Params, Delim, First);
-               return Elisp_Name_To_Ada (Params (First .. Last - 1), False, 0);
+               if Params (First .. Last - 1) = "nil" then
+                  return "nil";
+               else
+                  return Elisp_Name_To_Ada (Params (First .. Last - 1), False, 
0);
+               end if;
             end if;
          exception
          when E : others =>
@@ -634,6 +772,14 @@ is
             return "";
          end Expression;
 
+         procedure Skip_Expression (Param_First : in Integer)
+         is
+            Junk : constant String := Expression (Param_First);
+            pragma Unreferenced (Junk);
+         begin
+            null;
+         end Skip_Expression;
+
          function Ensure_Indent_Param (Item : in String) return String
          is begin
             --  Return an aggregate for Indent_Param. Item can be anything
@@ -649,56 +795,134 @@ is
                --  Anchored or Language
                return "(Simple, " & Item & ")";
 
+            elsif Item = "nil" then
+               return "(Simple, (Label => None))";
+
             else
                --  simple integer
                return "(Simple, (Int, " & Item & "))";
             end if;
          end Ensure_Indent_Param;
 
-      begin
-         loop
-            if Params (Last) /= ']' then
-               Last := Index_Non_Blank (Params, Last + 1);
-            end if;
-
-            exit when Params (Last) = ']';
-
-            if Need_Comma then
-               Result := Result & ", ";
-            else
-               Need_Comma := True;
-            end if;
-
+         procedure One_Param (Prefix : in Boolean := False; Skip : in Boolean 
:= False)
+         is
+            procedure Comma
+            is begin
+               if Need_Comma then
+                  if not Prefix then
+                     Result := Result & ", ";
+                  end if;
+               else
+                  Need_Comma := True;
+               end if;
+            end Comma;
+         begin
             case Params (Last) is
             when '(' =>
-               Result := Result & "(False, " & Ensure_Indent_Param (Expression 
(Last)) & ')';
+               --  cons or function
+               declare
+                  Label_Last : constant Integer := Check_Cons;
+               begin
+                  if Label_Last > 0 then
+                     declare
+                        Label : constant String := Params (Last + 1 .. 
Label_Last);
+                     begin
+                        Last := Index_Non_Blank (Params, Label_Last + 3);
+                        if Label_Used (Label) then
+                           Comma;
+                           Result := Result & Label & " => ";
+                           One_Param (Prefix => True);
+                        else
+                           --  This token is not present in this RHS; skip 
this param
+                           One_Param (Skip => True);
+                        end if;
+                        if Params (Last) /= ')' then
+                           Put_Error
+                             (Error_Message
+                                (Input_Data.Grammar_Lexer.File_Name,
+                                 RHS.Source_Line, "invalid indent syntax; 
missing ')'"));
+                        end if;
+                        Last := Last + 1;
+                     end;
+                  else
+                     if Skip then
+                        Skip_Expression (Last);
+                     else
+                        Comma;
+                        Result := Result & "(False, " & Ensure_Indent_Param 
(Expression (Last)) & ')';
+                     end if;
+                  end if;
+               end;
 
             when '[' =>
                --  vector
-               Result := Result & "(True, " & Ensure_Indent_Param (Expression 
(Last + 1));
-               Result := Result & ", " & Ensure_Indent_Param (Expression (Last 
+ 1)) & ')';
+               if Skip then
+                  Skip_Expression (Last + 1);
+                  Skip_Expression (Last + 1);
+               else
+                  Comma;
+                  Result := Result & "(True, " & Ensure_Indent_Param 
(Expression (Last + 1));
+                  Result := Result & ", " & Ensure_Indent_Param (Expression 
(Last + 1)) & ')';
+               end if;
                if Params (Last) /= ']' then
                   Put_Error
                     (Error_Message
-                       (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"invalid indent syntax"));
+                       (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"indent missing ']'"));
                end if;
                Last := Last + 1;
 
             when others =>
                --  integer or symbol
-               Result := Result & "(False, " & Ensure_Indent_Param (Expression 
(Last)) & ')';
-
+               if Skip then
+                  Skip_Expression (Last);
+               else
+                  Comma;
+                  Result := Result & "(False, " & Ensure_Indent_Param 
(Expression (Last)) & ')';
+               end if;
             end case;
+         end One_Param;
+
+      begin
+         loop
+            if Params (Last) /= ']' then
+               Last := Index_Non_Blank (Params, Last + 1);
+               if Last = 0 then
+                  Put_Error (Error_Message 
(Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, "indent missing ']'"));
+                  return -Result;
+               end if;
+            end if;
+
+            exit when Params (Last) = ']';
+
+            One_Param;
+
             Param_Count := Param_Count + 1;
          end loop;
 
+         --  In translated EBNF, token counts vary in each RHS; require each
+         --  parameter to be labeled if any are, both for catching errors, and
+         --  becase that would produce mixed positional and named association
+         --  in the Ada action subprogram.
          if Param_Count /= RHS.Tokens.Length then
-            Put_Error
-              (Error_Message
-                 (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, "indent 
parameters count of" & Count_Type'Image
-                    (Param_Count) & " /= production token count of" & 
Count_Type'Image (RHS.Tokens.Length)));
+            if Labels.Length = 0 then
+               Put_Error
+                 (Error_Message
+                    (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
Image (Prod_ID) &
+                       ": indent parameters count of" & Count_Type'Image 
(Param_Count) &
+                       " /= production token count of" & Count_Type'Image 
(RHS.Tokens.Length)));
+
+            elsif Count_Label_Needed /= RHS.Tokens.Length then
+               Put_Error
+                 (Error_Message
+                    (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
Image (Prod_ID) &
+                       ": indent parameter(s) not labeled"));
+            else
+               --  all parameters labeled
+               null;
+            end if;
          end if;
 
+         Nonterm_Needed := True;
          if Param_Count = 1 then
             Result := Prefix & "1 => " & Result;
          else
@@ -711,11 +935,29 @@ is
       function Merge_Names_Params (Params : in String) return String
       is
          --  Input looks like "1 2)"
-         First  : constant Integer := Index_Non_Blank (Params);
-         Second : constant Integer := Index (Params, Blank_Set, First);
+         First             : constant Integer := Index_Non_Blank (Params);
+         Second            : constant Integer := Index (Params, Blank_Set, 
First);
+         Label_First       : constant String  := Params (First .. Second - 1);
+         Label_Used_First  : constant Boolean := 0 = Index (Label_First, 
Numeric, Outside) or else
+           Label_Used (Label_First);
+         Label_Second      : constant String  := Params (Second + 1 .. 
Params'Last - 1);
+         Label_Used_Second : constant Boolean := 0 = Index (Label_Second, 
Numeric, Outside) or else
+           Label_Used (Label_Second);
       begin
-         return " (Nonterm, Tokens, " & Params (First .. Second - 1) & ',' &
-           Params (Second .. Params'Last);
+         Nonterm_Needed := True;
+
+         if Label_Used_First and Label_Used_Second then
+            return " (Nonterm, Tokens, " & Label_First & ", " & Label_Second & 
")";
+
+         elsif (not Label_Used_First) and Label_Used_Second then
+            --  A copied EBNF RHS; see subprograms.wy Name
+            return " (Nonterm, Tokens, " & Label_Second & ")";
+         else
+            Put_Error
+              (Error_Message
+                 (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"merge_names token label error"));
+            return " (Nonterm, Tokens)";
+         end if;
       end Merge_Names_Params;
 
       function Match_Names_Params (Params : in String) return String
@@ -732,7 +974,49 @@ is
             else "False") & ")";
       end Match_Names_Params;
 
-      procedure Translate_Line (Line : in String)
+      function Language_Action_Params (Params : in String; Action_Name : in 
String) return String
+      is
+         --  Input looks like: [1 2 ...])
+         Result      : Unbounded_String;
+         Need_Comma  : Boolean := False;
+         Param_Count : Integer := 0;
+         First       : Integer;
+         Last        : Integer := Params'First; --  '['
+      begin
+         loop
+            First := Index_Non_Blank (Params, Last + 1);
+            Last  := Index (Params, Space_Paren_Set, First);
+            declare
+               Label : constant String  := Params (First .. Last - 1);
+            begin
+               if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                  Param_Count := Param_Count + 1;
+                  if Need_Comma then
+                     Result := Result & ", ";
+                  else
+                     Need_Comma := True;
+                  end if;
+                  Result := Result & Label;
+               end if;
+               exit when Params (Last) = ']';
+               if Last = Params'Last then
+                  Put_Error
+                    (Error_Message
+                       (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
Action_Name & " missing ']'"));
+                  exit;
+               end if;
+            end;
+         end loop;
+         if Param_Count = 0 then
+            return "";
+         elsif Param_Count = 1 then
+            return "(1 => " & (-Result) & ")";
+         else
+            return "(" & (-Result) & ")";
+         end if;
+      end Language_Action_Params;
+
+      procedure Translate_Sexp (Line : in String)
       is
          Last       : constant Integer := Index (Line, Blank_Set);
          Elisp_Name : constant String  := Line (Line'First + 1 .. (if Last = 0 
then Line'Last else Last) - 1);
@@ -768,56 +1052,101 @@ is
          --  wisi action/check functions, in same order as typically used in
          --  .wy files; Navigate, Face, Indent, Check.
          if Elisp_Name = "wisi-statement-action" then
-            Navigate_Lines.Append
-              (Elisp_Name_To_Ada (Elisp_Name, False, 5) &
-                 Statement_Params (Line (Last + 1 .. Line'Last)) & ";");
+            declare
+               Params : constant String := Statement_Params (Line (Last + 1 .. 
Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Navigate_Lines.Append (Elisp_Name_To_Ada (Elisp_Name, False, 
5) & Params & ";");
+               end if;
+            end;
+
+         elsif Elisp_Name = "wisi-name-action" then
+            declare
+               First : constant Integer := Index_Non_Blank (Line, Last + 1);
+               Last  : constant Integer := Index (Line, Space_Paren_Set, 
First);
+               Label : constant String  := Line (First .. Last - 1);
+            begin
+               if 0 = Index (Label, Numeric, Outside) or else Label_Used 
(Label) then
+                  Nonterm_Needed := True;
+                  Navigate_Lines.Append
+                    ("Name_Action (Parse_Data, Tree, Nonterm, Tokens, " & Line 
(First .. Line'Last) & ";");
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-containing-action" then
-            Navigate_Lines.Append
-              (Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Containing_Params (Line (Last + 1 .. Line'Last)) & ";");
+            declare
+               Params : constant String := Containing_Params (Line (Last + 1 
.. Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Navigate_Lines.Append (Elisp_Name_To_Ada (Elisp_Name, False, 
Trim => 5) & Params & ";");
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-motion-action" then
-            Navigate_Lines.Append
-              (Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Motion_Params (Line (Last + 1 .. Line'Last)) & ";");
+            declare
+               Params : constant String := Motion_Params (Line (Last + 1 .. 
Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Navigate_Lines.Append (Elisp_Name_To_Ada (Elisp_Name, False, 
Trim => 5) & Params & ";");
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-face-apply-action" then
             Assert_Face_Empty;
-               Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Face_Apply_Params (Line (Last + 1 .. Line'Last)) & ";";
+            declare
+               Params : constant String := Face_Apply_Params (Line (Last + 1 
.. Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 
5) & Params & ";";
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-face-apply-list-action" then
             Assert_Face_Empty;
-               Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Face_Apply_Params (Line (Last + 1 .. Line'Last)) & ";";
+            declare
+               Params : constant String := Face_Apply_Params (Line (Last + 1 
.. Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 
5) & Params & ";";
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-face-mark-action" then
             Assert_Face_Empty;
-               Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Face_Mark_Params (Line (Last + 1 .. Line'Last)) & ";";
+            declare
+               Params : constant String := Face_Mark_Params (Line (Last + 1 .. 
Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 
5) & Params & ";";
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-face-remove-action" then
             Assert_Face_Empty;
-               Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 5) &
-                 Face_Remove_Params (Line (Last + 1 .. Line'Last)) & ";";
+            declare
+               Params : constant String := Face_Remove_Params (Line (Last + 1 
.. Line'Last));
+            begin
+               if Params'Length > 0 then
+                  Face_Line := +Elisp_Name_To_Ada (Elisp_Name, False, Trim => 
5) & Params & ";";
+               end if;
+            end;
 
          elsif Elisp_Name = "wisi-indent-action" then
             Assert_Indent_Empty;
-               Indent_Action_Line := +"Indent_Action_0" &
-                 Indent_Params (Line (Last + 1 .. Line'Last)) & ";";
+            Indent_Action_Line := +"Indent_Action_0" & Indent_Params (Line 
(Last + 1 .. Line'Last)) & ";";
 
          elsif Elisp_Name = "wisi-indent-action*" then
             Assert_Indent_Empty;
-               declare
-                  Temp : constant Integer := Index (Line, Blank_Set, Last + 1);
-               begin
-                  Indent_Action_Line := +"Indent_Action_1" &
-                    Indent_Params (Line (Temp + 1 .. Line'Last), Line (Last + 
1 .. Temp - 1) & ", ") & ";";
-               end;
+            declare
+               Temp : constant Integer := Index (Line, Blank_Set, Last + 1);
+            begin
+               Indent_Action_Line := +"Indent_Action_1" &
+                 Indent_Params (Line (Temp + 1 .. Line'Last), Line (Last + 1 
.. Temp - 1) & ", ") & ";";
+            end;
 
          elsif Elisp_Name = "wisi-propagate-name" then
             Assert_Check_Empty;
+            Nonterm_Needed := True;
             Check_Line := +"return " & Elisp_Name_To_Ada (Elisp_Name, False, 
Trim => 5) &
               " (Nonterm, Tokens, " & Line (Last + 1 .. Line'Last) & ";";
 
@@ -833,21 +1162,53 @@ is
 
          elsif Elisp_Name = "wisi-terminate-partial-parse" then
             Assert_Check_Empty;
+            Nonterm_Needed := True;
             Check_Line := +"return Terminate_Partial_Parse 
(Partial_Parse_Active, Partial_Parse_Byte_Goal, " &
               "Recover_Active, Nonterm);";
 
+         elsif Is_Present (Input_Data.Tokens.Actions, Elisp_Name) then
+            --  Language-specific action
+            declare
+               Item   : Elisp_Action_Type renames Input_Data.Tokens.Actions
+                 (Input_Data.Tokens.Actions.Find (+Elisp_Name));
+               Params : constant String := Language_Action_Params (Line (Last 
+ 1 .. Line'Last), Elisp_Name);
+               Code   : constant String := -Item.Ada_Name &
+                 " (Wisi.Parse_Data_Type'Class (User_Data), Tree, Tokens, " & 
Params & ");";
+            begin
+               if Params'Length > 0 then
+                  if "navigate" = -Item.Action_Label then
+                     Navigate_Lines.Append (Code);
+
+                  elsif "face" = -Item.Action_Label then
+                     Assert_Face_Empty;
+                     Face_Line := +Code;
+
+                  elsif "indent" = -Item.Action_Label then
+                     Assert_Indent_Empty;
+                     Indent_Action_Line := +Code;
+
+                  else
+                     Put_Error
+                       (Error_Message
+                          (Input_Data.Grammar_Lexer.File_Name, 
RHS.Source_Line, "unrecognized action label: '" &
+                             (-Item.Action_Label) & "'"));
+                  end if;
+
+                  --  else skip
+               end if;
+            end;
          else
             Put_Error
               (Error_Message
                  (Input_Data.Grammar_Lexer.File_Name, RHS.Source_Line, 
"unrecognized elisp action: '" &
                     Elisp_Name & "'"));
          end if;
-      end Translate_Line;
+      end Translate_Sexp;
 
    begin
       for Sexp of Sexps loop
          begin
-            Translate_Line (Sexp);
+            Translate_Sexp (Sexp);
          exception
          when E : Not_Found =>
             Put_Error
@@ -869,22 +1230,45 @@ is
             Unref_Nonterm : constant Boolean := 0 = Index (Check_Line, 
"Nonterm");
             Unref_Tokens  : constant Boolean := 0 = Index (Check_Line, 
"Tokens");
             Unref_Recover : constant Boolean := 0 = Index (Check_Line, 
"Recover_Active");
+            Need_Comma    : Boolean          := False;
          begin
-            if Unref_Lexer or Unref_Nonterm or Unref_Tokens or Unref_Recover 
then
+            if Unref_Lexer or Unref_Nonterm or Unref_Tokens or Unref_Recover or
+              (for some I of Label_Needed => I)
+            then
                Indent_Line ("is");
-               if Unref_Lexer then
-                  Indent_Line ("   pragma Unreferenced (Lexer);");
-               end if;
-               if Unref_Nonterm then
-                  Indent_Line ("   pragma Unreferenced (Nonterm);");
-               end if;
-               if Unref_Tokens then
-                  Indent_Line ("   pragma Unreferenced (Tokens);");
-               end if;
-               if Unref_Recover then
-                  Indent_Line ("   pragma Unreferenced (Recover_Active);");
+
+               Indent := Indent + 3;
+               if Unref_Lexer or Unref_Nonterm or Unref_Tokens or 
Unref_Recover then
+                  Indent_Start ("pragma Unreferenced (");
+
+                  if Unref_Lexer then
+                     Put ((if Need_Comma then ", " else "") & "Lexer");
+                     Need_Comma := True;
+                  end if;
+                  if Unref_Nonterm then
+                     Put ((if Need_Comma then ", " else "") & "Nonterm");
+                     Need_Comma := True;
+                  end if;
+                  if Unref_Tokens then
+                     Put ((if Need_Comma then ", " else "") & "Tokens");
+                     Need_Comma := True;
+                  end if;
+                  if Unref_Recover then
+                     Put ((if Need_Comma then ", " else "") & 
"Recover_Active");
+                     Need_Comma := True;
+                  end if;
+                  Put_Line (");");
                end if;
 
+               for I in Label_Needed'Range loop
+                  if Label_Needed (I) then
+                     Indent_Line
+                       (-Labels (I) & " : constant SAL.Peek_Type :=" &
+                          SAL.Peek_Type'Image (Find_Token_Index (I)) & ";");
+                  end if;
+               end loop;
+               Indent := Indent - 3;
+
                Indent_Line ("begin");
             else
                Indent_Line ("is begin");
@@ -900,8 +1284,24 @@ is
          Indent_Line ("  Nonterm   : in     
WisiToken.Syntax_Trees.Valid_Node_Index;");
          Indent_Line ("  Tokens    : in     
WisiToken.Syntax_Trees.Valid_Node_Index_Array)");
          Indent_Line ("is");
-         Indent_Start ("   Parse_Data : Wisi.Parse_Data_Type renames");
-         Put_Line (" Wisi.Parse_Data_Type (User_Data);");
+
+         Indent := Indent + 3;
+         Indent_Line ("Parse_Data : Wisi.Parse_Data_Type renames 
Wisi.Parse_Data_Type (User_Data);");
+
+         if not Nonterm_Needed then
+            --  Language_Action may not use this
+            Indent_Line ("pragma Unreferenced (Nonterm);");
+         end if;
+
+         for I in Label_Needed'Range loop
+            if Label_Needed (I) then
+               Indent_Line
+                 (-Labels (I) & " : constant SAL.Peek_Type :=" &
+                    SAL.Peek_Type'Image (Find_Token_Index (I)) & ";");
+            end if;
+         end loop;
+
+         Indent := Indent - 3;
          Indent_Line ("begin");
          Indent := Indent + 3;
 
@@ -965,6 +1365,7 @@ is
    procedure Create_Ada_Actions_Body
      (Action_Names : not null access WisiToken.Names_Array_Array;
       Check_Names  : not null access WisiToken.Names_Array_Array;
+      Label_Count  : in              Ada.Containers.Count_Type;
       Package_Name : in              String)
    is
       use Ada.Strings.Unbounded;
@@ -989,10 +1390,21 @@ is
       Put_Raw_Code (Ada_Comment, Input_Data.Raw_Code (Copyright_License));
       New_Line;
 
+      if Label_Count > 0 then
+         Put_Line ("with SAL;");
+      end if;
+
       Put_Line ("with Wisi; use Wisi;");
-      if Input_Data.Language_Params.Language_Runtime then
-         Put_Line ("with " & Language_Runtime_Package & "; use " & 
Language_Runtime_Package & ";");
-         --  For language-specific names in actions, checks.
+      if Input_Data.Language_Params.Use_Language_Runtime then
+         declare
+            Pkg : constant String :=
+              (if -Input_Data.Language_Params.Language_Runtime_Name = ""
+               then Default_Language_Runtime_Package
+               else -Input_Data.Language_Params.Language_Runtime_Name);
+         begin
+            --  For language-specific names in actions, checks.
+            Put_Line ("with " & Pkg & "; use " & Pkg & ";");
+         end;
       end if;
 
       case Common_Data.Interface_Kind is
@@ -1023,26 +1435,26 @@ is
          --  No need for a Token_Cursor here, since we only need the
          --  nonterminals.
          declare
-            LHS_ID     : constant WisiToken.Token_ID := Find_Token_ID 
(Generate_Data, -Rule.Left_Hand_Side);
-            Prod_Index : Integer                     := 0; -- Semantic_Action 
defines Prod_Index as zero-origin
+            LHS_ID    : constant WisiToken.Token_ID := Find_Token_ID 
(Generate_Data, -Rule.Left_Hand_Side);
+            RHS_Index : Integer                     := 0; -- Semantic_Action 
defines RHS_Index as zero-origin
          begin
             for RHS of Rule.Right_Hand_Sides loop
                if Length (RHS.Action) > 0 then
                   declare
-                     Name : constant String := Action_Names 
(LHS_ID)(Prod_Index).all;
+                     Name : constant String := Action_Names 
(LHS_ID)(RHS_Index).all;
                   begin
-                     Create_Ada_Action (Name, RHS, RHS.Action, Check => False);
+                     Create_Ada_Action (Name, RHS, (LHS_ID, RHS_Index), 
RHS.Action, Rule.Labels, Check => False);
                   end;
                end if;
 
                if Length (RHS.Check) > 0 then
                   declare
-                     Name : constant String := Check_Names 
(LHS_ID)(Prod_Index).all;
+                     Name : constant String := Check_Names 
(LHS_ID)(RHS_Index).all;
                   begin
-                     Create_Ada_Action (Name, RHS, RHS.Check, Check => True);
+                     Create_Ada_Action (Name, RHS, (LHS_ID, RHS_Index), 
RHS.Check, Rule.Labels, Check => True);
                   end;
                end if;
-               Prod_Index := Prod_Index + 1;
+               RHS_Index := RHS_Index + 1;
             end loop;
          end;
       end loop;
@@ -1070,7 +1482,9 @@ is
       Put_Raw_Code (Ada_Comment, Input_Data.Raw_Code (Copyright_License));
       New_Line;
 
-      Put_Line ("with " & Actions_Package_Name & "; use " & 
Actions_Package_Name & ";");
+      if Input_Data.Action_Count > 0 or Input_Data.Check_Count > 0 then
+         Put_Line ("with " & Actions_Package_Name & "; use " & 
Actions_Package_Name & ";");
+      end if;
 
       case Common_Data.Lexer is
       when None | Elisp_Lexer =>
@@ -1084,9 +1498,7 @@ is
 
       case Common_Data.Generate_Algorithm is
       when LR_Generate_Algorithm =>
-         if Tuple.Text_Rep then
-            Put_Line ("with WisiToken.Productions;");
-         end if;
+         null;
 
       when Packrat_Generate_Algorithm =>
          Put_Line ("with WisiToken.Parse;");
@@ -1232,6 +1644,19 @@ is
       Output_Elisp_Common.Indent_Name_Table
         (Output_File_Name_Root, "process-face-table", Input_Data.Tokens.Faces);
 
+      --  We need the elisp lexer for some operations
+      if Elisp_Tokens.Keywords.Length > 0 then
+         New_Line;
+         Output_Elisp_Common.Indent_Keyword_Table
+           (Output_File_Name_Root, "elisp", Elisp_Tokens.Keywords, 
Ada.Strings.Unbounded.To_String'Access);
+      end if;
+      if Elisp_Tokens.Tokens.Length > 0 then
+         New_Line;
+         Output_Elisp_Common.Indent_Token_Table
+           (Output_File_Name_Root, "elisp", Elisp_Tokens.Tokens, 
Ada.Strings.Unbounded.To_String'Access);
+      end if;
+
+      New_Line;
       Put_Line ("(provide '" & Output_File_Name_Root & "-process)");
       Set_Output (Standard_Output);
       Close (File);
@@ -1467,7 +1892,11 @@ begin
          when Module  => "_Module") &
         Gen_Alg_Name & "_Main";
    begin
-      Create_Ada_Actions_Body (Generate_Data.Action_Names, 
Generate_Data.Check_Names, Actions_Package_Name);
+      if Input_Data.Action_Count > 0 or Input_Data.Check_Count > 0 then
+         --  We typically have no actions when just getting started with a new 
language.
+         Create_Ada_Actions_Body
+           (Generate_Data.Action_Names, Generate_Data.Check_Names, 
Input_Data.Label_Count, Actions_Package_Name);
+      end if;
 
       Create_Ada_Actions_Spec
         (Output_File_Name => Output_File_Name_Root &
diff --git a/packages/wisi/wisitoken-bnf-output_elisp.adb 
b/packages/wisi/wisitoken-bnf-output_elisp.adb
index 8007bd2..ff52449 100644
--- a/packages/wisi/wisitoken-bnf-output_elisp.adb
+++ b/packages/wisi/wisitoken-bnf-output_elisp.adb
@@ -2,7 +2,7 @@
 --
 --  Output Elisp code implementing the grammar defined by the parameters.
 --
---  Copyright (C) 2012 - 2015, 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2012 - 2015, 2017 - 2019 Free Software Foundation, Inc.
 --
 --  The WisiToken package is free software; you can redistribute it
 --  and/or modify it under terms of the GNU General Public License as
@@ -216,7 +216,7 @@ is
          for RHS of Rule.Right_Hand_Sides loop
             Put ("       ((");
             for Token of RHS.Tokens loop
-               Put (Token & " ");
+               Put (-Token.Identifier & " ");
             end loop;
             if Length (RHS.Action) = 0 then
                Put (")");
diff --git a/packages/wisi/wisitoken-bnf-output_elisp_common.adb 
b/packages/wisi/wisitoken-bnf-output_elisp_common.adb
index 9d46b4f..a0b7158 100644
--- a/packages/wisi/wisitoken-bnf-output_elisp_common.adb
+++ b/packages/wisi/wisitoken-bnf-output_elisp_common.adb
@@ -2,7 +2,7 @@
 --
 --  See spec
 --
---  Copyright (C) 2012, 2013, 2015, 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2012, 2013, 2015, 2017 - 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -87,6 +87,20 @@ package body WisiToken.BNF.Output_Elisp_Common is
       use Ada.Strings.Unbounded;
       use Ada.Text_IO;
       use WisiToken.Generate;
+
+      function To_Double_Quotes (Item : in String) return String
+      is
+         Result : String := Item;
+      begin
+         if Result (Result'First) = ''' then
+            Result (Result'First) := '"';
+         end if;
+         if Result (Result'Last) = ''' then
+            Result (Result'Last) := '"';
+         end if;
+         return Result;
+      end To_Double_Quotes;
+
    begin
       Indent_Line ("(defconst " & Output_File_Root & "-" & Label & 
"-token-table-raw");
       Indent_Line ("  '(");
@@ -111,7 +125,7 @@ package body WisiToken.BNF.Output_Elisp_Common is
                      --  value not used by elisp
                      Indent_Line ("(" & Image (Token.Name) & " . """")");
                   else
-                     Indent_Line ("(" & Image (Token.Name) & " . " & 
(-Token.Value) & ")");
+                     Indent_Line ("(" & Image (Token.Name) & " . " & 
To_Double_Quotes (-Token.Value) & ")");
                   end if;
                end if;
             end loop;
@@ -139,7 +153,6 @@ package body WisiToken.BNF.Output_Elisp_Common is
       end loop;
       Indent_Line ("])");
       Indent := Indent - 3;
-      New_Line;
    end Indent_Name_Table;
 
 end WisiToken.BNF.Output_Elisp_Common;
diff --git a/packages/wisi/wisitoken-bnf.adb b/packages/wisi/wisitoken-bnf.adb
index 22492f0..dc37d56 100644
--- a/packages/wisi/wisitoken-bnf.adb
+++ b/packages/wisi/wisitoken-bnf.adb
@@ -2,7 +2,7 @@
 --
 --  see spec
 --
---  Copyright (C) 2012 - 2015, 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2012 - 2015, 2017 - 2019 Free Software Foundation, Inc.
 --
 --  This program is free software; you can redistribute it and/or
 --  modify it under terms of the GNU General Public License as
@@ -39,6 +39,16 @@ package body WisiToken.BNF is
       Free (Prev);
    end Add;
 
+   function To_Generate_Algorithm (Item : in String) return Generate_Algorithm
+   is begin
+      for I in Generate_Algorithm loop
+         if To_Lower (Generate_Algorithm_Image (I).all) = To_Lower (Item) then
+            return I;
+         end if;
+      end loop;
+      raise User_Error with "invalid generate algorithm name: '" & Item & "'";
+   end To_Generate_Algorithm;
+
    function To_Output_Language (Item : in String) return Output_Language
    is begin
       for I in Output_Language loop
@@ -176,6 +186,13 @@ package body WisiToken.BNF is
       raise Not_Found;
    end Value;
 
+   function Is_Present (List : in Elisp_Action_Maps.Map; Name : in String) 
return Boolean
+   is
+      use Elisp_Action_Maps;
+   begin
+      return No_Element /= List.Find (+Name);
+   end Is_Present;
+
    function Count (Tokens : in Token_Lists.List) return Integer
    is
       Result : Integer := 0;
diff --git a/packages/wisi/wisitoken-bnf.ads b/packages/wisi/wisitoken-bnf.ads
index 3d46c45..3532de7 100644
--- a/packages/wisi/wisitoken-bnf.ads
+++ b/packages/wisi/wisitoken-bnf.ads
@@ -32,9 +32,11 @@ pragma License (Modified_GPL);
 with Ada.Characters.Handling;
 with Ada.Containers.Doubly_Linked_Lists;
 with Ada.Containers.Indefinite_Doubly_Linked_Lists;
+with Ada.Containers.Ordered_Maps;
+with Ada.Containers.Vectors;
 with Ada.Strings.Unbounded;
 with Ada.Unchecked_Deallocation;
-with WisiToken;
+with WisiToken.Parse.LR;
 package WisiToken.BNF is
 
    --  See also WisiToken exceptions
@@ -47,14 +49,18 @@ package WisiToken.BNF is
    subtype LR_Generate_Algorithm is Generate_Algorithm range LALR .. LR1;
    subtype Packrat_Generate_Algorithm is Generate_Algorithm range Packrat_Gen 
.. Packrat_Proc;
 
-   Generate_Algorithm_Image : constant array (Valid_Generate_Algorithm) of 
access constant String :=
-     (LALR         => new String'("LALR"),
+   Generate_Algorithm_Image : constant array (Generate_Algorithm) of 
String_Access_Constant :=
+     (None         => new String'("None"),
+      LALR         => new String'("LALR"),
       LR1          => new String'("LR1"),
       Packrat_Gen  => new String'("Packrat_Gen"),
       Packrat_Proc => new String'("Packrat_Proc"),
       External     => new String'("External"));
    --  Suitable for Ada package names.
 
+   function To_Generate_Algorithm (Item : in String) return Generate_Algorithm;
+   --  Raises User_Error for invalid Item
+
    type Generate_Algorithm_Set is array (Generate_Algorithm) of Boolean;
    type Generate_Algorithm_Set_Access is access Generate_Algorithm_Set;
 
@@ -63,7 +69,7 @@ package WisiToken.BNF is
    --  _Lang to avoid colliding with the standard package Ada and
    --  WisiToken packages named *.Ada. In the grammar file, they
    --  are named by (case insensitive):
-   Output_Language_Image : constant array (Output_Language) of access constant 
String :=
+   Output_Language_Image : constant array (Output_Language) of 
String_Access_Constant :=
      (Ada_Lang       => new String'("Ada"),
       Ada_Emacs_Lang => new String'("Ada_Emacs"),
       Elisp_Lang     => new String'("elisp"));
@@ -76,7 +82,7 @@ package WisiToken.BNF is
    --  We append "_Lexer" to these names to avoid colliding with the
    --  similarly-named WisiToken packages. In the grammar file, they
    --  are named by:
-   Lexer_Image : constant array (Lexer_Type) of access constant String :=
+   Lexer_Image : constant array (Lexer_Type) of String_Access_Constant :=
      (None        => new String'("none"),
       Elisp_Lexer => new String'("elisp"),
       re2c_Lexer  => new String'("re2c"));
@@ -93,11 +99,11 @@ package WisiToken.BNF is
    subtype Valid_Interface is Interface_Type range Process .. Module;
 
    type Generate_Tuple is record
-      Gen_Alg        : Valid_Generate_Algorithm;
-      Out_Lang       : Output_Language;
-      Lexer          : Lexer_Type     := None;
-      Interface_Kind : Interface_Type := None;
-      Text_Rep       : Boolean        := False;
+      Gen_Alg        : Generate_Algorithm := None;
+      Out_Lang       : Output_Language    := Ada_Lang;
+      Lexer          : Lexer_Type         := None;
+      Interface_Kind : Interface_Type     := None;
+      Text_Rep       : Boolean            := False;
    end record;
 
    type Generate_Set is array (Natural range <>) of Generate_Tuple;
@@ -110,16 +116,21 @@ package WisiToken.BNF is
 
    package String_Lists is new Ada.Containers.Indefinite_Doubly_Linked_Lists 
(String);
 
+   package String_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (WisiToken.Identifier_Index, Ada.Strings.Unbounded.Unbounded_String,
+      Default_Element => Ada.Strings.Unbounded.Null_Unbounded_String);
+
    type Language_Param_Type is record
       --  Set by grammar file declarations or command line options. Error
       --  recover parameters are in McKenzie_Recover_Param_Type below.
-      Case_Insensitive              : Boolean := False;
-      Embedded_Quote_Escape_Doubled : Boolean := False;
-      End_Names_Optional_Option     : Ada.Strings.Unbounded.Unbounded_String;
-      Language_Runtime              : Boolean := True;
-      Declare_Enums                 : Boolean := True;
-      Error_Recover                 : Boolean := False;
-      Start_Token                   : Ada.Strings.Unbounded.Unbounded_String;
+      Case_Insensitive          : Boolean := False;
+      End_Names_Optional_Option : Ada.Strings.Unbounded.Unbounded_String;
+      Use_Language_Runtime      : Boolean := True;
+      Language_Runtime_Name     : Ada.Strings.Unbounded.Unbounded_String;
+      Declare_Enums             : Boolean := True;
+      Error_Recover             : Boolean := False;
+      Start_Token               : Ada.Strings.Unbounded.Unbounded_String;
+      Partial_Recursion         : Boolean := False;
    end record;
 
    type Raw_Code_Location is
@@ -174,26 +185,46 @@ package WisiToken.BNF is
    end record;
 
    package String_Pair_Lists is new Ada.Containers.Doubly_Linked_Lists 
(String_Pair_Type);
-
    function Is_Present (List : in String_Pair_Lists.List; Name : in String) 
return Boolean;
    function Value (List : in String_Pair_Lists.List; Name : in String) return 
String;
 
+   type Elisp_Action_Type is record
+      --  Elisp name is the key
+      Action_Label : Ada.Strings.Unbounded.Unbounded_String;
+      Ada_Name     : Ada.Strings.Unbounded.Unbounded_String;
+   end record;
+
+   package Elisp_Action_Maps is new Ada.Containers.Ordered_Maps
+     (Ada.Strings.Unbounded.Unbounded_String, Elisp_Action_Type, 
Ada.Strings.Unbounded."<");
+
+   function Is_Present (List : in Elisp_Action_Maps.Map; Name : in String) 
return Boolean;
+
    type McKenzie_Recover_Param_Type is record
       Source_Line : WisiToken.Line_Number_Type := 
WisiToken.Invalid_Line_Number;
       --  Of the %mckenzie_cost_default declaration; we assume the others
       --  are near.
 
-      Default_Insert          : Natural               := 0;
-      Default_Delete_Terminal : Natural               := 0;
-      Default_Push_Back       : Natural               := 0;
-      Delete                  : String_Pair_Lists.List;
-      Insert                  : String_Pair_Lists.List;
-      Push_Back               : String_Pair_Lists.List;
-      Ignore_Check_Fail       : Natural               := 0;
-      Cost_Limit              : Natural               := Integer'Last;
-      Check_Limit             : WisiToken.Token_Index := 
WisiToken.Token_Index'Last;
-      Check_Delta_Limit       : Natural               := Integer'Last;
-      Enqueue_Limit           : Natural               := Integer'Last;
+      Default_Insert              : Natural               := 0;
+      Default_Delete_Terminal     : Natural               := 0;
+      Default_Push_Back           : Natural               := 0; -- also 
default for undo_reduce
+      Delete                      : String_Pair_Lists.List;
+      Insert                      : String_Pair_Lists.List;
+      Push_Back                   : String_Pair_Lists.List;
+      Undo_Reduce                 : String_Pair_Lists.List;
+      Minimal_Complete_Cost_Delta : Integer               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Minimal_Complete_Cost_Delta;
+      Fast_Forward                : Integer               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Fast_Forward;
+      Matching_Begin              : Integer               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Matching_Begin;
+      Ignore_Check_Fail           : Natural               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Ignore_Check_Fail;
+      Check_Limit                 : WisiToken.Token_Index :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Check_Limit;
+      Check_Delta_Limit           : Natural               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Check_Delta_Limit;
+      Enqueue_Limit               : Natural               :=
+        WisiToken.Parse.LR.Default_McKenzie_Param.Enqueue_Limit;
    end record;
 
    type Token_Kind_Type is record
@@ -231,8 +262,17 @@ package WisiToken.BNF is
 
    package Conflict_Lists is new Ada.Containers.Doubly_Linked_Lists (Conflict);
 
+   type Labeled_Token is record
+      Label      : Ada.Strings.Unbounded.Unbounded_String;
+      Identifier : Ada.Strings.Unbounded.Unbounded_String;
+   end record;
+
+   package Labeled_Token_Arrays is new Ada.Containers.Vectors 
(Positive_Index_Type, Labeled_Token);
+   --  Index matches Syntax_Trees.Valid_Node_Index_Array, used for Tokens
+   --  in call to post parse grammar action.
+
    type RHS_Type is record
-      Tokens      : String_Lists.List;
+      Tokens      : Labeled_Token_Arrays.Vector;
       Action      : Ada.Strings.Unbounded.Unbounded_String;
       Check       : Ada.Strings.Unbounded.Unbounded_String;
       Source_Line : WisiToken.Line_Number_Type := 
WisiToken.Invalid_Line_Number;
@@ -242,6 +282,7 @@ package WisiToken.BNF is
    type Rule_Type is record
       Left_Hand_Side   : aliased Ada.Strings.Unbounded.Unbounded_String;
       Right_Hand_Sides : RHS_Lists.List;
+      Labels           : String_Arrays.Vector;
       Source_Line      : WisiToken.Line_Number_Type;
    end record;
 
@@ -257,13 +298,18 @@ package WisiToken.BNF is
       --  Rules included here because they define the nonterminal tokens, as
       --  well as the productions.
 
-      --  The following are specified in grammar file declarations and used in 
other declarations
-      --  or actions. Faces, Indents only used if .wy action language is
-      --  elisp and output language is not elisp.
+      Virtual_Identifiers : String_Arrays.Vector;
+      --  Nonterminals and terminals introduced by translating from EBNF to
+      --  BNF.
+
+      --  The following are specified in grammar file declarations and used
+      --  in other declarations or actions. Faces, Indents only used if .wy
+      --  action language is elisp and output language is not elisp.
 
       re2c_Regexps : String_Pair_Lists.List; -- %re2c_regexp
       Faces        : String_Lists.List;      -- %elisp_face
       Indents      : String_Pair_Lists.List; -- %elisp_indent
+      Actions      : Elisp_Action_Maps.Map;  -- %elisp_action
    end record;
 
    function "+" (Item : in String) return 
Ada.Strings.Unbounded.Unbounded_String
diff --git a/packages/wisi/wisitoken-gen_token_enum.ads 
b/packages/wisi/wisitoken-gen_token_enum.ads
index 36fca14..05bdb99 100644
--- a/packages/wisi/wisitoken-gen_token_enum.ads
+++ b/packages/wisi/wisitoken-gen_token_enum.ads
@@ -43,44 +43,36 @@ package WisiToken.Gen_Token_Enum is
    subtype Nonterminal_Enum_ID is Token_Enum_ID range First_Nonterminal .. 
Last_Nonterminal;
 
    LR1_Descriptor : aliased WisiToken.Descriptor :=
-     (First_Terminal                => +First_Terminal,
-      Last_Terminal                 => +Last_Terminal,
-      First_Nonterminal             => +First_Nonterminal,
-      Last_Nonterminal              => +Last_Nonterminal,
-      EOI_ID                        => +EOF_ID,
-      Accept_ID                     => +Accept_ID,
-      Case_Insensitive              => Case_Insensitive,
-      New_Line_ID                   => Invalid_Token_ID,
-      Comment_ID                    => Invalid_Token_ID,
-      Left_Paren_ID                 => Invalid_Token_ID,
-      Right_Paren_ID                => Invalid_Token_ID,
-      String_1_ID                   => Invalid_Token_ID,
-      String_2_ID                   => Invalid_Token_ID,
-      Embedded_Quote_Escape_Doubled => False,
-      Image                         => (others => null), --  set in body 
elaboration time code
-      Terminal_Image_Width          => Terminal_Enum_ID'Width,
-      Image_Width                   => Token_Enum_ID'Width,
-      Last_Lookahead                => +Last_Terminal);
+     (First_Terminal       => +First_Terminal,
+      Last_Terminal        => +Last_Terminal,
+      First_Nonterminal    => +First_Nonterminal,
+      Last_Nonterminal     => +Last_Nonterminal,
+      EOI_ID               => +EOF_ID,
+      Accept_ID            => +Accept_ID,
+      Case_Insensitive     => Case_Insensitive,
+      New_Line_ID          => Invalid_Token_ID,
+      String_1_ID          => Invalid_Token_ID,
+      String_2_ID          => Invalid_Token_ID,
+      Image                => (others => null), --  set in body elaboration 
time code
+      Terminal_Image_Width => Terminal_Enum_ID'Width,
+      Image_Width          => Token_Enum_ID'Width,
+      Last_Lookahead       => +Last_Terminal);
 
    LALR_Descriptor : aliased WisiToken.Descriptor :=
-     (First_Terminal                => +First_Terminal,
-      Last_Terminal                 => +Last_Terminal,
-      First_Nonterminal             => +First_Nonterminal,
-      Last_Nonterminal              => +Last_Nonterminal,
-      EOI_ID                        => +EOF_ID,
-      Accept_ID                     => +Accept_ID,
-      Case_Insensitive              => Case_Insensitive,
-      New_Line_ID                   => Invalid_Token_ID,
-      Comment_ID                    => Invalid_Token_ID,
-      Left_Paren_ID                 => Invalid_Token_ID,
-      Right_Paren_ID                => Invalid_Token_ID,
-      String_1_ID                   => Invalid_Token_ID,
-      String_2_ID                   => Invalid_Token_ID,
-      Embedded_Quote_Escape_Doubled => False,
-      Image                         => (others => null),
-      Terminal_Image_Width          => Terminal_Enum_ID'Width,
-      Image_Width                   => Token_Enum_ID'Width,
-      Last_Lookahead                => +First_Nonterminal);
+     (First_Terminal       => +First_Terminal,
+      Last_Terminal        => +Last_Terminal,
+      First_Nonterminal    => +First_Nonterminal,
+      Last_Nonterminal     => +Last_Nonterminal,
+      EOI_ID               => +EOF_ID,
+      Accept_ID            => +Accept_ID,
+      Case_Insensitive     => Case_Insensitive,
+      New_Line_ID          => Invalid_Token_ID,
+      String_1_ID          => Invalid_Token_ID,
+      String_2_ID          => Invalid_Token_ID,
+      Image                => (others => null),
+      Terminal_Image_Width => Terminal_Enum_ID'Width,
+      Image_Width          => Token_Enum_ID'Width,
+      Last_Lookahead       => +First_Nonterminal);
 
    type Enum_Syntax is array (Token_Enum_ID range Token_Enum_ID'First .. 
Last_Terminal) of
      WisiToken.Lexer.Regexp.Syntax_Item;
diff --git a/packages/wisi/wisitoken-generate-lr-lalr_generate.adb 
b/packages/wisi/wisitoken-generate-lr-lalr_generate.adb
index 2a1f403..f55c822 100644
--- a/packages/wisi/wisitoken-generate-lr-lalr_generate.adb
+++ b/packages/wisi/wisitoken-generate-lr-lalr_generate.adb
@@ -1,597 +1,610 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under terms of the GNU General Public License as
---  published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. This library is distributed in
---  the hope that it will be useful, but WITHOUT ANY WARRANTY; without
---  even the implied warranty of MERCHAN- TABILITY or FITNESS FOR A
---  PARTICULAR PURPOSE.
---
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Containers;
-with Ada.Text_IO;
-with SAL.Gen_Definite_Doubly_Linked_Lists;
-package body WisiToken.Generate.LR.LALR_Generate is
-
-   package Item_List_Cursor_Lists is new SAL.Gen_Definite_Doubly_Linked_Lists 
(LR1_Items.Item_Lists.Cursor);
-
-   type Item_Map is record
-      --  Keep track of all copies of Item, so Lookaheads can be updated
-      --  after they are initially copied.
-      From : LR1_Items.Item_Lists.Cursor;
-      To   : Item_List_Cursor_Lists.List;
-   end record;
-
-   package Item_Map_Lists is new SAL.Gen_Definite_Doubly_Linked_Lists 
(Item_Map);
-   --  IMPROVEME: should be a 3D array indexed by Prod, rhs_index,
-   --  dot_index. But it's not broken or slow, so we're not fixing it.
-
-   function Propagate_Lookahead (Descriptor : in WisiToken.Descriptor) return 
access LR1_Items.Lookahead
-   is begin
-      return new Token_ID_Set'(LR1_Items.To_Lookahead 
(Descriptor.Last_Lookahead, Descriptor));
-   end Propagate_Lookahead;
-
-   function Null_Lookahead (Descriptor : in WisiToken.Descriptor) return 
access LR1_Items.Lookahead
-   is begin
-      return new Token_ID_Set'(Descriptor.First_Terminal .. 
Descriptor.Last_Lookahead => False);
-   end Null_Lookahead;
-
-   ----------
-   --  Debug output
-
-   procedure Put
-     (Grammar      : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor   : in WisiToken.Descriptor;
-      Propagations : in Item_Map_Lists.List)
-   is
-      use LR1_Items.Item_Lists;
-   begin
-      for Map of Propagations loop
-         Ada.Text_IO.Put ("From ");
-         LR1_Items.Put (Grammar, Descriptor, Constant_Ref (Map.From), 
Show_Lookaheads => True);
-         Ada.Text_IO.New_Line;
-
-         for Cur of Map.To loop
-            Ada.Text_IO.Put ("To   ");
-            LR1_Items.Put (Grammar, Descriptor, Constant_Ref (Cur), 
Show_Lookaheads => True);
-            Ada.Text_IO.New_Line;
-         end loop;
-      end loop;
-   end Put;
-
-   ----------
-   --  Generate utils
-
-   function LALR_Goto_Transitions
-     (Kernel            : in LR1_Items.Item_Set;
-      Symbol            : in Token_ID;
-      First_Nonterm_Set : in Token_Array_Token_Set;
-      Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor        : in WisiToken.Descriptor)
-     return LR1_Items.Item_Set
-   is
-      use Token_ID_Arrays;
-      use LR1_Items;
-      use LR1_Items.Item_Lists;
-
-      Goto_Set : Item_Set;
-      Dot_ID   : Token_ID;
-   begin
-      for Item of Kernel.Set loop
-
-         if Has_Element (Item.Dot) then
-
-            Dot_ID := Element (Item.Dot);
-            --  ID of token after Dot
-
-            --  If Symbol = EOF_Token, this is the start symbol accept
-            --  production; don't need a kernel with dot after EOF.
-            if (Dot_ID = Symbol and Symbol /= Descriptor.EOI_ID) and then
-              not Has_Element (Find (Item.Prod, Next (Item.Dot), Goto_Set))
-            then
-               Goto_Set.Set.Insert
-                 ((Prod       => Item.Prod,
-                   Dot        => Next (Item.Dot),
-                   Lookaheads => new Token_ID_Set'(Item.Lookaheads.all)));
-
-               if Trace_Generate > Detail then
-                  Ada.Text_IO.Put_Line ("LALR_Goto_Transitions 1 " & Image 
(Symbol, Descriptor));
-                  Put (Grammar, Descriptor, Goto_Set);
-               end if;
-            end if;
-
-            if Dot_ID in Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal and then
-              First_Nonterm_Set (Dot_ID, Symbol)
-            then
-               --  Find the production(s) that create Dot_ID with first token 
Symbol
-               --  and put them in.
-               --
-               --  This is equivalent to Filter (LR1_Items.Closure, 
In_Kernel), but
-               --  more efficient, because it does not generate non-kernel 
items. See
-               --  Test/compare_goto_transitions.adb.
-               for Prod of Grammar loop
-                  for RHS_2_I in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index 
loop
-                     declare
-                        P_ID  : constant Production_ID          := (Prod.LHS, 
RHS_2_I);
-                        Dot_2 : constant Token_ID_Arrays.Cursor := Prod.RHSs 
(RHS_2_I).Tokens.First;
-                     begin
-                        if (Dot_ID = Prod.LHS or First_Nonterm_Set (Dot_ID, 
Prod.LHS)) and
-                          (Has_Element (Dot_2) and then Element (Dot_2) = 
Symbol)
-                        then
-                           if not Has_Element (Find (P_ID, Next (Dot_2), 
Goto_Set)) then
-                              Goto_Set.Set.Insert
-                                ((Prod       => P_ID,
-                                  Dot        => Next (Dot_2),
-                                  Lookaheads => Null_Lookahead (Descriptor)));
-
-                              if Trace_Generate > Detail then
-                                 Ada.Text_IO.Put_Line ("LALR_Goto_Transitions 
2 " & Image (Symbol, Descriptor));
-                                 Put (Grammar, Descriptor, Goto_Set);
-                              end if;
-
-                              --  else already in goto set
-                           end if;
-                        end if;
-                     end;
-                  end loop;
-               end loop;
-            end if;
-         end if; -- item.dot /= null
-      end loop;
-
-      return Goto_Set;
-   end LALR_Goto_Transitions;
-
-   function LALR_Kernels
-     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
-      First_Nonterm_Set : in Token_Array_Token_Set;
-      Descriptor        : in WisiToken.Descriptor)
-     return LR1_Items.Item_Set_List
-   is
-      use all type Token_ID_Arrays.Cursor;
-      use all type Ada.Containers.Count_Type;
-      use LR1_Items;
-
-      First_State_Index : constant State_Index := 0;
-      Kernels           : LR1_Items.Item_Set_List;
-      Kernel_Tree       : LR1_Items.Item_Set_Trees.Tree; -- for fast find
-      States_To_Check   : State_Index_Queues.Queue;
-      Checking_State    : State_Index;
-
-      New_Item_Set : Item_Set :=
-        (Set            => Item_Lists.To_List
-           ((Prod       => (Grammar.First_Index, 0),
-             Dot        => Grammar (Grammar.First_Index).RHSs (0).Tokens.First,
-             Lookaheads => Null_Lookahead (Descriptor))),
-         Goto_List      => <>,
-         Dot_IDs        => <>,
-         State          => First_State_Index);
-
-      Found_State : Unknown_State_Index;
-   begin
-      Kernels.Set_First (First_State_Index);
-
-      Add (New_Item_Set, Kernels, Kernel_Tree, Descriptor, Include_Lookaheads 
=> False);
-
-      States_To_Check.Put (First_State_Index);
-      loop
-         exit when States_To_Check.Is_Empty;
-         Checking_State := States_To_Check.Get;
-
-         if Trace_Generate > Detail then
-            Ada.Text_IO.Put ("Checking ");
-            Put (Grammar, Descriptor, Kernels (Checking_State));
-         end if;
-
-         for Symbol in Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal loop
-            --  LALR_Goto_Transitions does _not_ ignore Symbol if it is not in
-            --  Item_Set.Dot_IDs, so we can't iterate on that here as we do in
-            --  LR1_Generate.
-
-            New_Item_Set := LALR_Goto_Transitions
-              (Kernels (Checking_State), Symbol, First_Nonterm_Set, Grammar, 
Descriptor);
-
-            if New_Item_Set.Set.Length > 0 then
-
-               Found_State := Find (New_Item_Set, Kernel_Tree, 
Match_Lookaheads => False);
-
-               if Found_State = Unknown_State then
-                  New_Item_Set.State := Kernels.Last_Index + 1;
-
-                  States_To_Check.Put (New_Item_Set.State);
-
-                  Add (New_Item_Set, Kernels, Kernel_Tree, Descriptor, 
Include_Lookaheads => False);
-
-                  if Trace_Generate > Detail then
-                     Ada.Text_IO.Put_Line ("  adding state" & 
Unknown_State_Index'Image (Kernels.Last_Index));
-                  end if;
-
-                  Kernels (Checking_State).Goto_List.Insert ((Symbol, 
Kernels.Last_Index));
-               else
-
-                  --  If there's not already a goto entry between these two 
sets, create one.
-                  if not Is_In ((Symbol, Found_State), Kernels 
(Checking_State).Goto_List) then
-                     if Trace_Generate > Detail then
-                        Ada.Text_IO.Put_Line
-                          ("  state" & Unknown_State_Index'Image 
(Checking_State) &
-                             " adding goto on " & Image (Symbol, Descriptor) & 
" to state" &
-                             Unknown_State_Index'Image (Found_State));
-
-                     end if;
-
-                     Kernels (Checking_State).Goto_List.Insert ((Symbol, 
Found_State));
-                  end if;
-               end if;
-            end if;
-         end loop;
-      end loop;
-
-      if Trace_Generate > Detail then
-         Ada.Text_IO.New_Line;
-      end if;
-
-      return Kernels;
-   end LALR_Kernels;
-
-   --  Add a propagation entry (if it doesn't already exist) from From in
-   --  From_Set to To_Item.
-   procedure Add_Propagation
-     (From         : in     LR1_Items.Item;
-      From_Set     : in     LR1_Items.Item_Set;
-      To_Item      : in     LR1_Items.Item_Lists.Cursor;
-      Propagations : in out Item_Map_Lists.List)
-   is
-      use Item_Map_Lists;
-      use Item_List_Cursor_Lists;
-      use LR1_Items;
-      use LR1_Items.Item_Lists;
-
-      From_Cur : constant Item_Lists.Cursor := Find (From, From_Set);
-
-      From_Match : Item_Map_Lists.Cursor := Propagations.First;
-      To_Match   : Item_List_Cursor_Lists.Cursor;
-   begin
-      Find_From :
-      loop
-         exit Find_From when not Has_Element (From_Match);
-
-         declare
-            Map : Item_Map renames Constant_Ref (From_Match);
-         begin
-            if From_Cur = Map.From then
-
-               To_Match := Map.To.First;
-               loop
-                  exit when not Has_Element (To_Match);
-
-                  declare
-                     use all type SAL.Compare_Result;
-                     Cur       : Item_Lists.Cursor renames Constant_Ref 
(To_Match);
-                     Test_Item : LR1_Items.Item renames Constant_Ref (Cur);
-                  begin
-                     if Equal = LR1_Items.Item_Compare (Test_Item, 
Constant_Ref (To_Item)) then
-                        exit Find_From;
-                     end if;
-                  end;
-                  Next (To_Match);
-               end loop;
-               exit Find_From;
-            end if;
-         end;
-
-         Next (From_Match);
-      end loop Find_From;
-
-      if not Has_Element (From_Match) then
-         Propagations.Append ((From_Cur, To_List (To_Item)));
-
-      elsif not Has_Element (To_Match) then
-         Ref (From_Match).To.Append (To_Item);
-
-      else
-         raise SAL.Programmer_Error with "Add_Propagation: unexpected case";
-      end if;
-   end Add_Propagation;
-
-   --  Calculate the lookaheads from Closure_Item for Source_Item.
-   --  Source_Item must be one of the kernel items in Source_Set.
-   --  Closure_Item must be an item in the lookahead closure of Source_Item 
for #.
-   --
-   --  Spontaneous lookaheads are put in Source_Item.Lookahead,
-   --  propagated lookaheads in Propagations.
-   --
-   --  Set Used_Tokens = True for all tokens in lookaheads.
-   procedure Generate_Lookahead_Info
-     (Source_Item  : in     LR1_Items.Item;
-      Source_Set   : in     LR1_Items.Item_Set;
-      Closure_Item : in     LR1_Items.Item;
-      Propagations : in out Item_Map_Lists.List;
-      Descriptor   : in     WisiToken.Descriptor;
-      Grammar      : in     WisiToken.Productions.Prod_Arrays.Vector;
-      Kernels      : in out LR1_Items.Item_Set_List)
-   is
-      use LR1_Items;
-      use LR1_Items.Item_Lists;
-      use Token_ID_Arrays;
-
-      Spontaneous_Count : Integer := 0;
-   begin
-      if Trace_Generate > Outline then
-         Ada.Text_IO.Put_Line ("  closure_item: ");
-         LR1_Items.Put (Grammar, Descriptor, Closure_Item);
-         Ada.Text_IO.New_Line;
-      end if;
-
-      if not Has_Element (Closure_Item.Dot) then
-         return;
-      end if;
-
-      declare
-         ID         : constant Token_ID               := Element 
(Closure_Item.Dot);
-         Next_Dot   : constant Token_ID_Arrays.Cursor := Next 
(Closure_Item.Dot);
-         Goto_State : constant Unknown_State_Index    := LR1_Items.Goto_State 
(Source_Set, ID);
-         To_Item    : constant Item_Lists.Cursor      :=
-           (if Goto_State = Unknown_State then Item_Lists.No_Element
-            else LR1_Items.Find (Closure_Item.Prod, Next_Dot, Kernels 
(Goto_State)));
-      begin
-         if Closure_Item.Lookaheads (Descriptor.Last_Lookahead) and 
Has_Element (To_Item) then
-            Add_Propagation
-              (From         => Source_Item,
-               From_Set     => Source_Set,
-               To_Item      => To_Item,
-               Propagations => Propagations);
-         end if;
-
-         if Has_Element (To_Item) then
-            if Trace_Generate > Outline then
-               Spontaneous_Count := Spontaneous_Count + 1;
-               Ada.Text_IO.Put_Line ("  spontaneous: " & Lookahead_Image 
(Closure_Item.Lookaheads.all, Descriptor));
-            end if;
-
-            LR1_Items.Include (Ref (To_Item), Closure_Item.Lookaheads.all, 
Descriptor);
-         end if;
-      end;
-   end Generate_Lookahead_Info;
-
-   procedure Propagate_Lookaheads
-     (List       : in Item_Map_Lists.List;
-      Descriptor : in WisiToken.Descriptor)
-   is
-      --  In List, update all To lookaheads from From lookaheads,
-      --  recursively.
-
-      use LR1_Items.Item_Lists;
-
-      More_To_Check : Boolean := True;
-      Added_One     : Boolean;
-   begin
-      while More_To_Check loop
-
-         More_To_Check := False;
-         for Mapping of List loop
-            for Copy of Mapping.To loop
-               LR1_Items.Include (Ref (Copy), Constant_Ref 
(Mapping.From).Lookaheads.all, Added_One, Descriptor);
-
-               More_To_Check := More_To_Check or Added_One;
-            end loop;
-         end loop;
-      end loop;
-   end Propagate_Lookaheads;
-
-   --  Calculate the LALR(1) lookaheads for Grammar.
-   --  Kernels should be the sets of LR(0) kernels on input, and will
-   --  become the set of LALR(1) kernels on output.
-   procedure Fill_In_Lookaheads
-     (Grammar                 : in     
WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production    : in     Token_ID_Set;
-      First_Terminal_Sequence : in     Token_Sequence_Arrays.Vector;
-      Kernels                 : in out LR1_Items.Item_Set_List;
-      Descriptor              : in     WisiToken.Descriptor)
-   is
-      pragma Warnings (Off, """Kernel_Item_Set"" is not modified, could be 
declared constant");
-      --  WORKAROUND: GNAT GPL 2018 complains Kernel_Item_Set could be a 
constant, but
-      --  when we declare that, it complains the target of the assignment of
-      --  .Prod, .Dot below must be a variable.
-
-      Kernel_Item_Set : LR1_Items.Item_Set := -- used for temporary arg to 
Closure
-        (Set            => LR1_Items.Item_Lists.To_List
-           ((Prod       => <>,
-             Dot        => <>,
-             Lookaheads => Propagate_Lookahead (Descriptor))),
-         Goto_List      => <>,
-         Dot_IDs        => <>,
-         State          => <>);
-
-      Closure : LR1_Items.Item_Set;
-
-      Propagation_List : Item_Map_Lists.List;
-
-   begin
-      for Kernel of Kernels loop
-         if Trace_Generate > Outline then
-            Ada.Text_IO.Put ("Adding lookaheads for ");
-            LR1_Items.Put (Grammar, Descriptor, Kernel);
-         end if;
-
-         for Kernel_Item of Kernel.Set loop
-            Kernel_Item_Set.Set (Kernel_Item_Set.Set.First).Prod := 
Kernel_Item.Prod;
-            Kernel_Item_Set.Set (Kernel_Item_Set.Set.First).Dot  := 
Kernel_Item.Dot;
-
-            Closure := LR1_Items.Closure
-              (Kernel_Item_Set, Has_Empty_Production, First_Terminal_Sequence, 
Grammar, Descriptor);
-
-            for Closure_Item of Closure.Set loop
-               Generate_Lookahead_Info
-                 (Kernel_Item, Kernel, Closure_Item, Propagation_List, 
Descriptor, Grammar, Kernels);
-            end loop;
-         end loop;
-      end loop;
-
-      if Trace_Generate > Outline then
-         Ada.Text_IO.New_Line;
-         Ada.Text_IO.Put_Line ("Propagations:");
-         Put (Grammar, Descriptor, Propagation_List);
-         Ada.Text_IO.New_Line;
-      end if;
-
-      Propagate_Lookaheads (Propagation_List, Descriptor);
-   end Fill_In_Lookaheads;
-
-   --  Add actions for all Kernels to Table.
-   procedure Add_Actions
-     (Kernels                 : in     LR1_Items.Item_Set_List;
-      Grammar                 : in     
WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production    : in     Token_ID_Set;
-      First_Nonterm_Set       : in     Token_Array_Token_Set;
-      First_Terminal_Sequence : in     Token_Sequence_Arrays.Vector;
-      Conflicts               :    out Conflict_Lists.List;
-      Table                   : in out Parse_Table;
-      Descriptor              : in     WisiToken.Descriptor)
-   is
-      Closure : LR1_Items.Item_Set;
-   begin
-      for Kernel of Kernels loop
-         --  IMPROVEME: there are three "closure" computations that could
-         --  probably be refactored to save computation; in
-         --  LALR_Goto_Transitions, Fill_In_Lookaheads, and here.
-         Closure := LR1_Items.Closure (Kernel, Has_Empty_Production, 
First_Terminal_Sequence, Grammar, Descriptor);
-
-         Add_Actions (Closure, Table, Grammar, Has_Empty_Production, 
First_Nonterm_Set, Conflicts, Descriptor);
-      end loop;
-
-      if Trace_Generate > Detail then
-         Ada.Text_IO.New_Line;
-      end if;
-   end Add_Actions;
-
-   function Generate
-     (Grammar         : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor      : in WisiToken.Descriptor;
-      Known_Conflicts : in Conflict_Lists.List := Conflict_Lists.Empty_List;
-      McKenzie_Param  : in McKenzie_Param_Type := Default_McKenzie_Param;
-      Put_Parse_Table : in Boolean := False)
-     return Parse_Table_Ptr
-   is
-      use all type Ada.Containers.Count_Type;
-
-      Ignore_Unused_Tokens     : constant Boolean := WisiToken.Trace_Generate 
> Detail;
-      Ignore_Unknown_Conflicts : constant Boolean := WisiToken.Trace_Generate 
> Detail;
-      Unused_Tokens            : constant Boolean := 
WisiToken.Generate.Check_Unused_Tokens (Descriptor, Grammar);
-
-      Table : Parse_Table_Ptr;
-
-      Has_Empty_Production : constant Token_ID_Set := 
WisiToken.Generate.Has_Empty_Production (Grammar);
-
-      Minimal_Terminal_Sequences : constant Minimal_Sequence_Array :=
-        Compute_Minimal_Terminal_Sequences (Descriptor, Grammar);
-
-      Minimal_Terminal_First : constant Token_Array_Token_ID :=
-        Compute_Minimal_Terminal_First (Descriptor, 
Minimal_Terminal_Sequences);
-
-      First_Nonterm_Set : constant Token_Array_Token_Set := 
WisiToken.Generate.First
-        (Grammar, Has_Empty_Production, Descriptor.First_Terminal);
-
-      First_Terminal_Sequence : constant Token_Sequence_Arrays.Vector :=
-        WisiToken.Generate.To_Terminal_Sequence_Array (First_Nonterm_Set, 
Descriptor);
-
-      Kernels : LR1_Items.Item_Set_List := LALR_Kernels (Grammar, 
First_Nonterm_Set, Descriptor);
-
-      Unknown_Conflicts    : Conflict_Lists.List;
-      Known_Conflicts_Edit : Conflict_Lists.List := Known_Conflicts;
-
-   begin
-      WisiToken.Generate.Error := False; -- necessary in unit tests; some 
previous test might have encountered an error.
-
-      Fill_In_Lookaheads (Grammar, Has_Empty_Production, 
First_Terminal_Sequence, Kernels, Descriptor);
-
-      if Unused_Tokens then
-         WisiToken.Generate.Error := not Ignore_Unused_Tokens;
-         Ada.Text_IO.New_Line;
-      end if;
-
-      if Trace_Generate > Detail then
-         Ada.Text_IO.New_Line;
-         Ada.Text_IO.Put_Line ("LR(1) Kernels:");
-         LR1_Items.Put (Grammar, Descriptor, Kernels, Show_Lookaheads => True);
-      end if;
-
-      Table := new Parse_Table
-        (State_First       => Kernels.First_Index,
-         State_Last        => Kernels.Last_Index,
-         First_Terminal    => Descriptor.First_Terminal,
-         Last_Terminal     => Descriptor.Last_Terminal,
-         First_Nonterminal => Descriptor.First_Nonterminal,
-         Last_Nonterminal  => Descriptor.Last_Nonterminal);
-
-      if McKenzie_Param = Default_McKenzie_Param then
-         --  Descriminants in Default are wrong
-         Table.McKenzie_Param :=
-           (First_Terminal    => Descriptor.First_Terminal,
-            Last_Terminal     => Descriptor.Last_Terminal,
-            First_Nonterminal => Descriptor.First_Nonterminal,
-            Last_Nonterminal  => Descriptor.Last_Nonterminal,
-            Insert            => (others => 0),
-            Delete            => (others => 0),
-            Push_Back         => (others => 0),
-            Ignore_Check_Fail => Default_McKenzie_Param.Ignore_Check_Fail,
-            Task_Count        => Default_McKenzie_Param.Task_Count,
-            Cost_Limit        => Default_McKenzie_Param.Cost_Limit,
-            Check_Limit       => Default_McKenzie_Param.Check_Limit,
-            Check_Delta_Limit => Default_McKenzie_Param.Check_Delta_Limit,
-            Enqueue_Limit     => Default_McKenzie_Param.Enqueue_Limit);
-      else
-         Table.McKenzie_Param := McKenzie_Param;
-      end if;
-
-      Add_Actions
-        (Kernels, Grammar, Has_Empty_Production, First_Nonterm_Set, 
First_Terminal_Sequence, Unknown_Conflicts,
-         Table.all, Descriptor);
-
-      --  Set Table.States.Productions, Minimal_Complete_Actions for 
McKenzie_Recover
-      for State in Table.States'Range loop
-         Table.States (State).Productions := LR1_Items.Productions (Kernels 
(State));
-         if Trace_Generate > Extra then
-            Ada.Text_IO.Put_Line ("Set_Minimal_Complete_Actions:" & 
State_Index'Image (State));
-         end if;
-         WisiToken.Generate.LR.Set_Minimal_Complete_Actions
-           (Table.States (State), Kernels (State), Descriptor, Grammar, 
Minimal_Terminal_Sequences,
-            Minimal_Terminal_First);
-      end loop;
-
-      if Put_Parse_Table then
-         WisiToken.Generate.LR.Put_Parse_Table
-           (Table, "LALR", Grammar, Kernels, Unknown_Conflicts, Descriptor);
-      end if;
-
-      Delete_Known (Unknown_Conflicts, Known_Conflicts_Edit);
-
-      if Unknown_Conflicts.Length > 0 then
-         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "unknown 
conflicts:");
-         Put (Unknown_Conflicts, Ada.Text_IO.Current_Error, Descriptor);
-         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
-         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
-      end if;
-
-      if Known_Conflicts_Edit.Length > 0 then
-         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "excess known 
conflicts:");
-         Put (Known_Conflicts_Edit, Ada.Text_IO.Current_Error, Descriptor);
-         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
-         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
-      end if;
-
-      return Table;
-   end Generate;
-
-end WisiToken.Generate.LR.LALR_Generate;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under terms of the GNU General Public License as
+--  published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. This library is distributed in
+--  the hope that it will be useful, but WITHOUT ANY WARRANTY; without
+--  even the implied warranty of MERCHAN- TABILITY or FITNESS FOR A
+--  PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers;
+with Ada.Text_IO;
+with SAL.Gen_Definite_Doubly_Linked_Lists;
+package body WisiToken.Generate.LR.LALR_Generate is
+
+   package Item_List_Cursor_Lists is new SAL.Gen_Definite_Doubly_Linked_Lists 
(LR1_Items.Item_Lists.Cursor);
+
+   type Item_Map is record
+      --  Keep track of all copies of Item, so Lookaheads can be updated
+      --  after they are initially copied.
+      From : LR1_Items.Item_Lists.Cursor;
+      To   : Item_List_Cursor_Lists.List;
+   end record;
+
+   package Item_Map_Lists is new SAL.Gen_Definite_Doubly_Linked_Lists 
(Item_Map);
+   --  IMPROVEME: should be a 3D array indexed by Prod, rhs_index,
+   --  dot_index. But it's not broken or slow, so we're not fixing it.
+
+   function Propagate_Lookahead (Descriptor : in WisiToken.Descriptor) return 
Token_ID_Set_Access
+   is begin
+      return new Token_ID_Set'(LR1_Items.To_Lookahead 
(Descriptor.Last_Lookahead, Descriptor));
+   end Propagate_Lookahead;
+
+   function Null_Lookahead (Descriptor : in WisiToken.Descriptor) return 
Token_ID_Set_Access
+   is begin
+      return new Token_ID_Set'(Descriptor.First_Terminal .. 
Descriptor.Last_Lookahead => False);
+   end Null_Lookahead;
+
+   ----------
+   --  Debug output
+
+   procedure Put
+     (Grammar      : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor   : in WisiToken.Descriptor;
+      Propagations : in Item_Map_Lists.List)
+   is
+      use LR1_Items.Item_Lists;
+   begin
+      for Map of Propagations loop
+         Ada.Text_IO.Put ("From ");
+         LR1_Items.Put (Grammar, Descriptor, Constant_Ref (Map.From), 
Show_Lookaheads => True);
+         Ada.Text_IO.New_Line;
+
+         for Cur of Map.To loop
+            Ada.Text_IO.Put ("To   ");
+            LR1_Items.Put (Grammar, Descriptor, Constant_Ref (Cur), 
Show_Lookaheads => True);
+            Ada.Text_IO.New_Line;
+         end loop;
+      end loop;
+   end Put;
+
+   ----------
+   --  Generate utils
+
+   function LALR_Goto_Transitions
+     (Kernel            : in LR1_Items.Item_Set;
+      Symbol            : in Token_ID;
+      First_Nonterm_Set : in Token_Array_Token_Set;
+      Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor        : in WisiToken.Descriptor)
+     return LR1_Items.Item_Set
+   is
+      use Token_ID_Arrays;
+      use LR1_Items;
+      use LR1_Items.Item_Lists;
+
+      Goto_Set : Item_Set;
+      Dot_ID   : Token_ID;
+   begin
+      for Item of Kernel.Set loop
+
+         if Has_Element (Item.Dot) then
+
+            Dot_ID := Element (Item.Dot);
+            --  ID of token after Dot
+
+            --  If Symbol = EOF_Token, this is the start symbol accept
+            --  production; don't need a kernel with dot after EOF.
+            if (Dot_ID = Symbol and Symbol /= Descriptor.EOI_ID) and then
+              not Has_Element (Find (Item.Prod, Next (Item.Dot), Goto_Set))
+            then
+               Goto_Set.Set.Insert
+                 ((Prod       => Item.Prod,
+                   Dot        => Next (Item.Dot),
+                   Lookaheads => new Token_ID_Set'(Item.Lookaheads.all)));
+
+               if Trace_Generate > Detail then
+                  Ada.Text_IO.Put_Line ("LALR_Goto_Transitions 1 " & Image 
(Symbol, Descriptor));
+                  Put (Grammar, Descriptor, Goto_Set);
+               end if;
+            end if;
+
+            if Dot_ID in Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal and then
+              First_Nonterm_Set (Dot_ID, Symbol)
+            then
+               --  Find the production(s) that create Dot_ID with first token 
Symbol
+               --  and put them in.
+               for Prod of Grammar loop
+                  for RHS_2_I in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index 
loop
+                     declare
+                        P_ID  : constant Production_ID          := (Prod.LHS, 
RHS_2_I);
+                        Dot_2 : constant Token_ID_Arrays.Cursor := Prod.RHSs 
(RHS_2_I).Tokens.First;
+                     begin
+                        if (Dot_ID = Prod.LHS or First_Nonterm_Set (Dot_ID, 
Prod.LHS)) and
+                          (Has_Element (Dot_2) and then Element (Dot_2) = 
Symbol)
+                        then
+                           if not Has_Element (Find (P_ID, Next (Dot_2), 
Goto_Set)) then
+                              Goto_Set.Set.Insert
+                                ((Prod       => P_ID,
+                                  Dot        => Next (Dot_2),
+                                  Lookaheads => Null_Lookahead (Descriptor)));
+
+                              --  else already in goto set
+                           end if;
+                        end if;
+                     end;
+                  end loop;
+               end loop;
+               if Trace_Generate > Detail then
+                  Ada.Text_IO.Put_Line ("LALR_Goto_Transitions 2 " & Image 
(Symbol, Descriptor));
+                  Put (Grammar, Descriptor, Goto_Set);
+               end if;
+            end if;
+         end if; -- item.dot /= null
+      end loop;
+
+      return Goto_Set;
+   end LALR_Goto_Transitions;
+
+   function LALR_Kernels
+     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      First_Nonterm_Set : in Token_Array_Token_Set;
+      Descriptor        : in WisiToken.Descriptor)
+     return LR1_Items.Item_Set_List
+   is
+      use all type Token_ID_Arrays.Cursor;
+      use all type Ada.Containers.Count_Type;
+      use LR1_Items;
+
+      First_State_Index : constant State_Index := 0;
+      Kernels           : LR1_Items.Item_Set_List;
+      Kernel_Tree       : LR1_Items.Item_Set_Trees.Tree; -- for fast find
+      States_To_Check   : State_Index_Queues.Queue;
+      Checking_State    : State_Index;
+
+      New_Item_Set : Item_Set :=
+        (Set            => Item_Lists.To_List
+           ((Prod       => (Grammar.First_Index, 0),
+             Dot        => Grammar (Grammar.First_Index).RHSs (0).Tokens.First,
+             Lookaheads => Null_Lookahead (Descriptor))),
+         Goto_List      => <>,
+         Dot_IDs        => <>,
+         State          => First_State_Index);
+
+      Found_State : Unknown_State_Index;
+   begin
+      Kernels.Set_First (First_State_Index);
+
+      Add (New_Item_Set, Kernels, Kernel_Tree, Descriptor, Include_Lookaheads 
=> False);
+
+      States_To_Check.Put (First_State_Index);
+      loop
+         exit when States_To_Check.Is_Empty;
+         Checking_State := States_To_Check.Get;
+
+         if Trace_Generate > Detail then
+            Ada.Text_IO.Put ("Checking ");
+            Put (Grammar, Descriptor, Kernels (Checking_State));
+         end if;
+
+         for Symbol in Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal loop
+            --  LALR_Goto_Transitions does _not_ ignore Symbol if it is not in
+            --  Item_Set.Dot_IDs, so we can't iterate on that here as we do in
+            --  LR1_Generate.
+
+            New_Item_Set := LALR_Goto_Transitions
+              (Kernels (Checking_State), Symbol, First_Nonterm_Set, Grammar, 
Descriptor);
+
+            if New_Item_Set.Set.Length > 0 then
+
+               Found_State := Find (New_Item_Set, Kernel_Tree, 
Match_Lookaheads => False);
+
+               if Found_State = Unknown_State then
+                  New_Item_Set.State := Kernels.Last_Index + 1;
+
+                  States_To_Check.Put (New_Item_Set.State);
+
+                  Add (New_Item_Set, Kernels, Kernel_Tree, Descriptor, 
Include_Lookaheads => False);
+
+                  if Trace_Generate > Detail then
+                     Ada.Text_IO.Put_Line ("  adding state" & 
Unknown_State_Index'Image (Kernels.Last_Index));
+
+                     Ada.Text_IO.Put_Line
+                       ("  state" & Unknown_State_Index'Image (Checking_State) 
&
+                          " adding goto on " & Image (Symbol, Descriptor) & " 
to state" &
+                          Unknown_State_Index'Image (Kernels.Last_Index));
+                  end if;
+
+                  Kernels (Checking_State).Goto_List.Insert ((Symbol, 
Kernels.Last_Index));
+               else
+
+                  --  If there's not already a goto entry between these two 
sets, create one.
+                  if not Is_In ((Symbol, Found_State), Kernels 
(Checking_State).Goto_List) then
+                     if Trace_Generate > Detail then
+                        Ada.Text_IO.Put_Line
+                          ("  state" & Unknown_State_Index'Image 
(Checking_State) &
+                             " adding goto on " & Image (Symbol, Descriptor) & 
" to state" &
+                             Unknown_State_Index'Image (Found_State));
+
+                     end if;
+
+                     Kernels (Checking_State).Goto_List.Insert ((Symbol, 
Found_State));
+                  end if;
+               end if;
+            end if;
+         end loop;
+      end loop;
+
+      if Trace_Generate > Detail then
+         Ada.Text_IO.New_Line;
+      end if;
+
+      return Kernels;
+   end LALR_Kernels;
+
+   --  Add a propagation entry (if it doesn't already exist) from From in
+   --  From_Set to To_Item.
+   procedure Add_Propagation
+     (From         : in     LR1_Items.Item;
+      From_Set     : in     LR1_Items.Item_Set;
+      To_Item      : in     LR1_Items.Item_Lists.Cursor;
+      Propagations : in out Item_Map_Lists.List)
+   is
+      use Item_Map_Lists;
+      use Item_List_Cursor_Lists;
+      use LR1_Items;
+      use LR1_Items.Item_Lists;
+
+      From_Cur : constant Item_Lists.Cursor := Find (From, From_Set);
+
+      From_Match : Item_Map_Lists.Cursor := Propagations.First;
+      To_Match   : Item_List_Cursor_Lists.Cursor;
+   begin
+      Find_From :
+      loop
+         exit Find_From when not Has_Element (From_Match);
+
+         declare
+            Map : Item_Map renames Constant_Ref (From_Match);
+         begin
+            if From_Cur = Map.From then
+
+               To_Match := Map.To.First;
+               loop
+                  exit when not Has_Element (To_Match);
+
+                  declare
+                     use all type SAL.Compare_Result;
+                     Cur       : Item_Lists.Cursor renames Constant_Ref 
(To_Match);
+                     Test_Item : LR1_Items.Item renames Constant_Ref (Cur);
+                  begin
+                     if Equal = LR1_Items.Item_Compare (Test_Item, 
Constant_Ref (To_Item)) then
+                        exit Find_From;
+                     end if;
+                  end;
+                  Next (To_Match);
+               end loop;
+               exit Find_From;
+            end if;
+         end;
+
+         Next (From_Match);
+      end loop Find_From;
+
+      if not Has_Element (From_Match) then
+         Propagations.Append ((From_Cur, To_List (To_Item)));
+
+      elsif not Has_Element (To_Match) then
+         Ref (From_Match).To.Append (To_Item);
+
+      else
+         raise SAL.Programmer_Error with "Add_Propagation: unexpected case";
+      end if;
+   end Add_Propagation;
+
+   --  Calculate the lookaheads from Closure_Item for Source_Item.
+   --  Source_Item must be one of the kernel items in Source_Set.
+   --  Closure_Item must be an item in the lookahead closure of Source_Item 
for #.
+   --
+   --  Spontaneous lookaheads are put in Source_Item.Lookahead,
+   --  propagated lookaheads in Propagations.
+   --
+   --  Set Used_Tokens = True for all tokens in lookaheads.
+   procedure Generate_Lookahead_Info
+     (Source_Item  : in     LR1_Items.Item;
+      Source_Set   : in     LR1_Items.Item_Set;
+      Closure_Item : in     LR1_Items.Item;
+      Propagations : in out Item_Map_Lists.List;
+      Descriptor   : in     WisiToken.Descriptor;
+      Grammar      : in     WisiToken.Productions.Prod_Arrays.Vector;
+      Kernels      : in out LR1_Items.Item_Set_List)
+   is
+      use LR1_Items;
+      use LR1_Items.Item_Lists;
+      use Token_ID_Arrays;
+
+      Spontaneous_Count : Integer := 0;
+   begin
+      if Trace_Generate > Outline then
+         Ada.Text_IO.Put_Line ("  closure_item: ");
+         LR1_Items.Put (Grammar, Descriptor, Closure_Item);
+         Ada.Text_IO.New_Line;
+      end if;
+
+      if not Has_Element (Closure_Item.Dot) then
+         return;
+      end if;
+
+      declare
+         ID         : constant Token_ID               := Element 
(Closure_Item.Dot);
+         Next_Dot   : constant Token_ID_Arrays.Cursor := Next 
(Closure_Item.Dot);
+         Goto_State : constant Unknown_State_Index    := LR1_Items.Goto_State 
(Source_Set, ID);
+         To_Item    : constant Item_Lists.Cursor      :=
+           (if Goto_State = Unknown_State then Item_Lists.No_Element
+            else LR1_Items.Find (Closure_Item.Prod, Next_Dot, Kernels 
(Goto_State)));
+      begin
+         if Closure_Item.Lookaheads (Descriptor.Last_Lookahead) and 
Has_Element (To_Item) then
+            Add_Propagation
+              (From         => Source_Item,
+               From_Set     => Source_Set,
+               To_Item      => To_Item,
+               Propagations => Propagations);
+         end if;
+
+         if Has_Element (To_Item) then
+            if Trace_Generate > Outline then
+               Spontaneous_Count := Spontaneous_Count + 1;
+               Ada.Text_IO.Put_Line ("  spontaneous: " & Lookahead_Image 
(Closure_Item.Lookaheads.all, Descriptor));
+            end if;
+
+            LR1_Items.Include (Ref (To_Item), Closure_Item.Lookaheads.all, 
Descriptor);
+         end if;
+      end;
+   end Generate_Lookahead_Info;
+
+   procedure Propagate_Lookaheads
+     (List       : in Item_Map_Lists.List;
+      Descriptor : in WisiToken.Descriptor)
+   is
+      --  In List, update all To lookaheads from From lookaheads,
+      --  recursively.
+
+      use LR1_Items.Item_Lists;
+
+      More_To_Check : Boolean := True;
+      Added_One     : Boolean;
+   begin
+      while More_To_Check loop
+
+         More_To_Check := False;
+         for Mapping of List loop
+            for Copy of Mapping.To loop
+               LR1_Items.Include (Ref (Copy), Constant_Ref 
(Mapping.From).Lookaheads.all, Added_One, Descriptor);
+
+               More_To_Check := More_To_Check or Added_One;
+            end loop;
+         end loop;
+      end loop;
+   end Propagate_Lookaheads;
+
+   --  Calculate the LALR(1) lookaheads for Grammar.
+   --  Kernels should be the sets of LR(0) kernels on input, and will
+   --  become the set of LALR(1) kernels on output.
+   procedure Fill_In_Lookaheads
+     (Grammar                 : in     
WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production    : in     Token_ID_Set;
+      First_Terminal_Sequence : in     Token_Sequence_Arrays.Vector;
+      Kernels                 : in out LR1_Items.Item_Set_List;
+      Descriptor              : in     WisiToken.Descriptor)
+   is
+      pragma Warnings (Off, """Kernel_Item_Set"" is not modified, could be 
declared constant");
+      --  WORKAROUND: GNAT GPL 2018 complains Kernel_Item_Set could be a 
constant, but
+      --  when we declare that, it complains the target of the assignment of
+      --  .Prod, .Dot below must be a variable.
+
+      Kernel_Item_Set : LR1_Items.Item_Set := -- used for temporary arg to 
Closure
+        (Set            => LR1_Items.Item_Lists.To_List
+           ((Prod       => <>,
+             Dot        => <>,
+             Lookaheads => Propagate_Lookahead (Descriptor))),
+         Goto_List      => <>,
+         Dot_IDs        => <>,
+         State          => <>);
+
+      Closure : LR1_Items.Item_Set;
+
+      Propagation_List : Item_Map_Lists.List;
+
+   begin
+      for Kernel of Kernels loop
+         if Trace_Generate > Outline then
+            Ada.Text_IO.Put ("Adding lookaheads for ");
+            LR1_Items.Put (Grammar, Descriptor, Kernel);
+         end if;
+
+         for Kernel_Item of Kernel.Set loop
+            Kernel_Item_Set.Set (Kernel_Item_Set.Set.First).Prod := 
Kernel_Item.Prod;
+            Kernel_Item_Set.Set (Kernel_Item_Set.Set.First).Dot  := 
Kernel_Item.Dot;
+
+            Closure := LR1_Items.Closure
+              (Kernel_Item_Set, Has_Empty_Production, First_Terminal_Sequence, 
Grammar, Descriptor);
+
+            for Closure_Item of Closure.Set loop
+               Generate_Lookahead_Info
+                 (Kernel_Item, Kernel, Closure_Item, Propagation_List, 
Descriptor, Grammar, Kernels);
+            end loop;
+         end loop;
+      end loop;
+
+      if Trace_Generate > Outline then
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("Propagations:");
+         Put (Grammar, Descriptor, Propagation_List);
+         Ada.Text_IO.New_Line;
+      end if;
+
+      Propagate_Lookaheads (Propagation_List, Descriptor);
+   end Fill_In_Lookaheads;
+
+   --  Add actions for all Kernels to Table.
+   procedure Add_Actions
+     (Kernels                 : in     LR1_Items.Item_Set_List;
+      Grammar                 : in     
WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production    : in     Token_ID_Set;
+      First_Nonterm_Set       : in     Token_Array_Token_Set;
+      First_Terminal_Sequence : in     Token_Sequence_Arrays.Vector;
+      Conflict_Counts         :    out Conflict_Count_Lists.List;
+      Conflicts               :    out Conflict_Lists.List;
+      Table                   : in out Parse_Table;
+      Descriptor              : in     WisiToken.Descriptor)
+   is
+      Closure : LR1_Items.Item_Set;
+   begin
+      for Kernel of Kernels loop
+         --  IMPROVEME: there are three "closure" computations that could
+         --  probably be refactored to save computation; in
+         --  LALR_Goto_Transitions, Fill_In_Lookaheads, and here.
+         Closure := LR1_Items.Closure (Kernel, Has_Empty_Production, 
First_Terminal_Sequence, Grammar, Descriptor);
+
+         Add_Actions
+           (Closure, Table, Grammar, Has_Empty_Production, First_Nonterm_Set,
+            Conflict_Counts, Conflicts, Descriptor);
+      end loop;
+
+      if Trace_Generate > Detail then
+         Ada.Text_IO.New_Line;
+      end if;
+   end Add_Actions;
+
+   function Generate
+     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor        : in WisiToken.Descriptor;
+      Known_Conflicts   : in Conflict_Lists.List := Conflict_Lists.Empty_List;
+      McKenzie_Param    : in McKenzie_Param_Type := Default_McKenzie_Param;
+      Put_Parse_Table   : in Boolean             := False;
+      Include_Extra     : in Boolean             := False;
+      Ignore_Conflicts  : in Boolean             := False;
+      Partial_Recursion : in Boolean             := True)
+     return Parse_Table_Ptr
+   is
+      use all type Ada.Containers.Count_Type;
+
+      Ignore_Unused_Tokens     : constant Boolean := WisiToken.Trace_Generate 
> Detail;
+      Ignore_Unknown_Conflicts : constant Boolean := Ignore_Conflicts or 
WisiToken.Trace_Generate > Detail;
+      Unused_Tokens            : constant Boolean := 
WisiToken.Generate.Check_Unused_Tokens (Descriptor, Grammar);
+
+      Table : Parse_Table_Ptr;
+
+      Has_Empty_Production : constant Token_ID_Set := 
WisiToken.Generate.Has_Empty_Production (Grammar);
+
+      Recursions : constant WisiToken.Generate.Recursions :=
+        (if Partial_Recursion
+         then WisiToken.Generate.Compute_Partial_Recursion (Grammar)
+         else WisiToken.Generate.Compute_Full_Recursion (Grammar));
+      Minimal_Terminal_Sequences : constant Minimal_Sequence_Array :=
+        Compute_Minimal_Terminal_Sequences (Descriptor, Grammar, Recursions);
+
+      Minimal_Terminal_First : constant Token_Array_Token_ID :=
+        Compute_Minimal_Terminal_First (Descriptor, 
Minimal_Terminal_Sequences);
+
+      First_Nonterm_Set : constant Token_Array_Token_Set := 
WisiToken.Generate.First
+        (Grammar, Has_Empty_Production, Descriptor.First_Terminal);
+
+      First_Terminal_Sequence : constant Token_Sequence_Arrays.Vector :=
+        WisiToken.Generate.To_Terminal_Sequence_Array (First_Nonterm_Set, 
Descriptor);
+
+      Kernels : LR1_Items.Item_Set_List := LALR_Kernels (Grammar, 
First_Nonterm_Set, Descriptor);
+
+      Conflict_Counts      : Conflict_Count_Lists.List;
+      Unknown_Conflicts    : Conflict_Lists.List;
+      Known_Conflicts_Edit : Conflict_Lists.List := Known_Conflicts;
+
+   begin
+      WisiToken.Generate.Error := False; -- necessary in unit tests; some 
previous test might have encountered an error.
+
+      Fill_In_Lookaheads (Grammar, Has_Empty_Production, 
First_Terminal_Sequence, Kernels, Descriptor);
+
+      if Unused_Tokens then
+         WisiToken.Generate.Error := not Ignore_Unused_Tokens;
+         Ada.Text_IO.New_Line;
+      end if;
+
+      if Trace_Generate > Detail then
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("LR(1) Kernels:");
+         LR1_Items.Put (Grammar, Descriptor, Kernels, Show_Lookaheads => True);
+      end if;
+
+      Table := new Parse_Table
+        (State_First       => Kernels.First_Index,
+         State_Last        => Kernels.Last_Index,
+         First_Terminal    => Descriptor.First_Terminal,
+         Last_Terminal     => Descriptor.Last_Terminal,
+         First_Nonterminal => Descriptor.First_Nonterminal,
+         Last_Nonterminal  => Descriptor.Last_Nonterminal);
+
+      if McKenzie_Param = Default_McKenzie_Param then
+         --  Descriminants in Default are wrong
+         Table.McKenzie_Param :=
+           (First_Terminal              => Descriptor.First_Terminal,
+            Last_Terminal               => Descriptor.Last_Terminal,
+            First_Nonterminal           => Descriptor.First_Nonterminal,
+            Last_Nonterminal            => Descriptor.Last_Nonterminal,
+            Insert                      => (others => 0),
+            Delete                      => (others => 0),
+            Push_Back                   => (others => 0),
+            Undo_Reduce                 => (others => 0),
+            Minimal_Complete_Cost_Delta => 
Default_McKenzie_Param.Minimal_Complete_Cost_Delta,
+            Fast_Forward                => Default_McKenzie_Param.Fast_Forward,
+            Matching_Begin              => 
Default_McKenzie_Param.Matching_Begin,
+            Ignore_Check_Fail           => 
Default_McKenzie_Param.Ignore_Check_Fail,
+            Task_Count                  => Default_McKenzie_Param.Task_Count,
+            Check_Limit                 => Default_McKenzie_Param.Check_Limit,
+            Check_Delta_Limit           => 
Default_McKenzie_Param.Check_Delta_Limit,
+            Enqueue_Limit               => 
Default_McKenzie_Param.Enqueue_Limit);
+      else
+         Table.McKenzie_Param := McKenzie_Param;
+      end if;
+
+      Add_Actions
+        (Kernels, Grammar, Has_Empty_Production, First_Nonterm_Set, 
First_Terminal_Sequence, Conflict_Counts,
+         Unknown_Conflicts, Table.all, Descriptor);
+
+      for State in Table.States'Range loop
+         if Trace_Generate > Extra then
+            Ada.Text_IO.Put_Line ("Set_Minimal_Complete_Actions:" & 
State_Index'Image (State));
+         end if;
+         WisiToken.Generate.LR.Set_Minimal_Complete_Actions
+           (Table.States (State), Kernels (State), Descriptor, Grammar, 
Minimal_Terminal_Sequences,
+            Minimal_Terminal_First);
+      end loop;
+
+      if Put_Parse_Table then
+         WisiToken.Generate.LR.Put_Parse_Table
+           (Table, "LALR", Grammar, Recursions, Minimal_Terminal_Sequences, 
Kernels, Conflict_Counts, Descriptor,
+            Include_Extra);
+      end if;
+
+      Delete_Known (Unknown_Conflicts, Known_Conflicts_Edit);
+
+      if Unknown_Conflicts.Length > 0 then
+         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "unknown 
conflicts:");
+         Put (Unknown_Conflicts, Ada.Text_IO.Current_Error, Descriptor);
+         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
+         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
+      end if;
+
+      if Known_Conflicts_Edit.Length > 0 then
+         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "excess known 
conflicts:");
+         Put (Known_Conflicts_Edit, Ada.Text_IO.Current_Error, Descriptor);
+         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
+         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
+      end if;
+
+      return Table;
+   end Generate;
+
+end WisiToken.Generate.LR.LALR_Generate;
diff --git a/packages/wisi/wisitoken-generate-lr-lalr_generate.ads 
b/packages/wisi/wisitoken-generate-lr-lalr_generate.ads
index b4a109f..9e33931 100644
--- a/packages/wisi/wisitoken-generate-lr-lalr_generate.ads
+++ b/packages/wisi/wisitoken-generate-lr-lalr_generate.ads
@@ -25,11 +25,14 @@ with WisiToken.Productions;
 package WisiToken.Generate.LR.LALR_Generate is
 
    function Generate
-     (Grammar         : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor      : in WisiToken.Descriptor;
-      Known_Conflicts : in Conflict_Lists.List := Conflict_Lists.Empty_List;
-      McKenzie_Param  : in McKenzie_Param_Type := Default_McKenzie_Param;
-      Put_Parse_Table : in Boolean := False)
+     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor        : in WisiToken.Descriptor;
+      Known_Conflicts   : in Conflict_Lists.List := Conflict_Lists.Empty_List;
+      McKenzie_Param    : in McKenzie_Param_Type := Default_McKenzie_Param;
+      Put_Parse_Table   : in Boolean             := False;
+      Include_Extra     : in Boolean             := False;
+      Ignore_Conflicts  : in Boolean             := False;
+      Partial_Recursion : in Boolean             := True)
      return Parse_Table_Ptr
    with Pre =>
      Descriptor.Last_Lookahead = Descriptor.First_Nonterminal and
@@ -76,6 +79,7 @@ package WisiToken.Generate.LR.LALR_Generate is
       Has_Empty_Production    : in     Token_ID_Set;
       First_Nonterm_Set       : in     Token_Array_Token_Set;
       First_Terminal_Sequence : in     Token_Sequence_Arrays.Vector;
+      Conflict_Counts         :    out Conflict_Count_Lists.List;
       Conflicts               :    out Conflict_Lists.List;
       Table                   : in out Parse_Table;
       Descriptor              : in     WisiToken.Descriptor);
diff --git a/packages/wisi/wisitoken-generate-lr-lr1_generate.adb 
b/packages/wisi/wisitoken-generate-lr-lr1_generate.adb
index 62c20c1..0f177d9 100644
--- a/packages/wisi/wisitoken-generate-lr-lr1_generate.adb
+++ b/packages/wisi/wisitoken-generate-lr-lr1_generate.adb
@@ -1,321 +1,331 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under terms of the GNU General Public License as
---  published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. This library is distributed in
---  the hope that it will be useful, but WITHOUT ANY WARRANTY; without
---  even the implied warranty of MERCHAN- TABILITY or FITNESS FOR A
---  PARTICULAR PURPOSE.
---
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Containers;
-with Ada.Text_IO;
-with WisiToken.Generate;
-package body WisiToken.Generate.LR.LR1_Generate is
-
-   function LR1_Goto_Transitions
-     (Set                     : in LR1_Items.Item_Set;
-      Symbol                  : in Token_ID;
-      Has_Empty_Production    : in Token_ID_Set;
-      First_Terminal_Sequence : in Token_Sequence_Arrays.Vector;
-      Grammar                 : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor              : in WisiToken.Descriptor)
-     return LR1_Items.Item_Set
-   is
-      use all type Ada.Containers.Count_Type;
-      use Token_ID_Arrays;
-      use LR1_Items;
-
-      Goto_Set : Item_Set;
-   begin
-      for Item of Set.Set loop
-         if Item.Dot /= No_Element then
-            if Element (Item.Dot) = Symbol and
-              --  We don't need a state with dot after EOI in the
-              --  accept production. EOI should only appear in the
-              --  accept production.
-              Symbol /= Descriptor.EOI_ID
-            then
-               Goto_Set.Set.Insert ((Item.Prod, Next (Item.Dot), new 
Token_ID_Set'(Item.Lookaheads.all)));
-            end if;
-         end if;
-      end loop;
-
-      if Goto_Set.Set.Length > 0 then
-         return Closure (Goto_Set, Has_Empty_Production, 
First_Terminal_Sequence, Grammar, Descriptor);
-      else
-         return Goto_Set;
-      end if;
-   end LR1_Goto_Transitions;
-
-   function LR1_Item_Sets
-     (Has_Empty_Production    : in Token_ID_Set;
-      First_Terminal_Sequence : in Token_Sequence_Arrays.Vector;
-      Grammar                 : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor              : in WisiToken.Descriptor)
-     return LR1_Items.Item_Set_List
-   is
-      use all type Ada.Containers.Count_Type;
-
-      --  [dragon] algorithm 4.9 pg 231; figure 4.38 pg 232; procedure
-      --  "items", with some optimizations.
-
-      use LR1_Items;
-
-      First_State_Index : constant State_Index := 0;
-
-      C               : LR1_Items.Item_Set_List;       -- result
-      C_Tree          : LR1_Items.Item_Set_Trees.Tree; -- for fast find
-      States_To_Check : State_Index_Queues.Queue;
-      --  [dragon] specifies 'until no more items can be added', but we use
-      --  a queue to avoid checking unecessary states. Ada LR1 has over
-      --  100,000 states, so this is a significant gain (reduced time from
-      --  600 seconds to 40).
-
-      I       : State_Index;
-      Dot_IDs : Token_ID_Arrays.Vector;
-
-      New_Item_Set : Item_Set := Closure
-        ((Set            => Item_Lists.To_List
-            ((Prod       => (Grammar.First_Index, 0),
-              Dot        => Grammar (Grammar.First_Index).RHSs 
(0).Tokens.First,
-              Lookaheads => new Token_ID_Set'(To_Lookahead (Descriptor.EOI_ID, 
Descriptor)))),
-          Goto_List      => <>,
-          Dot_IDs        => <>,
-          State          => First_State_Index),
-        Has_Empty_Production, First_Terminal_Sequence, Grammar, Descriptor);
-
-      Found_State  : Unknown_State_Index;
-
-   begin
-      C.Set_First (First_State_Index);
-
-      Add (New_Item_Set, C, C_Tree, Descriptor, Include_Lookaheads => True);
-
-      States_To_Check.Put (First_State_Index);
-      loop
-         exit when States_To_Check.Is_Empty;
-         I := States_To_Check.Get;
-
-         if Trace_Generate > Outline then
-            Ada.Text_IO.Put ("Checking ");
-            Put (Grammar, Descriptor, C (I), Show_Lookaheads => True, 
Show_Goto_List => True);
-         end if;
-
-         Dot_IDs := C (I).Dot_IDs;
-         --  We can't iterate on C (I).Dot_IDs when the loop adds items to C;
-         --  it might be reallocated to grow.
-
-         for Symbol of Dot_IDs loop
-            --  [dragon] has 'for each grammar symbol X', but 
LR1_Goto_Transitions
-            --  rejects Symbol that is not in Dot_IDs, so we iterate over that.
-
-            New_Item_Set := LR1_Goto_Transitions
-              (C (I), Symbol, Has_Empty_Production, First_Terminal_Sequence, 
Grammar, Descriptor);
-
-            if New_Item_Set.Set.Length > 0 then -- 'goto (I, X) not empty'
-
-               Found_State := Find (New_Item_Set, C_Tree, Match_Lookaheads => 
True); -- 'not in C'
-
-               if Found_State = Unknown_State then
-                  New_Item_Set.State := C.Last_Index + 1;
-
-                  States_To_Check.Put (New_Item_Set.State);
-
-                  Add (New_Item_Set, C, C_Tree, Descriptor, Include_Lookaheads 
=> True);
-
-                  if Trace_Generate > Outline then
-                     Ada.Text_IO.Put_Line
-                       ("  adding state" & Unknown_State_Index'Image 
(C.Last_Index) & ": from state" &
-                          Unknown_State_Index'Image (I) & " on " & Image 
(Symbol, Descriptor));
-                     Put (Grammar, Descriptor, New_Item_Set, Show_Lookaheads 
=> True);
-                  end if;
-
-                  C (I).Goto_List.Insert ((Symbol, C.Last_Index));
-               else
-
-                  --  If there's not already a goto entry between these two 
sets, create one.
-                  if not Is_In ((Symbol, Found_State), Goto_List => C 
(I).Goto_List) then
-                     if Trace_Generate > Outline then
-                        Ada.Text_IO.Put_Line
-                          ("  adding goto on " & Image (Symbol, Descriptor) & 
" to state" &
-                             Unknown_State_Index'Image (Found_State));
-
-                     end if;
-
-                     C (I).Goto_List.Insert ((Symbol, Found_State));
-                  end if;
-               end if;
-            end if;
-         end loop;
-      end loop;
-
-      if Trace_Generate > Outline then
-         Ada.Text_IO.New_Line;
-      end if;
-
-      return C;
-   end LR1_Item_Sets;
-
-   procedure Add_Actions
-     (Item_Sets            : in     LR1_Items.Item_Set_List;
-      Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production : in     Token_ID_Set;
-      First_Nonterm_Set    : in     Token_Array_Token_Set;
-      Conflicts            :    out Conflict_Lists.List;
-      Table                : in out Parse_Table;
-      Descriptor           : in     WisiToken.Descriptor)
-   is
-      --  Add actions for all Item_Sets to Table.
-   begin
-      for Item_Set of Item_Sets loop
-         Add_Actions (Item_Set, Table, Grammar, Has_Empty_Production, 
First_Nonterm_Set, Conflicts, Descriptor);
-      end loop;
-
-      if Trace_Generate > Outline then
-         Ada.Text_IO.New_Line;
-      end if;
-   end Add_Actions;
-
-   function Generate
-     (Grammar         : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor      : in WisiToken.Descriptor;
-      Known_Conflicts : in Conflict_Lists.List := Conflict_Lists.Empty_List;
-      McKenzie_Param  : in McKenzie_Param_Type := Default_McKenzie_Param;
-      Put_Parse_Table : in Boolean := False)
-     return Parse_Table_Ptr
-   is
-      use type Ada.Containers.Count_Type;
-
-      Ignore_Unused_Tokens     : constant Boolean := WisiToken.Trace_Generate 
> Detail;
-      Ignore_Unknown_Conflicts : constant Boolean := WisiToken.Trace_Generate 
> Detail;
-      Unused_Tokens            : constant Boolean := 
WisiToken.Generate.Check_Unused_Tokens (Descriptor, Grammar);
-
-      Table : Parse_Table_Ptr;
-
-      Has_Empty_Production : constant Token_ID_Set := 
WisiToken.Generate.Has_Empty_Production (Grammar);
-
-      Minimal_Terminal_Sequences : constant Minimal_Sequence_Array :=
-        Compute_Minimal_Terminal_Sequences (Descriptor, Grammar);
-
-      Minimal_Terminal_First : constant Token_Array_Token_ID :=
-        Compute_Minimal_Terminal_First (Descriptor, 
Minimal_Terminal_Sequences);
-
-      First_Nonterm_Set : constant Token_Array_Token_Set := 
WisiToken.Generate.First
-        (Grammar, Has_Empty_Production, Descriptor.First_Terminal);
-
-      First_Terminal_Sequence : constant Token_Sequence_Arrays.Vector :=
-        WisiToken.Generate.To_Terminal_Sequence_Array (First_Nonterm_Set, 
Descriptor);
-
-      Item_Sets : constant LR1_Items.Item_Set_List := LR1_Item_Sets
-        (Has_Empty_Production, First_Terminal_Sequence, Grammar, Descriptor);
-
-      Unknown_Conflicts    : Conflict_Lists.List;
-      Known_Conflicts_Edit : Conflict_Lists.List := Known_Conflicts;
-   begin
-      if Trace_Generate > Outline then
-         Ada.Text_IO.New_Line;
-         Ada.Text_IO.Put_Line ("LR(1) Item_Sets:");
-         LR1_Items.Put (Grammar, Descriptor, Item_Sets);
-      end if;
-
-      Table := new Parse_Table
-        (State_First       => Item_Sets.First_Index,
-         State_Last        => Item_Sets.Last_Index,
-         First_Terminal    => Descriptor.First_Terminal,
-         Last_Terminal     => Descriptor.Last_Terminal,
-         First_Nonterminal => Descriptor.First_Nonterminal,
-         Last_Nonterminal  => Descriptor.Last_Nonterminal);
-
-      if McKenzie_Param = Default_McKenzie_Param then
-         --  Descriminants in Default are wrong
-         Table.McKenzie_Param :=
-           (First_Terminal    => Descriptor.First_Terminal,
-            Last_Terminal     => Descriptor.Last_Terminal,
-            First_Nonterminal => Descriptor.First_Nonterminal,
-            Last_Nonterminal  => Descriptor.Last_Nonterminal,
-            Insert            => (others => 0),
-            Delete            => (others => 0),
-            Push_Back         => (others => 0),
-            Ignore_Check_Fail => Default_McKenzie_Param.Ignore_Check_Fail,
-            Task_Count        => Default_McKenzie_Param.Task_Count,
-            Cost_Limit        => Default_McKenzie_Param.Cost_Limit,
-            Check_Limit       => Default_McKenzie_Param.Check_Limit,
-            Check_Delta_Limit => Default_McKenzie_Param.Check_Delta_Limit,
-            Enqueue_Limit     => Default_McKenzie_Param.Enqueue_Limit);
-      else
-         Table.McKenzie_Param := McKenzie_Param;
-      end if;
-
-      Add_Actions
-        (Item_Sets, Grammar, Has_Empty_Production, First_Nonterm_Set, 
Unknown_Conflicts, Table.all, Descriptor);
-
-      --  Set Table.States.Productions, Minimal_Complete_Actions for 
McKenzie_Recover
-      for State in Table.States'Range loop
-         Table.States (State).Productions := LR1_Items.Productions
-           (LR1_Items.Filter (Item_Sets (State), Grammar, Descriptor, 
LR1_Items.In_Kernel'Access));
-
-         if Trace_Generate > Detail then
-            Ada.Text_IO.Put_Line ("Set_Minimal_Complete_Actions:" & 
State_Index'Image (State));
-         end if;
-
-         WisiToken.Generate.LR.Set_Minimal_Complete_Actions
-           (Table.States (State),
-            LR1_Items.Filter (Item_Sets (State), Grammar, Descriptor, 
LR1_Items.In_Kernel'Access),
-            Descriptor, Grammar, Minimal_Terminal_Sequences, 
Minimal_Terminal_First);
-      end loop;
-
-      if Put_Parse_Table then
-         WisiToken.Generate.LR.Put_Parse_Table
-           (Table, "LR1", Grammar, Item_Sets, Unknown_Conflicts, Descriptor);
-      end if;
-
-      if Trace_Generate > Outline then
-         Ada.Text_IO.New_Line;
-         Ada.Text_IO.Put_Line ("Has_Empty_Production: " & Image 
(Has_Empty_Production, Descriptor));
-
-         Ada.Text_IO.New_Line;
-         Ada.Text_IO.Put_Line ("Minimal_Terminal_First:");
-         for ID in Minimal_Terminal_First'Range loop
-            Ada.Text_IO.Put_Line
-              (Image (ID, Descriptor) & " =>" &
-                 (if Minimal_Terminal_First (ID) = Invalid_Token_ID
-                  then ""
-                  else ' ' & Image (Minimal_Terminal_First (ID), Descriptor)));
-         end loop;
-      end if;
-
-      Delete_Known (Unknown_Conflicts, Known_Conflicts_Edit);
-
-      if Unknown_Conflicts.Length > 0 then
-         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "unknown 
conflicts:");
-         Put (Unknown_Conflicts, Ada.Text_IO.Current_Error, Descriptor);
-         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
-         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
-      end if;
-
-      if Known_Conflicts_Edit.Length > 0 then
-         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "excess known 
conflicts:");
-         Put (Known_Conflicts_Edit, Ada.Text_IO.Current_Error, Descriptor);
-         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
-         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
-      end if;
-
-      WisiToken.Generate.Error := WisiToken.Generate.Error or (Unused_Tokens 
and not Ignore_Unused_Tokens);
-
-      return Table;
-   end Generate;
-
-end WisiToken.Generate.LR.LR1_Generate;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under terms of the GNU General Public License as
+--  published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. This library is distributed in
+--  the hope that it will be useful, but WITHOUT ANY WARRANTY; without
+--  even the implied warranty of MERCHAN- TABILITY or FITNESS FOR A
+--  PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers;
+with Ada.Text_IO;
+with WisiToken.Generate;
+package body WisiToken.Generate.LR.LR1_Generate is
+
+   function LR1_Goto_Transitions
+     (Set                     : in LR1_Items.Item_Set;
+      Symbol                  : in Token_ID;
+      Has_Empty_Production    : in Token_ID_Set;
+      First_Terminal_Sequence : in Token_Sequence_Arrays.Vector;
+      Grammar                 : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor              : in WisiToken.Descriptor)
+     return LR1_Items.Item_Set
+   is
+      use all type Ada.Containers.Count_Type;
+      use Token_ID_Arrays;
+      use LR1_Items;
+
+      Goto_Set : Item_Set;
+   begin
+      for Item of Set.Set loop
+         if Item.Dot /= No_Element then
+            if Element (Item.Dot) = Symbol and
+              --  We don't need a state with dot after EOI in the
+              --  accept production. EOI should only appear in the
+              --  accept production.
+              Symbol /= Descriptor.EOI_ID
+            then
+               Goto_Set.Set.Insert ((Item.Prod, Next (Item.Dot), new 
Token_ID_Set'(Item.Lookaheads.all)));
+            end if;
+         end if;
+      end loop;
+
+      if Goto_Set.Set.Length > 0 then
+         return Closure (Goto_Set, Has_Empty_Production, 
First_Terminal_Sequence, Grammar, Descriptor);
+      else
+         return Goto_Set;
+      end if;
+   end LR1_Goto_Transitions;
+
+   function LR1_Item_Sets
+     (Has_Empty_Production    : in Token_ID_Set;
+      First_Terminal_Sequence : in Token_Sequence_Arrays.Vector;
+      Grammar                 : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor              : in WisiToken.Descriptor)
+     return LR1_Items.Item_Set_List
+   is
+      use all type Ada.Containers.Count_Type;
+
+      --  [dragon] algorithm 4.9 pg 231; figure 4.38 pg 232; procedure
+      --  "items", with some optimizations.
+
+      use LR1_Items;
+
+      First_State_Index : constant State_Index := 0;
+
+      C               : LR1_Items.Item_Set_List;       -- result
+      C_Tree          : LR1_Items.Item_Set_Trees.Tree; -- for fast find
+      States_To_Check : State_Index_Queues.Queue;
+      --  [dragon] specifies 'until no more items can be added', but we use
+      --  a queue to avoid checking unecessary states. Ada LR1 has over
+      --  100,000 states, so this is a significant gain (reduced time from
+      --  600 seconds to 40).
+
+      I       : State_Index;
+      Dot_IDs : Token_ID_Arrays.Vector;
+
+      New_Item_Set : Item_Set := Closure
+        ((Set            => Item_Lists.To_List
+            ((Prod       => (Grammar.First_Index, 0),
+              Dot        => Grammar (Grammar.First_Index).RHSs 
(0).Tokens.First,
+              Lookaheads => new Token_ID_Set'(To_Lookahead (Descriptor.EOI_ID, 
Descriptor)))),
+          Goto_List      => <>,
+          Dot_IDs        => <>,
+          State          => First_State_Index),
+        Has_Empty_Production, First_Terminal_Sequence, Grammar, Descriptor);
+
+      Found_State  : Unknown_State_Index;
+
+   begin
+      C.Set_First (First_State_Index);
+
+      Add (New_Item_Set, C, C_Tree, Descriptor, Include_Lookaheads => True);
+
+      States_To_Check.Put (First_State_Index);
+      loop
+         exit when States_To_Check.Is_Empty;
+         I := States_To_Check.Get;
+
+         if Trace_Generate > Outline then
+            Ada.Text_IO.Put ("Checking ");
+            Put (Grammar, Descriptor, C (I), Show_Lookaheads => True, 
Show_Goto_List => True);
+         end if;
+
+         Dot_IDs := C (I).Dot_IDs;
+         --  We can't iterate on C (I).Dot_IDs when the loop adds items to C;
+         --  it might be reallocated to grow.
+
+         for Symbol of Dot_IDs loop
+            --  [dragon] has 'for each grammar symbol X', but 
LR1_Goto_Transitions
+            --  rejects Symbol that is not in Dot_IDs, so we iterate over that.
+
+            New_Item_Set := LR1_Goto_Transitions
+              (C (I), Symbol, Has_Empty_Production, First_Terminal_Sequence, 
Grammar, Descriptor);
+
+            if New_Item_Set.Set.Length > 0 then -- 'goto (I, X) not empty'
+
+               Found_State := Find (New_Item_Set, C_Tree, Match_Lookaheads => 
True); -- 'not in C'
+
+               if Found_State = Unknown_State then
+                  New_Item_Set.State := C.Last_Index + 1;
+
+                  States_To_Check.Put (New_Item_Set.State);
+
+                  Add (New_Item_Set, C, C_Tree, Descriptor, Include_Lookaheads 
=> True);
+
+                  if Trace_Generate > Outline then
+                     Ada.Text_IO.Put_Line
+                       ("  adding state" & Unknown_State_Index'Image 
(C.Last_Index) & ": from state" &
+                          Unknown_State_Index'Image (I) & " on " & Image 
(Symbol, Descriptor));
+                     Put (Grammar, Descriptor, New_Item_Set, Show_Lookaheads 
=> True);
+                  end if;
+
+                  C (I).Goto_List.Insert ((Symbol, C.Last_Index));
+               else
+
+                  --  If there's not already a goto entry between these two 
sets, create one.
+                  if not Is_In ((Symbol, Found_State), Goto_List => C 
(I).Goto_List) then
+                     if Trace_Generate > Outline then
+                        Ada.Text_IO.Put_Line
+                          ("  adding goto on " & Image (Symbol, Descriptor) & 
" to state" &
+                             Unknown_State_Index'Image (Found_State));
+
+                     end if;
+
+                     C (I).Goto_List.Insert ((Symbol, Found_State));
+                  end if;
+               end if;
+            end if;
+         end loop;
+      end loop;
+
+      if Trace_Generate > Outline then
+         Ada.Text_IO.New_Line;
+      end if;
+
+      return C;
+   end LR1_Item_Sets;
+
+   procedure Add_Actions
+     (Item_Sets            : in     LR1_Items.Item_Set_List;
+      Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production : in     Token_ID_Set;
+      First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      :    out Conflict_Count_Lists.List;
+      Conflicts            :    out Conflict_Lists.List;
+      Table                : in out Parse_Table;
+      Descriptor           : in     WisiToken.Descriptor)
+   is
+      --  Add actions for all Item_Sets to Table.
+   begin
+      for Item_Set of Item_Sets loop
+         Add_Actions
+           (Item_Set, Table, Grammar, Has_Empty_Production, First_Nonterm_Set, 
Conflict_Counts, Conflicts, Descriptor);
+      end loop;
+
+      if Trace_Generate > Outline then
+         Ada.Text_IO.New_Line;
+      end if;
+   end Add_Actions;
+
+   function Generate
+     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor        : in WisiToken.Descriptor;
+      Known_Conflicts   : in Conflict_Lists.List := Conflict_Lists.Empty_List;
+      McKenzie_Param    : in McKenzie_Param_Type := Default_McKenzie_Param;
+      Put_Parse_Table   : in Boolean             := False;
+      Include_Extra     : in Boolean             := False;
+      Ignore_Conflicts  : in Boolean             := False;
+      Partial_Recursion : in Boolean             := True)
+     return Parse_Table_Ptr
+   is
+      use type Ada.Containers.Count_Type;
+
+      Ignore_Unused_Tokens     : constant Boolean := WisiToken.Trace_Generate 
> Detail;
+      Ignore_Unknown_Conflicts : constant Boolean := Ignore_Conflicts or 
WisiToken.Trace_Generate > Detail;
+      Unused_Tokens            : constant Boolean := 
WisiToken.Generate.Check_Unused_Tokens (Descriptor, Grammar);
+
+      Table : Parse_Table_Ptr;
+
+      Has_Empty_Production : constant Token_ID_Set := 
WisiToken.Generate.Has_Empty_Production (Grammar);
+
+      Recursions : constant WisiToken.Generate.Recursions :=
+        (if Partial_Recursion
+         then WisiToken.Generate.Compute_Partial_Recursion (Grammar)
+         else WisiToken.Generate.Compute_Full_Recursion (Grammar));
+      Minimal_Terminal_Sequences : constant Minimal_Sequence_Array :=
+        Compute_Minimal_Terminal_Sequences (Descriptor, Grammar, Recursions);
+
+      Minimal_Terminal_First : constant Token_Array_Token_ID :=
+        Compute_Minimal_Terminal_First (Descriptor, 
Minimal_Terminal_Sequences);
+
+      First_Nonterm_Set : constant Token_Array_Token_Set := 
WisiToken.Generate.First
+        (Grammar, Has_Empty_Production, Descriptor.First_Terminal);
+
+      First_Terminal_Sequence : constant Token_Sequence_Arrays.Vector :=
+        WisiToken.Generate.To_Terminal_Sequence_Array (First_Nonterm_Set, 
Descriptor);
+
+      Item_Sets : constant LR1_Items.Item_Set_List := LR1_Item_Sets
+        (Has_Empty_Production, First_Terminal_Sequence, Grammar, Descriptor);
+
+      Conflict_Counts      : Conflict_Count_Lists.List;
+      Unknown_Conflicts    : Conflict_Lists.List;
+      Known_Conflicts_Edit : Conflict_Lists.List := Known_Conflicts;
+   begin
+      if Trace_Generate > Outline then
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("LR(1) Item_Sets:");
+         LR1_Items.Put (Grammar, Descriptor, Item_Sets);
+      end if;
+
+      Table := new Parse_Table
+        (State_First       => Item_Sets.First_Index,
+         State_Last        => Item_Sets.Last_Index,
+         First_Terminal    => Descriptor.First_Terminal,
+         Last_Terminal     => Descriptor.Last_Terminal,
+         First_Nonterminal => Descriptor.First_Nonterminal,
+         Last_Nonterminal  => Descriptor.Last_Nonterminal);
+
+      if McKenzie_Param = Default_McKenzie_Param then
+         --  Descriminants in Default are wrong
+         Table.McKenzie_Param :=
+           (First_Terminal              => Descriptor.First_Terminal,
+            Last_Terminal               => Descriptor.Last_Terminal,
+            First_Nonterminal           => Descriptor.First_Nonterminal,
+            Last_Nonterminal            => Descriptor.Last_Nonterminal,
+            Insert                      => (others => 0),
+            Delete                      => (others => 0),
+            Push_Back                   => (others => 0),
+            Undo_Reduce                 => (others => 0),
+            Minimal_Complete_Cost_Delta => 
Default_McKenzie_Param.Minimal_Complete_Cost_Delta,
+            Fast_Forward                => Default_McKenzie_Param.Fast_Forward,
+            Matching_Begin              => 
Default_McKenzie_Param.Matching_Begin,
+            Ignore_Check_Fail           => 
Default_McKenzie_Param.Ignore_Check_Fail,
+            Task_Count                  => Default_McKenzie_Param.Task_Count,
+            Check_Limit                 => Default_McKenzie_Param.Check_Limit,
+            Check_Delta_Limit           => 
Default_McKenzie_Param.Check_Delta_Limit,
+            Enqueue_Limit               => 
Default_McKenzie_Param.Enqueue_Limit);
+      else
+         Table.McKenzie_Param := McKenzie_Param;
+      end if;
+
+      Add_Actions
+        (Item_Sets, Grammar, Has_Empty_Production, First_Nonterm_Set,
+         Conflict_Counts, Unknown_Conflicts, Table.all, Descriptor);
+
+      for State in Table.States'Range loop
+         if Trace_Generate > Extra then
+            Ada.Text_IO.Put_Line ("Set_Minimal_Complete_Actions:" & 
State_Index'Image (State));
+         end if;
+         WisiToken.Generate.LR.Set_Minimal_Complete_Actions
+           (Table.States (State),
+            LR1_Items.Filter (Item_Sets (State), Grammar, Descriptor, 
LR1_Items.In_Kernel'Access),
+            Descriptor, Grammar, Minimal_Terminal_Sequences, 
Minimal_Terminal_First);
+      end loop;
+
+      if Put_Parse_Table then
+         WisiToken.Generate.LR.Put_Parse_Table
+           (Table, "LR1", Grammar, Recursions, Minimal_Terminal_Sequences, 
Item_Sets, Conflict_Counts, Descriptor,
+            Include_Extra);
+      end if;
+
+      if Trace_Generate > Outline then
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("Has_Empty_Production: " & Image 
(Has_Empty_Production, Descriptor));
+
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("Minimal_Terminal_First:");
+         for ID in Minimal_Terminal_First'Range loop
+            Ada.Text_IO.Put_Line
+              (Image (ID, Descriptor) & " =>" &
+                 (if Minimal_Terminal_First (ID) = Invalid_Token_ID
+                  then ""
+                  else ' ' & Image (Minimal_Terminal_First (ID), Descriptor)));
+         end loop;
+      end if;
+
+      Delete_Known (Unknown_Conflicts, Known_Conflicts_Edit);
+
+      if Unknown_Conflicts.Length > 0 then
+         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "unknown 
conflicts:");
+         Put (Unknown_Conflicts, Ada.Text_IO.Current_Error, Descriptor);
+         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
+         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
+      end if;
+
+      if Known_Conflicts_Edit.Length > 0 then
+         Ada.Text_IO.Put_Line (Ada.Text_IO.Current_Error, "excess known 
conflicts:");
+         Put (Known_Conflicts_Edit, Ada.Text_IO.Current_Error, Descriptor);
+         Ada.Text_IO.New_Line (Ada.Text_IO.Current_Error);
+         WisiToken.Generate.Error := WisiToken.Generate.Error or not 
Ignore_Unknown_Conflicts;
+      end if;
+
+      WisiToken.Generate.Error := WisiToken.Generate.Error or (Unused_Tokens 
and not Ignore_Unused_Tokens);
+
+      return Table;
+   end Generate;
+
+end WisiToken.Generate.LR.LR1_Generate;
diff --git a/packages/wisi/wisitoken-generate-lr-lr1_generate.ads 
b/packages/wisi/wisitoken-generate-lr-lr1_generate.ads
index 92992cb..6e8ade6 100644
--- a/packages/wisi/wisitoken-generate-lr-lr1_generate.ads
+++ b/packages/wisi/wisitoken-generate-lr-lr1_generate.ads
@@ -30,11 +30,14 @@ with WisiToken.Productions;
 package WisiToken.Generate.LR.LR1_Generate is
 
    function Generate
-     (Grammar         : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor      : in WisiToken.Descriptor;
-      Known_Conflicts : in Conflict_Lists.List := Conflict_Lists.Empty_List;
-      McKenzie_Param  : in McKenzie_Param_Type := Default_McKenzie_Param;
-      Put_Parse_Table : in Boolean := False)
+     (Grammar           : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor        : in WisiToken.Descriptor;
+      Known_Conflicts   : in Conflict_Lists.List := Conflict_Lists.Empty_List;
+      McKenzie_Param    : in McKenzie_Param_Type := Default_McKenzie_Param;
+      Put_Parse_Table   : in Boolean             := False;
+      Include_Extra     : in Boolean             := False;
+      Ignore_Conflicts  : in Boolean             := False;
+      Partial_Recursion : in Boolean             := True)
      return Parse_Table_Ptr
    with Pre => Descriptor.First_Nonterminal = Descriptor.Accept_ID;
    --  Generate a generalized LR1 parse table for Grammar. The
@@ -78,6 +81,7 @@ package WisiToken.Generate.LR.LR1_Generate is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      :    out Conflict_Count_Lists.List;
       Conflicts            :    out Conflict_Lists.List;
       Table                : in out Parse_Table;
       Descriptor           : in     WisiToken.Descriptor);
diff --git a/packages/wisi/wisitoken-generate-lr.adb 
b/packages/wisi/wisitoken-generate-lr.adb
index f909fde..b814885 100644
--- a/packages/wisi/wisitoken-generate-lr.adb
+++ b/packages/wisi/wisitoken-generate-lr.adb
@@ -24,30 +24,12 @@ with WisiToken.Generate;
 package body WisiToken.Generate.LR is
 
    package RHS_Set is new SAL.Gen_Unbounded_Definite_Vectors (Natural, 
Boolean, Default_Element => False);
-   type Token_ID_RHS_Set is array (Token_ID range <>) of RHS_Set.Vector;
 
-   type Token_ID_Array_Positive is array (Token_ID range <>) of Positive;
+   type LHS_RHS_Set is array (Token_ID range <>) of RHS_Set.Vector;
 
    ----------
    --  Body subprograms, alphabetical
 
-   function Find
-     (Symbol      : in Token_ID;
-      Action_List : in Action_Node_Ptr)
-     return Action_Node_Ptr
-   is
-      Action_Node : Action_Node_Ptr := Action_List;
-   begin
-      while Action_Node /= null loop
-         if Action_Node.Symbol = Symbol then
-            return Action_Node;
-         end if;
-         Action_Node := Action_Node.Next;
-      end loop;
-
-      return null;
-   end Find;
-
    function Min
      (Item    : in RHS_Sequence_Arrays.Vector;
       RHS_Set : in LR.RHS_Set.Vector)
@@ -70,15 +52,72 @@ package body WisiToken.Generate.LR is
       end if;
    end Min;
 
+   function Net_Recursion (Cycle : in Recursion_Cycle; RHS : in Natural) 
return Recursion
+   is
+      Result : Recursion := None;
+   begin
+      if Cycle'Length = 1 then
+         for E of Cycle (Cycle'First).Edges loop
+            if E.Data.RHS = RHS then
+               Result := Net_Recursion (Result, E.Data.Recursive);
+            end if;
+         end loop;
+      else
+         for Item of Cycle loop
+            for E of Item.Edges loop
+               Result := Net_Recursion (Result, E.Data.Recursive);
+            end loop;
+         end loop;
+      end if;
+      return Result;
+   end Net_Recursion;
+
+   function Worst_Recursion (Cycle : in Recursion_Cycle; RHS : in Natural) 
return Recursion
+   is
+      Result : Recursion := None;
+   begin
+      if Cycle'Length = 1 then
+         for E of Cycle (Cycle'First).Edges loop
+            if E.Data.RHS = RHS then
+               Result := Worst_Recursion (Result, E.Data.Recursive);
+            end if;
+         end loop;
+      else
+         for Item of Cycle loop
+            for E of Item.Edges loop
+               Result := Worst_Recursion (Result, E.Data.Recursive);
+            end loop;
+         end loop;
+      end if;
+      return Result;
+   end Worst_Recursion;
+
+   function Worst_Recursion
+     (Recursion_IDs : in Recursion_Lists.List;
+      Recursions    : in Generate.Recursions;
+      RHS           : in Natural)
+     return Recursion
+   is
+      Result : Recursion := None;
+   begin
+      for ID of Recursion_IDs loop
+         Result := Worst_Recursion
+           (Result,
+            (if Recursions.Full
+             then Net_Recursion (Recursions.Recursions (ID), RHS)
+             else Worst_Recursion (Recursions.Recursions (ID), RHS)));
+      end loop;
+      return Result;
+   end Worst_Recursion;
+
    procedure Terminal_Sequence
-     (Grammar         : in     WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor      : in     WisiToken.Descriptor;
-      All_Sequences   : in out Minimal_Sequence_Array;
-      All_Set         : in out Token_ID_Set;
-      RHS_Set         : in out Token_ID_RHS_Set;
-      Recursing       : in out Token_ID_Set;
-      Recursing_Index : in out Token_ID_Array_Positive;
-      Nonterm         : in     Token_ID)
+     (Grammar       : in     WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor    : in     WisiToken.Descriptor;
+      All_Sequences : in out Minimal_Sequence_Array;
+      All_Seq_Set   : in out Token_ID_Set;
+      RHS_Seq_Set   : in out LHS_RHS_Set;
+      Recursing     : in out Token_ID_Set;
+      Nonterm       : in     Token_ID)
    is
       use Ada.Containers;
       use Token_ID_Arrays;
@@ -88,35 +127,45 @@ package body WisiToken.Generate.LR is
       Prod : Productions.Instance renames Grammar (Nonterm);
 
       Skipped_Recursive : Boolean := False;
+
+      procedure Init_All_Sequences (LHS : in Token_ID)
+      is
+         Prod : Productions.Instance renames Grammar (LHS);
+      begin
+         if All_Sequences (LHS).Length = 0 then
+            All_Sequences (LHS).Set_First_Last (Prod.RHSs.First_Index, 
Prod.RHSs.Last_Index);
+         end if;
+         if RHS_Seq_Set (LHS).Length = 0 then
+            RHS_Seq_Set (LHS).Set_First_Last (Prod.RHSs.First_Index, 
Prod.RHSs.Last_Index);
+         end if;
+      end Init_All_Sequences;
+
    begin
-      --  We get here because All_Sequences (Nonterm) has not been comptued
-      --  yet. Attempt to compute All_Sequences (Nonterm); it may not
-      --  succeed due to recursion. If successful, set All_Set (Nonterm)
-      --  True.
+      --  We get here because All_Sequences (Nonterm) has not been fully
+      --  computed yet (All_Seq_Set (Nonterm) is False). Attempt to
+      --  compute All_Sequences (Nonterm); it may not succeed due to
+      --  recursion. If successful, set All_Seq_Set (Nonterm).
       --
       --  In a useful grammar, all direct and indirect recursive nonterms
       --  have a non-recursive minimal terminal sequence; finding it will
       --  break the recursion, allowing this algorithm to complete. This is
       --  checked in Compute_Minimal_Terminal_Sequences.
 
-      --  Fill All_Sequences (Nonterm) with terminals from each production
-      --  for Nonterm. We set partial results so recursion can be resolved.
-      if All_Sequences (Nonterm).Length = 0 then
-         All_Sequences (Nonterm).Set_First_Last (Prod.RHSs.First_Index, 
Prod.RHSs.Last_Index); -- defaults empty
-         RHS_Set (Nonterm).Set_First_Last (Prod.RHSs.First_Index, 
Prod.RHSs.Last_Index); -- defaults False
-      end if;
+      Init_All_Sequences (Nonterm);
 
       for RHS in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index loop
-         if not RHS_Set (Nonterm)(RHS) then
+         if not RHS_Seq_Set (Nonterm)(RHS) then
+            if Trace_Generate > Extra then
+               Ada.Text_IO.Put_Line (Trimmed_Image ((Nonterm, RHS)) & " " & 
Image (Nonterm, Descriptor) & " compute");
+            end if;
             if Prod.RHSs (RHS).Tokens.Length = 0 then
-               RHS_Set (Nonterm)(RHS) := True;
+               RHS_Seq_Set (Nonterm)(RHS) := True;
                if Trace_Generate > Extra then
                   Ada.Text_IO.Put_Line (Trimmed_Image (Production_ID'(Nonterm, 
RHS)) & " => () empty");
                end if;
 
             else
                for I in Prod.RHSs (RHS).Tokens.First_Index .. Prod.RHSs 
(RHS).Tokens.Last_Index loop
-                  Recursing_Index (Nonterm) := I;
                   declare
                      ID : Token_ID renames Prod.RHSs (RHS).Tokens (I);
                   begin
@@ -124,40 +173,22 @@ package body WisiToken.Generate.LR is
                         All_Sequences (Nonterm) (RHS).Sequence.Append (ID);
 
                      else
-                        if not All_Set (ID) then
-                           --  Need to compute some RHSs of ID
-
+                        if (for some RHS of RHS_Seq_Set (ID) => RHS) then
+                           --  There is a minimal sequence for ID; use it
+                           null;
+                        else
                            if ID = Nonterm or Recursing (ID) then
-                              --  Nonterm is mutually recursive with itself or 
some other.
-                              All_Sequences (Nonterm)(RHS).Left_Recursive := I 
= Positive'First and
-                                (ID = Nonterm or Recursing_Index (ID) = 
Positive'First);
+                              --  Clear partial minimal sequence; we are 
starting over.
+                              All_Sequences (Nonterm)(RHS).Sequence.Clear;
+                              goto Skip;
 
-                              if (for some RHS of RHS_Set (ID) => RHS) then
-                                 --  There is a minimal sequence for ID; use it
-                                 null;
-                              else
-                                 if Trace_Generate > Extra then
-                                    Ada.Text_IO.Put_Line
-                                      (Trimmed_Image (Production_ID'(Nonterm, 
RHS)) & "." & Trimmed_Image (I) & " => " &
-                                         (if ID = Nonterm
-                                          then "direct recursive"
-                                          else "indirect recursive " & Image 
(ID, Descriptor)));
-                                 end if;
-
-                                 All_Sequences (Nonterm)(RHS).Left_Recursive 
:= False;
-                                 All_Sequences (Nonterm)(RHS).Sequence.Clear;
-                                 goto Skip;
-                              end if;
                            else
                               Recursing (ID) := True;
-                              if Trace_Generate > Extra then
-                                 Ada.Text_IO.Put_Line (Trimmed_Image (ID) & " 
" & Image (ID, Descriptor) & " compute");
-                              end if;
                               Terminal_Sequence
-                                (Grammar, Descriptor, All_Sequences, All_Set, 
RHS_Set, Recursing, Recursing_Index, ID);
+                                (Grammar, Descriptor, All_Sequences, 
All_Seq_Set, RHS_Seq_Set, Recursing, ID);
                               Recursing (ID) := False;
 
-                              if All_Set (ID) or else (for some RHS of RHS_Set 
(ID) => RHS) then
+                              if All_Seq_Set (ID) or else (for some RHS of 
RHS_Seq_Set (ID) => RHS) then
                                  --  Found a minimal sequence for ID; use it
                                  null;
                               else
@@ -167,14 +198,14 @@ package body WisiToken.Generate.LR is
                            end if;
                         end if;
                         declare
-                           Min_RHS : constant Integer := Min (All_Sequences 
(ID), RHS_Set (ID));
+                           Min_RHS : constant Integer := Min (All_Sequences 
(ID), RHS_Seq_Set (ID));
                         begin
                            All_Sequences (Nonterm)(RHS).Sequence.Append 
(All_Sequences (ID)(Min_RHS).Sequence);
                         end;
                      end if;
                   end;
                end loop;
-               RHS_Set (Nonterm)(RHS) := True;
+               RHS_Seq_Set (Nonterm)(RHS) := True;
                if Trace_Generate > Extra then
                   Ada.Text_IO.Put_Line
                     (Trimmed_Image (Production_ID'(Nonterm, RHS)) & " => " &
@@ -187,7 +218,7 @@ package body WisiToken.Generate.LR is
       end loop;
 
       if Skipped_Recursive then
-         if (for some RHS of RHS_Set (Nonterm) => not RHS) then
+         if (for some RHS of RHS_Seq_Set (Nonterm) => not RHS) then
             --  Some RHSs are have unresolved recursion; we will
             --  eventually try again when the recursion is resolved.
             if Trace_Generate > Extra then
@@ -198,7 +229,7 @@ package body WisiToken.Generate.LR is
          end if;
       end if;
 
-      All_Set (Nonterm) := True;
+      All_Seq_Set (Nonterm) := True;
 
       if Trace_Generate > Extra then
          Ada.Text_IO.Put_Line
@@ -228,31 +259,33 @@ package body WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Descriptor           : in     WisiToken.Descriptor)
    is
       Matching_Action : constant Action_Node_Ptr := Find (Symbol, Action_List);
    begin
-      if Trace_Generate > Outline then
+      if Trace_Generate > Detail then
          Ada.Text_IO.Put (Image (Symbol, Descriptor) & " => ");
          Put (Descriptor, Action);
          Ada.Text_IO.New_Line;
       end if;
 
       if Matching_Action /= null then
-         if Equal (Matching_Action.Action.Item, Action) then
-            --  Matching_Action is identical to Action, so there is no
-            --  conflict; just don't add it again.
-            if Trace_Generate > Outline then
+         if Is_In (Action, Matching_Action.Action) then
+            --  Action is already in the list.
+            if Trace_Generate > Detail then
                Ada.Text_IO.Put_Line (" - already present");
             end if;
             return;
          else
             --  There is a conflict. Report it and add it, so the
-            --  generalized parser can follow both paths
+            --  generalized parser can follow all paths
             declare
-               --  Enforce canonical Shift/Reduce or Accept/Reduce
-               --  order, to simplify searching and code generation.
+               --  Enforce canonical Shift/Reduce or Accept/Reduce order, to 
simplify
+               --  searching and code generation. There can be only one Shift 
in the
+               --  list of conflicting actions, so we keep it the first item 
in the
+               --  list; no order in the rest of the list.
                Action_A : constant Parse_Action_Rec :=
                  (if Action.Verb in Shift | Accept_It then Action else 
Matching_Action.Action.Item);
 
@@ -268,37 +301,66 @@ package body WisiToken.Generate.LR is
                     (Closure, Action_B, Symbol, Grammar, Has_Empty_Production, 
First_Nonterm_Set, Descriptor),
                   State_Index => Closure.State,
                   On          => Symbol);
+
+               Counts : Conflict_Count_Lists.Cursor;
             begin
+               for Cur in Conflict_Counts.Iterate loop
+                  if Conflict_Counts (Cur).State = Closure.State then
+                     Counts := Cur;
+                     exit;
+                  end if;
+               end loop;
+
+               if not Conflict_Count_Lists.Has_Element (Counts) then
+                  Conflict_Counts.Append ((Closure.State, others => 0));
+                  Counts := Conflict_Counts.Last;
+               end if;
+
+               declare
+                  use Conflict_Count_Lists;
+                  Counts_Ref : constant Reference_Type := Reference 
(Conflict_Counts, Counts);
+               begin
+                  case Action_A.Verb is
+                  when Shift =>
+                     case Action_B.Verb is
+                     when Shift | Accept_It | WisiToken.Parse.LR.Error =>
+                        raise SAL.Programmer_Error;
+                     when Reduce =>
+                        Counts_Ref.Shift_Reduce := Counts_Ref.Shift_Reduce + 1;
+                     end case;
+                  when Reduce =>
+                     case Action_B.Verb is
+                     when Shift | Accept_It | WisiToken.Parse.LR.Error =>
+                        raise SAL.Programmer_Error;
+                     when Reduce =>
+                        Counts_Ref.Reduce_Reduce := Counts_Ref.Reduce_Reduce + 
1;
+                     end case;
+                  when Accept_It =>
+                     case Action_B.Verb is
+                     when Shift | Accept_It | WisiToken.Parse.LR.Error =>
+                        raise SAL.Programmer_Error;
+                     when Reduce =>
+                        Counts_Ref.Accept_Reduce := Counts_Ref.Accept_Reduce + 
1;
+                     end case;
+                  when WisiToken.Parse.LR.Error =>
+                     raise SAL.Programmer_Error;
+                  end case;
+               end;
+
                if not Is_Present (New_Conflict, Conflicts) then
                   --  The same conflict may occur in a different
                   --  item set. Only add it to conflicts once.
                   Conflicts.Append (New_Conflict);
 
-                  if Trace_Generate > Outline then
+                  if Trace_Generate > Detail then
                      Ada.Text_IO.Put_Line (" - conflict added: " & Image 
(New_Conflict, Descriptor));
                   end if;
                else
-                  if Trace_Generate > Outline then
+                  if Trace_Generate > Detail then
                      Ada.Text_IO.Put_Line (" - conflict duplicate: " & Image 
(New_Conflict, Descriptor));
                   end if;
                end if;
 
-               --  More than two actions can occur; see triple_conflict.wy. We 
make
-               --  that an error, since the grammar will be better off without 
them.
-               --  But keep going; the full parse table output will be needed 
to fix
-               --  the excess conflict.
-               if Matching_Action.Action.Next /= null then
-                  if Matching_Action.Action.Item = Action or 
Matching_Action.Action.Next.Item = Action then
-                     if Trace_Generate > Outline then
-                        Ada.Text_IO.Put_Line (" - conflict duplicate");
-                     end if;
-                  else
-                     WisiToken.Generate.Put_Error
-                       ("More than two actions on " & Image (Symbol, 
Descriptor) &
-                          " in state" & State_Index'Image (Closure.State));
-                  end if;
-               end if;
-
                if Action.Verb = Shift then
                   Matching_Action.Action := new Parse_Action_Node'(Action, 
Matching_Action.Action);
                else
@@ -317,6 +379,7 @@ package body WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Descriptor           : in     WisiToken.Descriptor)
    is
@@ -324,7 +387,7 @@ package body WisiToken.Generate.LR is
 
       State : constant State_Index := Closure.State;
    begin
-      if Trace_Generate > Outline then
+      if Trace_Generate > Detail then
          Ada.Text_IO.Put_Line ("adding actions for state" & State_Index'Image 
(State));
       end if;
 
@@ -334,7 +397,7 @@ package body WisiToken.Generate.LR is
 
             Add_Lookahead_Actions
               (Item, Table.States (State).Action_List, Grammar, 
Has_Empty_Production, First_Nonterm_Set,
-               Conflicts, Closure, Descriptor);
+               Conflict_Counts, Conflicts, Closure, Descriptor);
 
          elsif Element (Item.Dot) in Descriptor.First_Terminal .. 
Descriptor.Last_Terminal then
             --  Dot is before a terminal token.
@@ -358,7 +421,7 @@ package body WisiToken.Generate.LR is
                         --  EOF is not pushed on stack in parser, because the 
action for EOF
                         --  is Accept, not Shift.
                         Table.States (State).Action_List, Closure,
-                        Grammar, Has_Empty_Production, First_Nonterm_Set, 
Conflicts, Descriptor);
+                        Grammar, Has_Empty_Production, First_Nonterm_Set, 
Conflict_Counts, Conflicts, Descriptor);
                   end;
                else
                   if Goto_State /= Unknown_State then
@@ -366,13 +429,14 @@ package body WisiToken.Generate.LR is
                        (Dot_ID,
                         (Shift, Goto_State),
                         Table.States (State).Action_List,
-                        Closure, Grammar, Has_Empty_Production, 
First_Nonterm_Set, Conflicts, Descriptor);
+                        Closure, Grammar, Has_Empty_Production, 
First_Nonterm_Set,
+                        Conflict_Counts, Conflicts, Descriptor);
                   end if;
                end if;
             end;
          else
             --  Dot is before a non-terminal token; no action.
-            if Trace_Generate > Outline then
+            if Trace_Generate > Detail then
                Ada.Text_IO.Put_Line (Image (Element (Item.Dot), Descriptor) & 
" => no action");
             end if;
          end if;
@@ -437,6 +501,7 @@ package body WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Closure              : in     LR1_Items.Item_Set;
       Descriptor           : in     WisiToken.Descriptor)
@@ -445,7 +510,7 @@ package body WisiToken.Generate.LR is
       RHS    : Productions.Right_Hand_Side renames Prod.RHSs (Item.Prod.RHS);
       Action : constant Parse_Action_Rec := (Reduce, Item.Prod, RHS.Action, 
RHS.Check, RHS.Tokens.Length);
    begin
-      if Trace_Generate > Outline then
+      if Trace_Generate > Detail then
          Ada.Text_IO.Put_Line ("processing lookaheads");
       end if;
 
@@ -457,7 +522,7 @@ package body WisiToken.Generate.LR is
             else
                Add_Action
                  (Lookahead, Action, Action_List, Closure, Grammar,
-                  Has_Empty_Production, First_Nonterm_Set, Conflicts, 
Descriptor);
+                  Has_Empty_Production, First_Nonterm_Set, Conflict_Counts, 
Conflicts, Descriptor);
             end if;
          end if;
       end loop;
@@ -635,9 +700,13 @@ package body WisiToken.Generate.LR is
         Known.On = Item.On;
    end Match;
 
+   ----------
+   --  Minimal terminal sequences.
+
    function Image (Item : in RHS_Sequence; Descriptor : in 
WisiToken.Descriptor) return String
    is begin
-      return "(" & Boolean'Image (Item.Left_Recursive) & ", " & Image 
(Item.Sequence, Descriptor) & ")";
+      return "(" & Image (Item.Recursion) & ", " & Recursion'Image 
(Item.Worst_Recursion) & ", " &
+        Image (Item.Sequence, Descriptor) & ")";
    end Image;
 
    function Min (Item : in RHS_Sequence_Arrays.Vector) return RHS_Sequence
@@ -661,43 +730,87 @@ package body WisiToken.Generate.LR is
    end Min;
 
    function Compute_Minimal_Terminal_Sequences
-     (Descriptor : in     WisiToken.Descriptor;
-      Grammar    : in     WisiToken.Productions.Prod_Arrays.Vector)
+     (Descriptor : in WisiToken.Descriptor;
+      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector;
+      Recursions : in Generate.Recursions)
      return Minimal_Sequence_Array
    is
-      --  Result (ID).Length = 0 is a valid sequence (ie the nonterminal can
-      --  be empty), so we use an auxilliary array to track whether Result
-      --  (ID) has been computed.
-      --
-      --  We also need to detect mutual recursion, and incomplete grammars.
-
-      All_Set   : Token_ID_Set := (Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal  => False);
-      Recursing : Token_ID_Set := (Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal  => False);
+      --  Result (ID).Sequence.Length = 0 is a valid result (ie the
+      --  nonterminal can be empty), so we use an auxilliary array to track
+      --  whether Result (ID) has been computed.
 
-      Recursing_Index : Token_ID_Array_Positive :=
-        (Descriptor.First_Nonterminal .. Descriptor.Last_Nonterminal  => 
Positive'Last);
+      All_Seq_Set : Token_ID_Set := (Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal => False);
+      Recursing   : Token_ID_Set := (Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal => False);
 
-      RHS_Set : Token_ID_RHS_Set :=
-        (Descriptor.First_Nonterminal .. Descriptor.Last_Nonterminal => 
LR.RHS_Set.Empty_Vector);
+      RHS_Seq_Set : LHS_RHS_Set :=
+        (Descriptor.First_Nonterminal .. Descriptor.Last_Nonterminal => 
RHS_Set.Empty_Vector);
 
-      Last_Count : Integer := 0;
-      This_Count : Integer;
+      Last_Seq_Count : Integer := 0;
+      This_Count     : Integer;
+      Pass_Count     : Integer := 0;
    begin
       return Result : Minimal_Sequence_Array (Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal) do
          loop
-            exit when (for all B of All_Set => B);
-            for P of Grammar loop
-               if not All_Set (P.LHS) then
-                  Terminal_Sequence (Grammar, Descriptor, Result, All_Set, 
RHS_Set, Recursing, Recursing_Index, P.LHS);
+            exit when (for all B of All_Seq_Set => B);
+            Pass_Count := Pass_Count + 1;
+            if Trace_Generate > Detail then
+               if Trace_Generate > Extra then
+                  Ada.Text_IO.New_Line;
                end if;
+               Ada.Text_IO.Put_Line ("Compute_Minimal_Terminal_Sequences pass" 
& Integer'Image (Pass_Count));
+            end if;
+            for P of Grammar loop
+               Terminal_Sequence (Grammar, Descriptor, Result, All_Seq_Set, 
RHS_Seq_Set, Recursing, P.LHS);
             end loop;
-            This_Count := Count (All_Set);
-            if This_Count = Last_Count then
-               Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, Image 
(All_Set, Descriptor, Inverted => True));
-               raise Grammar_Error with "recursion not resolved";
+            This_Count := Count (All_Seq_Set);
+            if This_Count = Last_Seq_Count then
+               Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, Image 
(All_Seq_Set, Descriptor, Inverted => True));
+               raise Grammar_Error with "sequences not resolved";
             end if;
-            Last_Count := This_Count;
+            Last_Seq_Count := This_Count;
          end loop;
+
+         --  Set Result.Recursions
+         for Recursion_ID in Recursions.Recursions.First_Index .. 
Recursions.Recursions.Last_Index loop
+            declare
+               Cycle : Recursion_Cycle renames Recursions.Recursions 
(Recursion_ID);
+            begin
+               for I in Cycle'Range loop
+                  declare
+                     Edges : constant Grammar_Graphs.Edge_Lists.List :=
+                       (if Recursions.Full then
+                          (if I = Cycle'Last
+                           then Cycle (Cycle'First).Edges
+                           else Cycle (I + 1).Edges)
+                        else Cycle (I).Edges);
+                  begin
+                     for E of Edges loop
+                        Result (Cycle (I).Vertex)(E.Data.RHS).Recursion.Append 
(Recursion_ID);
+                     end loop;
+                  end;
+               end loop;
+            end;
+         end loop;
+
+         --  Set Result.Worst_Recursions
+         for Nonterm in Result'Range loop
+            for RHS in Result (Nonterm).First_Index .. Result 
(Nonterm).Last_Index loop
+               declare
+                  RHS_Seq : RHS_Sequence renames Result (Nonterm)(RHS);
+               begin
+                  RHS_Seq.Worst_Recursion := Worst_Recursion 
(RHS_Seq.Recursion, Recursions, RHS);
+               end;
+            end loop;
+         end loop;
+
+         if Trace_Generate > Detail then
+            Ada.Text_IO.Put_Line ("Minimal_Terminal_Sequences:");
+            for LHS in Result'Range loop
+               Ada.Text_IO.Put_Line
+                 (Trimmed_Image (LHS) & " " & Image (LHS, Descriptor) & " ==> 
" &
+                    Image (Result (LHS), Descriptor));
+            end loop;
+         end if;
       end return;
    end Compute_Minimal_Terminal_Sequences;
 
@@ -739,7 +852,7 @@ package body WisiToken.Generate.LR is
       subtype Terminals is Token_ID range Descriptor.First_Terminal .. 
Descriptor.Last_Terminal;
 
       Working_Set : LR1_Items.Item_Lists.List := Kernel.Set;
-      Del         : LR1_Items.Item_Lists.Cursor;
+      Recursive   : Boolean := False;
 
       function Find_Action (List : in Action_Node_Ptr; ID : in Token_ID) 
return Minimal_Action
       is
@@ -764,100 +877,237 @@ package body WisiToken.Generate.LR is
          raise SAL.Programmer_Error;
       end Find_Action;
 
+      function Min_Length (Item : in RHS_Sequence_Arrays.Vector) return 
Ada.Containers.Count_Type
+      is
+         use Ada.Containers;
+         Min : Count_Type := Count_Type'Last;
+      begin
+         for RHS of Item loop
+            if RHS.Sequence.Length < Min then
+               Min := RHS.Sequence.Length;
+            end if;
+         end loop;
+         return Min;
+      end Min_Length;
+
+      function After_Dot_Length (Item : in LR1_Items.Item) return 
Ada.Containers.Count_Type
+      is
+         use Ada.Containers;
+         Prod   : constant Production_ID := Item.Prod;
+         I      : Token_ID_Arrays.Cursor := Item.Dot;
+         Result : Count_Type             := 0;
+         Tokens : Vector renames Grammar (Prod.LHS).RHSs (Prod.RHS).Tokens;
+      begin
+         loop
+            exit when I = Token_ID_Arrays.No_Element;
+
+            if Tokens (I) in Terminals then
+               Result := Result + 1;
+            else
+               Result := Result + Min_Length (Minimal_Terminal_Sequences 
(Tokens (I)));
+            end if;
+            Next (I);
+         end loop;
+         return Result;
+      end After_Dot_Length;
+
       procedure Delete_Non_Minimal
       is
-         Min_Length : Ada.Containers.Count_Type := 
Ada.Containers.Count_Type'Last;
-         I          : LR1_Items.Item_Lists.Cursor;
-         Min_I      : LR1_Items.Item_Lists.Cursor;
+         use Ada.Containers;
+
+         Min_Length       : Count_Type := Count_Type'Last;
+         I                : LR1_Items.Item_Lists.Cursor;
+         Recursive_Count  : Count_Type := 0;
+         Delete_Recursive : Boolean;
+
+         function Immediate_Recursive return Boolean
+         is
+            --  Direct left recursion is never minimal; for example, consider
+            --  ada_lite LALR state 149:
+            --
+            --  61.0:association_list <= association_list ^ COMMA 
association_opt
+            --
+            --  If we already have an association_list, adding a COMMA to it
+            --  cannot be minimal.
+            --
+            --  Similarly, indirect left recursion is not minimal; consider
+            --  ada_lite LALR states 29 and 60:
+            --
+            --  State 29:
+            --  103.3:name <= selected_component ^,
+            --
+            --  State 60:
+            --   94.0:function_specification <= FUNCTION name ^ 
parameter_and_result_profile
+            --  103.0:name <= name ^ LEFT_PAREN range_list
+            --  103.1:name <= name ^ actual_parameter_part
+            --  123.0:selected_component <= name ^ DOT IDENTIFIER
+            --
+            --  If we already have a name, adding actual_parameter_part or DOT 
IDENTIFIER cannot be
+            --  minimal.
+
+            --  There is a trade off here between error recovery power and 
risk of
+            --  recursive loops. Consider ada_lite state 152:
+            --
+            --  103.0:name <= name LEFT_PAREN range_list ^ RIGHT_PAREN
+            --  117.0:range_list <= range_list ^ COMMA range_g
+            --
+            --  Both productions are Left_Recursive, but in the first item, 
dot is past
+            --  the recursion, and can be usefully completed.
+            --
+            --  However, that might allow loops; see java_enum_ch19.wy.
+            --
+            --  A similar argument applies to right recursive items; from
+            --  java_expressions_ch19.wy:
+            --
+            --  State 7:
+            --  27.0:Assignment <= LeftHandSide ^ EQUAL Expression
+            --
+            --  State 22:
+            --  28.0:LeftHandSide <= Identifier ^
+            --  34.0:ClassType <= Identifier ^
+            --
+            --  State 25:
+            --  24.1:Expression <= AssignmentExpression ^
+            --
+            --  State 26:
+            --  26.1:AssignmentExpression <= Assignment ^
+            --
+            --  Choosing LeftHandSide for the minimal action in state 22 will 
lead
+            --  to a loop thru state 7. However, Assignment can also occur in
+            --  Statement, where it is not recursive:
+            --
+            --  State 1:
+            --  23.0:Statement <= LEFT_CURLY_BRACKET ^ Assignment 
RIGHT_CURLY_BRACKET
+            --
+            --  This is not easy to check for.
+            --
+            --  It is not expensive to check for loops in 
Minimal_Complete_Action
+            --  at run-time, so given all the above we allow items that are 
"past
+            --  the recursion" here.
+
+            Item : LR1_Items.Item renames Constant_Ref (I).Element.all;
+            Prod : constant WisiToken.Production_ID := Item.Prod;
+            Min_Seq : RHS_Sequence renames Minimal_Terminal_Sequences 
(Prod.LHS)(Prod.RHS);
+         begin
+            return Min_Seq.Worst_Recursion in Right | Left and then
+              (Has_Element (Item.Dot) and then
+                 Item.Dot = To_Cursor (Grammar (Prod.LHS).RHSs 
(Prod.RHS).Tokens, 2));
+         end Immediate_Recursive;
+
       begin
-         --  The absolute minimal production for an LHS may not be in this 
state.
-         --  For example, for an Ada aggregate, the minimal terminal sequence 
is:
+         --  The absolute minimal production for an LHS may not be in this
+         --  state. For example, for an Ada aggregate, the absolute minimal
+         --  terminal sequence is:
+         --
          --  aggregate <= LEFT_PAREN RIGHT_PAREN
-         --  but one state has:
+         --
+         --  but one state has only:
+         --
          --  aggregate <= LEFT_PAREN expression_opt WITH ^ NULL RECORD 
RIGHT_PAREN
          --  aggregate <= LEFT_PAREN expression_opt WITH ^ association_list 
RIGHT_PAREN
          --
-         --  Find the minimum of the productions that are present
+         --  Find the minimum tokens after dot of the productions that are 
present
 
+         --  First see if all are recursive
          I := Working_Set.First;
          loop
             exit when not Has_Element (I);
-            declare
-               Prod : constant WisiToken.Production_ID := Constant_Ref 
(I).Prod;
-            begin
-               --  IMPROVEME: If Dot is near the end of a production, this is 
not the
-               --  best metric; the best metric is count of remaining tokens to
-               --  insert. But changing to that won't make much difference; it 
only
-               --  matters when Dot is not near the beginning, but then we 
don't have
-               --  multiple productions (they all must have same prefix).
-               --
-               --  We must eliminate direct left recursion; otherwise it can 
appear
-               --  to have a minimum length. For example, consider ada_lite 
state
-               --  149:
-               --
-               --  57.0:actual_parameter_part <= LEFT_PAREN association_list ^ 
RIGHT_PAREN
-               --  61.0:association_list <= association_list ^ COMMA 
association_opt
-               --
-               --  Both have length 2, but the association_list requires a
-               --  RIGHT_PAREN eventually.
-               --
-               --  We also have to eliminate indirect left recursion; consider 
ada_lite state 60:
-               --
-               --   94.0:function_specification <= FUNCTION name ^ 
parameter_and_result_profile
-               --  103.0:name <= name ^ LEFT_PAREN range_list
-               --  103.1:name <= name ^ actual_parameter_part
-               --  123.0:selected_component <= name ^ DOT IDENTIFIER
-               --
-               --  'selected' component has length 3, which two others also 
have, but
-               --  it requires more eventually.
-               --
-               --  An item production is left recursive only if Dot is after 
the
-               --  first token (ie, before the second token); consider 
conflict_name
-               --  state 5:
-               --
-               --   8.0:attribute_reference <= name TICK ^ 
attribute_designator, RIGHT_PAREN/TICK/Wisi_EOI
-               --  11.0:qualified_expression <= name TICK ^ aggregate, 
RIGHT_PAREN/TICK/Wisi_EOI
-               --
-               --  Both are indirect left recursive with "name", but both are 
past
-               --  the recursion, and can be completed.
-
-               if Min_Length > Minimal_Terminal_Sequences 
(Prod.LHS)(Prod.RHS).Sequence.Length and
-                 not (Minimal_Terminal_Sequences 
(Prod.LHS)(Prod.RHS).Left_Recursive and then
-                        (Has_Element (Constant_Ref (I).Dot) and then
-                           Constant_Ref (I).Dot = To_Cursor (Grammar 
(Prod.LHS).RHSs (Prod.RHS).Tokens, 2)))
-               then
-                  Min_Length := Minimal_Terminal_Sequences 
(Prod.LHS)(Prod.RHS).Sequence.Length;
-                  Min_I      := I;
-               end if;
-            end;
+
+            if Immediate_Recursive then
+               Recursive_Count := Recursive_Count + 1;
+            end if;
+
             Next (I);
          end loop;
 
-         if not Has_Element (Min_I) then
-            Working_Set.Clear;
-         else
-            I := Working_Set.First;
-            loop
-               exit when not Has_Element (I);
+         Delete_Recursive := Recursive_Count < Working_Set.Length;
+
+         I := Working_Set.First;
+         loop
+            exit when not Has_Element (I);
+
+            if Delete_Recursive and Immediate_Recursive then
+               if Trace_Generate > Extra then
+                  Ada.Text_IO.Put_Line ("delete " & Image (Constant_Ref 
(I).Prod) & " recursive");
+               end if;
                declare
-                  Prod : constant WisiToken.Production_ID := Constant_Ref 
(I).Prod;
+                  Del : LR1_Items.Item_Lists.Cursor := I;
                begin
-                  if I /= Min_I then
-                     if Trace_Generate > Extra then
-                        Ada.Text_IO.Put_Line ("delete " & Image (Prod) & " not 
minimal");
-                     end if;
-                     Del := I;
-                     Next (I);
-                     Working_Set.Delete (Del);
-                  else
-                     Next (I);
+                  Next (I);
+                  Working_Set.Delete (Del);
+               end;
+
+            else
+               Recursive := Recursive or Minimal_Terminal_Sequences
+                 (Constant_Ref (I).Prod.LHS)(Constant_Ref 
(I).Prod.RHS).Worst_Recursion in
+                 Left | Right;
+
+               declare
+                  Prod_Length : constant Count_Type := After_Dot_Length 
(Constant_Ref (I));
+               begin
+                  if Min_Length > Prod_Length then
+                     Min_Length := Prod_Length;
                   end if;
                end;
-            end loop;
-         end if;
+
+               Next (I);
+            end if;
+         end loop;
+
+         --  Now we have the minimum length; check remaining items against that
+         I := Working_Set.First;
+         loop
+            exit when not Has_Element (I);
+            if Min_Length < After_Dot_Length (Constant_Ref (I)) then
+               declare
+                  Del : LR1_Items.Item_Lists.Cursor := I;
+               begin
+                  if Trace_Generate > Extra then
+                     Ada.Text_IO.Put_Line ("delete " & Image (Constant_Ref 
(I).Prod));
+                  end if;
+                  Next (I);
+                  Working_Set.Delete (Del);
+               end;
+            else
+               if Trace_Generate > Extra then
+                  Ada.Text_IO.Put_Line ("keep " & Image (Constant_Ref 
(I).Prod));
+               end if;
+               Next (I);
+            end if;
+         end loop;
       end Delete_Non_Minimal;
 
    begin
+      if Kernel.State > 0 then
+         declare
+            use Ada.Containers;
+            I : Count_Type := 1;
+
+            function Before_Dot (Item : in LR1_Items.Item) return Token_ID
+            is
+               Tokens : Token_ID_Arrays.Vector renames Grammar 
(Item.Prod.LHS).RHSs (Item.Prod.RHS).Tokens;
+            begin
+               if Item.Dot = Token_ID_Arrays.No_Element then
+                  return Tokens (Tokens.Last_Index);
+               else
+                  return Tokens (Prev (Item.Dot));
+               end if;
+            end Before_Dot;
+         begin
+            State.Kernel.Set_First_Last (1, Kernel.Set.Length);
+            for Item of Kernel.Set loop
+               State.Kernel (I) :=
+                 (LHS              => Item.Prod.LHS,
+                  Before_Dot       => Before_Dot (Item),
+                  Length_After_Dot => After_Dot_Length (Item),
+                  Recursive        => Minimal_Terminal_Sequences
+                    (Item.Prod.LHS)(Item.Prod.RHS).Worst_Recursion in Right | 
Left);
+
+               I := I + 1;
+            end loop;
+         end;
+      end if;
+
       --  The actions computed here are used in the error recovery
       --  algorithm, to decide what terminals to insert in the input stream
       --  in order to correct an error. The strategy is to complete a high
@@ -867,8 +1117,7 @@ package body WisiToken.Generate.LR is
       --  production.
       --
       --  The actions are empty in a state that includes the accept
-      --  production, or where the only not left recursive productions can
-      --  be empty. That tells the error recovery algorithm to stop using
+      --  production. That tells the error recovery algorithm to stop using
       --  the minimal complete actions strategy.
 
       if (for some Item of Working_Set =>
@@ -879,53 +1128,86 @@ package body WisiToken.Generate.LR is
          return;
       end if;
 
-      if Working_Set.Length > 1 then
-         --  There are multiple productions in this state, all equally valid;
-         --  the choice is determined by what input error recovery inserts.
-         Delete_Non_Minimal;
-      end if;
+      Delete_Non_Minimal;
 
-      if Trace_Generate > Extra then
-         Ada.Text_IO.Put_Line ("after deletions:");
-         LR1_Items.Put (Grammar, Descriptor, Working_Set, Show_Lookaheads => 
False);
-      end if;
+      State.Minimal_Complete_Actions_Recursive := Recursive;
 
-      --  Find the actions for the remaining productions.
-
-      for Item of Working_Set loop
-         if not Has_Element (Item.Dot) then
-            --  Item has no next terminal. Include a reduce action; the
-            --  Minimal_Terminal_First for the resulting state will be used.
-            if Trace_Generate > Extra then
-               Ada.Text_IO.Put_Line ("reduce " & Image (Item.Prod));
-            end if;
-            State.Minimal_Complete_Action :=
-              (Reduce, Item.Prod.LHS,
-                Token_Count => Grammar (Item.Prod.LHS).RHSs 
(Item.Prod.RHS).Tokens.Length);
-         else
-            declare
-               ID : constant Token_ID := Element (Item.Dot);
-            begin
-               if ID /= Descriptor.EOI_ID then
+      if Working_Set.Length > 0 then
+         --  There are one or more productions with equal after-dot length in
+         --  this state, all equally valid; the choice is determined by what
+         --  input error recovery inserts.
+         --
+         --  We could simply choose one arbitrarily, but that can lead to loops
+         --  (see discussion above in Immediate_Recursive). So we consider the
+         --  higher level production. However, in general we cannot precompute
+         --  what higher-level productions might be completed from each state;
+         --  we must use the parse stack during error recovery. In that case,
+         --  we store multiple minimal actions in the state (see
+         --  Insert_Minimal_Complete_Actions in
+         --  wisitoken-parse-lr-mckenzie_recover-explore.adb).
 
-                  if ID in Terminals then
-                     State.Minimal_Complete_Action := Find_Action 
(State.Action_List, ID);
+         declare
+            Actions : Minimal_Action_Array (1 .. Working_Set.Length) := 
(others => (others => <>));
 
-                  else
-                     if Minimal_Terminal_First (ID) = Invalid_Token_ID then
-                        --  Item.Dot is a nullable nonterm, include a reduce 
of the null
-                        --  nonterm, rather than a shift of the following 
terminal; recover
-                        --  must do the reduce first.
-                        State.Minimal_Complete_Action := (Reduce, ID, 
Token_Count => 0);
+            I    : Ada.Containers.Count_Type := 1;
+            Skip : Boolean;
+         begin
+            for Item of Working_Set loop
+
+               if not Has_Element (Item.Dot) then
+                  --  Item has no next terminal. Include a reduce action; the
+                  --  Minimal_Terminal_First for the resulting state will be 
used.
+                  Actions (I) :=
+                    (Reduce, Item.Prod.LHS,
+                     Token_Count => Grammar (Item.Prod.LHS).RHSs 
(Item.Prod.RHS).Tokens.Length);
+               else
+                  declare
+                     ID : constant Token_ID := Element (Item.Dot);
+                  begin
+                     if ID in Terminals then
+                        Actions (I) := Find_Action (State.Action_List, ID);
 
                      else
-                        State.Minimal_Complete_Action := Find_Action 
(State.Action_List, Minimal_Terminal_First (ID));
+                        if Minimal_Terminal_First (ID) = Invalid_Token_ID then
+                           --  Item.Dot is a nullable nonterm; include a 
reduce to the null
+                           --  nonterm, rather than a shift of the following 
terminal; recover
+                           --  must do the reduce first.
+                           Actions (I) := (Reduce, ID, Token_Count => 0);
+
+                        else
+                           Actions (I) := Find_Action (State.Action_List, 
Minimal_Terminal_First (ID));
+                        end if;
                      end if;
-                  end if;
+                  end;
                end if;
-            end;
-         end if;
-      end loop;
+               I := I + 1;
+            end loop;
+
+            if Actions'Length = 1 then
+               State.Minimal_Complete_Actions := 
Minimal_Action_Arrays.To_Vector (Actions (Actions'First));
+            else
+               --  Check for duplicates; see 
three_action_conflict_lalr.parse_table
+               --  state 3 or lalr_generator_bug_01_lalr.parse_table state 28
+               for I in Actions'Range loop
+                  Skip := False;
+                  for J in Actions'First .. I - 1 loop
+                     if Actions (I) = Actions (J) then
+                        Skip := True;
+                        exit;
+                     end if;
+                  end loop;
+                  if not Skip then
+                     State.Minimal_Complete_Actions.Append (Actions (I));
+                  end if;
+               end loop;
+            end if;
+
+            if Trace_Generate > Extra then
+               Ada.Text_IO.Put_Line
+                 (Image (State.Minimal_Complete_Actions, Descriptor) & (if 
Recursive then " recursive" else ""));
+            end if;
+         end;
+      end if;
    end Set_Minimal_Complete_Actions;
 
    ----------
@@ -937,14 +1219,14 @@ package body WisiToken.Generate.LR is
       Action_Names : in Names_Array_Array;
       Check_Names  : in Names_Array_Array)
    is
+      use Ada.Containers;
       use Ada.Text_IO;
       File : File_Type;
    begin
       --  Only space, semicolon, newline delimit object values. Bounds of
       --  arrays output before each array, unless known from discriminants.
       --  End of lists indicated by semicolon. Action, Check subprograms are
-      --  represented by True if present, False if not; look up the actual
-      --  address Table.Productions.
+      --  represented by True if present, False if not.
 
       Create (File, Out_File, File_Name);
 
@@ -956,13 +1238,6 @@ package body WisiToken.Generate.LR is
       New_Line (File);
 
       for State of Table.States loop
-         Put (File, Integer'Image (State.Productions.First_Index));
-         Put (File, Integer'Image (State.Productions.Last_Index));
-         for Prod of State.Productions loop
-            Put (File, Token_ID'Image (Prod.LHS) & Integer'Image (Prod.RHS));
-         end loop;
-         New_Line (File);
-
          declare
             Node_I : Action_Node_Ptr := State.Action_List;
          begin
@@ -1033,22 +1308,38 @@ package body WisiToken.Generate.LR is
             New_Line (File);
          end;
 
-         declare
-            Action  : Minimal_Action renames State.Minimal_Complete_Action;
-         begin
-            case State.Minimal_Complete_Action.Verb is
-            when Pause =>
-               null;
-            when Shift =>
-               Put (File, Minimal_Verbs'Image (Action.Verb));
-               Put (File, Token_ID'Image (Action.ID) & State_Index'Image 
(Action.State));
-            when Reduce =>
-               Put (File, Minimal_Verbs'Image (Action.Verb));
-               Put (File, Token_ID'Image (Action.Nonterm) & 
Ada.Containers.Count_Type'Image (Action.Token_Count));
-            end case;
-         end;
-         Put (File, ';');
-         New_Line (File);
+         if State.Kernel.Length = 0 then
+            --  Not set for state 0
+            Put_Line (File, "0 -1");
+
+         else
+            Put (File, Count_Type'Image (State.Kernel.First_Index));
+            Put (File, Count_Type'Image (State.Kernel.Last_Index));
+            for Item of State.Kernel loop
+               Put (File, Token_ID'Image (Item.LHS) & Token_ID'Image 
(Item.Before_Dot) &
+                      Count_Type'Image (Item.Length_After_Dot));
+            end loop;
+            New_Line (File);
+         end if;
+
+         if State.Minimal_Complete_Actions.Length = 0 then
+            null;
+         else
+            Put (File, Count_Type'Image 
(State.Minimal_Complete_Actions.First_Index));
+            Put (File, Count_Type'Image 
(State.Minimal_Complete_Actions.Last_Index));
+            for Action of State.Minimal_Complete_Actions loop
+               Put (File, " ");
+               case Action.Verb is
+               when Shift =>
+                  Put (File, Minimal_Verbs'Image (Action.Verb));
+                  Put (File, Token_ID'Image (Action.ID) & State_Index'Image 
(Action.State));
+               when Reduce =>
+                  Put (File, Minimal_Verbs'Image (Action.Verb));
+                  Put (File, Token_ID'Image (Action.Nonterm) & 
Ada.Containers.Count_Type'Image (Action.Token_Count));
+               end case;
+            end loop;
+         end if;
+         Put_Line (File, ";");
       end loop;
       Close (File);
    end Put_Text_Rep;
@@ -1096,17 +1387,28 @@ package body WisiToken.Generate.LR is
          end if;
       end loop;
       Put_Line ("(Push_Back =>");
-      for I in Item.Delete'Range loop
-         Put (" " & Padded_Image (I, Descriptor) & " =>" & Natural'Image 
(Item.Delete (I)));
-         if I = Item.Delete'Last then
+      for I in Item.Push_Back'Range loop
+         Put (" " & Padded_Image (I, Descriptor) & " =>" & Natural'Image 
(Item.Push_Back (I)));
+         if I = Item.Push_Back'Last then
             Put_Line (")");
          else
             Put_Line (",");
          end if;
       end loop;
+      Put_Line ("(Undo_Reduce =>");
+      for I in Item.Undo_Reduce'Range loop
+         Put (" " & Padded_Image (I, Descriptor) & " =>" & Natural'Image 
(Item.Undo_Reduce (I)));
+         if I = Item.Undo_Reduce'Last then
+            Put_Line (")");
+         else
+            Put_Line (",");
+         end if;
+      end loop;
+      Put_Line ("Minimal_Complete_Cost_Delta => " & Integer'Image 
(Item.Minimal_Complete_Cost_Delta));
+      Put_Line ("Fast_Forward      => " & Integer'Image (Item.Fast_Forward));
+      Put_Line ("Matching_Begin    => " & Integer'Image (Item.Matching_Begin));
       Put_Line ("Ignore_Check_Fail =>" & Integer'Image 
(Item.Ignore_Check_Fail));
       Put_Line ("Task_Count        =>" & 
System.Multiprocessors.CPU_Range'Image (Item.Task_Count));
-      Put_Line ("Cost_Limit        =>" & Integer'Image (Item.Cost_Limit));
       Put_Line ("Check_Limit       =>" & Token_Index'Image (Item.Check_Limit));
       Put_Line ("Check_Delta_Limit =>" & Integer'Image 
(Item.Check_Delta_Limit));
       Put_Line ("Enqueue_Limit     =>" & Integer'Image (Item.Enqueue_Limit));
@@ -1150,6 +1452,7 @@ package body WisiToken.Generate.LR is
 
    procedure Put (Descriptor : in WisiToken.Descriptor; State : in Parse_State)
    is
+      use all type Ada.Containers.Count_Type;
       use Ada.Text_IO;
       use Ada.Strings.Fixed;
       Action_Ptr : Action_Node_Ptr := State.Action_List;
@@ -1183,25 +1486,54 @@ package body WisiToken.Generate.LR is
       end loop;
 
       New_Line;
-      Put ("   Minimal_Complete_Action => (");
-      case State.Minimal_Complete_Action.Verb is
-      when Pause =>
+      Put ("   Minimal_Complete_Action => "); --  No trailing 's' for 
compatibility with previous good parse tables.
+      case State.Minimal_Complete_Actions.Length is
+      when 0 =>
          null;
-      when Shift =>
-         Put (Image (State.Minimal_Complete_Action.ID, Descriptor));
-      when Reduce =>
-         Put (Image (State.Minimal_Complete_Action.Nonterm, Descriptor));
+      when 1 =>
+         --  No () here for compatibity with previous known good parse tables.
+         declare
+            Action : Minimal_Action renames State.Minimal_Complete_Actions 
(State.Minimal_Complete_Actions.First_Index);
+         begin
+            case Action.Verb is
+            when Shift =>
+               Put (Image (Action.ID, Descriptor));
+            when Reduce =>
+               Put (Image (Action.Nonterm, Descriptor));
+            end case;
+         end;
+      when others =>
+         Put ("(");
+         for I in State.Minimal_Complete_Actions.First_Index .. 
State.Minimal_Complete_Actions.Last_Index loop
+            case State.Minimal_Complete_Actions (I).Verb is
+            when Shift =>
+               Put (Image (State.Minimal_Complete_Actions (I).ID, Descriptor));
+            when Reduce =>
+               Put (Image (State.Minimal_Complete_Actions (I).Nonterm, 
Descriptor));
+            end case;
+            if I < State.Minimal_Complete_Actions.Last_Index then
+               Put (", ");
+            end if;
+         end loop;
+         Put (")");
       end case;
-      Put_Line (")");
+      if State.Minimal_Complete_Actions_Recursive then
+         Put_Line (" recursive");
+      else
+         New_Line;
+      end if;
    end Put;
 
    procedure Put_Parse_Table
-     (Table      : in Parse_Table_Ptr;
-      Title      : in String;
-      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector;
-      Kernels    : in LR1_Items.Item_Set_List;
-      Conflicts  : in Conflict_Lists.List;
-      Descriptor : in WisiToken.Descriptor)
+     (Table                      : in Parse_Table_Ptr;
+      Title                      : in String;
+      Grammar                    : in WisiToken.Productions.Prod_Arrays.Vector;
+      Recursions                 : in Generate.Recursions;
+      Minimal_Terminal_Sequences : in Minimal_Sequence_Array;
+      Kernels                    : in LR1_Items.Item_Set_List;
+      Conflicts                  : in Conflict_Count_Lists.List;
+      Descriptor                 : in WisiToken.Descriptor;
+      Include_Extra              : in Boolean := False)
    is
       use all type Ada.Containers.Count_Type;
       use Ada.Text_IO;
@@ -1211,10 +1543,32 @@ package body WisiToken.Generate.LR is
 
       New_Line;
       Put_Line ("Productions:");
-      WisiToken.Productions.Put (Grammar, Descriptor);
+      for LHS in Grammar.First_Index .. Grammar.Last_Index loop
+         declare
+            Prod : WisiToken.Productions.Instance renames Grammar (LHS);
+         begin
+            for RHS in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index loop
+               Put (WisiToken.Productions.Image (Prod.LHS, RHS, Prod.RHSs 
(RHS).Tokens, Descriptor));
+               if not Include_Extra or Minimal_Terminal_Sequences 
(LHS)(RHS).Recursion.Length = 0 then
+                  New_Line;
+               else
+                  Put_Line
+                    (" ; " & Image (Minimal_Terminal_Sequences 
(LHS)(RHS).Recursion) & " " &
+                       Recursion'Image (Minimal_Terminal_Sequences 
(LHS)(RHS).Worst_Recursion));
+               end if;
+            end loop;
+         end;
+      end loop;
+
+      if Include_Extra then
+         New_Line;
+         Put_Line ((if Recursions.Full then "Recursions:" else "Partial 
recursions:"));
+         for I in Recursions.Recursions.First_Index .. 
Recursions.Recursions.Last_Index loop
+            Put_Line (Trimmed_Image (I) & " => " & Grammar_Graphs.Image 
(Recursions.Recursions (I)));
+         end loop;
+      end if;
 
-      if Table.McKenzie_Param.Cost_Limit /= Default_McKenzie_Param.Cost_Limit 
or
-          Table.McKenzie_Param.Check_Limit /= 
Default_McKenzie_Param.Check_Limit or
+      if Table.McKenzie_Param.Check_Limit /= 
Default_McKenzie_Param.Check_Limit or
           Table.McKenzie_Param.Check_Delta_Limit /= 
Default_McKenzie_Param.Check_Delta_Limit or
           Table.McKenzie_Param.Enqueue_Limit /= 
Default_McKenzie_Param.Enqueue_Limit
       then
@@ -1227,7 +1581,8 @@ package body WisiToken.Generate.LR is
       Put_Line (Title & " Parse Table:");
 
       for State_Index in Table.States'Range loop
-         LR1_Items.Put (Grammar, Descriptor, Kernels (State_Index), 
Kernel_Only => True, Show_Lookaheads => True);
+         LR1_Items.Put
+           (Grammar, Descriptor, Kernels (State_Index), Kernel_Only => True, 
Show_Lookaheads => Include_Extra);
          New_Line;
          Put (Descriptor, Table.States (State_Index));
 
@@ -1239,17 +1594,30 @@ package body WisiToken.Generate.LR is
       if Conflicts.Length > 0 then
          declare
             use Ada.Strings.Unbounded;
-            Last_State : Unknown_State_Index := Unknown_State;
-            Line : Unbounded_String := +"States with conflicts:";
+            Line          : Unbounded_String := +"States with conflicts:";
+            Accept_Reduce : Integer          := 0;
+            Shift_Reduce  : Integer          := 0;
+            Reduce_Reduce : Integer          := 0;
          begin
-            for Conflict of Conflicts loop
-               if Conflict.State_Index /= Last_State then
-                  Append (Line, State_Index'Image (Conflict.State_Index));
-                  Last_State := Conflict.State_Index;
-               end if;
+            for Count of Conflicts loop
+               Line          := Line & State_Index'Image (Count.State);
+               Accept_Reduce := Accept_Reduce + Count.Accept_Reduce;
+               Shift_Reduce  := Shift_Reduce + Count.Shift_Reduce;
+               Reduce_Reduce := Reduce_Reduce + Count.Reduce_Reduce;
             end loop;
+
+            New_Line;
             Indent_Wrap (-Line);
+
+            New_Line;
+            Put_Line
+              (Integer'Image (Accept_Reduce) & " accept/reduce conflicts," &
+                 Integer'Image (Shift_Reduce) & " shift/reduce conflicts," &
+                 Integer'Image (Reduce_Reduce) & " reduce/reduce conflicts");
          end;
+      else
+         New_Line;
+         Put_Line (" 0 accept/reduce conflicts, 0 shift/reduce conflicts, 0 
reduce/reduce conflicts");
       end if;
    end Put_Parse_Table;
 
diff --git a/packages/wisi/wisitoken-generate-lr.ads 
b/packages/wisi/wisitoken-generate-lr.ads
index 9cb22f2..297689b 100644
--- a/packages/wisi/wisitoken-generate-lr.ads
+++ b/packages/wisi/wisitoken-generate-lr.ads
@@ -46,6 +46,15 @@ package WisiToken.Generate.LR is
 
    package Conflict_Lists is new Ada.Containers.Doubly_Linked_Lists (Conflict);
 
+   type Conflict_Count is record
+      State : State_Index;
+      Accept_Reduce : Integer             := 0;
+      Shift_Reduce  : Integer             := 0;
+      Reduce_Reduce : Integer             := 0;
+   end record;
+
+   package Conflict_Count_Lists is new Ada.Containers.Doubly_Linked_Lists 
(Conflict_Count);
+
    procedure Put
      (Item       : in Conflict_Lists.List;
       File       : in Ada.Text_IO.File_Type;
@@ -59,6 +68,7 @@ package WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Descriptor           : in     WisiToken.Descriptor);
    --  Add (Symbol, Action) to Action_List; check for conflicts
@@ -71,6 +81,7 @@ package WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Descriptor           : in     WisiToken.Descriptor);
    --  Add actions for Closure to Table. Has_Empty_Production, First,
@@ -82,6 +93,7 @@ package WisiToken.Generate.LR is
       Grammar              : in     WisiToken.Productions.Prod_Arrays.Vector;
       Has_Empty_Production : in     Token_ID_Set;
       First_Nonterm_Set    : in     Token_Array_Token_Set;
+      Conflict_Counts      : in out Conflict_Count_Lists.List;
       Conflicts            : in out Conflict_Lists.List;
       Closure              : in     LR1_Items.Item_Set;
       Descriptor           : in     WisiToken.Descriptor);
@@ -95,11 +107,6 @@ package WisiToken.Generate.LR is
    --  Delete Known_Conflicts from Conflicts.
 
    function Find
-     (Symbol      : in Token_ID;
-      Action_List : in Action_Node_Ptr)
-     return Action_Node_Ptr;
-
-   function Find
      (Closure              : in LR1_Items.Item_Set;
       Action               : in Parse_Action_Rec;
       Lookahead            : in Token_ID;
@@ -117,11 +124,15 @@ package WisiToken.Generate.LR is
 
    function Match (Known : in Conflict; Item : in 
Conflict_Lists.Constant_Reference_Type) return Boolean;
 
+   ----------
+   --  Minimal terminal sequences.
+
    type RHS_Sequence is
    record
-      Left_Recursive : Boolean := False;
-      --  Direct or indirect; see comment in
-      --  Set_Minimal_Complete_Actions.Delete_Non_Minimal.
+      Recursion : Recursion_Lists.List;
+      --  All recursion cycles involving this RHS.
+
+      Worst_Recursion : WisiToken.Recursion := None; --  worst case of all 
Recursion.
 
       Sequence : Token_ID_Arrays.Vector;
    end record;
@@ -132,7 +143,7 @@ package WisiToken.Generate.LR is
    function Image (Item : in RHS_Sequence; Descriptor : in 
WisiToken.Descriptor) return String;
    --  Positional Ada aggregate syntax.
 
-   function Image is new RHS_Sequence_Arrays.Gen_Image_Aux (Descriptor, Image);
+   function Image is new RHS_Sequence_Arrays.Gen_Image_Aux (Descriptor, 
Trimmed_Image, Image);
 
    function Min (Item : in RHS_Sequence_Arrays.Vector) return RHS_Sequence;
    --  Return element of Item with minimum length;
@@ -140,13 +151,13 @@ package WisiToken.Generate.LR is
    type Minimal_Sequence_Array is array (Token_ID range <>) of 
RHS_Sequence_Arrays.Vector;
 
    function Compute_Minimal_Terminal_Sequences
-     (Descriptor : in     WisiToken.Descriptor;
-      Grammar    : in     WisiToken.Productions.Prod_Arrays.Vector)
+     (Descriptor : in WisiToken.Descriptor;
+      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector;
+      Recursions : in Generate.Recursions)
      return Minimal_Sequence_Array;
    --  For each production in Grammar, compute the minimal sequence of
    --  terminals that will complete it. Result is an empty sequence if
-   --  the production may be empty, or Invalid_Token_ID if it is
-   --  recursive.
+   --  the production may be empty.
 
    function Compute_Minimal_Terminal_First
      (Descriptor                 : in WisiToken.Descriptor;
@@ -169,7 +180,11 @@ package WisiToken.Generate.LR is
    --  terminal is a block ending or statement start.
    --
    --  The Minimal_Complete_Actions will be empty in a state where there
-   --  is nothing useful to do.
+   --  is nothing useful to do; the accept state, or one where all
+   --  productions are recursive.
+   --
+   --  Also set State.Kernels; used to resolve multiple reduce actions at
+   --  runtime.
 
    ----------
    --  Parse table output
@@ -191,11 +206,15 @@ package WisiToken.Generate.LR is
    --  Put Item to Ada.Text_IO.Current_Output in parse table format.
 
    procedure Put_Parse_Table
-     (Table      : in Parse_Table_Ptr;
-      Title      : in String;
-      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector;
-      Kernels    : in LR1_Items.Item_Set_List;
-      Conflicts  : in Conflict_Lists.List;
-      Descriptor : in WisiToken.Descriptor);
+     (Table                      : in Parse_Table_Ptr;
+      Title                      : in String;
+      Grammar                    : in WisiToken.Productions.Prod_Arrays.Vector;
+      Recursions                 : in Generate.Recursions;
+      Minimal_Terminal_Sequences : in Minimal_Sequence_Array;
+      Kernels                    : in LR1_Items.Item_Set_List;
+      Conflicts                  : in Conflict_Count_Lists.List;
+      Descriptor                 : in WisiToken.Descriptor;
+      Include_Extra              : in Boolean := False);
+   --  "Extra" is recursions, lookaheads.
 
 end WisiToken.Generate.LR;
diff --git a/packages/wisi/wisitoken-generate-lr1_items.adb 
b/packages/wisi/wisitoken-generate-lr1_items.adb
index b6d14ca..86cd8d9 100644
--- a/packages/wisi/wisitoken-generate-lr1_items.adb
+++ b/packages/wisi/wisitoken-generate-lr1_items.adb
@@ -451,9 +451,8 @@ package body WisiToken.Generate.LR1_Items is
             Added_Item := False;
 
             if Trace_Generate > Extra then
-               Ada.Text_IO.Put_Line ("I:");
+               Ada.Text_IO.Put_Line ("  closure:");
                Put (Grammar, Descriptor, I);
-               Ada.Text_IO.New_Line;
             end if;
          else
             Item_I := Item_Lists.Next (Item_I);
diff --git a/packages/wisi/wisitoken-generate-lr1_items.ads 
b/packages/wisi/wisitoken-generate-lr1_items.ads
index 3ee55d8..0fd8c55 100644
--- a/packages/wisi/wisitoken-generate-lr1_items.ads
+++ b/packages/wisi/wisitoken-generate-lr1_items.ads
@@ -96,7 +96,7 @@ package WisiToken.Generate.LR1_Items is
    type Item is record
       Prod       : Production_ID;
       Dot        : Token_ID_Arrays.Cursor; -- token after item Dot
-      Lookaheads : access Lookahead := null;
+      Lookaheads : Token_ID_Set_Access := null;
       --  Programmer must remember to copy Item.Lookaheads.all, not
       --  Item.Lookaheads. Wrapping this in Ada.Finalization.Controlled
       --  would just slow it down.
diff --git a/packages/wisi/wisitoken-generate-packrat.adb 
b/packages/wisi/wisitoken-generate-packrat.adb
index 80a4c10..c50b1ed 100644
--- a/packages/wisi/wisitoken-generate-packrat.adb
+++ b/packages/wisi/wisitoken-generate-packrat.adb
@@ -1,247 +1,247 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-package body WisiToken.Generate.Packrat is
-
-   function Potential_Direct_Right_Recursive
-     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
-      Empty   : in Token_ID_Set)
-     return Token_ID_Set
-   is
-      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
-   begin
-      return Result : Token_ID_Set (Nonterminal) := (others => False) do
-         for Prod of Grammar loop
-            RHS_Loop :
-            for RHS of Prod.RHSs loop
-               ID_Loop :
-               for I in reverse RHS.Tokens.First_Index + 1 .. 
RHS.Tokens.Last_Index loop
-                  declare
-                     ID : constant Token_ID := RHS.Tokens (I);
-                  begin
-                     if ID = Prod.LHS then
-                        Result (ID) := True;
-                        exit RHS_Loop;
-                     elsif not (ID in Nonterminal) then
-                        exit ID_Loop;
-                     elsif not Empty (ID) then
-                        exit ID_Loop;
-                     end if;
-                  end;
-               end loop ID_Loop;
-            end loop RHS_Loop;
-         end loop;
-      end return;
-   end Potential_Direct_Right_Recursive;
-
-   procedure Indirect_Left_Recursive (Data : in out Packrat.Data)
-   is
-   begin
-      for Prod_I of Data.Grammar loop
-         for Prod_J of Data.Grammar loop
-            Data.Involved (Prod_I.LHS, Prod_J.LHS) :=
-              Data.First (Prod_I.LHS, Prod_J.LHS) and
-              Data.First (Prod_J.LHS, Prod_I.LHS);
-         end loop;
-      end loop;
-   end Indirect_Left_Recursive;
-
-   ----------
-   --  Public subprograms
-
-   function Initialize
-     (Source_File_Name : in String;
-      Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
-      Source_Line_Map  : in Productions.Source_Line_Maps.Vector;
-      First_Terminal   : in Token_ID)
-     return Packrat.Data
-   is
-      Empty : constant Token_ID_Set := WisiToken.Generate.Has_Empty_Production 
(Grammar);
-   begin
-      return Result : Packrat.Data :=
-        (First_Terminal        => First_Terminal,
-         First_Nonterminal     => Grammar.First_Index,
-         Last_Nonterminal      => Grammar.Last_Index,
-         Source_File_Name      => +Source_File_Name,
-         Grammar               => Grammar,
-         Source_Line_Map       => Source_Line_Map,
-         Empty                 => Empty,
-         Direct_Left_Recursive => Potential_Direct_Left_Recursive (Grammar, 
Empty),
-         First                 => WisiToken.Generate.First (Grammar, Empty, 
First_Terminal => First_Terminal),
-         Involved              => (others => (others => False)))
-      do
-         Indirect_Left_Recursive (Result);
-      end return;
-   end Initialize;
-
-   procedure Check_Recursion (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
-   is
-      Right_Recursive : constant Token_ID_Set := 
Potential_Direct_Right_Recursive (Data.Grammar, Data.Empty);
-   begin
-      for Prod of Data.Grammar loop
-         if Data.Direct_Left_Recursive (Prod.LHS) and Right_Recursive 
(Prod.LHS) then
-            --  We only implement the simplest left recursion solution ([warth
-            --  2008] figure 3); [tratt 2010] section 6.3 gives this condition 
for
-            --  that to be valid.
-            --  FIXME: not quite? definite direct right recursive ok?
-            --  FIXME: for indirect left recursion, need potential indirect 
right recursive check?
-            Put_Error
-              (Error_Message
-                 (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line, "'" & Image (Prod.LHS, Descriptor) &
-                    "' is both left and right recursive; not supported."));
-         end if;
-
-         for I in Data.Involved'Range (2) loop
-            if Prod.LHS /= I and then Data.Involved (Prod.LHS, I) then
-               Put_Error
-                 (Error_Message
-                    (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line, "'" & Image (Prod.LHS, Descriptor) &
-                       "' is indirect recursive with " & Image (I, Descriptor) 
& ", not supported"));
-            end if;
-         end loop;
-      end loop;
-   end Check_Recursion;
-
-   procedure Check_RHS_Order (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
-   is
-      use all type Ada.Containers.Count_Type;
-   begin
-      for Prod of Data.Grammar loop
-         --  Empty must be last
-         for I in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index - 1 loop
-            if Prod.RHSs (I).Tokens.Length = 0 then
-               Put_Error
-                 (Error_Message
-                    (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).RHS_Map (I),
-                     "right hand side" & Integer'Image (I) & " in " & Image 
(Prod.LHS, Descriptor) &
-                       " is empty, but not last; no later right hand side will 
match."));
-               WisiToken.Generate.Error := True;
-            end if;
-         end loop;
-
-         for I in Prod.RHSs.First_Index + 1 .. Prod.RHSs.Last_Index loop
-            declare
-               Cur : Token_ID_Arrays.Vector renames Prod.RHSs (I).Tokens;
-            begin
-               --  Shared prefix; longer must be first
-               for J in Prod.RHSs.First_Index .. I - 1 loop
-                  declare
-                     Prev : Token_ID_Arrays.Vector renames Prod.RHSs 
(J).Tokens;
-                     K    : constant Natural := Shared_Prefix (Prev, Cur);
-                  begin
-                     if K > 0 and Prev.Length < Cur.Length then
-                        Put_Error
-                          (Error_Message
-                             (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).RHS_Map (I),
-                              "right hand side" & Integer'Image (I) & " in " & 
Image (Prod.LHS, Descriptor) &
-                                " may never match; it shares a prefix with a 
shorter previous rhs" &
-                                Integer'Image (J) & "."));
-                     end if;
-                  end;
-               end loop;
-
-               --  recursion; typical LALR list is written:
-               --
-               --  statement_list
-               --    : statement
-               --    | statement_list statement
-               --    ;
-               --  association_list
-               --    : association
-               --    | association_list COMMA association
-               --    ;
-               --
-               --  a different recursive definition:
-               --
-               --  name
-               --    : IDENTIFIER
-               --    | name LEFT_PAREN range_list RIGHT_PAREN
-               --    | name actual_parameter_part
-               --    ...
-               --    ;
-               --
-               --  For packrat, the recursive RHSs must come before others:
-               --
-               --  statement_list
-               --    : statement_list statement
-               --    | statement
-               --    ;
-               --  association_list
-               --    : association_list COMMA association
-               --    | association
-               --    ;
-               --  name
-               --    : name LEFT_PAREN range_list RIGHT_PAREN
-               --    | name actual_parameter_part
-               --    | IDENTIFIER
-               --    ...
-               --    ;
-               declare
-                  Prev : Token_ID_Arrays.Vector renames Prod.RHSs (I - 
1).Tokens;
-               begin
-                  if Cur.Length > 0 and then Prev.Length > 0 and then
-                    Cur (1) = Prod.LHS and then Prev (1) /= Prod.LHS
-                  then
-                     Put_Error
-                       (Error_Message
-                          (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line,
-                           "recursive right hand sides must be before 
others."));
-                  end if;
-               end;
-            end;
-         end loop;
-      end loop;
-   end Check_RHS_Order;
-
-   procedure Check_All (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
-   is begin
-      Check_Recursion (Data, Descriptor);
-      Check_RHS_Order (Data, Descriptor);
-   end Check_All;
-
-   function Potential_Direct_Left_Recursive
-     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
-      Empty   : in Token_ID_Set)
-     return Token_ID_Set
-   is
-      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
-   begin
-      --  FIXME: this duplicates the computation of First; if keep First,
-      --  change this to use it.
-      return Result : Token_ID_Set (Nonterminal) := (others => False) do
-         for Prod of Grammar loop
-            RHS_Loop :
-            for RHS of Prod.RHSs loop
-               ID_Loop :
-               for ID of RHS.Tokens loop
-                  if ID = Prod.LHS then
-                     Result (ID) := True;
-                     exit RHS_Loop;
-                  elsif not (ID in Nonterminal) then
-                     exit ID_Loop;
-                  elsif not Empty (ID) then
-                     exit ID_Loop;
-                  end if;
-               end loop ID_Loop;
-            end loop RHS_Loop;
-         end loop;
-      end return;
-   end Potential_Direct_Left_Recursive;
-
-end WisiToken.Generate.Packrat;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2018 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+package body WisiToken.Generate.Packrat is
+
+   function Potential_Direct_Right_Recursive
+     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
+      Empty   : in Token_ID_Set)
+     return Token_ID_Set
+   is
+      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
+   begin
+      return Result : Token_ID_Set (Nonterminal) := (others => False) do
+         for Prod of Grammar loop
+            RHS_Loop :
+            for RHS of Prod.RHSs loop
+               ID_Loop :
+               for I in reverse RHS.Tokens.First_Index + 1 .. 
RHS.Tokens.Last_Index loop
+                  declare
+                     ID : constant Token_ID := RHS.Tokens (I);
+                  begin
+                     if ID = Prod.LHS then
+                        Result (ID) := True;
+                        exit RHS_Loop;
+                     elsif not (ID in Nonterminal) then
+                        exit ID_Loop;
+                     elsif not Empty (ID) then
+                        exit ID_Loop;
+                     end if;
+                  end;
+               end loop ID_Loop;
+            end loop RHS_Loop;
+         end loop;
+      end return;
+   end Potential_Direct_Right_Recursive;
+
+   procedure Indirect_Left_Recursive (Data : in out Packrat.Data)
+   is
+   begin
+      for Prod_I of Data.Grammar loop
+         for Prod_J of Data.Grammar loop
+            Data.Involved (Prod_I.LHS, Prod_J.LHS) :=
+              Data.First (Prod_I.LHS, Prod_J.LHS) and
+              Data.First (Prod_J.LHS, Prod_I.LHS);
+         end loop;
+      end loop;
+   end Indirect_Left_Recursive;
+
+   ----------
+   --  Public subprograms
+
+   function Initialize
+     (Source_File_Name : in String;
+      Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
+      Source_Line_Map  : in Productions.Source_Line_Maps.Vector;
+      First_Terminal   : in Token_ID)
+     return Packrat.Data
+   is
+      Empty : constant Token_ID_Set := WisiToken.Generate.Has_Empty_Production 
(Grammar);
+   begin
+      return Result : Packrat.Data :=
+        (First_Terminal        => First_Terminal,
+         First_Nonterminal     => Grammar.First_Index,
+         Last_Nonterminal      => Grammar.Last_Index,
+         Source_File_Name      => +Source_File_Name,
+         Grammar               => Grammar,
+         Source_Line_Map       => Source_Line_Map,
+         Empty                 => Empty,
+         Direct_Left_Recursive => Potential_Direct_Left_Recursive (Grammar, 
Empty),
+         First                 => WisiToken.Generate.First (Grammar, Empty, 
First_Terminal => First_Terminal),
+         Involved              => (others => (others => False)))
+      do
+         Indirect_Left_Recursive (Result);
+      end return;
+   end Initialize;
+
+   procedure Check_Recursion (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
+   is
+      Right_Recursive : constant Token_ID_Set := 
Potential_Direct_Right_Recursive (Data.Grammar, Data.Empty);
+   begin
+      for Prod of Data.Grammar loop
+         if Data.Direct_Left_Recursive (Prod.LHS) and Right_Recursive 
(Prod.LHS) then
+            --  We only implement the simplest left recursion solution ([warth
+            --  2008] figure 3); [tratt 2010] section 6.3 gives this condition 
for
+            --  that to be valid.
+            --  FIXME: not quite? definite direct right recursive ok?
+            --  FIXME: for indirect left recursion, need potential indirect 
right recursive check?
+            Put_Error
+              (Error_Message
+                 (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line, "'" & Image (Prod.LHS, Descriptor) &
+                    "' is both left and right recursive; not supported."));
+         end if;
+
+         for I in Data.Involved'Range (2) loop
+            if Prod.LHS /= I and then Data.Involved (Prod.LHS, I) then
+               Put_Error
+                 (Error_Message
+                    (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line, "'" & Image (Prod.LHS, Descriptor) &
+                       "' is indirect recursive with " & Image (I, Descriptor) 
& ", not supported"));
+            end if;
+         end loop;
+      end loop;
+   end Check_Recursion;
+
+   procedure Check_RHS_Order (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      for Prod of Data.Grammar loop
+         --  Empty must be last
+         for I in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index - 1 loop
+            if Prod.RHSs (I).Tokens.Length = 0 then
+               Put_Error
+                 (Error_Message
+                    (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).RHS_Map (I),
+                     "right hand side" & Integer'Image (I) & " in " & Image 
(Prod.LHS, Descriptor) &
+                       " is empty, but not last; no later right hand side will 
match."));
+               WisiToken.Generate.Error := True;
+            end if;
+         end loop;
+
+         for I in Prod.RHSs.First_Index + 1 .. Prod.RHSs.Last_Index loop
+            declare
+               Cur : Token_ID_Arrays.Vector renames Prod.RHSs (I).Tokens;
+            begin
+               --  Shared prefix; longer must be first
+               for J in Prod.RHSs.First_Index .. I - 1 loop
+                  declare
+                     Prev : Token_ID_Arrays.Vector renames Prod.RHSs 
(J).Tokens;
+                     K    : constant Natural := Shared_Prefix (Prev, Cur);
+                  begin
+                     if K > 0 and Prev.Length < Cur.Length then
+                        Put_Error
+                          (Error_Message
+                             (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).RHS_Map (I),
+                              "right hand side" & Integer'Image (I) & " in " & 
Image (Prod.LHS, Descriptor) &
+                                " may never match; it shares a prefix with a 
shorter previous rhs" &
+                                Integer'Image (J) & "."));
+                     end if;
+                  end;
+               end loop;
+
+               --  recursion; typical LALR list is written:
+               --
+               --  statement_list
+               --    : statement
+               --    | statement_list statement
+               --    ;
+               --  association_list
+               --    : association
+               --    | association_list COMMA association
+               --    ;
+               --
+               --  a different recursive definition:
+               --
+               --  name
+               --    : IDENTIFIER
+               --    | name LEFT_PAREN range_list RIGHT_PAREN
+               --    | name actual_parameter_part
+               --    ...
+               --    ;
+               --
+               --  For packrat, the recursive RHSs must come before others:
+               --
+               --  statement_list
+               --    : statement_list statement
+               --    | statement
+               --    ;
+               --  association_list
+               --    : association_list COMMA association
+               --    | association
+               --    ;
+               --  name
+               --    : name LEFT_PAREN range_list RIGHT_PAREN
+               --    | name actual_parameter_part
+               --    | IDENTIFIER
+               --    ...
+               --    ;
+               declare
+                  Prev : Token_ID_Arrays.Vector renames Prod.RHSs (I - 
1).Tokens;
+               begin
+                  if Cur.Length > 0 and then Prev.Length > 0 and then
+                    Cur (1) = Prod.LHS and then Prev (1) /= Prod.LHS
+                  then
+                     Put_Error
+                       (Error_Message
+                          (-Data.Source_File_Name, Data.Source_Line_Map 
(Prod.LHS).Line,
+                           "recursive right hand sides must be before 
others."));
+                  end if;
+               end;
+            end;
+         end loop;
+      end loop;
+   end Check_RHS_Order;
+
+   procedure Check_All (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor)
+   is begin
+      Check_Recursion (Data, Descriptor);
+      Check_RHS_Order (Data, Descriptor);
+   end Check_All;
+
+   function Potential_Direct_Left_Recursive
+     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
+      Empty   : in Token_ID_Set)
+     return Token_ID_Set
+   is
+      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
+   begin
+      --  FIXME: this duplicates the computation of First; if keep First,
+      --  change this to use it.
+      return Result : Token_ID_Set (Nonterminal) := (others => False) do
+         for Prod of Grammar loop
+            RHS_Loop :
+            for RHS of Prod.RHSs loop
+               ID_Loop :
+               for ID of RHS.Tokens loop
+                  if ID = Prod.LHS then
+                     Result (ID) := True;
+                     exit RHS_Loop;
+                  elsif not (ID in Nonterminal) then
+                     exit ID_Loop;
+                  elsif not Empty (ID) then
+                     exit ID_Loop;
+                  end if;
+               end loop ID_Loop;
+            end loop RHS_Loop;
+         end loop;
+      end return;
+   end Potential_Direct_Left_Recursive;
+
+end WisiToken.Generate.Packrat;
diff --git a/packages/wisi/wisitoken-generate-packrat.ads 
b/packages/wisi/wisitoken-generate-packrat.ads
index ec9a4cb..17bf03e 100644
--- a/packages/wisi/wisitoken-generate-packrat.ads
+++ b/packages/wisi/wisitoken-generate-packrat.ads
@@ -1,75 +1,75 @@
---  Abstract :
---
---  Types and operations for computing grammar properties used in
---  generating a packrat parser.
---
---  We use the terminology in [tratt 2010] for recursion in
---  productions.
---
---  References :
---
---  See wisitoken-parse-packrat.ads.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-package WisiToken.Generate.Packrat is
-
-   type Data (First_Terminal, First_Nonterminal, Last_Nonterminal : Token_ID) 
is tagged
-   record
-      --  Data needed to check a grammar and generate code. Tagged to allow
-      --  Object.Method syntax. Descriptor not included to avoid duplicating
-      --  lots of discriminants.
-      Source_File_Name      : Ada.Strings.Unbounded.Unbounded_String;
-      Grammar               : WisiToken.Productions.Prod_Arrays.Vector;
-      Source_Line_Map       : Productions.Source_Line_Maps.Vector;
-      Empty                 : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
-      Direct_Left_Recursive : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
-      First                 : Token_Array_Token_Set
-        (First_Nonterminal .. Last_Nonterminal, First_Terminal .. 
Last_Nonterminal);
-      Involved              : Token_Array_Token_Set
-        (First_Nonterminal .. Last_Nonterminal, First_Nonterminal .. 
Last_Nonterminal);
-   end record;
-
-   function Initialize
-     (Source_File_Name : in String;
-      Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
-      Source_Line_Map  : in Productions.Source_Line_Maps.Vector;
-      First_Terminal   : in Token_ID)
-     return Packrat.Data;
-
-   procedure Check_Recursion (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
-   --  Check that any rule recursion present is supported.
-
-   procedure Check_RHS_Order (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
-   --  For each production, check that right hand sides that share
-   --  prefixes have the longest right hand side first, and that any
-   --  empty right hand side is last.
-   --
-   --  Violations output a message to Ada.Text_IO.Standard_Error, and
-   --  set WisiToken.Generate.Error True.
-
-   procedure Check_All  (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
-   --  Run all the above checks.
-   --
-   --  Note that WisiToken.Generate.Check_Consistent is run in
-   --  wisi-gen_generate_utils.To_Grammar.
-
-   function Potential_Direct_Left_Recursive
-     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
-      Empty   : in Token_ID_Set)
-     return Token_ID_Set;
-
-end WisiToken.Generate.Packrat;
+--  Abstract :
+--
+--  Types and operations for computing grammar properties used in
+--  generating a packrat parser.
+--
+--  We use the terminology in [tratt 2010] for recursion in
+--  productions.
+--
+--  References :
+--
+--  See wisitoken-parse-packrat.ads.
+--
+--  Copyright (C) 2018 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+package WisiToken.Generate.Packrat is
+
+   type Data (First_Terminal, First_Nonterminal, Last_Nonterminal : Token_ID) 
is tagged
+   record
+      --  Data needed to check a grammar and generate code. Tagged to allow
+      --  Object.Method syntax. Descriptor not included to avoid duplicating
+      --  lots of discriminants.
+      Source_File_Name      : Ada.Strings.Unbounded.Unbounded_String;
+      Grammar               : WisiToken.Productions.Prod_Arrays.Vector;
+      Source_Line_Map       : Productions.Source_Line_Maps.Vector;
+      Empty                 : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
+      Direct_Left_Recursive : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
+      First                 : Token_Array_Token_Set
+        (First_Nonterminal .. Last_Nonterminal, First_Terminal .. 
Last_Nonterminal);
+      Involved              : Token_Array_Token_Set
+        (First_Nonterminal .. Last_Nonterminal, First_Nonterminal .. 
Last_Nonterminal);
+   end record;
+
+   function Initialize
+     (Source_File_Name : in String;
+      Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
+      Source_Line_Map  : in Productions.Source_Line_Maps.Vector;
+      First_Terminal   : in Token_ID)
+     return Packrat.Data;
+
+   procedure Check_Recursion (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
+   --  Check that any rule recursion present is supported.
+
+   procedure Check_RHS_Order (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
+   --  For each production, check that right hand sides that share
+   --  prefixes have the longest right hand side first, and that any
+   --  empty right hand side is last.
+   --
+   --  Violations output a message to Ada.Text_IO.Standard_Error, and
+   --  set WisiToken.Generate.Error True.
+
+   procedure Check_All  (Data : in Packrat.Data; Descriptor : in 
WisiToken.Descriptor);
+   --  Run all the above checks.
+   --
+   --  Note that WisiToken.Generate.Check_Consistent is run in
+   --  wisi-gen_generate_utils.To_Grammar.
+
+   function Potential_Direct_Left_Recursive
+     (Grammar : in WisiToken.Productions.Prod_Arrays.Vector;
+      Empty   : in Token_ID_Set)
+     return Token_ID_Set;
+
+end WisiToken.Generate.Packrat;
diff --git a/packages/wisi/wisitoken-generate.adb 
b/packages/wisi/wisitoken-generate.adb
index 9796b87..769a581 100644
--- a/packages/wisi/wisitoken-generate.adb
+++ b/packages/wisi/wisitoken-generate.adb
@@ -1,434 +1,543 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Directories;
-with Ada.Text_IO;
-with Ada.Strings.Fixed;
-package body WisiToken.Generate is
-
-   function Error_Message
-     (File_Name : in String;
-      File_Line : in Line_Number_Type;
-      Message   : in String)
-     return String
-   is
-      use Ada.Directories;
-      use Ada.Strings.Fixed;
-      use Ada.Strings;
-   begin
-      return Simple_Name (File_Name) & ":" &
-        Trim (Line_Number_Type'Image (File_Line), Left) & ":0: " & Message;
-   end Error_Message;
-
-   procedure Put_Error (Message : in String)
-   is begin
-      Error := True;
-      Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, Message);
-   end Put_Error;
-
-   procedure Check_Consistent
-     (Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor       : in WisiToken.Descriptor;
-      Source_File_Name : in String)
-   is begin
-      if Descriptor.Accept_ID /= Descriptor.First_Nonterminal then
-         Put_Error
-           (Error_Message
-              (Source_File_Name, Line_Number_Type'First,
-               "Descriptor.Accept_ID /= Descriptor.First_Nonterminal"));
-      end if;
-      if Grammar.First_Index /= Descriptor.First_Nonterminal then
-         Put_Error
-           (Error_Message
-              (Source_File_Name, Line_Number_Type'First,
-               "Grammar.First_Index /= Descriptor.First_Nonterminal"));
-      end if;
-      if Grammar.Last_Index /= Descriptor.Last_Nonterminal then
-         Put_Error
-           (Error_Message
-              (Source_File_Name, Line_Number_Type'First,
-               "Grammar.Last_Index /= Descriptor.Last_Nonterminal"));
-      end if;
-
-      for Nonterm in Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal loop
-         if Grammar (Nonterm).LHS /= Nonterm then
-            Put_Error
-              (Error_Message
-                 (Source_File_Name, Line_Number_Type'First,
-                  "Grammar (" & Image (Nonterm, Descriptor) & ").LHS /= " &
-                    Image (Nonterm, Descriptor)));
-         end if;
-      end loop;
-   end Check_Consistent;
-
-   function Check_Unused_Tokens
-     (Descriptor : in WisiToken.Descriptor;
-      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector)
-     return Boolean
-   is
-      subtype Terminals    is Token_ID range Descriptor.First_Terminal    .. 
Descriptor.Last_Terminal;
-      subtype Nonterminals is Token_ID range Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal;
-
-      Used_Tokens : Token_ID_Set := (Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal => False);
-
-      Changed        : Boolean := False;
-      Abort_Generate : Boolean := False;
-      Unused_Tokens  : Boolean := False;
-   begin
-      Used_Tokens (Descriptor.Accept_ID) := True;
-
-      --  First mark all nonterminals that occur in used nonterminals as
-      --  used.
-      loop
-         for Prod of Grammar loop
-            if Used_Tokens (Prod.LHS) then
-               for RHS of Prod.RHSs loop
-                  for J of RHS.Tokens loop
-                     if J in Nonterminals then
-                        Changed         := Changed or else not Used_Tokens (J);
-                        Used_Tokens (J) := True;
-                     end if;
-                  end loop;
-               end loop;
-            end if;
-         end loop;
-         exit when not Changed;
-         Changed := False;
-      end loop;
-
-      --  Now mark terminals used in used nonterminals
-      for Prod of Grammar loop
-         if Used_Tokens (Prod.LHS) then
-            for RHS of Prod.RHSs loop
-               for J of RHS.Tokens loop
-                  if not (J in Used_Tokens'Range) then
-                     WisiToken.Generate.Put_Error
-                       ("non-grammar token " & Image (J, Descriptor) & " used 
in grammar");
-
-                     --  This causes lots of problems with token_id not in 
terminal or
-                     --  nonterminal range, so abort early.
-                     Abort_Generate := True;
-                  end if;
-
-                  if J in Terminals then
-                     Used_Tokens (J) := True;
-                  end if;
-               end loop;
-            end loop;
-         end if;
-      end loop;
-
-      for I in Used_Tokens'Range loop
-         if not Used_Tokens (I) then
-            if not Unused_Tokens then
-               WisiToken.Generate.Put_Error ("Unused tokens:");
-               Unused_Tokens := True;
-            end if;
-            WisiToken.Generate.Put_Error (Image (I, Descriptor));
-         end if;
-      end loop;
-
-      if Abort_Generate then
-         raise Grammar_Error;
-      end if;
-
-      return Unused_Tokens;
-   end Check_Unused_Tokens;
-
-   function Has_Empty_Production (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Token_ID_Set
-   is
-      use all type Ada.Containers.Count_Type;
-
-      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
-
-      Result  : Token_ID_Set := (Nonterminal => False);
-      Changed : Boolean      := True;
-   begin
-      loop
-         exit when not Changed;
-         Changed := False;
-
-         for Prod of Grammar loop
-            for RHS of Prod.RHSs loop
-               if (RHS.Tokens.Length = 0 or else
-                     (RHS.Tokens (1) in Nonterminal and then Result 
(RHS.Tokens (1)))) and
-                 not Result (Prod.LHS)
-               then
-                  Result (Prod.LHS) := True;
-                  Changed := True;
-               end if;
-            end loop;
-         end loop;
-      end loop;
-      return Result;
-   end Has_Empty_Production;
-
-   function First
-     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production : in Token_ID_Set;
-      First_Terminal       : in Token_ID;
-      Non_Terminal         : in Token_ID)
-     return Token_ID_Set
-   is
-      Derivations   : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
-      Added_Tokens  : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
-      Search_Tokens : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
-
-      function Compute_Non_Terminals return Token_ID_Set
-      is
-         Result : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
-      begin
-         --  Can't use a simple aggregate for this; bounds are non-static.
-         Result (First_Terminal .. Grammar.First_Index - 1) := (others => 
False);
-         Result (Grammar.First_Index .. Grammar.Last_Index) := (others => 
True);
-         return Result;
-      end Compute_Non_Terminals;
-
-      Non_Terminals : constant Token_ID_Set := Compute_Non_Terminals;
-
-   begin
-      Search_Tokens (Non_Terminal) := True;
-
-      while Any (Search_Tokens) loop
-
-         Added_Tokens := (others => False);
-
-         for Prod of Grammar loop
-            if Search_Tokens (Prod.LHS) then
-               for RHS of Prod.RHSs loop
-                  for Derived_Token of RHS.Tokens loop
-                     if not Derivations (Derived_Token) then
-                        Added_Tokens (Derived_Token) := True;
-                     end if;
-
-                     if Non_Terminals (Derived_Token) and then 
Has_Empty_Production (Derived_Token) then
-                        null;
-                     else
-                        exit;
-                     end if;
-                  end loop;
-               end loop;
-            end if;
-         end loop;
-
-         Derivations   := Derivations or Added_Tokens;
-         Search_Tokens := Added_Tokens and Non_Terminals;
-      end loop;
-
-      return Derivations;
-   end First;
-
-   function First
-     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production : in Token_ID_Set;
-      First_Terminal       : in Token_ID)
-     return Token_Array_Token_Set
-   is
-      Matrix : Token_Array_Token_Set :=
-        (Grammar.First_Index .. Grammar.Last_Index =>
-           (First_Terminal .. Grammar.Last_Index => False));
-
-      procedure Set_Slice (Matrix : in out Token_Array_Token_Set; I : 
Token_ID; Value : in Token_ID_Set)
-      is begin
-         for J in Matrix'Range (2) loop
-            Matrix (I, J) := Value (J);
-         end loop;
-      end Set_Slice;
-
-   begin
-      for NT_Index in Matrix'Range loop
-         Set_Slice (Matrix, NT_Index, First (Grammar, Has_Empty_Production, 
First_Terminal, NT_Index));
-      end loop;
-
-      return Matrix;
-   end First;
-
-   function To_Terminal_Sequence_Array
-     (First      : in Token_Array_Token_Set;
-      Descriptor : in WisiToken.Descriptor)
-     return Token_Sequence_Arrays.Vector
-   is
-      subtype Terminal is Token_ID range Descriptor.First_Terminal .. 
Descriptor.Last_Terminal;
-   begin
-      return Result : Token_Sequence_Arrays.Vector do
-         Result.Set_First (First'First (1));
-         Result.Set_Last (First'Last (1));
-
-         for I in First'Range (1) loop
-            declare
-               Row : Token_ID_Arrays.Vector renames Result (I);
-            begin
-               for J in First'Range (2) loop
-                  if First (I, J) and then J in Terminal then
-                     Row.Append (J);
-                  end if;
-               end loop;
-            end;
-         end loop;
-      end return;
-   end To_Terminal_Sequence_Array;
-
-   function Follow
-     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor           : in WisiToken.Descriptor;
-      First                : in Token_Array_Token_Set;
-      Has_Empty_Production : in Token_ID_Set)
-     return Token_Array_Token_Set
-   is
-      subtype Terminal    is Token_ID range Descriptor.First_Terminal    .. 
Descriptor.Last_Terminal;
-      subtype Nonterminal is Token_ID range Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal;
-
-      Prev_Result : Token_Array_Token_Set := (Nonterminal => (Terminal => 
False));
-      Result      : Token_Array_Token_Set := (Nonterminal => (Terminal => 
False));
-
-      ID : Token_ID;
-   begin
-      --  [dragon] pgp 189:
-      --
-      --  Rule 1 Follow (S, EOF) = True; EOF is explicit in the
-      --  start symbol production, so this is covered by Rule 2.
-      --
-      --  Rule 2: If A => alpha B Beta, add First (Beta) to Follow (B)
-      --
-      --  Rule 3; if A => alpha B, or A -> alpha B Beta and Beta
-      --  can be null, add Follow (A) to Follow (B)
-      --
-      --  We don't assume any order in the productions list, so we
-      --  have to keep applying rule 3 until nothing changes.
-
-      for B in Nonterminal loop
-         for Prod of Grammar loop
-            for A of Prod.RHSs loop
-               for I in A.Tokens.First_Index .. A.Tokens.Last_Index loop
-                  if A.Tokens (I) = B then
-                     if I < A.Tokens.Last_Index then
-                        --  Rule 1
-                        ID := A.Tokens (1 + I);
-                        if ID in Terminal then
-                           Result (B, ID) := True;
-                        else
-                           Or_Slice (Result, B, Slice (First, ID));
-                        end if;
-                     end if;
-                  end if;
-               end loop;
-            end loop;
-         end loop;
-      end loop;
-
-      Prev_Result := Result;
-      loop
-         for B in Nonterminal loop
-            for Prod of Grammar loop
-               for A of Prod.RHSs loop
-                  for I in A.Tokens.First_Index .. A.Tokens.Last_Index loop
-                     if A.Tokens (I) = B then
-                        if I = A.Tokens.Last_Index or else
-                          (A.Tokens (1 + I) in Nonterminal and then
-                             Has_Empty_Production (A.Tokens (1 + I)))
-                        then
-                           --  rule 3
-                           Or_Slice (Result, B, Slice (Result, Prod.LHS));
-                        end if;
-                     end if;
-                  end loop;
-               end loop;
-            end loop;
-         end loop;
-
-         exit when Prev_Result = Result;
-         Prev_Result := Result;
-      end loop;
-      return Result;
-   end Follow;
-
-   ----------
-   --  Indented text output
-
-   procedure Indent_Line (Text : in String)
-   is
-      use Ada.Text_IO;
-   begin
-      Set_Col (Indent);
-      Put_Line (Text);
-      Line_Count := Line_Count + 1;
-   end Indent_Line;
-
-   procedure Indent_Start (Text : in String)
-   is
-      use Ada.Text_IO;
-   begin
-      Set_Col (Indent);
-      Put (Text);
-   end Indent_Start;
-
-   procedure Indent_Wrap (Text : in String)
-   is
-      use all type Ada.Text_IO.Count;
-      use Ada.Strings;
-      use Ada.Strings.Fixed;
-      I     : Natural;
-      First : Integer := Text'First;
-   begin
-      if Text'Length + Indent <= Max_Line_Length then
-         Indent_Line (Text);
-      else
-         loop
-            I := Text'Last;
-            loop
-               I := Index (Text (First .. Text'Last), " ", From => I, Going => 
Backward);
-               exit when I - First + Integer (Indent) <= Max_Line_Length;
-               I := I - 1;
-            end loop;
-            Indent_Line (Text (First .. I - 1));
-            First := I + 1;
-            exit when Text'Last - First + Integer (Indent) <= Max_Line_Length;
-         end loop;
-         Indent_Line (Text (First .. Text'Last));
-      end if;
-   end Indent_Wrap;
-
-   procedure Indent_Wrap_Comment (Text : in String; Comment_Syntax : in String)
-   is
-      use all type Ada.Text_IO.Count;
-      use Ada.Strings;
-      use Ada.Strings.Fixed;
-      Prefix : constant String := Comment_Syntax & "  ";
-      I      : Natural;
-      First  : Integer         := Text'First;
-   begin
-      if Text'Length + Indent <= Max_Line_Length - 4 then
-         Indent_Line (Prefix & Text);
-      else
-         loop
-            I := Text'Last;
-            loop
-               I := Index (Text (First .. Text'Last), " ", From => I, Going => 
Backward);
-               exit when I - First + Integer (Indent) <= Max_Line_Length - 4;
-               I := I - 1;
-            end loop;
-            Indent_Line (Prefix & Text (First .. I - 1));
-            First := I + 1;
-            exit when Text'Last - First + Integer (Indent) <= Max_Line_Length 
- 4;
-         end loop;
-         Indent_Line (Prefix & Text (First .. Text'Last));
-      end if;
-   end Indent_Wrap_Comment;
-
-end WisiToken.Generate;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Directories;
+with Ada.Text_IO;
+with Ada.Strings.Fixed;
+package body WisiToken.Generate is
+
+   function Error_Message
+     (File_Name : in String;
+      File_Line : in Line_Number_Type;
+      Message   : in String)
+     return String
+   is
+      use Ada.Directories;
+      use Ada.Strings.Fixed;
+      use Ada.Strings;
+   begin
+      return Simple_Name (File_Name) & ":" &
+        Trim (Line_Number_Type'Image (File_Line), Left) & ":0: " & Message;
+   end Error_Message;
+
+   procedure Put_Error (Message : in String)
+   is begin
+      Error := True;
+      Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, Message);
+   end Put_Error;
+
+   procedure Check_Consistent
+     (Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor       : in WisiToken.Descriptor;
+      Source_File_Name : in String)
+   is begin
+      if Descriptor.Accept_ID /= Descriptor.First_Nonterminal then
+         Put_Error
+           (Error_Message
+              (Source_File_Name, Line_Number_Type'First,
+               "Descriptor.Accept_ID /= Descriptor.First_Nonterminal"));
+      end if;
+      if Grammar.First_Index /= Descriptor.First_Nonterminal then
+         Put_Error
+           (Error_Message
+              (Source_File_Name, Line_Number_Type'First,
+               "Grammar.First_Index /= Descriptor.First_Nonterminal"));
+      end if;
+      if Grammar.Last_Index /= Descriptor.Last_Nonterminal then
+         Put_Error
+           (Error_Message
+              (Source_File_Name, Line_Number_Type'First,
+               "Grammar.Last_Index /= Descriptor.Last_Nonterminal"));
+      end if;
+
+      for Nonterm in Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal loop
+         if Grammar (Nonterm).LHS /= Nonterm then
+            Put_Error
+              (Error_Message
+                 (Source_File_Name, Line_Number_Type'First,
+                  "Grammar (" & Image (Nonterm, Descriptor) & ").LHS = " &
+                    Image (Grammar (Nonterm).LHS, Descriptor) & " /= " &
+                    Image (Nonterm, Descriptor)));
+         end if;
+      end loop;
+   end Check_Consistent;
+
+   function Check_Unused_Tokens
+     (Descriptor : in WisiToken.Descriptor;
+      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector)
+     return Boolean
+   is
+      subtype Terminals    is Token_ID range Descriptor.First_Terminal    .. 
Descriptor.Last_Terminal;
+      subtype Nonterminals is Token_ID range Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal;
+
+      Used_Tokens : Token_ID_Set := (Descriptor.First_Terminal .. 
Descriptor.Last_Nonterminal => False);
+
+      Changed        : Boolean := False;
+      Abort_Generate : Boolean := False;
+      Unused_Tokens  : Boolean := False;
+   begin
+      Used_Tokens (Descriptor.Accept_ID) := True;
+
+      --  First mark all nonterminals that occur in used nonterminals as
+      --  used.
+      loop
+         for Prod of Grammar loop
+            if Used_Tokens (Prod.LHS) then
+               for RHS of Prod.RHSs loop
+                  for J of RHS.Tokens loop
+                     if J in Nonterminals then
+                        Changed         := Changed or else not Used_Tokens (J);
+                        Used_Tokens (J) := True;
+                     end if;
+                  end loop;
+               end loop;
+            end if;
+         end loop;
+         exit when not Changed;
+         Changed := False;
+      end loop;
+
+      --  Now mark terminals used in used nonterminals
+      for Prod of Grammar loop
+         if Used_Tokens (Prod.LHS) then
+            for RHS of Prod.RHSs loop
+               for J of RHS.Tokens loop
+                  if not (J in Used_Tokens'Range) then
+                     WisiToken.Generate.Put_Error
+                       ("non-grammar token " & Image (J, Descriptor) & " used 
in grammar");
+
+                     --  This causes lots of problems with token_id not in 
terminal or
+                     --  nonterminal range, so abort early.
+                     Abort_Generate := True;
+                  end if;
+
+                  if J in Terminals then
+                     Used_Tokens (J) := True;
+                  end if;
+               end loop;
+            end loop;
+         end if;
+      end loop;
+
+      for I in Used_Tokens'Range loop
+         if not Used_Tokens (I) then
+            if not Unused_Tokens then
+               WisiToken.Generate.Put_Error ("Unused tokens:");
+               Unused_Tokens := True;
+            end if;
+            WisiToken.Generate.Put_Error (Image (I, Descriptor));
+         end if;
+      end loop;
+
+      if Abort_Generate then
+         raise Grammar_Error;
+      end if;
+
+      return Unused_Tokens;
+   end Check_Unused_Tokens;
+
+   function Has_Empty_Production (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Token_ID_Set
+   is
+      use all type Ada.Containers.Count_Type;
+
+      subtype Nonterminal is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
+
+      Result  : Token_ID_Set := (Nonterminal => False);
+      Changed : Boolean      := True;
+   begin
+      loop
+         exit when not Changed;
+         Changed := False;
+
+         for Prod of Grammar loop
+            for RHS of Prod.RHSs loop
+               if (RHS.Tokens.Length = 0 or else
+                     (RHS.Tokens (1) in Nonterminal and then Result 
(RHS.Tokens (1)))) and
+                 not Result (Prod.LHS)
+               then
+                  Result (Prod.LHS) := True;
+                  Changed := True;
+               end if;
+            end loop;
+         end loop;
+      end loop;
+      return Result;
+   end Has_Empty_Production;
+
+   function First
+     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production : in Token_ID_Set;
+      First_Terminal       : in Token_ID;
+      Non_Terminal         : in Token_ID)
+     return Token_ID_Set
+   is
+      Derivations   : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
+      Added_Tokens  : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
+      Search_Tokens : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
+
+      function Compute_Non_Terminals return Token_ID_Set
+      is
+         Result : Token_ID_Set := (First_Terminal .. Grammar.Last_Index => 
False);
+      begin
+         --  Can't use a simple aggregate for this; bounds are non-static.
+         Result (First_Terminal .. Grammar.First_Index - 1) := (others => 
False);
+         Result (Grammar.First_Index .. Grammar.Last_Index) := (others => 
True);
+         return Result;
+      end Compute_Non_Terminals;
+
+      Non_Terminals : constant Token_ID_Set := Compute_Non_Terminals;
+
+   begin
+      Search_Tokens (Non_Terminal) := True;
+
+      while Any (Search_Tokens) loop
+
+         Added_Tokens := (others => False);
+
+         for Prod of Grammar loop
+            if Search_Tokens (Prod.LHS) then
+               for RHS of Prod.RHSs loop
+                  for Derived_Token of RHS.Tokens loop
+                     if not Derivations (Derived_Token) then
+                        Added_Tokens (Derived_Token) := True;
+                     end if;
+
+                     if Non_Terminals (Derived_Token) and then 
Has_Empty_Production (Derived_Token) then
+                        null;
+                     else
+                        exit;
+                     end if;
+                  end loop;
+               end loop;
+            end if;
+         end loop;
+
+         Derivations   := Derivations or Added_Tokens;
+         Search_Tokens := Added_Tokens and Non_Terminals;
+      end loop;
+
+      return Derivations;
+   end First;
+
+   function First
+     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production : in Token_ID_Set;
+      First_Terminal       : in Token_ID)
+     return Token_Array_Token_Set
+   is
+      Matrix : Token_Array_Token_Set :=
+        (Grammar.First_Index .. Grammar.Last_Index =>
+           (First_Terminal .. Grammar.Last_Index => False));
+
+      procedure Set_Slice (Matrix : in out Token_Array_Token_Set; I : 
Token_ID; Value : in Token_ID_Set)
+      is begin
+         for J in Matrix'Range (2) loop
+            Matrix (I, J) := Value (J);
+         end loop;
+      end Set_Slice;
+
+   begin
+      for NT_Index in Matrix'Range loop
+         Set_Slice (Matrix, NT_Index, First (Grammar, Has_Empty_Production, 
First_Terminal, NT_Index));
+      end loop;
+
+      return Matrix;
+   end First;
+
+   function To_Terminal_Sequence_Array
+     (First      : in Token_Array_Token_Set;
+      Descriptor : in WisiToken.Descriptor)
+     return Token_Sequence_Arrays.Vector
+   is
+      subtype Terminal is Token_ID range Descriptor.First_Terminal .. 
Descriptor.Last_Terminal;
+   begin
+      return Result : Token_Sequence_Arrays.Vector do
+         Result.Set_First (First'First (1));
+         Result.Set_Last (First'Last (1));
+
+         for I in First'Range (1) loop
+            declare
+               Row : Token_ID_Arrays.Vector renames Result (I);
+            begin
+               for J in First'Range (2) loop
+                  if First (I, J) and then J in Terminal then
+                     Row.Append (J);
+                  end if;
+               end loop;
+            end;
+         end loop;
+      end return;
+   end To_Terminal_Sequence_Array;
+
+   function Follow
+     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor           : in WisiToken.Descriptor;
+      First                : in Token_Array_Token_Set;
+      Has_Empty_Production : in Token_ID_Set)
+     return Token_Array_Token_Set
+   is
+      subtype Terminal    is Token_ID range Descriptor.First_Terminal    .. 
Descriptor.Last_Terminal;
+      subtype Nonterminal is Token_ID range Descriptor.First_Nonterminal .. 
Descriptor.Last_Nonterminal;
+
+      Prev_Result : Token_Array_Token_Set := (Nonterminal => (Terminal => 
False));
+      Result      : Token_Array_Token_Set := (Nonterminal => (Terminal => 
False));
+
+      ID : Token_ID;
+   begin
+      --  [dragon] pgp 189:
+      --
+      --  Rule 1 Follow (S, EOF) = True; EOF is explicit in the
+      --  start symbol production, so this is covered by Rule 2.
+      --
+      --  Rule 2: If A => alpha B Beta, add First (Beta) to Follow (B)
+      --
+      --  Rule 3; if A => alpha B, or A -> alpha B Beta and Beta
+      --  can be null, add Follow (A) to Follow (B)
+      --
+      --  We don't assume any order in the productions list, so we
+      --  have to keep applying rule 3 until nothing changes.
+
+      for B in Nonterminal loop
+         for Prod of Grammar loop
+            for A of Prod.RHSs loop
+               for I in A.Tokens.First_Index .. A.Tokens.Last_Index loop
+                  if A.Tokens (I) = B then
+                     if I < A.Tokens.Last_Index then
+                        --  Rule 1
+                        ID := A.Tokens (1 + I);
+                        if ID in Terminal then
+                           Result (B, ID) := True;
+                        else
+                           Or_Slice (Result, B, Slice (First, ID));
+                        end if;
+                     end if;
+                  end if;
+               end loop;
+            end loop;
+         end loop;
+      end loop;
+
+      Prev_Result := Result;
+      loop
+         for B in Nonterminal loop
+            for Prod of Grammar loop
+               for A of Prod.RHSs loop
+                  for I in A.Tokens.First_Index .. A.Tokens.Last_Index loop
+                     if A.Tokens (I) = B then
+                        if I = A.Tokens.Last_Index or else
+                          (A.Tokens (1 + I) in Nonterminal and then
+                             Has_Empty_Production (A.Tokens (1 + I)))
+                        then
+                           --  rule 3
+                           Or_Slice (Result, B, Slice (Result, Prod.LHS));
+                        end if;
+                     end if;
+                  end loop;
+               end loop;
+            end loop;
+         end loop;
+
+         exit when Prev_Result = Result;
+         Prev_Result := Result;
+      end loop;
+      return Result;
+   end Follow;
+
+   function To_Graph (Grammar : in WisiToken.Productions.Prod_Arrays.Vector) 
return Grammar_Graphs.Graph
+   is
+      use all type Ada.Containers.Count_Type;
+      subtype Nonterminals is Token_ID range Grammar.First_Index .. 
Grammar.Last_Index;
+      Graph : Grammar_Graphs.Graph;
+      J     : Integer := 1;
+   begin
+      if Trace_Generate > Outline then
+         Ada.Text_IO.Put_Line ("grammar graph:");
+      end if;
+
+      for LHS in Grammar.First_Index .. Grammar.Last_Index loop
+         declare
+            Prod : WisiToken.Productions.Instance renames Grammar (LHS);
+         begin
+            for RHS in Prod.RHSs.First_Index .. Prod.RHSs.Last_Index loop
+               declare
+                  Tokens : Token_ID_Arrays.Vector renames Prod.RHSs 
(RHS).Tokens;
+               begin
+                  for I in Tokens.First_Index .. Tokens.Last_Index loop
+                     if Tokens (I) in Nonterminals then
+                        if Trace_Generate > Detail then
+                           Ada.Text_IO.Put_Line
+                             ("(" & Trimmed_Image (LHS) & ", " & Trimmed_Image 
(Tokens (I)) & ","  & J'Image & ")");
+                           J := J + 1;
+                        end if;
+                        Graph.Add_Edge
+                          (LHS, Tokens (I),
+                           (RHS,
+                            Recursive =>
+                              (if Tokens.Length = 1 then Single
+                               elsif I = Tokens.First_Index then Left
+                               elsif I = Tokens.Last_Index then Right
+                               else Middle)));
+                     end if;
+                  end loop;
+               end;
+            end loop;
+         end;
+      end loop;
+
+      if Trace_Generate > Outline then
+         Ada.Text_IO.Put_Line ("..." & Graph.Count_Nodes'Image & " nodes" & 
Graph.Count_Edges'Image & " edges.");
+      end if;
+      return Graph;
+   end To_Graph;
+
+   function Compute_Full_Recursion (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Recursions
+   is
+      Graph : constant Grammar_Graphs.Graph := To_Graph (Grammar);
+   begin
+      return Result : Recursions :=
+        (Full       => True,
+         Recursions => Graph.Find_Cycles)
+      do
+         Grammar_Graphs.Sort_Paths.Sort (Result.Recursions);
+         if Trace_Generate > Extra then
+            Ada.Text_IO.Put_Line ("full recursions:");
+            for I in Result.Recursions.First_Index .. 
Result.Recursions.Last_Index loop
+               Ada.Text_IO.Put_Line (Trimmed_Image (I) & " => " & 
Grammar_Graphs.Image (Result.Recursions (I)));
+            end loop;
+         end if;
+      end return;
+   end Compute_Full_Recursion;
+
+   function Compute_Partial_Recursion (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Recursions
+   is
+      use Grammar_Graphs;
+      Graph      : constant Grammar_Graphs.Graph := To_Graph (Grammar);
+      Components : constant Component_Lists.List := 
Strongly_Connected_Components
+        (To_Adjancency (Graph), Non_Trivial_Only => True);
+      Loops      : constant Vertex_Lists.List    := Graph.Loops;
+   begin
+      return Result : Recursions do
+         Result.Full := False;
+         for Comp of Components loop
+            declare
+               Path : Recursion_Cycle (1 .. Integer (Comp.Length));
+               Last : Integer := Path'First - 1;
+            begin
+               for V of Comp loop
+                  Last := Last + 1;
+                  Path (Last) := (V, Graph.Edges (V));
+               end loop;
+               Result.Recursions.Append (Path);
+            end;
+         end loop;
+
+         declare
+            Path : Recursion_Cycle (1 .. Integer (Loops.Length));
+            Last : Integer := Path'First - 1;
+         begin
+            for V of Loops loop
+               Last := Last + 1;
+               Path (Last) := (V, Graph.Edges (V));
+            end loop;
+            Result.Recursions.Append (Path);
+         end;
+
+         if Trace_Generate > Extra then
+            Ada.Text_IO.Put_Line ("partial recursions:");
+            for I in Result.Recursions.First_Index .. 
Result.Recursions.Last_Index loop
+               Ada.Text_IO.Put_Line (Trimmed_Image (I) & " => " & 
Grammar_Graphs.Image (Result.Recursions (I)));
+            end loop;
+         end if;
+      end return;
+   end Compute_Partial_Recursion;
+
+   ----------
+   --  Indented text output
+
+   procedure Indent_Line (Text : in String)
+   is
+      use Ada.Text_IO;
+   begin
+      Set_Col (Indent);
+      Put_Line (Text);
+      Line_Count := Line_Count + 1;
+   end Indent_Line;
+
+   procedure Indent_Start (Text : in String)
+   is
+      use Ada.Text_IO;
+   begin
+      Set_Col (Indent);
+      Put (Text);
+   end Indent_Start;
+
+   procedure Indent_Wrap (Text : in String)
+   is
+      use all type Ada.Text_IO.Count;
+      use Ada.Strings;
+      use Ada.Strings.Fixed;
+      I     : Natural;
+      First : Integer := Text'First;
+   begin
+      if Text'Length + Indent <= Max_Line_Length then
+         Indent_Line (Text);
+      else
+         loop
+            I := Text'Last;
+            loop
+               I := Index (Text (First .. Text'Last), " ", From => I, Going => 
Backward);
+               exit when I - First + Integer (Indent) <= Max_Line_Length;
+               I := I - 1;
+            end loop;
+            Indent_Line (Text (First .. I - 1));
+            First := I + 1;
+            exit when Text'Last - First + Integer (Indent) <= Max_Line_Length;
+         end loop;
+         Indent_Line (Text (First .. Text'Last));
+      end if;
+   end Indent_Wrap;
+
+   procedure Indent_Wrap_Comment (Text : in String; Comment_Syntax : in String)
+   is
+      use all type Ada.Text_IO.Count;
+      use Ada.Strings;
+      use Ada.Strings.Fixed;
+      Prefix : constant String := Comment_Syntax & "  ";
+      I      : Natural;
+      First  : Integer         := Text'First;
+   begin
+      if Text'Length + Indent <= Max_Line_Length - 4 then
+         Indent_Line (Prefix & Text);
+      else
+         loop
+            I := Text'Last;
+            loop
+               I := Index (Text (First .. Text'Last), " ", From => I, Going => 
Backward);
+               exit when I - First + Integer (Indent) <= Max_Line_Length - 4;
+               I := I - 1;
+            end loop;
+            Indent_Line (Prefix & Text (First .. I - 1));
+            First := I + 1;
+            exit when Text'Last - First + Integer (Indent) <= Max_Line_Length 
- 4;
+         end loop;
+         Indent_Line (Prefix & Text (First .. Text'Last));
+      end if;
+   end Indent_Wrap_Comment;
+
+end WisiToken.Generate;
diff --git a/packages/wisi/wisitoken-generate.ads 
b/packages/wisi/wisitoken-generate.ads
index 01340eb..45d8c7c 100644
--- a/packages/wisi/wisitoken-generate.ads
+++ b/packages/wisi/wisitoken-generate.ads
@@ -1,121 +1,189 @@
---  Abstract :
---
---  Types and operations for generating parsers, common to all parser
---  types.
---
---  The wisi* packages deal with reading *.wy files and generating
---  source code files. The wisitoken-generate* packages deal with
---  computing parser properties from the grammar. (For historical
---  reasons, not all packages follow this naming convention yet).
---
---  References :
---
---  See wisitoken.ads
---
---  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Productions;
-package WisiToken.Generate is
-
-   Error : Boolean := False;
-   --  Set True by errors during grammar generation
-
-   function Error_Message
-     (File_Name : in String;
-      File_Line : in WisiToken.Line_Number_Type;
-      Message   : in String)
-     return String;
-
-   procedure Put_Error (Message : in String);
-   --  Set Error True, output Message to Standard_Error
-
-   procedure Check_Consistent
-     (Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor       : in WisiToken.Descriptor;
-      Source_File_Name : in String);
-   --  Check requirements on Descriptor values.
-
-   function Check_Unused_Tokens
-     (Descriptor : in WisiToken.Descriptor;
-      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector)
-     return Boolean;
-   --  Return False if there is a terminal or nonterminal that is not
-   --  used in the grammar.
-   --
-   --  Raises Grammar_Error if there is a non-grammar token used in the
-   --  grammar.
-
-   function Has_Empty_Production (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Token_ID_Set;
-   --  Result (ID) is True if any production for ID can be an empty
-   --  production, recursively.
-
-   function First
-     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
-      Has_Empty_Production : in Token_ID_Set;
-      First_Terminal       : in Token_ID)
-     return Token_Array_Token_Set;
-   --  For each nonterminal in Grammar, find the set of tokens
-   --  (terminal or nonterminal) that any string derived from it can
-   --  start with. Together with Has_Empty_Production, implements
-   --  algorithm FIRST from [dragon], augmented with nonterminals.
-   --
-   --  LALR, LR1 generate want First as both Token_Sequence_Arrays.Vector
-   --  and Token_Array_Token_Set, Packrat wants Token_Array_Token_Set,
-   --  existing tests all use Token_Array_Token_Set. So for LR1 we use
-   --  To_Terminal_Sequence_Array.
-
-   function To_Terminal_Sequence_Array
-     (First      : in Token_Array_Token_Set;
-      Descriptor : in WisiToken.Descriptor)
-     return Token_Sequence_Arrays.Vector;
-   --  Only includes terminals.
-
-   function Follow
-     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
-      Descriptor           : in WisiToken.Descriptor;
-      First                : in Token_Array_Token_Set;
-      Has_Empty_Production : in Token_ID_Set)
-     return Token_Array_Token_Set;
-   --  For each nonterminal in Grammar, find the set of terminal
-   --  tokens that can follow it. Implements algorithm FOLLOW from
-   --  [dragon] pg 189.
-
-   ----------
-   --  Indented text output. Mostly used for code generation in wisi,
-   --  also used in outputing the parse_table and other debug stuff.
-
-   Max_Line_Length : constant := 120;
-
-   Indent     : Standard.Ada.Text_IO.Positive_Count := 1;
-   Line_Count : Integer;
-
-   procedure Indent_Line (Text : in String);
-   --  Put Text, indented to Indent, to Current_Output, with newline.
-
-   procedure Indent_Start (Text : in String);
-   --  Put Text indented to Indent to Current_Output, without newline.
-   --  Should be followed by Put_Line, not Indent_Line.
-
-   procedure Indent_Wrap (Text : in String);
-   --  Put Text, indented to Indent, wrapped at Max_Line_Length, to
-   --  Current_Output, ending with newline.
-
-   procedure Indent_Wrap_Comment (Text : in String; Comment_Syntax : in 
String);
-   --  Put Text, prefixed by Comment_Syntax and two spaces, indented to
-   --  Indent, wrapped at Max_Line_Length, to Current_Output, ending with
-   --  newline.
-
-end WisiToken.Generate;
+--  Abstract :
+--
+--  Types and operations for generating parsers, common to all parser
+--  types.
+--
+--  The wisi* packages deal with reading *.wy files and generating
+--  source code files. The wisitoken-generate* packages deal with
+--  computing parser properties from the grammar. (For historical
+--  reasons, not all packages follow this naming convention yet).
+--
+--  References :
+--
+--  See wisitoken.ads
+--
+--  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers.Doubly_Linked_Lists;
+with SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image;
+with SAL.Gen_Graphs;
+with WisiToken.Productions;
+package WisiToken.Generate is
+
+   Error : Boolean := False;
+   --  Set True by errors during grammar generation
+
+   function Error_Message
+     (File_Name : in String;
+      File_Line : in WisiToken.Line_Number_Type;
+      Message   : in String)
+     return String;
+
+   procedure Put_Error (Message : in String);
+   --  Set Error True, output Message to Standard_Error
+
+   procedure Check_Consistent
+     (Grammar          : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor       : in WisiToken.Descriptor;
+      Source_File_Name : in String);
+   --  Check requirements on Descriptor values.
+
+   function Check_Unused_Tokens
+     (Descriptor : in WisiToken.Descriptor;
+      Grammar    : in WisiToken.Productions.Prod_Arrays.Vector)
+     return Boolean;
+   --  Return False if there is a terminal or nonterminal that is not
+   --  used in the grammar.
+   --
+   --  Raises Grammar_Error if there is a non-grammar token used in the
+   --  grammar.
+
+   function Has_Empty_Production (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Token_ID_Set;
+   --  Result (ID) is True if any production for ID can be an empty
+   --  production, recursively.
+
+   function First
+     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
+      Has_Empty_Production : in Token_ID_Set;
+      First_Terminal       : in Token_ID)
+     return Token_Array_Token_Set;
+   --  For each nonterminal in Grammar, find the set of tokens
+   --  (terminal or nonterminal) that any string derived from it can
+   --  start with. Together with Has_Empty_Production, implements
+   --  algorithm FIRST from [dragon], augmented with nonterminals.
+   --
+   --  LALR, LR1 generate want First as both Token_Sequence_Arrays.Vector
+   --  and Token_Array_Token_Set, Packrat wants Token_Array_Token_Set,
+   --  existing tests all use Token_Array_Token_Set. So for LR1 we use
+   --  To_Terminal_Sequence_Array.
+
+   function To_Terminal_Sequence_Array
+     (First      : in Token_Array_Token_Set;
+      Descriptor : in WisiToken.Descriptor)
+     return Token_Sequence_Arrays.Vector;
+   --  Only includes terminals.
+
+   function Follow
+     (Grammar              : in WisiToken.Productions.Prod_Arrays.Vector;
+      Descriptor           : in WisiToken.Descriptor;
+      First                : in Token_Array_Token_Set;
+      Has_Empty_Production : in Token_ID_Set)
+     return Token_Array_Token_Set;
+   --  For each nonterminal in Grammar, find the set of terminal
+   --  tokens that can follow it. Implements algorithm FOLLOW from
+   --  [dragon] pg 189.
+
+   ----------
+   --  Recursion
+
+   --  Recursion is the result of a cycle in the grammar. We can form a
+   --  graph representing the grammar by taking the nonterminals as the
+   --  graph vertices, and the occurence of a nonterminal in a production
+   --  right hand side as a directed edge connecting two nonterminals
+   --  (the other is the left hand side of that production. Then
+   --  recursion is represented by a cycle in the graph.
+
+   type Recursion_Item is record
+      RHS : Natural := 0;
+      --  The edge leading to this node. We don't need the actual token
+      --  number.
+
+      Recursive : Recursion := None;
+      --  Position of the token in the RHS.
+   end record;
+
+   function Edge_Image (Edge : in Recursion_Item) return String is
+     (Trimmed_Image (Edge.RHS) & " " & Recursion'Image (Edge.Recursive));
+
+   type Base_Recursion_Index is range 0 .. Integer'Last;
+   subtype Recursion_Index is Base_Recursion_Index range 1 .. 
Base_Recursion_Index'Last;
+   Invalid_Recursion_Index : constant Base_Recursion_Index := 0;
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Base_Recursion_Index);
+
+   package Grammar_Graphs is new SAL.Gen_Graphs
+     (Edge_Data         => Recursion_Item,
+      Default_Edge_Data => (others => <>),
+      Vertex_Index      => Token_ID,
+      Invalid_Vertex    => Invalid_Token_ID,
+      Path_Index        => Recursion_Index,
+      Edge_Image        => Edge_Image);
+
+   subtype Recursion_Cycle is Grammar_Graphs.Path;
+   --  A recursion, with lowest numbered production first. If there is
+   --  only one element, the recursion is direct; otherwise indirect.
+
+   subtype Recursion_Array is Grammar_Graphs.Path_Arrays.Vector;
+   --  For the collection of all cycles.
+
+   type Recursions is record
+      Full       : Boolean;
+      Recursions : Recursion_Array;
+      --  If Full, elements are paths; edges at path (I) are to path (I). If
+      --  not Full, elements are strongly connected components; edges at
+      --  path (I) are from path (I).
+   end record;
+
+   package Recursion_Lists is new Ada.Containers.Doubly_Linked_Lists 
(Recursion_Index);
+   function Image is new SAL.Ada_Containers.Gen_Doubly_Linked_Lists_Image
+     (Recursion_Index, "=", Recursion_Lists, Trimmed_Image);
+
+   function To_Graph (Grammar : in WisiToken.Productions.Prod_Arrays.Vector) 
return Grammar_Graphs.Graph;
+
+   function Compute_Full_Recursion (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Recursions;
+   --  Each element of result is a cycle in the grammar.
+
+   function Compute_Partial_Recursion (Grammar : in 
WisiToken.Productions.Prod_Arrays.Vector) return Recursions;
+   --  Each element of the result contains all members of a non-trivial
+   --  strongly connected component in the grammar, in arbitrary order.
+   --  This is an approximation to the full recursion, when that is too
+   --  hard to compute (ie for Java).
+
+   ----------
+   --  Indented text output. Mostly used for code generation in wisi,
+   --  also used in outputing the parse_table and other debug stuff.
+
+   Max_Line_Length : constant := 120;
+
+   Indent     : Standard.Ada.Text_IO.Positive_Count := 1;
+   Line_Count : Integer;
+
+   procedure Indent_Line (Text : in String);
+   --  Put Text, indented to Indent, to Current_Output, with newline.
+
+   procedure Indent_Start (Text : in String);
+   --  Put Text indented to Indent to Current_Output, without newline.
+   --  Should be followed by Put_Line, not Indent_Line.
+
+   procedure Indent_Wrap (Text : in String);
+   --  Put Text, indented to Indent, wrapped at Max_Line_Length, to
+   --  Current_Output, ending with newline.
+
+   procedure Indent_Wrap_Comment (Text : in String; Comment_Syntax : in 
String);
+   --  Put Text, prefixed by Comment_Syntax and two spaces, indented to
+   --  Indent, wrapped at Max_Line_Length, to Current_Output, ending with
+   --  newline.
+
+end WisiToken.Generate;
diff --git a/packages/wisi/wisitoken-lexer-re2c.adb 
b/packages/wisi/wisitoken-lexer-re2c.adb
index 10bbd16..d66088d 100644
--- a/packages/wisi/wisitoken-lexer-re2c.adb
+++ b/packages/wisi/wisitoken-lexer-re2c.adb
@@ -81,7 +81,7 @@ package body WisiToken.Lexer.re2c is
 
    overriding procedure Reset_With_String_Access
      (Lexer      : in out Instance;
-      Input      : access String;
+      Input      : in     Ada.Strings.Unbounded.String_Access;
       File_Name  : in     Ada.Strings.Unbounded.Unbounded_String;
       Begin_Char : in     Buffer_Pos       := Buffer_Pos'First;
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First)
diff --git a/packages/wisi/wisitoken-lexer-re2c.ads 
b/packages/wisi/wisitoken-lexer-re2c.ads
index b58c4ea..b871e9c 100644
--- a/packages/wisi/wisitoken-lexer-re2c.ads
+++ b/packages/wisi/wisitoken-lexer-re2c.ads
@@ -92,7 +92,7 @@ package WisiToken.Lexer.re2c is
 
    overriding procedure Reset_With_String_Access
      (Lexer      : in out Instance;
-      Input      : access String;
+      Input      : in     Ada.Strings.Unbounded.String_Access;
       File_Name  : in     Ada.Strings.Unbounded.Unbounded_String;
       Begin_Char : in     Buffer_Pos       := Buffer_Pos'First;
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First);
diff --git a/packages/wisi/wisitoken-lexer-regexp.adb 
b/packages/wisi/wisitoken-lexer-regexp.adb
index 1790b74..3e5a421 100644
--- a/packages/wisi/wisitoken-lexer-regexp.adb
+++ b/packages/wisi/wisitoken-lexer-regexp.adb
@@ -178,9 +178,9 @@ package body WisiToken.Lexer.Regexp is
    end Reset_With_String;
 
    overriding procedure Reset_With_String_Access
-     (Lexer     : in out Instance;
-      Input     : access String;
-      File_Name : in     Ada.Strings.Unbounded.Unbounded_String;
+     (Lexer      : in out Instance;
+      Input      : in     Ada.Strings.Unbounded.String_Access;
+      File_Name  : in     Ada.Strings.Unbounded.Unbounded_String;
       Begin_Char : in     Buffer_Pos       := Buffer_Pos'First;
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First)
    is begin
diff --git a/packages/wisi/wisitoken-lexer-regexp.ads 
b/packages/wisi/wisitoken-lexer-regexp.ads
index 3a3d5f4..da55448 100644
--- a/packages/wisi/wisitoken-lexer-regexp.ads
+++ b/packages/wisi/wisitoken-lexer-regexp.ads
@@ -67,7 +67,7 @@ package WisiToken.Lexer.Regexp is
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First);
    overriding procedure Reset_With_String_Access
      (Lexer      : in out Instance;
-      Input      : access String;
+      Input      : in     Ada.Strings.Unbounded.String_Access;
       File_Name  : in     Ada.Strings.Unbounded.Unbounded_String;
       Begin_Char : in     Buffer_Pos       := Buffer_Pos'First;
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First);
diff --git a/packages/wisi/wisitoken-lexer.ads 
b/packages/wisi/wisitoken-lexer.ads
index 7be10ed..3de31c7 100644
--- a/packages/wisi/wisitoken-lexer.ads
+++ b/packages/wisi/wisitoken-lexer.ads
@@ -70,7 +70,7 @@ package WisiToken.Lexer is
 
    procedure Reset_With_String_Access
      (Lexer      : in out Instance;
-      Input      : access String;
+      Input      : in     Ada.Strings.Unbounded.String_Access;
       File_Name  : in     Ada.Strings.Unbounded.Unbounded_String;
       Begin_Char : in     Buffer_Pos       := Buffer_Pos'First;
       Begin_Line : in     Line_Number_Type := Line_Number_Type'First)
@@ -154,7 +154,7 @@ private
 
       case Label is
       when String_Label =>
-         Buffer      : access String;
+         Buffer      : Ada.Strings.Unbounded.String_Access;
          User_Buffer : Boolean := False;
          --  If User_Buffer is True, user provided buffer and will deallocate
          --  it. Otherwise we must deallocate it.
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.adb 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.adb
index 17301b2..ae60955 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.adb
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.adb
@@ -1,433 +1,442 @@
---  Abstract :
---
---  Base utilities for McKenzie_Recover
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Task_Identification;
-with GNAT.Traceback.Symbolic;
-package body WisiToken.Parse.LR.McKenzie_Recover.Base is
-
-   function Get_Barrier
-     (Parsers                 : not null access Parser_Lists.List;
-      Parser_Status           : in              Parser_Status_Array;
-      Cost_Limit              : in              Natural;
-      Min_Success_Check_Count : in              Natural;
-      Check_Delta_Limit       : in              Natural;
-      Enqueue_Limit           : in              Natural)
-     return Boolean
-   is
-      use all type SAL.Base_Peek_Type;
-      Done_Count : SAL.Base_Peek_Type := 0;
-   begin
-      --  Return True if all parsers are done, or if any parser has a config
-      --  available to check.
-      for P_Status of Parser_Status loop
-         case P_Status.Recover_State is
-         when Active =>
-            if P_Status.Parser_State.Recover.Check_Count - Check_Delta_Limit 
>= Min_Success_Check_Count then
-               --  fail; another parser succeeded, this one taking too long.
-               Done_Count := Done_Count + 1;
-
-            elsif P_Status.Parser_State.Recover.Enqueue_Count >= Enqueue_Limit 
then
-               --  fail
-               Done_Count := Done_Count + 1;
-
-            elsif P_Status.Parser_State.Recover.Config_Heap.Count > 0 then
-               if P_Status.Parser_State.Recover.Config_Heap.Min_Key <= 
Cost_Limit then
-                  return True;
-               else
-                  if P_Status.Active_Workers = 0 then
-                     --  fail; remaining configs exceed cost limit
-                     Done_Count := Done_Count + 1;
-                  end if;
-               end if;
-
-            else
-               if P_Status.Active_Workers = 0 then
-                  --  fail; no configs left to check (rarely happens with real
-                  --  languages).
-                  Done_Count := Done_Count + 1;
-               end if;
-            end if;
-
-         when Ready =>
-            --  We don't check Enqueue_Limit here; there will only be a few 
more
-            --  to find all the same-cost solutions.
-
-            if P_Status.Parser_State.Recover.Config_Heap.Count > 0 and then
-              P_Status.Parser_State.Recover.Config_Heap.Min_Key <= 
P_Status.Parser_State.Recover.Results.Min_Key
-            then
-               --  Still more to check.
-               return True;
-
-            elsif P_Status.Active_Workers = 0 then
-               Done_Count := Done_Count + 1;
-            end if;
-
-         when Success | Fail =>
-            Done_Count := Done_Count + 1;
-         end case;
-      end loop;
-
-      return Done_Count = Parsers.Count;
-   end Get_Barrier;
-
-   protected body Supervisor is
-
-      procedure Initialize
-        (Parsers   : not null access Parser_Lists.List;
-         Terminals : not null access constant Base_Token_Arrays.Vector)
-      is
-         use all type SAL.Base_Peek_Type;
-         Index : SAL.Peek_Type := 1;
-      begin
-         Supervisor.Parsers      := Parsers;
-         Supervisor.Terminals    := Terminals;
-         All_Parsers_Done        := False;
-         Success_Counter         := 0;
-         Min_Success_Check_Count := Natural'Last;
-         Fatal_Called            := False;
-         Result                  := Recover_Status'First;
-         Error_ID                := Ada.Exceptions.Null_Id;
-
-         for I in Parsers.Iterate loop
-            if Parsers.Reference (I).Recover_Insert_Delete.Length > 0 then
-               --  Previous error recovery resume not finished; this is 
supposed to
-               --  be checked in Parser.
-               raise SAL.Programmer_Error;
-            end if;
-
-            Parser_Status (Index) :=
-              (Recover_State  => Active,
-               Parser_State   => Parser_Lists.Persistent_State_Ref (I),
-               Fail_Mode      => Success,
-               Active_Workers => 0);
-
-            declare
-               Data : McKenzie_Data renames Parsers.Reference (I).Recover;
-            begin
-               Data.Config_Heap.Clear;
-               Data.Results.Clear;
-               Data.Enqueue_Count := 0;
-               Data.Check_Count   := 0;
-               Data.Success       := False;
-            end;
-
-            Index := Index + 1;
-         end loop;
-      end Initialize;
-
-      entry Get
-        (Parser_Index : out SAL.Base_Peek_Type;
-         Config       : out Configuration;
-         Status       : out Config_Status)
-        when (Fatal_Called or All_Parsers_Done) or else
-          Get_Barrier (Parsers, Parser_Status, Cost_Limit, 
Min_Success_Check_Count, Check_Delta_Limit, Enqueue_Limit)
-      is
-         use all type SAL.Base_Peek_Type;
-         Done_Count     : SAL.Base_Peek_Type := 0;
-         Min_Cost       : Integer            := Integer'Last;
-         Min_Cost_Index : SAL.Base_Peek_Type;
-
-         procedure Set_Outputs (I : in SAL.Peek_Type)
-         is begin
-            Parser_Index := I;
-            Config       := Parser_Status 
(I).Parser_State.Recover.Config_Heap.Remove;
-            Status       := Valid;
-
-            Parser_Status (I).Parser_State.Recover.Check_Count :=
-              Parser_Status (I).Parser_State.Recover.Check_Count + 1;
-
-            Parser_Status (I).Active_Workers := Parser_Status 
(I).Active_Workers + 1;
-         end Set_Outputs;
-
-         procedure Set_All_Done
-         is begin
-            Parser_Index := SAL.Base_Peek_Type'First;
-            Config       := (others => <>);
-            Status       := All_Done;
-         end Set_All_Done;
-
-      begin
-         if Fatal_Called or All_Parsers_Done then
-            Set_All_Done;
-            return;
-         end if;
-
-         --  Same logic as in Get_Barrier, but different actions.
-         for I in Parser_Status'Range loop
-            declare
-               P_Status : Base.Parser_Status renames Parser_Status (I);
-            begin
-               case P_Status.Recover_State is
-               when Active =>
-                  if P_Status.Parser_State.Recover.Config_Heap.Count > 0 then
-                     if P_Status.Parser_State.Recover.Check_Count - 
Check_Delta_Limit >= Min_Success_Check_Count then
-                        if Trace_McKenzie > Outline then
-                           Put_Line (Trace.all, P_Status.Parser_State.Label, 
"fail; check delta (limit" &
-                                       Integer'Image (Min_Success_Check_Count 
+ Check_Delta_Limit) & ")");
-                        end if;
-                        P_Status.Recover_State := Fail;
-                        P_Status.Fail_Mode     := Fail_Check_Delta;
-
-                        Done_Count := Done_Count + 1;
-
-                     elsif P_Status.Parser_State.Recover.Enqueue_Count >= 
Enqueue_Limit then
-                        if Trace_McKenzie > Outline then
-                           Put_Line (Trace.all, P_Status.Parser_State.Label, 
"fail; enqueue limit (" &
-                                       Integer'Image (Enqueue_Limit) & ")");
-                        end if;
-                        P_Status.Recover_State := Fail;
-                        P_Status.Fail_Mode     := Fail_Enqueue_Limit;
-
-                        Done_Count := Done_Count + 1;
-
-                     elsif P_Status.Parser_State.Recover.Config_Heap.Min_Key 
<= Cost_Limit then
-                        if P_Status.Parser_State.Recover.Config_Heap.Min_Key < 
Min_Cost then
-                           Min_Cost       := 
P_Status.Parser_State.Recover.Config_Heap.Min_Key;
-                           Min_Cost_Index := I;
-                        end if;
-
-                     else
-                        if P_Status.Active_Workers = 0 then
-                           if Trace_McKenzie > Outline then
-                              Put_Line (Trace.all, 
P_Status.Parser_State.Label, "fail; cost");
-                           end if;
-                           P_Status.Recover_State := Fail;
-                           P_Status.Fail_Mode     := Fail_Cost;
-
-                           Done_Count := Done_Count + 1;
-                        end if;
-                     end if;
-                  else
-                     if P_Status.Active_Workers = 0 then
-                        --  No configs left to check (rarely happens with real 
languages).
-                        if Trace_McKenzie > Outline then
-                           Put_Line (Trace.all, P_Status.Parser_State.Label, 
"fail; no configs left");
-                        end if;
-                        P_Status.Recover_State := Fail;
-                        P_Status.Fail_Mode     := Fail_No_Configs_Left;
-
-                        Done_Count := Done_Count + 1;
-                     end if;
-                  end if;
-
-               when Ready =>
-                  if P_Status.Parser_State.Recover.Enqueue_Count >= 
Enqueue_Limit then
-                     if Trace_McKenzie > Outline then
-                        Put_Line (Trace.all, P_Status.Parser_State.Label, 
"fail; enqueue limit (" &
-                                    Integer'Image (Enqueue_Limit) & ")");
-                     end if;
-                     P_Status.Recover_State := Fail;
-                     P_Status.Fail_Mode     := Fail_Enqueue_Limit;
-
-                     Done_Count := Done_Count + 1;
-
-                  elsif P_Status.Parser_State.Recover.Config_Heap.Count > 0 
and then
-                    P_Status.Parser_State.Recover.Config_Heap.Min_Key <= 
P_Status.Parser_State.Recover.Results.Min_Key
-                  then
-                     --  Still more to check.
-                     Set_Outputs (I);
-                     return;
-
-                  elsif P_Status.Active_Workers = 0 then
-                     P_Status.Recover_State := Success;
-                     Done_Count             := Done_Count + 1;
-                  end if;
-
-               when Success | Fail =>
-                  Done_Count := Done_Count + 1;
-               end case;
-            end;
-         end loop;
-
-         if Min_Cost /= Integer'Last then
-            Set_Outputs (Min_Cost_Index);
-
-         elsif Done_Count = Parsers.Count then
-            if Trace_McKenzie > Extra then
-               Trace.Put_Line ("Supervisor: done, " & (if Success_Counter > 0 
then "succeed" else "fail"));
-            end if;
-
-            Set_All_Done;
-            All_Parsers_Done := True;
-         else
-            raise SAL.Programmer_Error with "Get_Barrier and Get logic do not 
match";
-         end if;
-      end Get;
-
-      procedure Success
-        (Parser_Index : in     SAL.Peek_Type;
-         Config       : in     Configuration;
-         Configs      : in out Config_Heaps.Heap_Type)
-      is
-         use all type SAL.Base_Peek_Type;
-         Data : McKenzie_Data renames Parser_Status 
(Parser_Index).Parser_State.Recover;
-      begin
-         Put (Parser_Index, Configs); --  Decrements Active_Worker_Count.
-
-         if Trace_McKenzie > Detail then
-            Put
-              ("succeed: enqueue" & Integer'Image (Data.Enqueue_Count) & ", 
check " & Integer'Image (Data.Check_Count),
-               Trace.all, Parser_Status (Parser_Index).Parser_State.Label, 
Terminals.all, Config);
-         end if;
-
-         if Force_Full_Explore then
-            return;
-         end if;
-
-         Success_Counter := Success_Counter + 1;
-         Result          := Success;
-
-         Data.Success := True;
-
-         if Data.Check_Count < Min_Success_Check_Count then
-            Min_Success_Check_Count := Data.Check_Count;
-         end if;
-
-         if Force_High_Cost_Solutions then
-            Data.Results.Add (Config);
-            if Data.Results.Count > 3 then
-               Parser_Status (Parser_Index).Recover_State := Ready;
-            end if;
-         else
-            if Data.Results.Count = 0 then
-               Data.Results.Add (Config);
-
-               Parser_Status (Parser_Index).Recover_State := Ready;
-
-            elsif Config.Cost < Data.Results.Min_Key then
-               --  delete higher cost configs from Results
-               loop
-                  Data.Results.Drop;
-                  exit when Data.Results.Count = 0 or else
-                    Config.Cost >= Data.Results.Min_Key;
-               end loop;
-
-               Data.Results.Add (Config);
-
-            elsif Config.Cost = Data.Results.Min_Key then
-               Data.Results.Add (Config);
-
-            else
-               --  Config.Cost > Results.Min_Key
-               null;
-            end if;
-         end if;
-      end Success;
-
-      procedure Put (Parser_Index : in SAL.Peek_Type; Configs : in out 
Config_Heaps.Heap_Type)
-      is
-         use all type SAL.Base_Peek_Type;
-         Configs_Count : constant SAL.Base_Peek_Type := Configs.Count; -- 
Before it is emptied, for Trace.
-
-         P_Status : Base.Parser_Status renames Parser_Status (Parser_Index);
-         Data : McKenzie_Data renames P_Status.Parser_State.Recover;
-      begin
-         P_Status.Active_Workers := P_Status.Active_Workers - 1;
-
-         loop
-            exit when Configs.Count = 0;
-
-            --  [1] has a check for duplicate configs here; that only happens 
with
-            --  higher costs, which take too long for our application.
-            Data.Config_Heap.Add (Configs.Remove);
-            Data.Enqueue_Count := Data.Enqueue_Count + 1;
-         end loop;
-
-         if Trace_McKenzie > Detail then
-            Put_Line
-              (Trace.all, P_Status.Parser_State.Label,
-               "enqueue:" & SAL.Base_Peek_Type'Image (Configs_Count) &
-                 "/" & SAL.Base_Peek_Type'Image (Data.Config_Heap.Count) &
-                 "/" & Trimmed_Image (Data.Enqueue_Count) &
-                 "/" & Trimmed_Image (Data.Check_Count) &
-                 ", min cost:" &
-                 (if Data.Config_Heap.Count > 0
-                  then Integer'Image (Data.Config_Heap.Min_Key)
-                  else " ? ") &
-                 ", active workers:" & Integer'Image 
(P_Status.Active_Workers));
-         end if;
-      end Put;
-
-      function Recover_Result return Recover_Status
-      is
-         Temp : Recover_Status := Result;
-      begin
-         if Result = Success then
-            return Success;
-         else
-            for S of Parser_Status loop
-               Temp := Recover_Status'Max (Result, S.Fail_Mode);
-            end loop;
-            return Temp;
-         end if;
-      end Recover_Result;
-
-      procedure Fatal (E : in Ada.Exceptions.Exception_Occurrence)
-      is
-         use Ada.Exceptions;
-         Task_ID : constant String := Ada.Task_Identification.Image 
(Ada.Task_Identification.Current_Task);
-      begin
-         if Trace_McKenzie > Outline then
-            Trace.Put_Line (Task_ID & " Supervisor: Error");
-         end if;
-         Fatal_Called   := True;
-         Error_ID       := Exception_Identity (E);
-         Error_Message  := +Exception_Message (E);
-         if Debug_Mode then
-            Trace.Put_Line (Exception_Name (E) & ": " & Exception_Message (E));
-            Trace.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback (E));
-         end if;
-      end Fatal;
-
-      entry Done (Error_ID : out Ada.Exceptions.Exception_Id; Message : out 
Ada.Strings.Unbounded.Unbounded_String)
-        when All_Parsers_Done or Fatal_Called
-      is begin
-         Error_ID := Supervisor.Error_ID;
-         Message  := Error_Message;
-         if Trace_McKenzie > Detail then
-            Trace.New_Line;
-            Trace.Put_Line ("Supervisor: Done");
-         end if;
-      end Done;
-
-      function Parser_State (Parser_Index : in SAL.Peek_Type) return 
Parser_Lists.Constant_Reference_Type
-      is begin
-         return (Element => Parser_Status (Parser_Index).Parser_State);
-      end Parser_State;
-
-      function Label (Parser_Index : in SAL.Peek_Type) return Natural
-      is begin
-         return Parser_Status (Parser_Index).Parser_State.Label;
-      end Label;
-
-   end Supervisor;
-
-   procedure Put
-     (Message      : in              String;
-      Super        : not null access Base.Supervisor;
-      Shared       : not null access Base.Shared;
-      Parser_Index : in              SAL.Peek_Type;
-      Config       : in              Configuration;
-      Task_ID      : in              Boolean := True)
-   is begin
-      Put (Message, Super.Trace.all, Super.Parser_State (Parser_Index).Label,
-           Shared.Terminals.all, Config, Task_ID);
-   end Put;
-
-end WisiToken.Parse.LR.McKenzie_Recover.Base;
+--  Abstract :
+--
+--  Base utilities for McKenzie_Recover
+--
+--  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with GNAT.Traceback.Symbolic;
+package body WisiToken.Parse.LR.McKenzie_Recover.Base is
+
+   function Get_Barrier
+     (Parsers                 : not null access Parser_Lists.List;
+      Parser_Status           : in              Parser_Status_Array;
+      Min_Success_Check_Count : in              Natural;
+      Check_Delta_Limit       : in              Natural;
+      Enqueue_Limit           : in              Natural)
+     return Boolean
+   is
+      use all type SAL.Base_Peek_Type;
+      Done_Count : SAL.Base_Peek_Type := 0;
+   begin
+      --  Return True if all parsers are done, or if any parser has a config
+      --  available to check.
+      for P_Status of Parser_Status loop
+         case P_Status.Recover_State is
+         when Active | Ready =>
+            if P_Status.Parser_State.Recover.Config_Heap.Count > 0 then
+               if P_Status.Parser_State.Recover.Check_Count - 
Check_Delta_Limit >= Min_Success_Check_Count then
+                  --  fail; another parser succeeded, this one taking too long.
+                  Done_Count := Done_Count + 1;
+
+               elsif P_Status.Parser_State.Recover.Enqueue_Count +
+                 P_Status.Parser_State.Recover.Config_Full_Count >= 
Enqueue_Limit
+               then
+                  --  fail
+                  Done_Count := Done_Count + 1;
+               end if;
+            end if;
+
+            case P_Status.Recover_State is
+            when Active =>
+               if P_Status.Parser_State.Recover.Config_Heap.Count > 0 then
+                  --  Still working
+                  return True;
+               else
+                  if P_Status.Active_Workers = 0 then
+                     --  fail; no configs left to check.
+                     Done_Count := Done_Count + 1;
+                  end if;
+               end if;
+
+            when Ready =>
+               if P_Status.Parser_State.Recover.Config_Heap.Count > 0 and then
+                 P_Status.Parser_State.Recover.Config_Heap.Min_Key <= 
P_Status.Parser_State.Recover.Results.Min_Key
+               then
+                  --  Still more to check.
+                  return True;
+
+               elsif P_Status.Active_Workers = 0 then
+                  Done_Count := Done_Count + 1;
+               end if;
+
+            when others =>
+               null;
+            end case;
+
+         when Success | Fail =>
+            Done_Count := Done_Count + 1;
+         end case;
+      end loop;
+
+      return Done_Count = Parsers.Count;
+   end Get_Barrier;
+
+   protected body Supervisor is
+
+      procedure Initialize
+        (Parsers   : not null access Parser_Lists.List;
+         Terminals : not null access constant Base_Token_Arrays.Vector)
+      is
+         use all type SAL.Base_Peek_Type;
+         Index : SAL.Peek_Type := 1;
+      begin
+         Supervisor.Parsers      := Parsers;
+         Supervisor.Terminals    := Terminals;
+         All_Parsers_Done        := False;
+         Success_Counter         := 0;
+         Min_Success_Check_Count := Natural'Last;
+         Fatal_Called            := False;
+         Result                  := Recover_Status'First;
+         Error_ID                := Ada.Exceptions.Null_Id;
+
+         for I in Parsers.Iterate loop
+            if Parsers.Reference (I).Recover_Insert_Delete.Length > 0 then
+               --  Previous error recovery resume not finished; this is 
supposed to
+               --  be checked in Parser.
+               raise SAL.Programmer_Error;
+            end if;
+
+            Parser_Status (Index) :=
+              (Recover_State  => Active,
+               Parser_State   => Parser_Lists.Persistent_State_Ref (I),
+               Fail_Mode      => Success,
+               Active_Workers => 0);
+
+            declare
+               Data : McKenzie_Data renames Parsers.Reference (I).Recover;
+            begin
+               Data.Config_Heap.Clear;
+               Data.Results.Clear;
+               Data.Enqueue_Count := 0;
+               Data.Check_Count   := 0;
+               Data.Success       := False;
+            end;
+
+            Index := Index + 1;
+         end loop;
+      end Initialize;
+
+      entry Get
+        (Parser_Index : out SAL.Base_Peek_Type;
+         Config       : out Configuration;
+         Status       : out Config_Status)
+        when (Fatal_Called or All_Parsers_Done) or else
+          Get_Barrier (Parsers, Parser_Status, Min_Success_Check_Count, 
Check_Delta_Limit, Enqueue_Limit)
+      is
+         use all type SAL.Base_Peek_Type;
+         Done_Count     : SAL.Base_Peek_Type := 0;
+         Min_Cost       : Integer            := Integer'Last;
+         Min_Cost_Index : SAL.Base_Peek_Type;
+
+         procedure Set_Outputs (I : in SAL.Peek_Type)
+         is begin
+            Parser_Index := I;
+            Config       := Parser_Status 
(I).Parser_State.Recover.Config_Heap.Remove;
+            Status       := Valid;
+
+            Parser_Status (I).Parser_State.Recover.Check_Count :=
+              Parser_Status (I).Parser_State.Recover.Check_Count + 1;
+
+            Parser_Status (I).Active_Workers := Parser_Status 
(I).Active_Workers + 1;
+         end Set_Outputs;
+
+         procedure Set_All_Done
+         is begin
+            Parser_Index := SAL.Base_Peek_Type'First;
+            Config       := (others => <>);
+            Status       := All_Done;
+         end Set_All_Done;
+
+      begin
+         if Fatal_Called or All_Parsers_Done then
+            Set_All_Done;
+            return;
+         end if;
+
+         --  Same logic as in Get_Barrier, but different actions.
+         --
+         --  No task_id in outline trace messages, because they may appear in
+         --  .parse_good
+         for I in Parser_Status'Range loop
+            declare
+               P_Status : Base.Parser_Status renames Parser_Status (I);
+            begin
+               case P_Status.Recover_State is
+               when Active | Ready =>
+                  if P_Status.Parser_State.Recover.Config_Heap.Count > 0 then
+                     if P_Status.Parser_State.Recover.Check_Count - 
Check_Delta_Limit >= Min_Success_Check_Count then
+                        if Trace_McKenzie > Outline then
+                           Put_Line
+                             (Trace.all,
+                              P_Status.Parser_State.Label, "fail; check delta 
(limit" &
+                                Integer'Image (Min_Success_Check_Count + 
Check_Delta_Limit) & ")",
+                              Task_ID => False);
+                        end if;
+                        P_Status.Recover_State := Fail;
+                        P_Status.Fail_Mode     := Fail_Check_Delta;
+
+                        Done_Count := Done_Count + 1;
+
+                     elsif P_Status.Parser_State.Recover.Enqueue_Count +
+                       P_Status.Parser_State.Recover.Config_Full_Count >= 
Enqueue_Limit
+                     then
+                        if Trace_McKenzie > Outline then
+                           Put_Line
+                             (Trace.all,
+                              P_Status.Parser_State.Label, "fail; enqueue 
limit (" &
+                                Enqueue_Limit'Image & " cost" &
+                                
P_Status.Parser_State.Recover.Config_Heap.Min_Key'Image & ")",
+                              Task_ID => False);
+                        end if;
+                        P_Status.Recover_State := Fail;
+                        P_Status.Fail_Mode     := Fail_Enqueue_Limit;
+
+                        Done_Count := Done_Count + 1;
+                     end if;
+                  end if;
+
+                  case P_Status.Recover_State is
+                  when Active =>
+                     if P_Status.Parser_State.Recover.Config_Heap.Count > 0 
then
+                        if P_Status.Parser_State.Recover.Config_Heap.Min_Key < 
Min_Cost then
+                           Min_Cost       := 
P_Status.Parser_State.Recover.Config_Heap.Min_Key;
+                           Min_Cost_Index := I;
+                           --  not done
+                        end if;
+                     else
+                        if P_Status.Active_Workers = 0 then
+                           --  No configs left to check (rarely happens with 
real languages).
+                           if Trace_McKenzie > Outline then
+                              Put_Line
+                                (Trace.all, P_Status.Parser_State.Label, 
"fail; no configs left", Task_ID => False);
+                           end if;
+                           P_Status.Recover_State := Fail;
+                           P_Status.Fail_Mode     := Fail_No_Configs_Left;
+
+                           Done_Count := Done_Count + 1;
+                        end if;
+                     end if;
+
+                  when Ready =>
+                     if P_Status.Parser_State.Recover.Config_Heap.Count > 0 
and then
+                       P_Status.Parser_State.Recover.Config_Heap.Min_Key <=
+                       P_Status.Parser_State.Recover.Results.Min_Key
+                     then
+                        --  Still more to check. We don't check Min_Cost here 
so this parser
+                        --  can finish quickly.
+                        Set_Outputs (I);
+                        return;
+
+                     elsif P_Status.Active_Workers = 0 then
+                        P_Status.Recover_State := Success;
+                        Done_Count             := Done_Count + 1;
+                     end if;
+                  when others =>
+                     null;
+                  end case;
+
+               when Success | Fail =>
+                  Done_Count := Done_Count + 1;
+               end case;
+            end;
+         end loop;
+
+         if Min_Cost /= Integer'Last then
+            Set_Outputs (Min_Cost_Index);
+
+         elsif Done_Count = Parsers.Count then
+            if Trace_McKenzie > Extra then
+               Trace.Put_Line ("Supervisor: done, " & (if Success_Counter > 0 
then "succeed" else "fail"));
+            end if;
+
+            Set_All_Done;
+            All_Parsers_Done := True;
+         else
+            raise SAL.Programmer_Error with "Get_Barrier and Get logic do not 
match";
+         end if;
+      end Get;
+
+      procedure Success
+        (Parser_Index : in     SAL.Peek_Type;
+         Config       : in     Configuration;
+         Configs      : in out Config_Heaps.Heap_Type)
+      is
+         use all type SAL.Base_Peek_Type;
+         Data : McKenzie_Data renames Parser_Status 
(Parser_Index).Parser_State.Recover;
+      begin
+         Put (Parser_Index, Configs); --  Decrements Active_Worker_Count.
+
+         if Trace_McKenzie > Detail then
+            Put
+              ("succeed: enqueue" & Integer'Image (Data.Enqueue_Count) & ", 
check " & Integer'Image (Data.Check_Count),
+               Trace.all, Parser_Status (Parser_Index).Parser_State.Label, 
Terminals.all, Config);
+         end if;
+
+         if Force_Full_Explore then
+            return;
+         end if;
+
+         Success_Counter := Success_Counter + 1;
+         Result          := Success;
+
+         Data.Success := True;
+
+         if Data.Check_Count < Min_Success_Check_Count then
+            Min_Success_Check_Count := Data.Check_Count;
+         end if;
+
+         if Force_High_Cost_Solutions then
+            Data.Results.Add (Config);
+            if Data.Results.Count > 3 then
+               Parser_Status (Parser_Index).Recover_State := Ready;
+            end if;
+         else
+            if Data.Results.Count = 0 then
+               Data.Results.Add (Config);
+
+               Parser_Status (Parser_Index).Recover_State := Ready;
+
+            elsif Config.Cost < Data.Results.Min_Key then
+               --  delete higher cost configs from Results
+               loop
+                  Data.Results.Drop;
+                  exit when Data.Results.Count = 0 or else
+                    Config.Cost >= Data.Results.Min_Key;
+               end loop;
+
+               Data.Results.Add (Config);
+
+            elsif Config.Cost = Data.Results.Min_Key then
+               Data.Results.Add (Config);
+
+            else
+               --  Config.Cost > Results.Min_Key
+               null;
+            end if;
+         end if;
+      end Success;
+
+      procedure Put (Parser_Index : in SAL.Peek_Type; Configs : in out 
Config_Heaps.Heap_Type)
+      is
+         use all type SAL.Base_Peek_Type;
+         Configs_Count : constant SAL.Base_Peek_Type := Configs.Count; -- 
Before it is emptied, for Trace.
+
+         P_Status : Base.Parser_Status renames Parser_Status (Parser_Index);
+         Data : McKenzie_Data renames P_Status.Parser_State.Recover;
+      begin
+         P_Status.Active_Workers := P_Status.Active_Workers - 1;
+
+         loop
+            exit when Configs.Count = 0;
+
+            --  [1] has a check for duplicate configs here; that only happens 
with
+            --  higher costs, which take too long for our application.
+            Data.Config_Heap.Add (Configs.Remove);
+            Data.Enqueue_Count := Data.Enqueue_Count + 1;
+         end loop;
+
+         if Trace_McKenzie > Detail then
+            Put_Line
+              (Trace.all, P_Status.Parser_State.Label,
+               "enqueue:" & SAL.Base_Peek_Type'Image (Configs_Count) &
+                 "/" & SAL.Base_Peek_Type'Image (Data.Config_Heap.Count) &
+                 "/" & Trimmed_Image (Data.Enqueue_Count) &
+                 "/" & Trimmed_Image (Data.Check_Count) &
+                 ", min cost:" &
+                 (if Data.Config_Heap.Count > 0
+                  then Integer'Image (Data.Config_Heap.Min_Key)
+                  else " ? ") &
+                 ", active workers:" & Integer'Image 
(P_Status.Active_Workers));
+         end if;
+      end Put;
+
+      procedure Config_Full (Parser_Index : in SAL.Peek_Type)
+      is
+         P_Status : Base.Parser_Status renames Parser_Status (Parser_Index);
+         Data : McKenzie_Data renames P_Status.Parser_State.Recover;
+      begin
+         Data.Config_Full_Count := Data.Config_Full_Count + 1;
+         if Trace_McKenzie > Outline then
+            Put_Line (Trace.all, Label (Parser_Index), "config.ops is full; " 
& Data.Config_Full_Count'Image);
+         end if;
+      end Config_Full;
+
+      function Recover_Result return Recover_Status
+      is
+         Temp : Recover_Status := Result;
+      begin
+         if Result = Success then
+            return Success;
+         else
+            for S of Parser_Status loop
+               Temp := Recover_Status'Max (Result, S.Fail_Mode);
+            end loop;
+            return Temp;
+         end if;
+      end Recover_Result;
+
+      procedure Fatal (E : in Ada.Exceptions.Exception_Occurrence)
+      is
+         use Ada.Exceptions;
+      begin
+         if Trace_McKenzie > Outline then
+            Trace.Put_Line ("task " & Task_Attributes.Value'Image & " 
Supervisor: Error");
+         end if;
+         Fatal_Called   := True;
+         Error_ID       := Exception_Identity (E);
+         Error_Message  := +Exception_Message (E);
+         if Debug_Mode then
+            Trace.Put_Line (Exception_Name (E) & ": " & Exception_Message (E));
+            Trace.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback (E));
+         end if;
+      end Fatal;
+
+      entry Done (Error_ID : out Ada.Exceptions.Exception_Id; Message : out 
Ada.Strings.Unbounded.Unbounded_String)
+        when All_Parsers_Done or Fatal_Called
+      is begin
+         Error_ID := Supervisor.Error_ID;
+         Message  := Error_Message;
+         if Trace_McKenzie > Detail then
+            Trace.New_Line;
+            Trace.Put_Line ("Supervisor: Done");
+         end if;
+      end Done;
+
+      function Parser_State (Parser_Index : in SAL.Peek_Type) return 
Parser_Lists.Constant_Reference_Type
+      is begin
+         return (Element => Parser_Status (Parser_Index).Parser_State);
+      end Parser_State;
+
+      function Label (Parser_Index : in SAL.Peek_Type) return Natural
+      is begin
+         return Parser_Status (Parser_Index).Parser_State.Label;
+      end Label;
+
+   end Supervisor;
+
+   procedure Put
+     (Message      : in              String;
+      Super        : not null access Base.Supervisor;
+      Shared       : not null access Base.Shared;
+      Parser_Index : in              SAL.Peek_Type;
+      Config       : in              Configuration;
+      Task_ID      : in              Boolean := True)
+   is begin
+      Put (Message, Super.Trace.all, Super.Parser_State (Parser_Index).Label,
+           Shared.Terminals.all, Config, Task_ID);
+   end Put;
+
+end WisiToken.Parse.LR.McKenzie_Recover.Base;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.ads 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.ads
index c5d78ea..cde4bd5 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.ads
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-base.ads
@@ -1,181 +1,184 @@
---  Abstract :
---
---  Base utilities for McKenzie_Recover
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Exceptions;
-with WisiToken.Parse.LR.Parser;
-with WisiToken.Parse.LR.Parser_Lists;
-private package WisiToken.Parse.LR.McKenzie_Recover.Base is
-
-   ----------
-   --  Protected object specs.
-   --
-   --  Tasking design requirements:
-   --
-   --  1) For each parse_state, find all solutions of the same lowest
-   --  cost.
-   --
-   --  2) use as many CPUs as available as fully as possible.
-   --
-   --  3) avoid
-   --     a) busy waits
-   --     b) race conditions
-   --     c) deadlocks.
-   --
-   --  For 2), we use worker_tasks to perform the check computations on
-   --  each configuration. We allocate N - 1 worker_tasks, where N is the
-   --  number of available CPUs, saving one CPU for Supervisor and the
-   --  foreground IDE.
-   --
-   --  For 1), worker_tasks always get the lowest cost configuration
-   --  available. However, some active worker_task may have a lower cost
-   --  configuration that it has not yet delivered to Supervisor.
-   --  Therefore we always wait until all current active worker_tasks
-   --  deliver their results before deciding we are done.
-   --
-   --  For 3a) we have one Supervisor protected object that controls
-   --  access to all Parse_States and configurations, and a Shared object
-   --  that provides appropriate access to the Shared_Parser components.
-   --
-   --  It is tempting to try to reduce contention for Supervisor by
-   --  having one protected object per parser, but that requires the
-   --  worker tasks to busy loop checking all the parsers.
-   --
-   --  There is still a race condition on Success; the solutions 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. See ada-mode/tests/ada_mode-interactive_2.adb
-   --  for an example.
-   --
-   --  There is also a race condition on how many failed or higher cost
-   --  configurations are checked, before the final solutions are found.
-
-   type Config_Status is (Valid, All_Done);
-   type Recover_State is (Active, Ready, Success, Fail);
-
-   type Parser_Status is record
-      Recover_State : Base.Recover_State;
-      Parser_State  : Parser_Lists.State_Access;
-      Fail_Mode     : Recover_Status;
-
-      Active_Workers : Natural;
-      --  Count of Worker_Tasks that have done Get but not Put or Success.
-   end record;
-
-   type Parser_Status_Array is array (SAL.Peek_Type range <>) of Parser_Status;
-
-   protected type Supervisor
-     (Trace             : not null access WisiToken.Trace'Class;
-      Cost_Limit        : Natural;
-      Check_Delta_Limit : Natural;
-      Enqueue_Limit     : Natural;
-      Parser_Count      : SAL.Peek_Type)
-   is
-      --  There is only one object of this type, declared in Recover.
-
-      procedure Initialize
-        (Parsers   : not null access Parser_Lists.List;
-         Terminals : not null access constant Base_Token_Arrays.Vector);
-
-      entry Get
-        (Parser_Index : out SAL.Base_Peek_Type;
-         Config       : out Configuration;
-         Status       : out Config_Status);
-      --  Get a new configuration to check. Available when there is a
-      --  configuration to get, or when all configs have been checked.
-      --
-      --  Increments active worker count.
-      --
-      --  Status values mean:
-      --
-      --  Valid - Parser_Index, Config are valid, should be checked.
-      --
-      --  All_Done - Parser_Index, Config are not valid.
-
-      procedure Success
-        (Parser_Index : in     SAL.Peek_Type;
-         Config       : in     Configuration;
-         Configs      : in out Config_Heaps.Heap_Type);
-      --  Report that Configuration succeeds for Parser_Label, and enqueue
-      --  Configs.
-      --
-      --  Decrements active worker count.
-
-      procedure Put (Parser_Index : in SAL.Peek_Type; Configs : in out 
Config_Heaps.Heap_Type);
-      --  Add Configs to the McKenzie_Data Config_Heap for Parser_Label
-      --
-      --  Decrements active worker count.
-
-      function Recover_Result return Recover_Status;
-
-      procedure Fatal (E : in Ada.Exceptions.Exception_Occurrence);
-      --  Report a fatal error; abort all processing, make Done
-      --  available.
-
-      entry Done (Error_ID : out Ada.Exceptions.Exception_Id; Message : out 
Ada.Strings.Unbounded.Unbounded_String);
-      --  Available when all parsers have failed or succeeded, or an error
-      --  occured.
-      --
-      --  If Error_ID is not Null_Id, an error occured.
-
-      function Parser_State (Parser_Index : in SAL.Peek_Type) return 
Parser_Lists.Constant_Reference_Type;
-      function Label (Parser_Index : in SAL.Peek_Type) return Natural;
-
-   private
-      Parsers   : access Parser_Lists.List;
-      Terminals : access constant Base_Token_Arrays.Vector;
-
-      All_Parsers_Done        : Boolean;
-      Success_Counter         : Natural;
-      Min_Success_Check_Count : Natural;
-      Fatal_Called            : Boolean;
-      Result                  : Recover_Status;
-      Error_ID                : Ada.Exceptions.Exception_Id;
-      Error_Message           : Ada.Strings.Unbounded.Unbounded_String;
-      Parser_Status           : Parser_Status_Array (1 .. Parser_Count);
-   end Supervisor;
-
-   type Shared
-     (Trace                                 : not null access 
WisiToken.Trace'Class;
-      Lexer                                 : not null access constant 
WisiToken.Lexer.Instance'Class;
-      Table                                 : not null access constant 
Parse_Table;
-      Language_Fixes                        : 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set                : 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
-      Terminals                             : not null access constant 
Base_Token_Arrays.Vector;
-      Line_Begin_Token                      : not null access constant 
Line_Begin_Token_Vectors.Vector)
-     is null record;
-   --  There is only one object of this type, declared in Recover. It
-   --  provides appropriate access to Shared_Parser components.
-   --
-   --  Since all the accessible objects are read-only (except Trace),
-   --  there are no protected operations, and this is not a protected
-   --  type.
-
-   procedure Put
-     (Message      : in              String;
-      Super        : not null access Base.Supervisor;
-      Shared       : not null access Base.Shared;
-      Parser_Index : in              SAL.Peek_Type;
-      Config       : in              Configuration;
-      Task_ID      : in              Boolean := True);
-
-end WisiToken.Parse.LR.McKenzie_Recover.Base;
+--  Abstract :
+--
+--  Base utilities for McKenzie_Recover
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Exceptions;
+with WisiToken.Parse.LR.Parser;
+with WisiToken.Parse.LR.Parser_Lists;
+private package WisiToken.Parse.LR.McKenzie_Recover.Base is
+
+   ----------
+   --  Protected object specs.
+   --
+   --  Tasking design requirements:
+   --
+   --  1) For each parse_state, find all solutions of the same lowest
+   --  cost.
+   --
+   --  2) use as many CPUs as available as fully as possible.
+   --
+   --  3) avoid
+   --     a) busy waits
+   --     b) race conditions
+   --     c) deadlocks.
+   --
+   --  For 2), we use worker_tasks to perform the check computations on
+   --  each configuration. We allocate N - 1 worker_tasks, where N is the
+   --  number of available CPUs, saving one CPU for Supervisor and the
+   --  foreground IDE.
+   --
+   --  For 1), worker_tasks always get the lowest cost configuration
+   --  available. However, some active worker_task may have a lower cost
+   --  configuration that it has not yet delivered to Supervisor.
+   --  Therefore we always wait until all current active worker_tasks
+   --  deliver their results before deciding we are done.
+   --
+   --  For 3a) we have one Supervisor protected object that controls
+   --  access to all Parse_States and configurations, and a Shared object
+   --  that provides appropriate access to the Shared_Parser components.
+   --
+   --  It is tempting to try to reduce contention for Supervisor by
+   --  having one protected object per parser, but that requires the
+   --  worker tasks to busy loop checking all the parsers.
+   --
+   --  There is still a race condition on Success; the solutions 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. See ada-mode/tests/ada_mode-interactive_2.adb
+   --  for an example.
+   --
+   --  There is also a race condition on how many failed or higher cost
+   --  configurations are checked, before the final solutions are found.
+
+   type Config_Status is (Valid, All_Done);
+   type Recover_State is (Active, Ready, Success, Fail);
+
+   type Parser_Status is record
+      Recover_State : Base.Recover_State;
+      Parser_State  : Parser_Lists.State_Access;
+      Fail_Mode     : Recover_Status;
+
+      Active_Workers : Natural;
+      --  Count of Worker_Tasks that have done Get but not Put or Success.
+   end record;
+
+   type Parser_Status_Array is array (SAL.Peek_Type range <>) of Parser_Status;
+
+   protected type Supervisor
+     (Trace             : not null access WisiToken.Trace'Class;
+      Check_Delta_Limit : Natural;
+      Enqueue_Limit     : Natural;
+      Parser_Count      : SAL.Peek_Type)
+   is
+      --  There is only one object of this type, declared in Recover.
+
+      procedure Initialize
+        (Parsers   : not null access Parser_Lists.List;
+         Terminals : not null access constant Base_Token_Arrays.Vector);
+
+      entry Get
+        (Parser_Index : out SAL.Base_Peek_Type;
+         Config       : out Configuration;
+         Status       : out Config_Status);
+      --  Get a new configuration to check. Available when there is a
+      --  configuration to get, or when all configs have been checked.
+      --
+      --  Increments active worker count.
+      --
+      --  Status values mean:
+      --
+      --  Valid - Parser_Index, Config are valid, should be checked.
+      --
+      --  All_Done - Parser_Index, Config are not valid.
+
+      procedure Success
+        (Parser_Index : in     SAL.Peek_Type;
+         Config       : in     Configuration;
+         Configs      : in out Config_Heaps.Heap_Type);
+      --  Report that Configuration succeeds for Parser_Label, and enqueue
+      --  Configs.
+      --
+      --  Decrements active worker count.
+
+      procedure Put (Parser_Index : in SAL.Peek_Type; Configs : in out 
Config_Heaps.Heap_Type);
+      --  Add Configs to the McKenzie_Data Config_Heap for Parser_Label
+      --
+      --  Decrements active worker count.
+
+      procedure Config_Full (Parser_Index : in SAL.Peek_Type);
+      --  Report that a config.ops was full when trying to add another op.
+      --  This is counted towards the enqueue limit.
+
+      function Recover_Result return Recover_Status;
+
+      procedure Fatal (E : in Ada.Exceptions.Exception_Occurrence);
+      --  Report a fatal error; abort all processing, make Done
+      --  available.
+
+      entry Done (Error_ID : out Ada.Exceptions.Exception_Id; Message : out 
Ada.Strings.Unbounded.Unbounded_String);
+      --  Available when all parsers have failed or succeeded, or an error
+      --  occured.
+      --
+      --  If Error_ID is not Null_Id, an error occured.
+
+      function Parser_State (Parser_Index : in SAL.Peek_Type) return 
Parser_Lists.Constant_Reference_Type;
+      function Label (Parser_Index : in SAL.Peek_Type) return Natural;
+
+   private
+      Parsers   : access Parser_Lists.List;
+      Terminals : access constant Base_Token_Arrays.Vector;
+
+      All_Parsers_Done        : Boolean;
+      Success_Counter         : Natural;
+      Min_Success_Check_Count : Natural;
+      Fatal_Called            : Boolean;
+      Result                  : Recover_Status;
+      Error_ID                : Ada.Exceptions.Exception_Id;
+      Error_Message           : Ada.Strings.Unbounded.Unbounded_String;
+      Parser_Status           : Parser_Status_Array (1 .. Parser_Count);
+   end Supervisor;
+
+   type Shared
+     (Trace                          : not null access WisiToken.Trace'Class;
+      Lexer                          : not null access constant 
WisiToken.Lexer.Instance'Class;
+      Table                          : not null access constant Parse_Table;
+      Language_Fixes                 : 
WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : 
WisiToken.Parse.LR.Parser.Language_String_ID_Set_Access;
+      Terminals                      : not null access constant 
Base_Token_Arrays.Vector;
+      Line_Begin_Token               : not null access constant 
Line_Begin_Token_Vectors.Vector)
+     is null record;
+   --  There is only one object of this type, declared in Recover. It
+   --  provides appropriate access to Shared_Parser components.
+   --
+   --  Since all the accessible objects are read-only (except Trace),
+   --  there are no protected operations, and this is not a protected
+   --  type.
+
+   procedure Put
+     (Message      : in              String;
+      Super        : not null access Base.Supervisor;
+      Shared       : not null access Base.Shared;
+      Parser_Index : in              SAL.Peek_Type;
+      Config       : in              Configuration;
+      Task_ID      : in              Boolean := True);
+
+end WisiToken.Parse.LR.McKenzie_Recover.Base;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.adb 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.adb
index 56bd3fe..272eadf 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.adb
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.adb
@@ -1,1406 +1,1668 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Parse.LR.McKenzie_Recover.Parse;
-with WisiToken.Parse.LR.Parser;
-package body WisiToken.Parse.LR.McKenzie_Recover.Explore is
-
-   procedure Do_Shift
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
-      Config            : in out          Configuration;
-      State             : in              State_Index;
-      ID                : in              Token_ID;
-      Cost_Delta        : in              Integer;
-      Strategy          : in              Strategies)
-   is
-      use all type SAL.Base_Peek_Type;
-      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
-
-      Op : constant Config_Op := (Insert, ID, Config.Current_Shared_Token);
-   begin
-      Config.Strategy_Counts (Strategy) := Config.Strategy_Counts (Strategy) + 
1;
-
-      begin
-         if Config.Current_Ops = No_Insert_Delete then
-            Config.Ops.Append (Op);
-         else
-            Config.Ops.Insert (Op, Before => Config.Current_Ops);
-            Config.Current_Ops := Config.Current_Ops + 1;
-         end if;
-      exception
-      when SAL.Container_Full =>
-         if Trace_McKenzie > Outline then
-            Put_Line (Super.Trace.all, Super.Label (Parser_Index), "config.ops 
is full");
-         end if;
-         raise Bad_Config;
-      end;
-
-      if Cost_Delta = 0 then
-         Config.Cost := Config.Cost + McKenzie_Param.Insert (ID);
-      else
-         --  Cost_Delta /= 0 comes from Try_Insert_Terminal when
-         --  Minimal_Complete_Actions is useful. That doesn't mean it is better
-         --  than any other solution, so don't let cost be 0.
-         Config.Cost := Integer'Max (1, Config.Cost + McKenzie_Param.Insert 
(ID) + Cost_Delta);
-      end if;
-
-      Config.Error_Token.ID := Invalid_Token_ID;
-      Config.Check_Status   := (Label => WisiToken.Semantic_Checks.Ok);
-
-      Config.Stack.Push ((State, Syntax_Trees.Invalid_Node_Index, (ID, Virtual 
=> True, others => <>)));
-      if Trace_McKenzie > Detail then
-         Base.Put ("insert " & Image (ID, Super.Trace.Descriptor.all), Super, 
Shared, Parser_Index, Config);
-      end if;
-
-      Local_Config_Heap.Add (Config);
-   end Do_Shift;
-
-   procedure Do_Reduce_1
-     (Label             : in              String;
-      Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
-      Config            : in out          Configuration;
-      Action            : in              Reduce_Action_Rec;
-      Do_Language_Fixes : in              Boolean := True)
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Semantic_Checks.Check_Status_Label;
-      use all type WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-
-      Prev_State : constant Unknown_State_Index := Config.Stack.Peek.State;
-
-      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
-      Table      : Parse_Table renames Shared.Table.all;
-      Nonterm    : Recover_Token;
-      New_State  : Unknown_State_Index;
-   begin
-      Config.Check_Status := Parse.Reduce_Stack (Shared, Config.Stack, Action, 
Nonterm, Default_Virtual => True);
-      case Config.Check_Status.Label is
-      when Ok =>
-         null;
-
-      when Semantic_Checks.Error =>
-         Config.Error_Token       := Nonterm;
-         Config.Check_Token_Count := Action.Token_Count;
-
-         if Do_Language_Fixes then
-            if Shared.Language_Fixes /= null then
-               Shared.Language_Fixes
-                 (Super.Trace.all, Shared.Lexer, Super.Label (Parser_Index), 
Shared.Table.all, Shared.Terminals.all,
-                  Super.Parser_State (Parser_Index).Tree, Local_Config_Heap,
-                  Config);
-            end if;
-         end if;
-
-         --  Finish the reduce; ignore the check fail.
-         Config.Stack.Pop (SAL.Base_Peek_Type (Config.Check_Token_Count));
-         Config.Error_Token.ID := Invalid_Token_ID;
-         Config.Check_Status   := (Label => Ok);
-      end case;
-
-      if Config.Stack.Depth = 0 or else Config.Stack (1).State = Unknown_State 
then
-         raise Bad_Config;
-      end if;
-
-      New_State := Goto_For (Table, Config.Stack (1).State, 
Action.Production.LHS);
-
-      if New_State = Unknown_State then
-         raise Bad_Config;
-      end if;
-
-      Config.Stack.Push ((New_State, Syntax_Trees.Invalid_Node_Index, 
Nonterm));
-
-      if Trace_McKenzie > Extra and Label'Length > 0 then
-         Put_Line
-           (Super.Trace.all, Super.Label (Parser_Index), Label &
-              ": state" & State_Index'Image (Prev_State) & " reduce to " &
-              Image (Action.Production.LHS, Descriptor) & ", goto" &
-              State_Index'Image (New_State));
-      end if;
-   end Do_Reduce_1;
-
-   procedure Do_Reduce_2
-     (Label             : in              String;
-      Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
-      Config            : in out          Configuration;
-      Inserted_ID       : in              Token_ID;
-      Cost_Delta        : in              Integer;
-      Strategy          : in              Strategies)
-   is
-      --  Perform reduce actions until shift Inserted_ID; if all succeed,
-      --  add the final configuration to the heap. If a conflict is
-      --  encountered, process the other action the same way. If a semantic
-      --  check fails, enqueue possible solutions. For parse table error
-      --  actions, or exception Bad_Config, just return.
-
-      Table       : Parse_Table renames Shared.Table.all;
-      Next_Action : constant Parse_Action_Node_Ptr := Action_For (Table, 
Config.Stack (1).State, Inserted_ID);
-   begin
-      if Next_Action.Next /= null then
-         --  There is a conflict; create a new config to shift or reduce.
-         declare
-            New_Config : Configuration := Config;
-            Action     : Parse_Action_Rec renames Next_Action.Next.Item;
-         begin
-            case Action.Verb is
-            when Shift =>
-               Do_Shift
-                 (Super, Shared, Parser_Index, Local_Config_Heap, New_Config, 
Action.State, Inserted_ID,
-                  Cost_Delta, Strategy);
-
-            when Reduce =>
-               Do_Reduce_1 (Label, Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Action);
-               Do_Reduce_2 (Label, Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Inserted_ID,
-                            Cost_Delta, Strategy);
-
-            when Accept_It =>
-               raise SAL.Programmer_Error with "found test case for Do_Reduce 
Accept_It conflict";
-
-            when Error =>
-               null;
-            end case;
-         end;
-
-         --  There can be only one conflict.
-      end if;
-
-      case Next_Action.Item.Verb is
-      when Shift =>
-         Do_Shift
-           (Super, Shared, Parser_Index, Local_Config_Heap, Config, 
Next_Action.Item.State, Inserted_ID,
-            Cost_Delta, Strategy);
-
-      when Reduce =>
-         Do_Reduce_1 (Label, Super, Shared, Parser_Index, Local_Config_Heap, 
Config, Next_Action.Item);
-         Do_Reduce_2 (Label, Super, Shared, Parser_Index, Local_Config_Heap, 
Config, Inserted_ID, Cost_Delta, Strategy);
-
-      when Accept_It =>
-         raise SAL.Programmer_Error with "found test case for Do_Reduce 
Accept_It";
-
-      when Error =>
-         null;
-      end case;
-
-   exception
-   when Bad_Config =>
-      null;
-   end Do_Reduce_2;
-
-   function Fast_Forward
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
-      Config            : in out          Configuration)
-     return Non_Success_Status
-   is
-      --  Apply the ops in Config; they were inserted by some fix.
-      --  Return Abandon if Config should be abandoned, otherwise Continue.
-      --  Leaves Config.Error_Token, Config.Check_Status set.
-      --
-      --  If there are conflicts, all are parsed; if more than one succeed,
-      --  all are enqueued in Local_Config_Heap, and this returns Abandon.
-
-      use all type SAL.Base_Peek_Type;
-      use all type Ada.Containers.Count_Type;
-
-      Parse_Items : Parse.Parse_Item_Arrays.Vector;
-   begin
-      if Parse.Parse
-        (Super, Shared, Parser_Index, Parse_Items, Config,
-         Shared_Token_Goal => Invalid_Token_Index,
-         All_Conflicts     => True,
-         Trace_Prefix      => "fast_forward")
-      then
-         --  At least one config parsed without error, so continue with them.
-         if Parse_Items.Length = 1 then
-            Config := Parse_Items (1).Config;
-            Config.Current_Ops := No_Insert_Delete;
-            Config.Ops.Append ((Fast_Forward, Config.Current_Shared_Token));
-            return Continue;
-         else
-            --  Enqueue all passing configs, abandon current.
-            for Item of Parse_Items loop
-               if Item.Parsed and Item.Config.Error_Token.ID = 
Invalid_Token_ID then
-                  Item.Config.Ops.Append ((Fast_Forward, 
Item.Config.Current_Shared_Token));
-                  Config.Current_Ops := No_Insert_Delete;
-                  Local_Config_Heap.Add (Item.Config);
-
-                  if Trace_McKenzie > Detail then
-                     Base.Put ("fast forward conflict", Super, Shared, 
Parser_Index, Item.Config);
-                  end if;
-               end if;
-            end loop;
-            return Abandon;
-         end if;
-
-      else
-         --  No parse item parsed without error. This indicates that Config.Ops
-         --  (enqueued by language_fixes) did not fix all the problems; see
-         --  test_mckenzie_recover Two_Missing_Ends. If it made progress we try
-         --  more fixes.
-         for Item of Parse_Items loop
-            declare
-               Parsed_Config : Configuration renames Item.Config;
-               Remaining : SAL.Base_Peek_Type;
-            begin
-               if Parsed_Config.Current_Insert_Delete = No_Insert_Delete then
-                  --  Insert_Delete contains only Deletes, and the next token 
caused an
-                  --  error.
-                  Parsed_Config.Ops.Append ((Fast_Forward, 
Config.Current_Shared_Token));
-                  Local_Config_Heap.Add (Parsed_Config);
-                  if Trace_McKenzie > Detail then
-                     Base.Put ("fast forward failure", Super, Shared, 
Parser_Index, Item.Config);
-                  end if;
-
-               elsif Parsed_Config.Current_Insert_Delete = 1 then
-                  --  No progress made; abandon config
-                  null;
-
-               else
-                  --  Find fixes at the failure point. We don't reset
-                  --  Config.Current_Insert_Delete here, to allow skipping 
Check.
-                  --
-                  --  If the unparsed ops are at Config.Current_Shared_Token, 
then new
-                  --  ops applied in Process_One below must be inserted in 
Config.Ops
-                  --  before the unparsed ops, so the final order applied to 
the full
-                  --  parser is correct.
-                  if Parsed_Config.Insert_Delete 
(Parsed_Config.Current_Insert_Delete).Token_Index =
-                    Parsed_Config.Current_Shared_Token
-                  then
-                     Parsed_Config.Current_Ops := Parsed_Config.Ops.Last_Index;
-                     Remaining := Parsed_Config.Insert_Delete.Last_Index - 
Parsed_Config.Current_Insert_Delete;
-                     loop
-                        exit when Remaining = 0;
-                        if Parsed_Config.Ops (Parsed_Config.Current_Ops).Op in 
Insert_Delete_Op_Label then
-                           Remaining := Remaining - 1;
-                        end if;
-                        Parsed_Config.Current_Ops := Parsed_Config.Current_Ops 
- 1;
-                        if Parsed_Config.Current_Ops < 
Parsed_Config.Ops.First_Index then
-                           if Trace_McKenzie > Outline then
-                              Put_Line
-                                (Super.Trace.all, Super.Label (Parser_Index),
-                                 "Insert_Delete is out of sync with Ops");
-                           end if;
-                           raise Bad_Config;
-                        end if;
-                     end loop;
-                  end if;
-
-                  if Parsed_Config.Current_Insert_Delete > 1 then
-                     if Parsed_Config.Current_Ops = No_Insert_Delete then
-                        Parsed_Config.Ops.Append ((Fast_Forward, 
Config.Current_Shared_Token));
-                     else
-                        Parsed_Config.Ops.Insert
-                          ((Fast_Forward, Config.Current_Shared_Token), Before 
=> Parsed_Config.Current_Ops);
-                        Parsed_Config.Current_Ops := Parsed_Config.Current_Ops 
+ 1;
-                     end if;
-                  end if;
-                  Local_Config_Heap.Add (Parsed_Config);
-                  if Trace_McKenzie > Detail then
-                     Base.Put ("fast forward failure", Super, Shared, 
Parser_Index, Item.Config);
-                  end if;
-               end if;
-            end;
-         end loop;
-         return Abandon;
-      end if;
-   exception
-   when SAL.Container_Full | Bad_Config =>
-      return Abandon;
-   end Fast_Forward;
-
-   function Check
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Config            : in out          Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-     return Check_Status
-   is
-      use all type Ada.Containers.Count_Type;
-      use all type Semantic_Checks.Check_Status_Label;
-      use all type Parser.Language_Fixes_Access;
-
-      Parse_Items : Parse.Parse_Item_Arrays.Vector;
-   begin
-      if Parse.Parse
-        (Super, Shared, Parser_Index, Parse_Items, Config, 
Config.Resume_Token_Goal,
-         All_Conflicts => False,
-         Trace_Prefix  => "check")
-      then
-         Config.Error_Token.ID := Invalid_Token_ID;
-         return Success;
-      end if;
-
-      --  All Parse_Items failed; enqueue them so Language_Fixes can try to 
fix them.
-      declare
-         Parse_Error_Found : Boolean := False;
-      begin
-         for Item of Parse_Items loop
-
-            if Item.Config.Error_Token.ID /= Invalid_Token_ID and 
Item.Config.Check_Status.Label = Ok then
-               Parse_Error_Found := True;
-
-               if Item.Shift_Count = 0 or
-                 ((Item.Config.Ops.Length > 0 and then
-                     Item.Config.Ops (Item.Config.Ops.Last_Index).Op in 
Undo_Reduce | Push_Back) and
-                    Item.Config.Current_Shared_Token = 
Config.Current_Shared_Token)
-               then
-                  --  (Item.config.ops is empty on the very first Check). This 
is the
-                  --  same error Config originally found; report it in Config, 
so
-                  --  Use_Minimal_Complete_Actions can see it.
-                  Config.Error_Token  := Item.Config.Error_Token;
-                  Config.Check_Status := (Label => Ok);
-               end if;
-            end if;
-
-            if Item.Shift_Count > 0 and then
-              (Item.Config.Check_Status.Label /= Ok or
-                 Item.Config.Error_Token.ID /= Invalid_Token_ID)
-            then
-               --  Some progress was made; let Language_Fixes try to fix the 
new
-               --  error.
-               --
-               --  This is abandoning the original location of the error, 
which may
-               --  not be entirely fixed. So we increase the cost. See
-               --  test_mckenzie_recover Loop_Bounds.
-               Item.Config.Cost := Item.Config.Cost + 1;
-               begin
-                  if Item.Config.Ops (Item.Config.Ops.Last_Index).Op = 
Fast_Forward then
-                     Item.Config.Ops 
(Item.Config.Ops.Last_Index).FF_Token_Index :=
-                       Item.Config.Current_Shared_Token;
-                  else
-                     Item.Config.Ops.Append ((Fast_Forward, 
Item.Config.Current_Shared_Token));
-                  end if;
-               exception
-               when SAL.Container_Full =>
-                  raise Bad_Config;
-               end;
-               Local_Config_Heap.Add (Item.Config);
-               if Trace_McKenzie > Detail then
-                  Base.Put ("for Language_Fixes ", Super, Shared, 
Parser_Index, Item.Config);
-               end if;
-            end if;
-         end loop;
-
-         if Parse_Error_Found then
-            return Continue;
-         else
-            --  Failed due to Semantic_Check
-            if Shared.Language_Fixes = null then
-               --  Only fix is to ignore the error
-               return Continue;
-            else
-               --  Assume Language_Fixes handles this, not Explore.
-               return Abandon;
-            end if;
-         end if;
-      end;
-   exception
-   when Bad_Config =>
-      return Abandon;
-   end Check;
-
-   function Check_Reduce_To_Start
-     (Super        : not null access Base.Supervisor;
-      Shared       : not null access Base.Shared;
-      Parser_Index : in              SAL.Base_Peek_Type;
-      Orig_Config  : in              Configuration)
-     return Boolean
-      --  Returns True if Config reduces to the start nonterm.
-   is
-      Table : Parse_Table renames Shared.Table.all;
-
-      function To_Reduce_Action (Item : in Minimal_Action) return 
Reduce_Action_Rec
-      is begin
-         return (Reduce, (Item.Nonterm, 0), null, null, Item.Token_Count);
-      end To_Reduce_Action;
-
-      Local_Config_Heap : Config_Heaps.Heap_Type; -- never used, because 
Do_Language_Fixes is False.
-
-      Config : Configuration  := Orig_Config;
-      Action : Minimal_Action := Table.States 
(Config.Stack.Peek.State).Minimal_Complete_Action;
-   begin
-      loop
-         case Action.Verb is
-         when Pause =>
-            return True;
-
-         when Shift =>
-            return False;
-
-         when Reduce =>
-            Do_Reduce_1
-              ("", Super, Shared, Parser_Index, Local_Config_Heap, Config,
-               To_Reduce_Action (Action),
-               Do_Language_Fixes => False);
-
-            Action := Table.States 
(Config.Stack.Peek.State).Minimal_Complete_Action;
-         end case;
-         --  loop only exits via returns above
-      end loop;
-   end Check_Reduce_To_Start;
-
-   procedure Try_Push_Back
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Config            : in out          Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-   is
-      Trace          : WisiToken.Trace'Class renames Super.Trace.all;
-      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
-
-      Token : constant Recover_Token := Config.Stack (1).Token;
-   begin
-      --  Try pushing back the stack top, to allow insert and other
-      --  operations at that point.
-      --
-      --  Since we are not actually changing the source text, it is tempting
-      --  to give this operation zero cost. But then we keep doing push_back
-      --  forever, making no progress. So we give it a cost.
-
-      if not Token.Virtual then
-         --  If Virtual, this is from earlier in this recover session; no point
-         --  in trying to redo it.
-
-         declare
-            New_Config : Configuration := Config;
-         begin
-            New_Config.Error_Token.ID := Invalid_Token_ID;
-            New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
-
-            New_Config.Stack.Pop;
-
-            if Token.Min_Terminal_Index = Invalid_Token_Index then
-               --  Token is empty; Config.current_shared_token does not 
change, no
-               --  cost increase.
-               New_Config.Ops.Append ((Push_Back, Token.ID, 
New_Config.Current_Shared_Token));
-            else
-               New_Config.Cost := New_Config.Cost + McKenzie_Param.Push_Back 
(Token.ID);
-               New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
-               New_Config.Current_Shared_Token := Token.Min_Terminal_Index;
-            end if;
-
-            Local_Config_Heap.Add (New_Config);
-
-            if Trace_McKenzie > Detail then
-               Base.Put ("push_back " & Image (Token.ID, 
Trace.Descriptor.all), Super, Shared,
-                         Parser_Index, New_Config);
-            end if;
-         end;
-      end if;
-   exception
-   when SAL.Container_Full =>
-      if Trace_McKenzie > Outline then
-         Put_Line (Super.Trace.all, Super.Label (Parser_Index), "config.ops is 
full");
-      end if;
-   end Try_Push_Back;
-
-   procedure Insert_From_Action_List
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Config            : in              Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-   is
-      use all type Ada.Containers.Count_Type;
-
-      Table  : Parse_Table renames Shared.Table.all;
-      EOF_ID : Token_ID renames Super.Trace.Descriptor.EOI_ID;
-
-      --  Find terminal insertions from the current state's action_list to try.
-      --
-      --  We perform any needed reductions and one shift, so the config is
-      --  in a consistent state, and enqueue the result. If there are any
-      --  conflicts or semantic check fails encountered, they create other
-      --  configs to enqueue.
-
-      I : Action_List_Iterator := First (Table.States (Config.Stack 
(1).State));
-
-      Cached_Config : Configuration;
-      Cached_Action : Reduce_Action_Rec;
-      --  Most of the time, all the reductions in a state are the same. So
-      --  we cache the first result. This includes one reduction; if an
-      --  associated semantic check failed, this does not include the fixes.
-   begin
-      loop
-         exit when I.Is_Done;
-
-         declare
-            ID     : constant Token_ID := I.Symbol;
-            Action : Parse_Action_Rec renames I.Action;
-         begin
-            if ID /= EOF_ID and then --  can't insert eof
-              ID /= Invalid_Token_ID and then -- invalid when Verb = Error
-              (Config.Ops.Length = 0 or else
-                 --  Don't insert an ID we just pushed back or deleted; we 
know that failed.
-                 (Config.Ops (Config.Ops.Last_Index) /= (Push_Back, ID, 
Config.Current_Shared_Token) and
-                    Config.Ops (Config.Ops.Last_Index) /= (Delete, ID, 
Config.Current_Shared_Token)))
-            then
-               case Action.Verb is
-               when Shift =>
-                  declare
-                     New_Config : Configuration := Config;
-                  begin
-                     New_Config.Error_Token.ID := Invalid_Token_ID;
-                     New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
-
-                     Do_Shift
-                       (Super, Shared, Parser_Index, Local_Config_Heap, 
New_Config, Action.State, ID,
-                        Cost_Delta => 0,
-                        Strategy   => Explore_Table);
-                  end;
-
-               when Reduce =>
-                  if not Equal (Action, Cached_Action) then
-                     declare
-                        New_Config : Configuration := Config;
-                     begin
-                        New_Config.Error_Token.ID := Invalid_Token_ID;
-                        New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
-
-                        Do_Reduce_1 ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Action);
-                        Cached_Config := New_Config;
-                        Cached_Action := Action;
-
-                        Do_Reduce_2
-                          ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, ID,
-                           Cost_Delta => 0,
-                           Strategy   => Explore_Table);
-                     end;
-
-                  else
-                     declare
-                        New_Config : Configuration := Cached_Config;
-                     begin
-                        Do_Reduce_2
-                          ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, ID,
-                           Cost_Delta => 0,
-                           Strategy   => Explore_Table);
-                     end;
-                  end if;
-
-               when Accept_It =>
-                  raise SAL.Programmer_Error with "found test case for 
Process_One Accept_It";
-
-               when Error =>
-                  null;
-               end case;
-            end if;
-         end;
-         I.Next;
-      end loop;
-   end Insert_From_Action_List;
-
-   function Insert_Minimal_Complete_Actions
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Orig_Config       : in              Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-     return Integer
-      --  Returns count of terminals inserted; 0 if Orig_Config reduces to
-      --  the start nonterm.
-   is
-      use all type Ada.Containers.Count_Type;
-
-      Table        : Parse_Table renames Shared.Table.all;
-      Descriptor   : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
-      Insert_Count : Integer := 0;
-
-      Cost_Delta : constant Integer := -1;
-
-      New_Config      : Configuration  := Orig_Config;
-      Complete_Action : Minimal_Action := Table.States 
(New_Config.Stack.Peek.State).Minimal_Complete_Action;
-
-      function To_Reduce_Action (Item : in Minimal_Action) return 
Reduce_Action_Rec
-      is begin
-         return (Reduce, (Item.Nonterm, 0), null, null, Item.Token_Count);
-      end To_Reduce_Action;
-
-      procedure Minimal_Do_Shift
-      is begin
-         if New_Config.Ops.Length > 0 and then
-           --  Don't insert an ID we just pushed back or deleted; we know that 
failed.
-           (New_Config.Ops (New_Config.Ops.Last_Index) =
-              (Push_Back, Complete_Action.ID, New_Config.Current_Shared_Token) 
or
-              New_Config.Ops (New_Config.Ops.Last_Index) =
-              (Delete, Complete_Action.ID, New_Config.Current_Shared_Token))
-         then
-            if Trace_McKenzie > Extra then
-               Put_Line
-                 (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions abandoned " &
-                    Image (Complete_Action.ID, Descriptor));
-            end if;
-            pragma Assert (Insert_Count = 0);
-         else
-            if Trace_McKenzie > Extra then
-               Put_Line
-                 (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions shift " &
-                    Image (Complete_Action.ID, Descriptor));
-            end if;
-            New_Config.Check_Status := (Label => WisiToken.Semantic_Checks.Ok);
-            Insert_Count            := Insert_Count + 1;
-
-            Do_Shift
-              (Super, Shared, Parser_Index, Local_Config_Heap, New_Config, 
Complete_Action.State, Complete_Action.ID,
-               Cost_Delta,
-               Strategy   => Minimal_Complete);
-         end if;
-      end Minimal_Do_Shift;
-
-   begin
-      case Complete_Action.Verb is
-      when Pause =>
-         return 0;
-
-      when Reduce =>
-         --  Do a reduce, look at resulting state. Keep reducing until we can't
-         --  anymore.
-         declare
-            Reduce_Action : Reduce_Action_Rec := To_Reduce_Action 
(Complete_Action);
-         begin
-            loop
-               Do_Reduce_1
-                 ("Minimal_Complete_Actions", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Reduce_Action,
-                  Do_Language_Fixes => False);
-
-               Complete_Action := Table.States 
(New_Config.Stack.Peek.State).Minimal_Complete_Action;
-
-               case Complete_Action.Verb is
-               when Pause =>
-                  return 0;
-               when Shift =>
-                  Minimal_Do_Shift;
-                  return Insert_Count;
-               when Reduce =>
-                  null;
-               end case;
-
-               Reduce_Action := To_Reduce_Action
-                 (Table.States 
(New_Config.Stack.Peek.State).Minimal_Complete_Action);
-            end loop;
-         end;
-
-      when Shift =>
-         Minimal_Do_Shift;
-      end case;
-      return Insert_Count;
-   end Insert_Minimal_Complete_Actions;
-
-   procedure Insert_Matching_Begin
-     (Super                : not null access Base.Supervisor;
-      Shared               : not null access Base.Shared;
-      Parser_Index         : in              SAL.Base_Peek_Type;
-      Config               : in              Configuration;
-      Local_Config_Heap    : in out          Config_Heaps.Heap_Type;
-      Matching_Begin_Token : in              Token_ID)
-   is
-      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
-      New_Config : Configuration                  := Config;
-
-      Action     : constant Parse_Action_Node_Ptr := Action_For
-        (Shared.Table.all, New_Config.Stack (1).State, Matching_Begin_Token);
-   begin
-      if Trace_McKenzie > Extra then
-         Put_Line
-           (Super.Trace.all, Super.Label (Parser_Index), "Matching_Begin 
insert " &
-              Image (Matching_Begin_Token, Descriptor));
-      end if;
-
-      case Action.Item.Verb is
-      when Shift =>
-         Do_Shift
-           (Super, Shared, Parser_Index, Local_Config_Heap, New_Config, 
Action.Item.State,
-            Matching_Begin_Token,
-            Cost_Delta => -1,
-            Strategy   => Matching_Begin);
-
-      when Reduce =>
-         Do_Reduce_1
-           ("Matching_Begin", Super, Shared, Parser_Index, Local_Config_Heap, 
New_Config, Action.Item,
-            Do_Language_Fixes => False);
-
-         Do_Reduce_2
-           ("Matching_Begin", Super, Shared, Parser_Index, Local_Config_Heap, 
New_Config, Matching_Begin_Token,
-            Cost_Delta => -1,
-            Strategy   => Matching_Begin);
-
-      when Error | Accept_It =>
-         if Trace_McKenzie > Extra then
-            Put_Line
-              (Super.Trace.all, Super.Label (Parser_Index), "Matching_Begin 
abandoned " &
-                 Image (Matching_Begin_Token, Descriptor));
-         end if;
-      end case;
-   end Insert_Matching_Begin;
-
-   procedure Try_Insert_Terminal
-     (Super                        : not null access Base.Supervisor;
-      Shared                       : not null access Base.Shared;
-      Parser_Index                 : in              SAL.Base_Peek_Type;
-      Config                       : in              Configuration;
-      Local_Config_Heap            : in out          Config_Heaps.Heap_Type;
-      Use_Minimal_Complete_Actions : in              Boolean;
-      Matching_Begin_Token         : in              Token_ID)
-   is begin
-      if Use_Minimal_Complete_Actions then
-         if 0 = Insert_Minimal_Complete_Actions (Super, Shared, Parser_Index, 
Config, Local_Config_Heap) then
-            if Matching_Begin_Token /= Invalid_Token_ID then
-               Insert_Matching_Begin (Super, Shared, Parser_Index, Config, 
Local_Config_Heap, Matching_Begin_Token);
-            else
-               Insert_From_Action_List (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
-            end if;
-         else
-            --  We _do not_ do Insert_From_Action_list when
-            --  Insert_Minimal_Complete inserted something; let it try again 
next
-            --  cycle.
-            null;
-         end if;
-      else
-         Insert_From_Action_List (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
-      end if;
-
-      --  It is tempting to use the Goto_List to find nonterms to insert.
-      --  But that can easily lead to error states, and it turns out to be
-      --  not useful, especially if the grammar has been relaxed so most
-      --  expressions and lists can be empty.
-
-   exception
-   when Bad_Config =>
-      null;
-   end Try_Insert_Terminal;
-
-   procedure Try_Insert_Quote
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Config            : in out          Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-   is
-      use all type Parser.Language_String_ID_Set_Access;
-
-      Descriptor  : WisiToken.Descriptor renames Shared.Trace.Descriptor.all;
-      Check_Limit : Token_Index renames 
Shared.Table.McKenzie_Param.Check_Limit;
-
-      Current_Line            : constant Line_Number_Type := 
Shared.Terminals.all (Config.Current_Shared_Token).Line;
-      Lexer_Error_Token_Index : Base_Token_Index;
-      Lexer_Error_Token       : Base_Token;
-
-      function Recovered_Lexer_Error (Line : in Line_Number_Type) return 
Base_Token_Index
-      is begin
-         --  We are assuming the list of lexer errors is short, so binary
-         --  search would not be significantly faster.
-         for Err of reverse Shared.Lexer.Errors loop
-            if Err.Recover_Token /= Invalid_Token_Index and then
-              Shared.Terminals.all (Err.Recover_Token).Line = Line
-            then
-               return Err.Recover_Token;
-            end if;
-         end loop;
-         return Invalid_Token_Index;
-      end Recovered_Lexer_Error;
-
-      function String_ID_Set (String_ID : in Token_ID) return Token_ID_Set
-      is begin
-         return
-           (if Shared.Language_String_ID_Set = null
-            then (Descriptor.First_Terminal .. Descriptor.Last_Terminal => 
True)
-            else Shared.Language_String_ID_Set (Descriptor, String_ID));
-      end String_ID_Set;
-
-      procedure String_Literal_In_Stack
-        (New_Config        : in out Configuration;
-         Matching          : in     SAL.Peek_Type;
-         String_Literal_ID : in     Token_ID)
-      is
-         Saved_Shared_Token : constant Token_Index := 
New_Config.Current_Shared_Token;
-
-         Tok         : Recover_Token;
-         J           : Token_Index;
-         Parse_Items : Parse.Parse_Item_Arrays.Vector;
-      begin
-         --  Matching is the index of a token on New_Config.Stack containing a 
string
-         --  literal. Push back thru that token, then delete all tokens after
-         --  the string literal to Saved_Shared_Token.
-         for I in 1 .. Matching loop
-            Tok := New_Config.Stack.Pop.Token;
-            New_Config.Ops.Append ((Push_Back, Tok.ID, 
Tok.Min_Terminal_Index));
-         end loop;
-
-         New_Config.Current_Shared_Token := Tok.Min_Terminal_Index;
-
-         --  Find last string literal in pushed back terminals.
-         J := Saved_Shared_Token - 1;
-         loop
-            exit when Shared.Terminals.all (J).ID = String_Literal_ID;
-            J := J - 1;
-         end loop;
-
-         begin
-            if Parse.Parse
-              (Super, Shared, Parser_Index, Parse_Items, New_Config,
-               Shared_Token_Goal => J,
-               All_Conflicts     => False,
-               Trace_Prefix      => "insert quote parse pushback")
-            then
-               --  The non-deleted tokens parsed without error. We don't care 
if any
-               --  conflicts were encountered; we are not using the parse 
result.
-               New_Config := Parse_Items (1).Config;
-               New_Config.Ops.Append ((Fast_Forward, 
New_Config.Current_Shared_Token));
-            else
-               raise SAL.Programmer_Error;
-            end if;
-         exception
-         when Bad_Config =>
-            raise SAL.Programmer_Error;
-         end;
-         J := New_Config.Current_Shared_Token; -- parse result
-         loop
-            exit when J = Saved_Shared_Token;
-            New_Config.Ops.Append ((Delete, Shared.Terminals.all (J).ID, J));
-            J := J + 1;
-         end loop;
-
-         New_Config.Current_Shared_Token := Saved_Shared_Token;
-
-      end String_Literal_In_Stack;
-
-      procedure Finish
-        (Label       : in     String;
-         New_Config  : in out Configuration;
-         First, Last : in     Base_Token_Index)
-      is begin
-         --  Delete tokens First .. Last; either First - 1 or Last + 1 should
-         --  be a String_Literal. Leave Current_Shared_Token at Last + 1.
-
-         New_Config.Error_Token.ID := Invalid_Token_ID;
-         New_Config.Check_Status   := (Label => WisiToken.Semantic_Checks.Ok);
-
-         --  This is a guess, so we give it a nominal cost
-         New_Config.Cost := New_Config.Cost + 1;
-
-         for I in First .. Last loop
-            if New_Config.Ops.Is_Full then
-               if Trace_McKenzie > Outline then
-                  Put_Line (Super.Trace.all, Super.Label (Parser_Index), 
"config.ops is full");
-               end if;
-               raise Bad_Config;
-            end if;
-            New_Config.Ops.Append ((Delete, Shared.Terminals.all (I).ID, I));
-         end loop;
-         New_Config.Current_Shared_Token := Last + 1;
-
-         --  Allow insert/delete tokens
-         New_Config.Ops.Append ((Fast_Forward, 
New_Config.Current_Shared_Token));
-
-         if New_Config.Resume_Token_Goal - Check_Limit < 
New_Config.Current_Shared_Token then
-            New_Config.Resume_Token_Goal := New_Config.Current_Shared_Token + 
Check_Limit;
-            if Trace_McKenzie > Detail then
-               Put_Line
-                 (Super.Trace.all, Super.Label (Parser_Index), 
"resume_token_goal:" & Token_Index'Image
-                    (New_Config.Resume_Token_Goal));
-            end if;
-         end if;
-
-         Config.Strategy_Counts (String_Quote) := Config.Strategy_Counts 
(String_Quote) + 1;
-
-         if Trace_McKenzie > Detail then
-            Base.Put ("insert missing quote " & Label & " ", Super, Shared, 
Parser_Index, New_Config);
-         end if;
-      end Finish;
-
-   begin
-      --  When the lexer finds an unbalanced quote, it inserts a virtual
-      --  balancing quote at the same character position as the unbalanced
-      --  quote, returning an empty string literal token there. The parser
-      --  does not see that as an error; it encounters a syntax error
-      --  before, at, or after that string literal.
-      --
-      --  Here we assume the parse error in Config.Error_Token is due to
-      --  putting the balancing quote in the wrong place, and attempt to
-      --  find a better place to put the balancing quote. Then all tokens
-      --  from the balancing quote to the unbalanced quote are now part of a
-      --  string literal, so delete them, leaving just the string literal
-      --  created by Lexer error recovery.
-
-      --  First we check to see if there is an unbalanced quote in the
-      --  current line; if not, just return. Some lexer errors are for other
-      --  unrecognized characters; see ada_mode-recover_bad_char.adb.
-      --
-      --  An alternate strategy is to treat the lexer error as a parse error
-      --  immediately, but that complicates the parse logic.
-
-      Config.String_Quote_Checked := Current_Line;
-
-      Lexer_Error_Token_Index := Recovered_Lexer_Error (Current_Line);
-
-      if Lexer_Error_Token_Index = Invalid_Token_Index then
-         return;
-      end if;
-
-      Lexer_Error_Token := Shared.Terminals.all (Lexer_Error_Token_Index);
-
-      --  It is not possible to tell where the best place to put the
-      --  balancing quote is, so we always try all reasonable places.
-
-      if Lexer_Error_Token.Byte_Region.First = 
Config.Error_Token.Byte_Region.First then
-         --  The parse error token is the string literal at the lexer error.
-         --
-         --  case a: Insert the balancing quote somewhere before the error
-         --  point. There is no way to tell how far back to put the balancing
-         --  quote, so we just do one non-empty token. See
-         --  test_mckenzie_recover.adb String_Quote_0. So far we have not found
-         --  a test case for more than one token.
-         declare
-            New_Config : Configuration := Config;
-            Token      : Recover_Token;
-         begin
-            loop
-               Token := New_Config.Stack.Pop.Token;
-               if Token.Byte_Region /= Null_Buffer_Region then
-                  New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
-                  exit;
-               end if;
-            end loop;
-
-            Finish ("a", New_Config, Token.Min_Terminal_Index, 
Config.Current_Shared_Token - 1);
-            Local_Config_Heap.Add (New_Config);
-         end;
-
-         --  Note that it is not reasonable to insert a quote after the error
-         --  in this case. If that were the right solution, the parser error
-         --  token would not be the lexer repaired string literal, since a
-         --  string literal would be legal here.
-
-      elsif Lexer_Error_Token.Byte_Region.First < 
Config.Error_Token.Byte_Region.First then
-         --  The unbalanced quote is before the parse error token; see
-         --  test_mckenzie_recover.adb String_Quote_2.
-         --
-         --  The missing quote belongs after the parse error token, before or
-         --  at the end of the current line; try inserting it at the end of
-         --  the current line.
-         --
-         --  The lexer repaired string literal may be in a reduced token on the
-         --  stack.
-
-         declare
-            use all type SAL.Base_Peek_Type;
-            Matching : SAL.Peek_Type := 1;
-         begin
-            Find_Descendant_ID
-              (Super.Parser_State (Parser_Index).Tree, Config, 
Lexer_Error_Token.ID,
-               String_ID_Set (Lexer_Error_Token.ID), Matching);
-
-            if Matching = Config.Stack.Depth then
-               --  String literal is in a virtual nonterm; give up. So far 
this only
-               --  happens in a high cost non critical config.
-               if Trace_McKenzie > Detail then
-                  Put_Line
-                    (Super.Trace.all, Super.Label (Parser_Index), "abandon 
missing quote b; string literal in virtual");
-               end if;
-               return;
-            end if;
-
-            declare
-               New_Config : Configuration := Config;
-            begin
-               String_Literal_In_Stack (New_Config, Matching, 
Lexer_Error_Token.ID);
-
-               Finish
-                 ("b", New_Config, Config.Current_Shared_Token, 
Shared.Line_Begin_Token.all (Current_Line + 1) - 1);
-               Local_Config_Heap.Add (New_Config);
-            end;
-         end;
-
-      else
-         --  The unbalanced quote is after the parse error token.
-
-         --  case c: Assume a missing quote belongs immediately before the 
current token.
-         --  See test_mckenzie_recover.adb String_Quote_3.
-         declare
-            New_Config : Configuration := Config;
-         begin
-            Finish ("c", New_Config, Config.Current_Shared_Token, 
Lexer_Error_Token_Index - 1);
-            Local_Config_Heap.Add (New_Config);
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-         --  case d: Assume a missing quote belongs somewhere farther before
-         --  the current token; try one non-empty (as in case a above). See
-         --  test_mckenzie_recover.adb String_Quote_4.
-         declare
-            New_Config : Configuration := Config;
-            Token      : Recover_Token;
-         begin
-            loop
-               Token := New_Config.Stack.Pop.Token;
-               if Token.Byte_Region /= Null_Buffer_Region then
-                  New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
-                  exit;
-               end if;
-            end loop;
-
-            Finish ("d", New_Config, Token.Min_Terminal_Index, 
Lexer_Error_Token_Index - 1);
-            Local_Config_Heap.Add (New_Config);
-         exception
-         when Bad_Config =>
-            null;
-         end;
-
-         --  case e: Assume the actual error is an extra quote that terminates
-         --  an intended string literal early, in which case there is a token
-         --  on the stack containing the string literal that should be extended
-         --  to the found quote. See test_mckenzie_recover.adb String_Quote_1.
-         declare
-            use all type SAL.Base_Peek_Type;
-            Matching : SAL.Peek_Type := 1;
-         begin
-            --  Lexer_Error_Token is a string literal; find a matching one.
-            Find_Descendant_ID
-              (Super.Parser_State (Parser_Index).Tree, Config, 
Lexer_Error_Token.ID, String_ID_Set
-                 (Lexer_Error_Token.ID), Matching);
-
-            if Matching = Config.Stack.Depth then
-               --  No matching string literal, so this case does not apply.
-               null;
-            else
-               declare
-                  New_Config : Configuration := Config;
-               begin
-                  String_Literal_In_Stack (New_Config, Matching, 
Lexer_Error_Token.ID);
-
-                  Finish ("e", New_Config, Config.Current_Shared_Token, 
Lexer_Error_Token_Index);
-                  Local_Config_Heap.Add (New_Config);
-               end;
-            end if;
-         end;
-      end if;
-   exception
-   when SAL.Container_Full =>
-      if Trace_McKenzie > Outline then
-         Put_Line (Super.Trace.all, Super.Label (Parser_Index), "config.ops is 
full");
-      end if;
-
-   when Bad_Config =>
-      null;
-   end Try_Insert_Quote;
-
-   procedure Try_Delete_Input
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Base_Peek_Type;
-      Config            : in out          Configuration;
-      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
-   is
-      --  Try deleting (= skipping) the current shared input token.
-      Trace       : WisiToken.Trace'Class renames Super.Trace.all;
-      EOF_ID      : Token_ID renames Trace.Descriptor.EOI_ID;
-      Check_Limit : Token_Index renames 
Shared.Table.McKenzie_Param.Check_Limit;
-
-      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
-
-      ID : constant Token_ID := Shared.Terminals.all 
(Config.Current_Shared_Token).ID;
-   begin
-      if ID /= EOF_ID then
-         --  can't delete EOF
-         declare
-            New_Config : Configuration := Config;
-         begin
-            New_Config.Error_Token.ID := Invalid_Token_ID;
-            New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
-
-            New_Config.Cost := New_Config.Cost + McKenzie_Param.Delete (ID);
-
-            if Match_Since_FF (Config.Ops, (Push_Back, ID, 
Config.Current_Shared_Token))
-            then
-               --  We are deleting a push_back; cancel the push_back cost, to 
make
-               --  this the same as plain deleting.
-               New_Config.Cost := Natural'Max (Natural'First, New_Config.Cost 
- McKenzie_Param.Push_Back (ID));
-            end if;
-
-            New_Config.Ops.Append ((Delete, ID, Config.Current_Shared_Token));
-            New_Config.Current_Shared_Token := New_Config.Current_Shared_Token 
+ 1;
-            loop
-               exit when not Super.Parser_State 
(Parser_Index).Prev_Deleted.Contains (New_Config.Current_Shared_Token);
-               New_Config.Current_Shared_Token := 
New_Config.Current_Shared_Token + 1;
-            end loop;
-
-            if New_Config.Resume_Token_Goal - Check_Limit < 
New_Config.Current_Shared_Token then
-               New_Config.Resume_Token_Goal := New_Config.Current_Shared_Token 
+ Check_Limit;
-            end if;
-
-            Local_Config_Heap.Add (New_Config);
-
-            if Trace_McKenzie > Detail then
-               Base.Put
-                 ("delete " & Image (ID, Trace.Descriptor.all), Super, Shared, 
Parser_Index, New_Config);
-            end if;
-         end;
-      end if;
-   exception
-   when SAL.Container_Full =>
-      if Trace_McKenzie > Outline then
-         Put_Line (Super.Trace.all, Super.Label (Parser_Index), "config.ops is 
full");
-      end if;
-   end Try_Delete_Input;
-
-   procedure Process_One
-     (Super         : not null access Base.Supervisor;
-      Shared        : not null access Base.Shared;
-      Config_Status : out             Base.Config_Status)
-   is
-      --  Get one config from Super, check to see if it is a viable
-      --  solution. If not, enqueue variations to check.
-
-      use all type Base.Config_Status;
-      use all type Parser.Language_Fixes_Access;
-      use all type SAL.Base_Peek_Type;
-      use all type Semantic_Checks.Check_Status_Label;
-      use all type 
WisiToken.Parse.LR.Parser.Language_Use_Minimal_Complete_Actions_Access;
-
-      Trace      : WisiToken.Trace'Class renames Super.Trace.all;
-      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
-      Table      : Parse_Table renames Shared.Table.all;
-
-      Parser_Index : SAL.Base_Peek_Type;
-      Config       : Configuration;
-
-      Local_Config_Heap : Config_Heaps.Heap_Type;
-      --  We collect all the variants to enqueue, then deliver them all at
-      --  once to Super, to minimizes task interactions.
-
-      Use_Minimal_Complete_Actions : Boolean  := False;
-      Matching_Begin_Token         : Token_ID := Invalid_Token_ID;
-
-      function Allow_Insert_Terminal (Config : in Configuration) return Boolean
-      is begin
-         if Use_Minimal_Complete_Actions then
-            if Table.States 
(Config.Stack.Peek.State).Minimal_Complete_Action.Verb = Pause then
-               --  This happens when there is an extra token after an 
acceptable
-               --  grammar statement. There is no production to complete, so 
try
-               --  other things.
-               Use_Minimal_Complete_Actions := False;
-            else
-               if Trace_McKenzie > Detail then
-                  Put_Line (Super.Trace.all, Super.Label (Parser_Index), "use 
Minimal_Complete_Actions");
-               end if;
-               return True;
-            end if;
-         end if;
-         return None_Since_FF (Config.Ops, Delete);
-      end Allow_Insert_Terminal;
-
-   begin
-      Super.Get (Parser_Index, Config, Config_Status);
-
-      if Config_Status = All_Done then
-         return;
-      end if;
-
-      if Trace_McKenzie > Extra then
-         Base.Put ("dequeue", Super, Shared, Parser_Index, Config);
-         Put_Line (Trace, Super.Label (Parser_Index), "stack: " & Image 
(Config.Stack, Trace.Descriptor.all));
-      end if;
-
-      if Config.Current_Insert_Delete = 1 then
-         --  If Config.Current_Insert_Delete > 1 then Fast_Forward failed on 
this
-         --  config; don't fast_forward again.
-
-         case Fast_Forward (Super, Shared, Parser_Index, Local_Config_Heap, 
Config) is
-         when Abandon =>
-            --  We know Local_Config_Heap is empty; just tell
-            --  Super we are done working.
-            Super.Put (Parser_Index, Local_Config_Heap);
-            return;
-         when Continue =>
-            --  We don't increase cost for this Fast_Forward, since it is due 
to a
-            --  Language_Fixes.
-            null;
-         end case;
-      end if;
-
-      if Config.Error_Token.ID /= Invalid_Token_ID then
-         if Shared.Language_Fixes = null then
-            null;
-         else
-            Shared.Language_Fixes
-              (Trace, Shared.Lexer, Super.Label (Parser_Index), 
Shared.Table.all,
-               Shared.Terminals.all, Super.Parser_State (Parser_Index).Tree, 
Local_Config_Heap,
-               Config);
-
-            --  The solutions provided by Language_Fixes should be lower cost 
than
-            --  others (typically 0), so they will be checked first.
-
-            if Config.Check_Status.Label = Ok then
-               --  Parse table Error action.
-               --
-               --  We don't clear Config.Error_Token here, because 
Try_Insert_Terminal calls
-               --  Language_Use_Minimal_Complete_Actions, which needs it. We 
only clear it
-               --  when a parse results in no error (or a different error), or 
a
-               --  push_back moves the Current_Token.
-               null;
-
-            else
-               --  Assume "ignore check error" is a viable solution. But give 
it a
-               --  cost, so a solution provided by Language_Fixes is preferred.
-
-               declare
-                  New_State : Unknown_State_Index;
-               begin
-                  Config.Cost := Config.Cost + 
Table.McKenzie_Param.Ignore_Check_Fail;
-
-                  --  finish reduce.
-                  Config.Stack.Pop (SAL.Base_Peek_Type 
(Config.Check_Token_Count));
-
-                  New_State := Goto_For (Table, Config.Stack (1).State, 
Config.Error_Token.ID);
-
-                  if New_State = Unknown_State then
-                     if Config.Stack.Depth = 1 then
-                        --  Stack is empty, and we did not get Accept; really 
bad syntax got
-                        --  us here; abandon this config. See 
ada_mode-recover_bad_char.adb.
-                        Super.Put (Parser_Index, Local_Config_Heap);
-                        return;
-                     else
-                        raise SAL.Programmer_Error with
-                          "process_one found test case for new_state = 
Unknown; old state " &
-                          Trimmed_Image (Config.Stack (1).State) & " nonterm " 
& Image
-                            (Config.Error_Token.ID, Trace.Descriptor.all);
-                     end if;
-                  end if;
-
-                  Config.Stack.Push ((New_State, 
Syntax_Trees.Invalid_Node_Index, Config.Error_Token));
-
-                  --  We must clear Check_Status here, so if this config comes 
back
-                  --  here, we don't try to reduce the stack again. We also 
clear
-                  --  Error_Token, so this doesn't look like a parse error.
-                  Config.Check_Status := (Label => Ok);
-
-                  Config.Error_Token.ID := Invalid_Token_ID;
-               end;
-            end if;
-         end if;
-      end if;
-
-      if Config.Current_Insert_Delete > 1 then
-         --  Fast_Forward failed on this config; no need to check it. Remove
-         --  already parsed items from Insert_Delete, setting
-         --  Current_Insert_Delete to 1, so it will be checked after the Ops
-         --  applied below.
-         Config.Insert_Delete.Delete_First (Config.Current_Insert_Delete - 1);
-         Config.Current_Insert_Delete := 1;
-      else
-         case Check (Super, Shared, Parser_Index, Config, Local_Config_Heap) is
-         when Success =>
-            Super.Success (Parser_Index, Config, Local_Config_Heap);
-            return;
-
-         when Abandon =>
-            Super.Put (Parser_Index, Local_Config_Heap);
-            return;
-
-         when Continue =>
-            null;
-
-         end case;
-      end if;
-
-      if Trace_McKenzie > Detail then
-         Base.Put ("continuing", Super, Shared, Parser_Index, Config);
-         if Trace_McKenzie > Extra then
-            Put_Line (Trace, Super.Label (Parser_Index), "stack: " & Image 
(Config.Stack, Trace.Descriptor.all));
-         end if;
-      end if;
-
-      --  Grouping these operations ensures that there are no duplicate
-      --  solutions found. We reset the grouping after each fast_forward.
-      --
-      --  All possible permutations will be explored.
-
-      if Shared.Language_Use_Minimal_Complete_Actions = null then
-         Use_Minimal_Complete_Actions := False;
-         Matching_Begin_Token         := Invalid_Token_ID;
-      else
-         declare
-            Current_Token : Token_ID;
-            Next_Token : Token_ID;
-         begin
-            Current_Token_ID_Peek_2
-              (Shared.Terminals.all, Config.Current_Shared_Token, 
Config.Insert_Delete, Config.Current_Insert_Delete,
-               Super.Parser_State (Parser_Index).Prev_Deleted, Current_Token, 
Next_Token);
-
-            Shared.Language_Use_Minimal_Complete_Actions
-              (Current_Token, Next_Token, Config,
-               Use_Complete         => Use_Minimal_Complete_Actions,
-               Matching_Begin_Token => Matching_Begin_Token);
-         end;
-      end if;
-
-      if None_Since_FF (Config.Ops, Delete) and then
-        None_Since_FF (Config.Ops, Insert) and then
-        Config.Stack.Depth > 1 and then -- can't delete the first state
-        (not (Use_Minimal_Complete_Actions and then Check_Reduce_To_Start 
(Super, Shared, Parser_Index, Config)))
-        --  If Config reduces to the start nonterm, there's no point in 
push_back.
-      then
-         Try_Push_Back (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
-      end if;
-
-      if Allow_Insert_Terminal (Config) then
-         Try_Insert_Terminal
-           (Super, Shared, Parser_Index, Config, Local_Config_Heap, 
Use_Minimal_Complete_Actions, Matching_Begin_Token);
-      end if;
-
-      if Config.Current_Insert_Delete = No_Insert_Delete then
-         if Config.Check_Status.Label = Ok and
-           (Descriptor.String_1_ID /= Invalid_Token_ID or 
Descriptor.String_2_ID /= Invalid_Token_ID) and
-           (Config.String_Quote_Checked = Invalid_Line_Number or else
-              Config.String_Quote_Checked < Shared.Terminals.all 
(Config.Current_Shared_Token).Line)
-         then
-            --  See if there is a mismatched quote. The solution is to delete
-            --  tokens, replacing them with a string literal. So we try this 
when
-            --  it is ok to try delete.
-            Try_Insert_Quote (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
-         end if;
-
-         Try_Delete_Input (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
-      end if;
-
-      Super.Put (Parser_Index, Local_Config_Heap);
-   exception
-   when others =>
-      --  Just abandon this config; tell Super we are done.
-      Super.Put (Parser_Index, Local_Config_Heap);
-      if Debug_Mode then
-         raise;
-      end if;
-   end Process_One;
-
-end WisiToken.Parse.LR.McKenzie_Recover.Explore;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Exceptions;
+with WisiToken.Parse.LR.McKenzie_Recover.Parse;
+with WisiToken.Parse.LR.Parser;
+package body WisiToken.Parse.LR.McKenzie_Recover.Explore is
+
+   procedure Do_Shift
+     (Label             : in              String;
+      Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
+      Config            : in out          Configuration;
+      State             : in              State_Index;
+      ID                : in              Token_ID;
+      Cost_Delta        : in              Integer;
+      Strategy          : in              Strategies)
+   is
+      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
+
+      Op : constant Config_Op := (Insert, ID, Config.Current_Shared_Token, 
State, Config.Stack.Depth);
+   begin
+      Config.Strategy_Counts (Strategy) := Config.Strategy_Counts (Strategy) + 
1;
+
+      begin
+         Config.Ops.Append (Op);
+      exception
+      when SAL.Container_Full =>
+         Super.Config_Full (Parser_Index);
+         raise Bad_Config;
+      end;
+
+      if Cost_Delta = 0 then
+         Config.Cost := Config.Cost + McKenzie_Param.Insert (ID);
+      else
+         --  Cost_Delta /= 0 comes from Insert_Minimal_Complete_Actions. That
+         --  doesn't mean it is better than any other solution, so don't let
+         --  cost be 0.
+         --
+         --  We don't just eliminate all cost for Minimal_Complete_Actions;
+         --  that leads to using it far too much at the expense of better
+         --  solutions.
+         Config.Cost := Integer'Max (1, Config.Cost + McKenzie_Param.Insert 
(ID) + Cost_Delta);
+      end if;
+
+      Config.Error_Token.ID := Invalid_Token_ID;
+      Config.Check_Status   := (Label => WisiToken.Semantic_Checks.Ok);
+
+      Config.Stack.Push ((State, Syntax_Trees.Invalid_Node_Index, (ID, Virtual 
=> True, others => <>)));
+      if Trace_McKenzie > Detail then
+         Base.Put
+           ((if Label'Length > 0 then Label & ": " else "") & "insert " & 
Image (ID, Super.Trace.Descriptor.all),
+            Super, Shared, Parser_Index, Config);
+      end if;
+
+      Local_Config_Heap.Add (Config);
+   end Do_Shift;
+
+   procedure Do_Reduce_1
+     (Label             : in              String;
+      Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
+      Config            : in out          Configuration;
+      Action            : in              Reduce_Action_Rec;
+      Do_Language_Fixes : in              Boolean := True)
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Semantic_Checks.Check_Status_Label;
+      use all type WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+
+      Prev_State : constant Unknown_State_Index := Config.Stack.Peek.State;
+
+      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+      Table      : Parse_Table renames Shared.Table.all;
+      Nonterm    : Recover_Token;
+      New_State  : Unknown_State_Index;
+   begin
+      Config.Check_Status := Parse.Reduce_Stack (Shared, Config.Stack, Action, 
Nonterm, Default_Virtual => True);
+      case Config.Check_Status.Label is
+      when Ok =>
+         null;
+
+      when Semantic_Checks.Error =>
+         Config.Error_Token       := Nonterm;
+         Config.Check_Token_Count := Action.Token_Count;
+
+         if Do_Language_Fixes then
+            if Shared.Language_Fixes /= null then
+               Shared.Language_Fixes
+                 (Super.Trace.all, Shared.Lexer, Super.Label (Parser_Index), 
Shared.Table.all, Shared.Terminals.all,
+                  Super.Parser_State (Parser_Index).Tree, Local_Config_Heap,
+                  Config);
+            end if;
+         end if;
+
+         --  Finish the reduce; ignore the check fail.
+         Config.Stack.Pop (SAL.Base_Peek_Type (Config.Check_Token_Count));
+         Config.Error_Token.ID := Invalid_Token_ID;
+         Config.Check_Status   := (Label => Ok);
+      end case;
+
+      if Config.Stack.Depth = 0 or else Config.Stack (1).State = Unknown_State 
then
+         raise Bad_Config;
+      end if;
+
+      New_State := Goto_For (Table, Config.Stack (1).State, 
Action.Production.LHS);
+
+      if New_State = Unknown_State then
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Super.Trace.all, Super.Label (Parser_Index), Label &
+                 ": Do_Reduce_1: unknown_State " & 
Config.Stack.Peek.State'Image & " " &
+                 Image (Action.Production.LHS, Descriptor));
+         end if;
+         raise Bad_Config;
+      end if;
+
+      Config.Stack.Push ((New_State, Syntax_Trees.Invalid_Node_Index, 
Nonterm));
+
+      if Trace_McKenzie > Extra and Label'Length > 0 then
+         Put_Line
+           (Super.Trace.all, Super.Label (Parser_Index), Label &
+              ": state" & State_Index'Image (Prev_State) & " reduce" &
+              Ada.Containers.Count_Type'Image (Action.Token_Count) & " to " &
+              Image (Action.Production.LHS, Descriptor) & ", goto" &
+              State_Index'Image (New_State) & " via" & State_Index'Image 
(Config.Stack (2).State));
+      end if;
+   end Do_Reduce_1;
+
+   procedure Do_Reduce_2
+     (Label             : in              String;
+      Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
+      Config            : in out          Configuration;
+      Inserted_ID       : in              Token_ID;
+      Cost_Delta        : in              Integer;
+      Strategy          : in              Strategies)
+   is
+      --  Perform reduce actions until shift Inserted_ID; if all succeed,
+      --  add the final configuration to the heap, return True. If a conflict 
is
+      --  encountered, process the other action the same way. If a semantic
+      --  check fails, enqueue possible solutions. For parse table error
+      --  actions, or exception Bad_Config, return False.
+
+      Orig_Config : Configuration;
+      Table       : Parse_Table renames Shared.Table.all;
+      Next_Action : Parse_Action_Node_Ptr := Action_For (Table, Config.Stack 
(1).State, Inserted_ID);
+   begin
+      if Next_Action.Next /= null then
+         Orig_Config := Config;
+      end if;
+
+      case Next_Action.Item.Verb is
+      when Shift =>
+         Do_Shift
+           (Label, Super, Shared, Parser_Index, Local_Config_Heap, Config, 
Next_Action.Item.State, Inserted_ID,
+            Cost_Delta, Strategy);
+
+      when Reduce =>
+         Do_Reduce_1 (Label, Super, Shared, Parser_Index, Local_Config_Heap, 
Config, Next_Action.Item);
+         Do_Reduce_2
+           (Label, Super, Shared, Parser_Index, Local_Config_Heap, Config, 
Inserted_ID, Cost_Delta, Strategy);
+
+      when Accept_It =>
+         raise SAL.Programmer_Error with "found test case for Do_Reduce 
Accept_It";
+
+      when Error =>
+         null;
+      end case;
+
+      loop
+         exit when Next_Action.Next = null;
+         --  There is a conflict; create a new config to shift or reduce.
+         declare
+            New_Config : Configuration := Orig_Config;
+            Action     : Parse_Action_Rec renames Next_Action.Next.Item;
+         begin
+            case Action.Verb is
+            when Shift =>
+               Do_Shift
+                 (Label, Super, Shared, Parser_Index, Local_Config_Heap, 
New_Config, Action.State, Inserted_ID,
+                  Cost_Delta, Strategy);
+
+            when Reduce =>
+               Do_Reduce_1 (Label, Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Action);
+               Do_Reduce_2
+                 (Label, Super, Shared, Parser_Index, Local_Config_Heap, 
New_Config, Inserted_ID,
+                  Cost_Delta, Strategy);
+
+            when Accept_It =>
+               raise SAL.Programmer_Error with "found test case for Do_Reduce 
Accept_It conflict";
+
+            when Error =>
+               null;
+            end case;
+         end;
+
+         Next_Action := Next_Action.Next;
+      end loop;
+   exception
+   when Bad_Config =>
+      if Debug_Mode then
+         raise;
+      end if;
+   end Do_Reduce_2;
+
+   function Fast_Forward
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type;
+      Config            : in out          Configuration)
+     return Non_Success_Status
+   is
+      --  Apply the ops in Config; they were inserted by some fix.
+      --  Return Abandon if Config should be abandoned, otherwise Continue.
+      --  Leaves Config.Error_Token, Config.Check_Status set.
+      --
+      --  If there are conflicts, all are parsed; if more than one succeed,
+      --  all are enqueued in Local_Config_Heap, and this returns Abandon.
+
+      use all type SAL.Base_Peek_Type;
+      use all type Ada.Containers.Count_Type;
+
+      Parse_Items : Parse.Parse_Item_Arrays.Vector;
+
+      Dummy : Boolean := Parse.Parse
+        (Super, Shared, Parser_Index, Parse_Items, Config,
+         Shared_Token_Goal => Invalid_Token_Index,
+         All_Conflicts     => True,
+         Trace_Prefix      => "fast_forward");
+   begin
+      --  This solution is from Language_Fixes; any cost increase is done 
there.
+
+      if Parse_Items.Length = 1 then
+         declare
+            Item : Parse.Parse_Item renames Parse_Items (1);
+         begin
+            if Item.Parsed and Item.Config.Current_Insert_Delete = 
No_Insert_Delete then
+               --  Item.Config.Error_Token.ID, Check_Status are correct.
+               Config := Item.Config;
+
+               Config.Ops.Append ((Fast_Forward, Config.Current_Shared_Token));
+               Config.Minimal_Complete_State := None;
+               Config.Matching_Begin_Done    := False;
+               return Continue;
+            else
+               return Abandon;
+            end if;
+         end;
+      else
+         for Item of Parse_Items loop
+            if Item.Parsed and Item.Config.Current_Insert_Delete = 
No_Insert_Delete then
+               Item.Config.Ops.Append ((Fast_Forward, 
Item.Config.Current_Shared_Token));
+               Item.Config.Minimal_Complete_State := None;
+               Item.Config.Matching_Begin_Done    := False;
+               Local_Config_Heap.Add (Item.Config);
+
+               if Trace_McKenzie > Detail then
+                  Base.Put ("fast forward enqueue", Super, Shared, 
Parser_Index, Item.Config);
+               end if;
+            end if;
+         end loop;
+         return Abandon;
+      end if;
+   exception
+   when Bad_Config =>
+      return Abandon;
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+      return Abandon;
+   end Fast_Forward;
+
+   function Check
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+     return Check_Status
+   is
+      use all type Semantic_Checks.Check_Status_Label;
+
+      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
+
+      Parse_Items : Parse.Parse_Item_Arrays.Vector;
+      Result      : Check_Status := Continue;
+
+      function Max_Push_Back_Token_Index (Ops : in Config_Op_Arrays.Vector) 
return WisiToken.Base_Token_Index
+      is
+         Result : WisiToken.Base_Token_Index := 
WisiToken.Base_Token_Index'First;
+      begin
+         --  For Ops since last Fast_Forward, return maximum Token_Index in a
+         --  Push_Back. If there are no such ops, return a value that will be
+         --  less than the current token index.
+         for Op of reverse Ops loop
+            exit when Op.Op = Fast_Forward;
+            if Op.Op = Push_Back and then Op.PB_Token_Index > Result then
+               Result := Op.PB_Token_Index;
+            end if;
+         end loop;
+         return Result;
+      end Max_Push_Back_Token_Index;
+
+   begin
+      if Parse.Parse
+        (Super, Shared, Parser_Index, Parse_Items, Config, 
Config.Resume_Token_Goal,
+         All_Conflicts => False,
+         Trace_Prefix  => "check")
+      then
+         Config.Error_Token.ID := Invalid_Token_ID;
+         --  FIXME: if there were conflicts, enqueue them; they might yield a
+         --  cheaper or same cost solution?
+         return Success;
+      end if;
+
+      --  Set Config.error to reflect failure, if it is at current token, so
+      --  Use_Minimal_Complete_Actions can see it.
+      declare
+         Item          : Parse.Parse_Item renames Parse_Items 
(Parse_Items.First_Index);
+         Parsed_Config : Configuration renames Item.Config;
+      begin
+         if Parsed_Config.Check_Status.Label /= Ok then
+            Config.Check_Status := Parsed_Config.Check_Status;
+            Config.Error_Token  := Parsed_Config.Error_Token;
+
+            --  Explore cannot fix a check fail; only Language_Fixes can. The
+            --  "ignore error" case is handled immediately on return from
+            --  Language_Fixes in Process_One, below.
+            Result := Abandon;
+
+         elsif Parsed_Config.Error_Token.ID /= Invalid_Token_ID then
+
+            if Item.Shift_Count = 0 then
+               Config.Error_Token  := Parsed_Config.Error_Token;
+               Config.Check_Status := (Label => Ok);
+            else
+               --  Error is not at current token, but Explore might find 
something
+               --  that will help (see test_mckenzie_recover.adb Extra_Begin). 
On the
+               --  other hand, this can lead to lots of bogus configs (see
+               --  If_In_Handler).
+               Config.Error_Token.ID := Invalid_Token_ID;
+               Config.Check_Status   := (Label => Ok);
+            end if;
+         end if;
+      end;
+
+      --  All Parse_Items either failed or were not parsed; if they failed
+      --  and made progress, enqueue them so Language_Fixes can try to fix
+      --  them.
+      for Item of Parse_Items loop
+         if Item.Config.Error_Token.ID /= Invalid_Token_ID and then
+           Item.Shift_Count > 0 and then
+           Max_Push_Back_Token_Index (Item.Config.Ops) < 
Item.Config.Current_Shared_Token - 1
+         then
+            --  Some progress was made; explore at the new error point. It is
+            --  likely that there is only one actual error point, and this 
moves
+            --  away from it, so we give it a cost.
+            begin
+               Item.Config.Minimal_Complete_State := None;
+               Item.Config.Matching_Begin_Done    := False;
+               if Item.Config.Ops (Item.Config.Ops.Last_Index).Op = 
Fast_Forward then
+
+                  Item.Config.Cost := Item.Config.Cost + 
McKenzie_Param.Fast_Forward;
+
+                  Item.Config.Ops (Item.Config.Ops.Last_Index).FF_Token_Index 
:=
+                    Item.Config.Current_Shared_Token;
+
+               else
+                  Item.Config.Cost := Item.Config.Cost + 
McKenzie_Param.Fast_Forward;
+
+                  Item.Config.Ops.Append ((Fast_Forward, 
Item.Config.Current_Shared_Token));
+               end if;
+            exception
+            when SAL.Container_Full =>
+               Super.Config_Full (Parser_Index);
+               raise Bad_Config;
+            end;
+            Local_Config_Heap.Add (Item.Config);
+            if Trace_McKenzie > Detail then
+               Base.Put ("new error point ", Super, Shared, Parser_Index, 
Item.Config);
+            end if;
+         end if;
+      end loop;
+
+      if Trace_McKenzie > Extra then
+         Put_Line (Super.Trace.all, Super.Label (Parser_Index), "check result: 
" & Result'Image);
+      end if;
+      return Result;
+   exception
+   when Bad_Config =>
+      return Abandon;
+   end Check;
+
+   function Check_Reduce_To_Start
+     (Super        : not null access Base.Supervisor;
+      Shared       : not null access Base.Shared;
+      Parser_Index : in              SAL.Base_Peek_Type;
+      Orig_Config  : in              Configuration)
+     return Boolean
+      --  Returns True if Config reduces to the start nonterm.
+   is
+      Table : Parse_Table renames Shared.Table.all;
+
+      function To_Reduce_Action (Item : in Minimal_Action) return 
Reduce_Action_Rec
+      is begin
+         return (Reduce, (Item.Nonterm, 0), null, null, Item.Token_Count);
+      end To_Reduce_Action;
+
+      Local_Config_Heap : Config_Heaps.Heap_Type; -- never used, because 
Do_Language_Fixes is False.
+
+      Config  : Configuration                := Orig_Config;
+      Actions : Minimal_Action_Arrays.Vector := Table.States 
(Config.Stack.Peek.State).Minimal_Complete_Actions;
+   begin
+      loop
+         case Actions.Length is
+         when 0 =>
+            if (for some Item of Table.States (Config.Stack.Peek.State).Kernel 
=>
+                  Item.LHS = Super.Trace.Descriptor.Accept_ID)
+            then
+               return True;
+            else
+               return False;
+            end if;
+
+         when 1 =>
+            case Actions (Actions.First_Index).Verb is
+            when Shift =>
+               return False;
+
+            when Reduce =>
+               Do_Reduce_1
+                 ("", Super, Shared, Parser_Index, Local_Config_Heap, Config,
+                  To_Reduce_Action (Actions (Actions.First_Index)),
+                  Do_Language_Fixes => False);
+
+               Actions := Table.States 
(Config.Stack.Peek.State).Minimal_Complete_Actions;
+            end case;
+
+         when others =>
+            return False;
+         end case;
+
+         --  loop only exits via returns above
+      end loop;
+   end Check_Reduce_To_Start;
+
+   procedure Try_Push_Back
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      Trace          : WisiToken.Trace'Class renames Super.Trace.all;
+      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
+
+      Token : constant Recover_Token := Config.Stack (1).Token;
+   begin
+      --  Try pushing back the stack top, to allow insert and other
+      --  operations at that point.
+      --
+      --  Since we are not actually changing the source text, it is tempting
+      --  to give this operation zero cost. But then we keep doing push_back
+      --  forever, making no progress. So we give it a cost.
+
+      if not Token.Virtual then
+         --  If Virtual, this is from earlier in this recover session; no point
+         --  in trying to redo it.
+
+         declare
+            New_Config : Configuration := Config;
+         begin
+            New_Config.Error_Token.ID := Invalid_Token_ID;
+            New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+            New_Config.Stack.Pop;
+
+            if Token.Min_Terminal_Index = Invalid_Token_Index then
+               --  Token is empty; Config.current_shared_token does not 
change, no
+               --  cost increase.
+               New_Config.Ops.Append ((Push_Back, Token.ID, 
New_Config.Current_Shared_Token));
+            else
+               New_Config.Cost := New_Config.Cost + McKenzie_Param.Push_Back 
(Token.ID);
+               New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
+               New_Config.Current_Shared_Token := Token.Min_Terminal_Index;
+            end if;
+            New_Config.Strategy_Counts (Explore_Table) := 
New_Config.Strategy_Counts (Explore_Table) + 1;
+
+            Local_Config_Heap.Add (New_Config);
+
+            if Trace_McKenzie > Detail then
+               Base.Put ("push_back " & Image (Token.ID, 
Trace.Descriptor.all), Super, Shared,
+                         Parser_Index, New_Config);
+            end if;
+         end;
+      end if;
+   exception
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+   end Try_Push_Back;
+
+   function Just_Pushed_Back_Or_Deleted (Config : in Configuration; ID : in 
Token_ID) return Boolean
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      if Config.Ops.Length = 0 then
+         return False;
+      else
+         declare
+            Last_Op : Config_Op renames Config.Ops (Config.Ops.Last_Index);
+         begin
+            return Last_Op = (Push_Back, ID, Config.Current_Shared_Token) or
+              Last_Op = (Push_Back, ID, Config.Current_Shared_Token - 1) or
+            Last_Op = (Delete, ID, Config.Current_Shared_Token) or
+              Last_Op = (Delete, ID, Config.Current_Shared_Token - 1);
+         end;
+      end if;
+   end Just_Pushed_Back_Or_Deleted;
+
+   procedure Try_Undo_Reduce
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      Trace : WisiToken.Trace'Class renames Super.Trace.all;
+      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
+
+      Token : constant Recover_Token := Config.Stack (1).Token;
+   begin
+      --  Try expanding the nonterm on the stack top, to allow pushing_back
+      --  its components, or insert and other operations at that point.
+
+      if Undo_Reduce_Valid (Config.Stack, Super.Parser_State 
(Parser_Index).Tree) then
+         declare
+            New_Config  : Configuration := Config;
+            Token_Count : Ada.Containers.Count_Type;
+         begin
+            New_Config.Error_Token.ID := Invalid_Token_ID;
+            New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+            Token_Count := Undo_Reduce (New_Config.Stack, Super.Parser_State 
(Parser_Index).Tree);
+
+            if Token.Min_Terminal_Index /= Invalid_Token_Index  then
+               --  If Token is empty no cost increase.
+               New_Config.Cost := New_Config.Cost + McKenzie_Param.Undo_Reduce 
(Token.ID);
+            end if;
+
+            New_Config.Ops.Append ((Undo_Reduce, Token.ID, Token_Count));
+
+            New_Config.Strategy_Counts (Explore_Table) := 
New_Config.Strategy_Counts (Explore_Table) + 1;
+
+            Local_Config_Heap.Add (New_Config);
+
+            if Trace_McKenzie > Detail then
+               Base.Put ("undo_reduce " & Image (Token.ID, 
Trace.Descriptor.all), Super, Shared,
+                         Parser_Index, New_Config);
+            end if;
+         end;
+      end if;
+   exception
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+   end Try_Undo_Reduce;
+
+   procedure Insert_From_Action_List
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in              Configuration;
+      Minimal_Insert    : in              Token_ID_Arrays.Vector;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      Table      : Parse_Table renames Shared.Table.all;
+      EOF_ID     : Token_ID renames Super.Trace.Descriptor.EOI_ID;
+      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+
+      --  Find terminal insertions from the current state's action_list to try.
+      --
+      --  We perform any needed reductions and one shift, so the config is
+      --  in a consistent state, and enqueue the result. If there are any
+      --  conflicts or semantic check fails encountered, they create other
+      --  configs to enqueue.
+
+      I : Action_List_Iterator := First (Table.States 
(Config.Stack.Peek.State));
+
+      Current_Token : constant Token_ID := Current_Token_ID_Peek
+        (Shared.Terminals.all, Config.Current_Shared_Token, 
Config.Insert_Delete, Config.Current_Insert_Delete);
+
+      Cached_Config : Configuration;
+      Cached_Action : Reduce_Action_Rec;
+      --  Most of the time, all the reductions in a state are the same. So
+      --  we cache the first result. This includes one reduction; if an
+      --  associated semantic check failed, this does not include the fixes.
+   begin
+
+      loop
+         exit when I.Is_Done;
+
+         declare
+            ID     : constant Token_ID := I.Symbol;
+            Action : Parse_Action_Rec renames I.Action;
+         begin
+            if ID /= EOF_ID and then --  can't insert eof
+              ID /= Invalid_Token_ID -- invalid when Verb = Error
+            then
+               if Just_Pushed_Back_Or_Deleted (Config, ID) then
+                  if Trace_McKenzie > Extra then
+                     Put_Line
+                       (Super.Trace.all, Super.Label (Parser_Index), "Insert: 
abandon " & Image (ID, Descriptor) &
+                          ": undo push_back");
+                  end if;
+               elsif ID = Current_Token then
+                  --  This needed because we allow explore when the error is 
not at the
+                  --  explore point; it prevents inserting useless tokens (ie
+                  --  'identifier ;' in ada_lite).
+                  if Trace_McKenzie > Extra then
+                     Put_Line
+                       (Super.Trace.all, Super.Label (Parser_Index), "Insert: 
abandon " & Image (ID, Descriptor) &
+                          ": current token");
+                  end if;
+
+               elsif (for some Minimal of Minimal_Insert => ID = Minimal) then
+                  --  Was inserted by Insert_Minimal_Complete_Actions
+                  null;
+
+               else
+                  case Action.Verb is
+                  when Shift =>
+                     declare
+                        New_Config : Configuration := Config;
+                     begin
+                        New_Config.Error_Token.ID := Invalid_Token_ID;
+                        New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+                        Do_Shift
+                          ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Action.State, ID,
+                           Cost_Delta => 0,
+                           Strategy   => Explore_Table);
+                     end;
+
+                  when Reduce =>
+                     if not Equal (Action, Cached_Action) then
+                        declare
+                           New_Config : Configuration := Config;
+                        begin
+                           New_Config.Error_Token.ID := Invalid_Token_ID;
+                           New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+                           Do_Reduce_1 ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, Action);
+                           Cached_Config := New_Config;
+                           Cached_Action := Action;
+
+                           Do_Reduce_2
+                             ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, ID,
+                              Cost_Delta => 0,
+                              Strategy   => Explore_Table);
+                        end;
+
+                     else
+                        declare
+                           New_Config : Configuration := Cached_Config;
+                        begin
+                           Do_Reduce_2
+                             ("Insert", Super, Shared, Parser_Index, 
Local_Config_Heap, New_Config, ID,
+                              Cost_Delta => 0,
+                              Strategy   => Explore_Table);
+                        end;
+                     end if;
+
+                  when Accept_It =>
+                     raise SAL.Programmer_Error with "found test case for 
Process_One Accept_It";
+
+                  when Error =>
+                     null;
+                  end case;
+               end if;
+            end if;
+         end;
+         I.Next;
+      end loop;
+   end Insert_From_Action_List;
+
+   function Insert_Minimal_Complete_Actions
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Orig_Config       : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+     return Token_ID_Arrays.Vector
+      --  Return tokens inserted (empty if none).
+   is
+      use all type SAL.Base_Peek_Type;
+      use Ada.Containers;
+
+      Table         : Parse_Table renames Shared.Table.all;
+      Descriptor    : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+      Inserted      : Token_ID_Array (1 .. 10) := (others => Invalid_Token_ID);
+      Inserted_Last : Integer                  := Inserted'First - 1;
+
+      type Work_Item is record
+         Action : Minimal_Action;
+         Config : Configuration;
+      end record;
+
+      package Item_Queues is new SAL.Gen_Unbounded_Definite_Queues (Work_Item);
+
+      Work : Item_Queues.Queue;
+
+      function To_Reduce_Action (Action : in Minimal_Action) return 
Reduce_Action_Rec
+        is (Reduce, (Action.Nonterm, 0), null, null, Action.Token_Count);
+
+      procedure Minimal_Do_Shift (Action : in Minimal_Action; Config : in out 
Configuration)
+      is begin
+         --  Check for a cycle. We compare stack depth as well as state, so
+         --  nested compound statements don't look like a cycle; see
+         --  test_mckenzie_recover Push_Back_1. We don't check for cycles in
+         --  Insert_From_Action_List because we assume cost eliminates cycles
+         --  there; Minimal_Complete_Delta is usually negative, so cost does
+         --  not necessarily increase here.
+         for Op of reverse Config.Ops loop
+            if Op.Op = Insert and then
+              (Op.Ins_ID = Action.ID and Op.State = Action.State and 
Op.Stack_Depth = Config.Stack.Depth)
+            then
+               if Trace_McKenzie > Extra then
+                  Put_Line
+                    (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions: abandon " &
+                       Image (Action.ID, Descriptor) & Action.State'Image & ": 
cycle");
+               end if;
+               return;
+            end if;
+         end loop;
+
+         --  We don't check Action.ID = Current_Token; the error is at the
+         --  explore point, so ID is valid.
+
+         if Just_Pushed_Back_Or_Deleted (Config, Action.ID) then
+            if Trace_McKenzie > Extra then
+               Put_Line
+                 (Super.Trace.all, Super.Label (Parser_Index),
+                  "Minimal_Complete_Actions: abandon " & Image (Action.ID, 
Descriptor) & ": undo push back");
+            end if;
+         else
+            Config.Check_Status           := (Label => 
WisiToken.Semantic_Checks.Ok);
+            Config.Minimal_Complete_State := Active;
+            Inserted_Last                 := Inserted_Last + 1;
+            Inserted (Inserted_Last)      := Action.ID;
+
+            Do_Shift
+              ("Minimal_Complete_Actions", Super, Shared, Parser_Index, 
Local_Config_Heap, Config,
+               Action.State, Action.ID, 
Table.McKenzie_Param.Minimal_Complete_Cost_Delta,
+               Strategy => Minimal_Complete);
+         end if;
+      end Minimal_Do_Shift;
+
+      procedure Enqueue_Min_Actions
+        (Label       : in String;
+         Actions     : in Minimal_Action_Arrays.Vector;
+         Recursive   : in Boolean;
+         Config      : in Configuration;
+         Reduce_Only : in Boolean)
+      is
+         use SAL;
+         Length : array (Actions.First_Index .. Actions.Last_Index) of 
Count_Type := (others => Count_Type'Last);
+
+         Item_Not_Recursive  : array (Actions.First_Index .. 
Actions.Last_Index) of Boolean := (others => False);
+
+         Not_Recursive_Count : Count_Type := 0;
+         Min_Length          : Count_Type := Count_Type'Last;
+         Use_Recursive       : Boolean;
+      begin
+         --  Enqueue non-minimal actions on Work,
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions: " & Label &
+                 Image (Actions, Descriptor) & (if Recursive then " recursive" 
else ""));
+         end if;
+
+         if Actions.Length = 0 then
+            return;
+         elsif Actions.Length = 1 then
+            if (not Reduce_Only) or Actions (Actions.First_Index).Verb = 
Reduce then
+               Work.Add ((Actions (Actions.First_Index), Config));
+            end if;
+            return;
+         end if;
+
+         for I in Actions.First_Index .. Actions.Last_Index loop
+            declare
+               Action     : Minimal_Action renames Actions (I);
+               Next_State : constant State_Index :=
+                 (case Action.Verb is
+                  when Shift => Action.State,
+                  when Reduce => Goto_For
+                    (Shared.Table.all,
+                     Config.Stack.Peek (Base_Peek_Type (Action.Token_Count) + 
1).State,
+                     Action.Nonterm));
+               Before_Dot : constant Token_ID :=
+                 (case Action.Verb is
+                  when Shift => Action.ID,
+                  when Reduce => Action.Nonterm);
+               Kernel     : Kernel_Info_Arrays.Vector renames 
Shared.Table.States (Next_State).Kernel;
+            begin
+               if (not Reduce_Only) or Action.Verb = Reduce then
+                  for Item of Kernel loop
+                     Item_Not_Recursive (I) := Item_Not_Recursive (I) or not 
Item.Recursive;
+                     if Item.Before_Dot = Before_Dot and
+                       Item.Length_After_Dot < Length (I)
+                     then
+                        Length (I) := Item.Length_After_Dot;
+                        if Length (I) < Min_Length then
+                           Min_Length := Length (I);
+                        end if;
+                     end if;
+                  end loop;
+               end if;
+            end;
+            if Item_Not_Recursive (I) then
+               Not_Recursive_Count := Not_Recursive_Count + 1;
+            end if;
+         end loop;
+
+         Use_Recursive := Recursive and Not_Recursive_Count > 0 and 
Not_Recursive_Count < Actions.Length;
+
+         for I in Length'Range loop
+            if (Use_Recursive and Item_Not_Recursive (I)) or ((not 
Use_Recursive) and Length (I) = Min_Length) then
+               Work.Add ((Actions (I), Config));
+            elsif Trace_McKenzie > Extra then
+               Put_Line
+                 (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions: drop " &
+                    Image (Actions (I), Descriptor));
+            end if;
+         end loop;
+      end Enqueue_Min_Actions;
+
+   begin
+      if Orig_Config.Stack.Depth = 1 then
+         --  Get here with an empty source file, or a syntax error on the first
+         --  token.
+         return Token_ID_Arrays.Empty_Vector;
+
+      elsif Orig_Config.Minimal_Complete_State = Done then
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions: done");
+         end if;
+         return Token_ID_Arrays.Empty_Vector;
+      end if;
+
+      Enqueue_Min_Actions
+        ("",
+         Table.States (Orig_Config.Stack.Peek.State).Minimal_Complete_Actions,
+         Table.States 
(Orig_Config.Stack.Peek.State).Minimal_Complete_Actions_Recursive,
+         Orig_Config, Reduce_Only => False);
+
+      loop
+         exit when Work.Is_Empty;
+
+         declare
+            Item : Work_Item := Work.Get;
+         begin
+            if Trace_McKenzie > Extra then
+               Put_Line
+                 (Super.Trace.all, Super.Label (Parser_Index), 
"Minimal_Complete_Actions: dequeue work item " &
+                    Image (Item.Action, Descriptor));
+            end if;
+
+            case Item.Action.Verb is
+            when Reduce =>
+               --  Do a reduce, look at resulting state. Keep reducing until 
we can't
+               --  anymore.
+               declare
+                  Reduce_Action : Reduce_Action_Rec := To_Reduce_Action 
(Item.Action);
+                  Actions       : Minimal_Action_Arrays.Vector;
+                  Recursive     : Boolean;
+               begin
+                  loop
+                     Do_Reduce_1
+                       ("Minimal_Complete_Actions", Super, Shared, 
Parser_Index, Local_Config_Heap, Item.Config,
+                        Reduce_Action,
+                        Do_Language_Fixes => False);
+
+                     Actions   := Table.States 
(Item.Config.Stack.Peek.State).Minimal_Complete_Actions;
+                     Recursive := Table.States 
(Item.Config.Stack.Peek.State).Minimal_Complete_Actions_Recursive;
+
+                     case Actions.Length is
+                     when 0 =>
+                        if Trace_McKenzie > Extra then
+                           Put_Line
+                             (Super.Trace.all, Super.Label (Parser_Index),
+                              "Minimal_Complete_Actions abandoned: no 
actions");
+                        end if;
+                        exit;
+                     when 1 =>
+                        case Actions (Actions.First_Index).Verb is
+                        when Shift =>
+                           Minimal_Do_Shift (Actions (Actions.First_Index), 
Item.Config);
+                           exit;
+                        when Reduce =>
+                           Reduce_Action := To_Reduce_Action (Actions 
(Actions.First_Index));
+                        end case;
+
+                     when others =>
+                        Enqueue_Min_Actions ("multiple actions ", Actions, 
Recursive, Item.Config, Reduce_Only => True);
+                        exit;
+                     end case;
+                  end loop;
+               end;
+
+            when Shift =>
+               Minimal_Do_Shift (Item.Action, Item.Config);
+            end case;
+         end;
+      end loop;
+
+      if Inserted_Last = Inserted'First - 1 then
+         if Orig_Config.Minimal_Complete_State = Active then
+            Orig_Config.Minimal_Complete_State := Done;
+         end if;
+      end if;
+
+      return To_Vector (Inserted (1 .. Inserted_Last));
+   end Insert_Minimal_Complete_Actions;
+
+   procedure Insert_Matching_Begin
+     (Super                 : not null access Base.Supervisor;
+      Shared                : not null access Base.Shared;
+      Parser_Index          : in              SAL.Base_Peek_Type;
+      Config                : in              Configuration;
+      Local_Config_Heap     : in out          Config_Heaps.Heap_Type;
+      Matching_Begin_Tokens : in              Token_ID_Arrays.Vector)
+   is
+      Table      : Parse_Table renames Shared.Table.all;
+      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+   begin
+      --  We don't check for insert = current token; that's either ok or a
+      --  severe bug in Language_Use_Minimal_Complete.
+
+      if Config.Matching_Begin_Done then
+         if Trace_McKenzie > Extra then
+            Put_Line (Super.Trace.all, Super.Label (Parser_Index), 
"Matching_Begin abandoned: done");
+         end if;
+         return;
+      end if;
+
+      if Just_Pushed_Back_Or_Deleted (Config, Matching_Begin_Tokens 
(Matching_Begin_Tokens.First_Index)) then
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Super.Trace.all, Super.Label (Parser_Index), "Matching_Begin 
abandoned " &
+                 Image (Matching_Begin_Tokens 
(Matching_Begin_Tokens.First_Index), Descriptor) & ": undo push_back");
+         end if;
+         return;
+      end if;
+
+      --  Set up for Parse
+      declare
+         New_Config  : Configuration := Config;
+      begin
+         for ID of Matching_Begin_Tokens loop
+            Insert (New_Config, ID);
+         end loop;
+
+         declare
+            use all type SAL.Base_Peek_Type;
+            Parse_Items : Parse.Parse_Item_Arrays.Vector;
+            Dummy : constant Boolean :=  Parse.Parse
+              (Super, Shared, Parser_Index, Parse_Items, New_Config,
+               Shared_Token_Goal => Invalid_Token_Index,
+               All_Conflicts     => True,
+               Trace_Prefix      => "parse Matching_Begin");
+         begin
+            for Item of Parse_Items loop
+               if Item.Parsed and Item.Config.Current_Insert_Delete = 
No_Insert_Delete then
+                  Item.Config.Matching_Begin_Done := True;
+                  Item.Config.Cost := Item.Config.Cost + 
Table.McKenzie_Param.Matching_Begin;
+                  Item.Config.Strategy_Counts (Matching_Begin) := 
Item.Config.Strategy_Counts (Matching_Begin) + 1;
+                  Item.Config.Error_Token.ID := Invalid_Token_ID;
+                  Item.Config.Check_Status := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+                  if Trace_McKenzie > Detail then
+                     Base.Put
+                       ("Matching_Begin: insert " & Image 
(Matching_Begin_Tokens, Descriptor),
+                        Super, Shared, Parser_Index, Item.Config);
+                  end if;
+                  Local_Config_Heap.Add (Item.Config);
+               else
+                  if Trace_McKenzie > Detail then
+                     Base.Put
+                     ("Matching_Begin: abandon " & Image 
(Matching_Begin_Tokens, Descriptor) & ": parse fail",
+                        Super, Shared, Parser_Index, Item.Config);
+                  end if;
+               end if;
+            end loop;
+         end;
+      end;
+   exception
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+   end Insert_Matching_Begin;
+
+   procedure Try_Insert_Terminal
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      use all type 
WisiToken.Parse.LR.Parser.Language_Matching_Begin_Tokens_Access;
+      use all type Ada.Containers.Count_Type;
+      Tokens                : Token_ID_Array_1_3;
+      Matching_Begin_Tokens : Token_ID_Arrays.Vector;
+      Forbid_Minimal_Insert : Boolean := False;
+
+      Minimal_Inserted : Token_ID_Arrays.Vector;
+   begin
+      if Shared.Language_Matching_Begin_Tokens /= null then
+         Current_Token_ID_Peek_3
+           (Shared.Terminals.all, Config.Current_Shared_Token, 
Config.Insert_Delete, Config.Current_Insert_Delete,
+            Super.Parser_State (Parser_Index).Prev_Deleted, Tokens);
+
+         Shared.Language_Matching_Begin_Tokens (Tokens, Config, 
Matching_Begin_Tokens, Forbid_Minimal_Insert);
+      end if;
+
+      if not Forbid_Minimal_Insert then
+         --  See test_mckenzie_recover.adb Forbid_Minimal_Insert for rationale.
+         Minimal_Inserted := Insert_Minimal_Complete_Actions
+           (Super, Shared, Parser_Index, Config, Local_Config_Heap);
+      end if;
+
+      if Matching_Begin_Tokens.Length > 0 then
+         Insert_Matching_Begin (Super, Shared, Parser_Index, Config, 
Local_Config_Heap, Matching_Begin_Tokens);
+      end if;
+
+      --  We always do all three Insert_Minimal_Complete (unless
+      --  Forbid_Minimal_Insert), Insert_Matching_Begin,
+      --  Insert_From_Action_List; in general it's not possible to tell when
+      --  one will be better (see test_mckenzie_recover.adb
+      --  Always_Minimal_Complete, Always_Matching_Begin).
+      --  Insert_From_Action does not insert the Minimal_Inserted tokens,
+      --  and it will never insert the Matching_Begin_Tokens, so there is no
+      --  duplication. Insert_From_Action_List will normally be more
+      --  expensive.
+      Insert_From_Action_List (Super, Shared, Parser_Index, Config, 
Minimal_Inserted, Local_Config_Heap);
+
+      --  It is tempting to use the Goto_List to find nonterms to insert.
+      --  But that can easily lead to error states, and it turns out to be
+      --  not useful, especially if the grammar has been relaxed so most
+      --  expressions and lists can be empty.
+
+   exception
+   when Bad_Config =>
+      null;
+   end Try_Insert_Terminal;
+
+   procedure Try_Insert_Quote
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      use all type Parser.Language_String_ID_Set_Access;
+
+      Descriptor  : WisiToken.Descriptor renames Shared.Trace.Descriptor.all;
+      Check_Limit : WisiToken.Token_Index renames 
Shared.Table.McKenzie_Param.Check_Limit;
+
+      Current_Line            : constant Line_Number_Type := 
Shared.Terminals.all (Config.Current_Shared_Token).Line;
+      Lexer_Error_Token_Index : Base_Token_Index;
+      Lexer_Error_Token       : Base_Token;
+
+      function Recovered_Lexer_Error (Line : in Line_Number_Type) return 
Base_Token_Index
+      is begin
+         --  We are assuming the list of lexer errors is short, so binary
+         --  search would not be significantly faster.
+         for Err of reverse Shared.Lexer.Errors loop
+            if Err.Recover_Token /= Invalid_Token_Index and then
+              Shared.Terminals.all (Err.Recover_Token).Line = Line
+            then
+               return Err.Recover_Token;
+            end if;
+         end loop;
+         return Invalid_Token_Index;
+      end Recovered_Lexer_Error;
+
+      function String_ID_Set (String_ID : in Token_ID) return Token_ID_Set
+      is begin
+         if Shared.Language_String_ID_Set = null then
+            return (String_ID .. String_ID => True);
+         else
+            return Shared.Language_String_ID_Set (Descriptor, String_ID);
+         end if;
+      end String_ID_Set;
+
+      procedure String_Literal_In_Stack
+        (New_Config        : in out Configuration;
+         Matching          : in     SAL.Peek_Type;
+         String_Literal_ID : in     Token_ID)
+      is
+         Saved_Shared_Token : constant WisiToken.Token_Index := 
New_Config.Current_Shared_Token;
+
+         Tok         : Recover_Token;
+         J           : WisiToken.Token_Index;
+         Parse_Items : Parse.Parse_Item_Arrays.Vector;
+      begin
+         --  Matching is the index of a token on New_Config.Stack containing a 
string
+         --  literal. Push back thru that token, then delete all tokens after
+         --  the string literal to Saved_Shared_Token.
+         for I in 1 .. Matching loop
+            Tok := New_Config.Stack.Pop.Token;
+            New_Config.Ops.Append ((Push_Back, Tok.ID, 
Tok.Min_Terminal_Index));
+         end loop;
+
+         New_Config.Current_Shared_Token := Tok.Min_Terminal_Index;
+
+         --  Find last string literal in pushed back terminals.
+         J := Saved_Shared_Token - 1;
+         loop
+            exit when Shared.Terminals.all (J).ID = String_Literal_ID;
+            J := J - 1;
+         end loop;
+
+         begin
+            if Parse.Parse
+              (Super, Shared, Parser_Index, Parse_Items, New_Config,
+               Shared_Token_Goal => J,
+               All_Conflicts     => False,
+               Trace_Prefix      => "insert quote parse pushback")
+            then
+               --  The non-deleted tokens parsed without error. We don't care 
if any
+               --  conflicts were encountered; we are not using the parse 
result.
+               New_Config := Parse_Items (1).Config;
+               New_Config.Ops.Append ((Fast_Forward, 
New_Config.Current_Shared_Token));
+            else
+               raise SAL.Programmer_Error;
+            end if;
+         exception
+         when Bad_Config =>
+            raise SAL.Programmer_Error;
+         end;
+         J := New_Config.Current_Shared_Token; -- parse result
+         loop
+            exit when J = Saved_Shared_Token;
+            New_Config.Ops.Append ((Delete, Shared.Terminals.all (J).ID, J));
+            J := J + 1;
+         end loop;
+
+         New_Config.Current_Shared_Token := Saved_Shared_Token;
+
+      end String_Literal_In_Stack;
+
+      procedure Finish
+        (Label       : in     String;
+         New_Config  : in out Configuration;
+         First, Last : in     Base_Token_Index)
+      is begin
+         --  Delete tokens First .. Last; either First - 1 or Last + 1 should
+         --  be a String_Literal. Leave Current_Shared_Token at Last + 1.
+
+         New_Config.Error_Token.ID := Invalid_Token_ID;
+         New_Config.Check_Status   := (Label => WisiToken.Semantic_Checks.Ok);
+
+         --  This is a guess, so we give it a nominal cost
+         New_Config.Cost := New_Config.Cost + 1;
+
+         for I in First .. Last loop
+            New_Config.Ops.Append ((Delete, Shared.Terminals.all (I).ID, I));
+         end loop;
+         New_Config.Current_Shared_Token := Last + 1;
+
+         --  Let explore do insert after these deletes.
+         New_Config.Ops.Append ((Fast_Forward, 
New_Config.Current_Shared_Token));
+
+         if New_Config.Resume_Token_Goal - Check_Limit < 
New_Config.Current_Shared_Token then
+            New_Config.Resume_Token_Goal := New_Config.Current_Shared_Token + 
Check_Limit;
+            if Trace_McKenzie > Detail then
+               Put_Line
+                 (Super.Trace.all, Super.Label (Parser_Index), 
"resume_token_goal:" & WisiToken.Token_Index'Image
+                    (New_Config.Resume_Token_Goal));
+            end if;
+         end if;
+
+         New_Config.Strategy_Counts (String_Quote) := 
New_Config.Strategy_Counts (String_Quote) + 1;
+
+         if Trace_McKenzie > Detail then
+            Base.Put ("insert missing quote " & Label & " ", Super, Shared, 
Parser_Index, New_Config);
+         end if;
+      exception
+      when SAL.Container_Full =>
+         Super.Config_Full (Parser_Index);
+         raise Bad_Config;
+      end Finish;
+
+   begin
+      --  When the lexer finds an unbalanced quote, it inserts a virtual
+      --  balancing quote at the same character position as the unbalanced
+      --  quote, returning an empty string literal token there. The parser
+      --  does not see that as an error; it encounters a syntax error
+      --  before, at, or after that string literal.
+      --
+      --  Here we assume the parse error in Config.Error_Token is due to
+      --  putting the balancing quote in the wrong place, and attempt to
+      --  find a better place to put the balancing quote. Then all tokens
+      --  from the balancing quote to the unbalanced quote are now part of a
+      --  string literal, so delete them, leaving just the string literal
+      --  created by Lexer error recovery.
+
+      --  First we check to see if there is an unbalanced quote in the
+      --  current line; if not, just return. Some lexer errors are for other
+      --  unrecognized characters; see ada_mode-recover_bad_char.adb.
+      --
+      --  An alternate strategy is to treat the lexer error as a parse error
+      --  immediately, but that complicates the parse logic.
+
+      Config.String_Quote_Checked := Current_Line;
+
+      Lexer_Error_Token_Index := Recovered_Lexer_Error (Current_Line);
+
+      if Lexer_Error_Token_Index = Invalid_Token_Index then
+         return;
+      end if;
+
+      Lexer_Error_Token := Shared.Terminals.all (Lexer_Error_Token_Index);
+
+      --  It is not possible to tell where the best place to put the
+      --  balancing quote is, so we always try all reasonable places.
+
+      if Lexer_Error_Token.Byte_Region.First = 
Config.Error_Token.Byte_Region.First then
+         --  The parse error token is the string literal at the lexer error.
+         --
+         --  case a: Insert the balancing quote somewhere before the error
+         --  point. There is no way to tell how far back to put the balancing
+         --  quote, so we just do one non-empty token. See
+         --  test_mckenzie_recover.adb String_Quote_0. So far we have not found
+         --  a test case for more than one token.
+         declare
+            New_Config : Configuration := Config;
+            Token      : Recover_Token;
+         begin
+            loop
+               Token := New_Config.Stack.Pop.Token;
+               if Token.Byte_Region /= Null_Buffer_Region then
+                  New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
+                  exit;
+               end if;
+            end loop;
+
+            Finish ("a", New_Config, Token.Min_Terminal_Index, 
Config.Current_Shared_Token - 1);
+            Local_Config_Heap.Add (New_Config);
+         end;
+
+         --  Note that it is not reasonable to insert a quote after the error
+         --  in this case. If that were the right solution, the parser error
+         --  token would not be the lexer repaired string literal, since a
+         --  string literal would be legal here.
+
+      elsif Lexer_Error_Token.Byte_Region.First < 
Config.Error_Token.Byte_Region.First then
+         --  The unbalanced quote is before the parse error token; see
+         --  test_mckenzie_recover.adb String_Quote_2.
+         --
+         --  The missing quote belongs after the parse error token, before or
+         --  at the end of the current line; try inserting it at the end of
+         --  the current line.
+         --
+         --  The lexer repaired string literal may be in a reduced token on the
+         --  stack.
+
+         declare
+            use all type SAL.Base_Peek_Type;
+            Matching : SAL.Peek_Type := 1;
+         begin
+            Find_Descendant_ID
+              (Super.Parser_State (Parser_Index).Tree, Config, 
Lexer_Error_Token.ID,
+               String_ID_Set (Lexer_Error_Token.ID), Matching);
+
+            if Matching = Config.Stack.Depth then
+               --  String literal is in a virtual nonterm; give up. So far 
this only
+               --  happens in a high cost non critical config.
+               if Trace_McKenzie > Detail then
+                  Put_Line
+                    (Super.Trace.all, Super.Label (Parser_Index), "abandon 
missing quote b; string literal in virtual");
+               end if;
+               return;
+            end if;
+
+            declare
+               New_Config : Configuration := Config;
+            begin
+               String_Literal_In_Stack (New_Config, Matching, 
Lexer_Error_Token.ID);
+
+               Finish
+                 ("b", New_Config, Config.Current_Shared_Token, 
Shared.Line_Begin_Token.all (Current_Line + 1) - 1);
+               Local_Config_Heap.Add (New_Config);
+            end;
+         end;
+
+      else
+         --  The unbalanced quote is after the parse error token.
+
+         --  case c: Assume a missing quote belongs immediately before the 
current token.
+         --  See test_mckenzie_recover.adb String_Quote_3.
+         declare
+            New_Config : Configuration := Config;
+         begin
+            Finish ("c", New_Config, Config.Current_Shared_Token, 
Lexer_Error_Token_Index - 1);
+            Local_Config_Heap.Add (New_Config);
+         exception
+         when Bad_Config =>
+            null;
+         end;
+
+         --  case d: Assume a missing quote belongs somewhere farther before
+         --  the current token; try one non-empty (as in case a above). See
+         --  test_mckenzie_recover.adb String_Quote_4.
+         declare
+            New_Config : Configuration := Config;
+            Token      : Recover_Token;
+         begin
+            loop
+               Token := New_Config.Stack.Pop.Token;
+               if Token.Byte_Region /= Null_Buffer_Region then
+                  New_Config.Ops.Append ((Push_Back, Token.ID, 
Token.Min_Terminal_Index));
+                  exit;
+               end if;
+            end loop;
+
+            Finish ("d", New_Config, Token.Min_Terminal_Index, 
Lexer_Error_Token_Index - 1);
+            Local_Config_Heap.Add (New_Config);
+         exception
+         when SAL.Container_Empty =>
+            --  From Stack.Pop
+            null;
+         when Bad_Config =>
+            null;
+         end;
+
+         --  case e: Assume the actual error is an extra quote that terminates
+         --  an intended string literal early, in which case there is a token
+         --  on the stack containing the string literal that should be extended
+         --  to the found quote. See test_mckenzie_recover.adb String_Quote_1.
+         declare
+            use all type SAL.Base_Peek_Type;
+            Matching : SAL.Peek_Type := 1;
+         begin
+            --  Lexer_Error_Token is a string literal; find a matching one.
+            Find_Descendant_ID
+              (Super.Parser_State (Parser_Index).Tree, Config, 
Lexer_Error_Token.ID, String_ID_Set
+                 (Lexer_Error_Token.ID), Matching);
+
+            if Matching = Config.Stack.Depth then
+               --  No matching string literal, so this case does not apply.
+               null;
+            else
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  String_Literal_In_Stack (New_Config, Matching, 
Lexer_Error_Token.ID);
+
+                  Finish ("e", New_Config, Config.Current_Shared_Token, 
Lexer_Error_Token_Index);
+                  Local_Config_Heap.Add (New_Config);
+               end;
+            end if;
+         end;
+      end if;
+   exception
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+
+   when Bad_Config =>
+      null;
+   end Try_Insert_Quote;
+
+   procedure Try_Delete_Input
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Base_Peek_Type;
+      Config            : in out          Configuration;
+      Local_Config_Heap : in out          Config_Heaps.Heap_Type)
+   is
+      --  Try deleting (= skipping) the current shared input token.
+
+      use all type Ada.Containers.Count_Type;
+      Trace       : WisiToken.Trace'Class renames Super.Trace.all;
+      EOF_ID      : Token_ID renames Trace.Descriptor.EOI_ID;
+      Check_Limit : WisiToken.Token_Index renames 
Shared.Table.McKenzie_Param.Check_Limit;
+
+      McKenzie_Param : McKenzie_Param_Type renames Shared.Table.McKenzie_Param;
+
+      ID : constant Token_ID := Shared.Terminals.all 
(Config.Current_Shared_Token).ID;
+   begin
+      if ID /= EOF_ID and then
+         --  can't delete EOF
+         (Config.Ops.Length = 0 or else
+           --  Don't delete an ID we just inserted; waste of time
+           (not Equal (Config.Ops (Config.Ops.Last_Index), (Insert, ID, 
Config.Current_Shared_Token, 1, 0))))
+      then
+         declare
+            New_Config : Configuration := Config;
+
+            function Matching_Push_Back return Boolean
+            is begin
+               for Op of reverse New_Config.Ops loop
+                  exit when not (Op.Op in Undo_Reduce | Push_Back | Delete);
+                  if Op = (Push_Back, ID, New_Config.Current_Shared_Token) then
+                     return True;
+                  end if;
+               end loop;
+               return False;
+            end Matching_Push_Back;
+         begin
+            New_Config.Error_Token.ID := Invalid_Token_ID;
+            New_Config.Check_Status   := (Label => 
WisiToken.Semantic_Checks.Ok);
+
+            New_Config.Cost := New_Config.Cost + McKenzie_Param.Delete (ID);
+            New_Config.Strategy_Counts (Explore_Table) := 
Config.Strategy_Counts (Explore_Table) + 1;
+
+            if Matching_Push_Back then
+               --  We are deleting a push_back; cancel the push_back cost, to 
make
+               --  this the same as plain deleting.
+               New_Config.Cost := Natural'Max (Natural'First, New_Config.Cost 
- McKenzie_Param.Push_Back (ID));
+            end if;
+
+            New_Config.Ops.Append ((Delete, ID, Config.Current_Shared_Token));
+            New_Config.Current_Shared_Token := New_Config.Current_Shared_Token 
+ 1;
+            loop
+               exit when not Super.Parser_State 
(Parser_Index).Prev_Deleted.Contains (New_Config.Current_Shared_Token);
+               New_Config.Current_Shared_Token := 
New_Config.Current_Shared_Token + 1;
+            end loop;
+
+            if New_Config.Resume_Token_Goal - Check_Limit < 
New_Config.Current_Shared_Token then
+               New_Config.Resume_Token_Goal := New_Config.Current_Shared_Token 
+ Check_Limit;
+            end if;
+
+            Local_Config_Heap.Add (New_Config);
+
+            if Trace_McKenzie > Detail then
+               Base.Put
+                 ("delete " & Image (ID, Trace.Descriptor.all), Super, Shared, 
Parser_Index, New_Config);
+            end if;
+         end;
+      end if;
+   exception
+   when SAL.Container_Full =>
+      Super.Config_Full (Parser_Index);
+   end Try_Delete_Input;
+
+   procedure Process_One
+     (Super         : not null access Base.Supervisor;
+      Shared        : not null access Base.Shared;
+      Config_Status : out             Base.Config_Status)
+   is
+      --  Get one config from Super, check to see if it is a viable
+      --  solution. If not, enqueue variations to check.
+
+      use all type Base.Config_Status;
+      use all type Parser.Language_Fixes_Access;
+      use all type SAL.Base_Peek_Type;
+      use all type Semantic_Checks.Check_Status_Label;
+
+      Trace      : WisiToken.Trace'Class renames Super.Trace.all;
+      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+      Table      : Parse_Table renames Shared.Table.all;
+
+      Parser_Index : SAL.Base_Peek_Type;
+      Config       : Configuration;
+
+      Local_Config_Heap : Config_Heaps.Heap_Type;
+      --  We collect all the variants to enqueue, then deliver them all at
+      --  once to Super, to minimizes task interactions.
+   begin
+      Super.Get (Parser_Index, Config, Config_Status);
+
+      if Config_Status = All_Done then
+         return;
+      end if;
+
+      if Trace_McKenzie > Detail then
+         Base.Put ("dequeue", Super, Shared, Parser_Index, Config);
+         if Trace_McKenzie > Extra then
+            Put_Line (Trace, Super.Label (Parser_Index), "stack: " & Image 
(Config.Stack, Trace.Descriptor.all));
+         end if;
+      end if;
+
+      --  Fast_Forward; parse Insert, Delete in Config.Ops that have not
+      --  been parsed yet. 'parse' here means adjusting Config.Stack and
+      --  Current_Terminal_Index. Code in this file always parses when
+      --  adding ops to Config (except as noted); Language_Fixes should use
+      --  McKenzie_Recover.Insert, Delete instead.
+      if Config.Current_Insert_Delete = 1 then
+         --  Config.Current_Insert_Delete > 1 is a programming error.
+
+         case Fast_Forward (Super, Shared, Parser_Index, Local_Config_Heap, 
Config) is
+         when Abandon =>
+            --  We know Local_Config_Heap is empty; just tell
+            --  Super we are done working.
+            Super.Put (Parser_Index, Local_Config_Heap);
+            return;
+         when Continue =>
+            --  We don't increase cost for this Fast_Forward, since it is due 
to a
+            --  Language_Fixes.
+            null;
+         end case;
+      end if;
+
+      pragma Assert (Config.Current_Insert_Delete = 0);
+
+      --  Language_Fixes: let it enqueue configs.
+      if Config.Error_Token.ID /= Invalid_Token_ID then
+         if Shared.Language_Fixes = null then
+            null;
+         else
+            Shared.Language_Fixes
+              (Trace, Shared.Lexer, Super.Label (Parser_Index), 
Shared.Table.all,
+               Shared.Terminals.all, Super.Parser_State (Parser_Index).Tree, 
Local_Config_Heap,
+               Config);
+
+            --  The solutions enqueued by Language_Fixes should be lower cost 
than
+            --  others (typically 0), so they will be checked first.
+
+            if Config.Check_Status.Label = Ok then
+               --  Parse table Error action.
+               --
+               --  We don't clear Config.Error_Token here, because
+               --  Language_Use_Minimal_Complete_Actions needs it. We only 
clear it
+               --  when a parse results in no error (or a different error), or 
a
+               --  push_back moves the Current_Token.
+               null;
+
+            else
+               --  Assume "ignore check error" is a viable solution. But give 
it a
+               --  cost, so a solution provided by Language_Fixes is preferred.
+
+               declare
+                  New_State : Unknown_State_Index;
+               begin
+                  Config.Cost := Config.Cost + 
Table.McKenzie_Param.Ignore_Check_Fail;
+
+                  --  finish reduce.
+                  Config.Stack.Pop (SAL.Base_Peek_Type 
(Config.Check_Token_Count));
+
+                  New_State := Goto_For (Table, Config.Stack (1).State, 
Config.Error_Token.ID);
+
+                  if New_State = Unknown_State then
+                     if Config.Stack.Depth = 1 then
+                        --  Stack is empty, and we did not get Accept; really 
bad syntax got
+                        --  us here; abandon this config. See 
ada_mode-recover_bad_char.adb.
+                        Super.Put (Parser_Index, Local_Config_Heap);
+                        return;
+                     else
+                        raise SAL.Programmer_Error with
+                          "process_one found test case for new_state = 
Unknown; old state " &
+                          Trimmed_Image (Config.Stack (1).State) & " nonterm " 
& Image
+                            (Config.Error_Token.ID, Trace.Descriptor.all);
+                     end if;
+                  end if;
+
+                  Config.Stack.Push ((New_State, 
Syntax_Trees.Invalid_Node_Index, Config.Error_Token));
+
+                  --  We clear Check_Status and Error_Token so the check error 
is ignored.
+                  Config.Check_Status := (Label => Ok);
+
+                  Config.Error_Token.ID := Invalid_Token_ID;
+               end;
+            end if;
+         end if;
+      end if;
+
+      --  Call Check to see if this config succeeds. Note that Check does
+      --  more than Fast_Forward, so the fact that Fast_Forward succeeds
+      --  does not mean we don't need to call Check.
+      case Check (Super, Shared, Parser_Index, Config, Local_Config_Heap) is
+      when Success =>
+         Super.Success (Parser_Index, Config, Local_Config_Heap);
+         return;
+
+      when Abandon =>
+         Super.Put (Parser_Index, Local_Config_Heap);
+         return;
+
+      when Continue =>
+         null;
+
+      end case;
+
+      if Trace_McKenzie > Detail then
+         Base.Put ("continuing", Super, Shared, Parser_Index, Config);
+         if Trace_McKenzie > Extra then
+            Put_Line (Trace, Super.Label (Parser_Index), "stack: " & Image 
(Config.Stack, Trace.Descriptor.all));
+         end if;
+      end if;
+
+      --  Grouping these operations (push_back, delete, insert) ensures that
+      --  there are no duplicate solutions found. We reset the grouping
+      --  after each fast_forward.
+      --
+      --  We do delete before insert so Insert_Matching_Begin can operate on
+      --  the new next token, before Fast_Forwarding past it.
+      --
+      --  All possible permutations will be explored.
+
+      Try_Insert_Terminal (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
+
+      if None_Since_FF (Config.Ops, Delete) and then
+        None_Since_FF (Config.Ops, Insert) and then
+        Config.Stack.Depth > 1 and then -- can't delete the first state
+        (not Check_Reduce_To_Start (Super, Shared, Parser_Index, Config))
+        --  If Config reduces to the start nonterm, there's no point in 
push_back.
+      then
+         Try_Push_Back (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
+         Try_Undo_Reduce (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
+      end if;
+
+      if None_Since_FF (Config.Ops, Insert) then
+         Try_Delete_Input (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
+      end if;
+
+      --  This is run once per input line, independent of what other ops
+      --  have been done.
+      if Config.Check_Status.Label = Ok and
+        (Descriptor.String_1_ID /= Invalid_Token_ID or Descriptor.String_2_ID 
/= Invalid_Token_ID) and
+        (Config.String_Quote_Checked = Invalid_Line_Number or else
+           Config.String_Quote_Checked < Shared.Terminals.all 
(Config.Current_Shared_Token).Line)
+      then
+         --  See if there is a mismatched quote. The solution is to delete
+         --  tokens, replacing them with a string literal. So we try this when
+         --  it is ok to try delete.
+         Try_Insert_Quote (Super, Shared, Parser_Index, Config, 
Local_Config_Heap);
+      end if;
+
+      Super.Put (Parser_Index, Local_Config_Heap);
+   exception
+   when E : others =>
+      --  Just abandon this config; tell Super we are done.
+      Super.Put (Parser_Index, Local_Config_Heap);
+      if Debug_Mode then
+         raise;
+      elsif Trace_McKenzie > Outline then
+         Put_Line
+           (Super.Trace.all, Super.Label (Parser_Index),
+            "Process_One: unhandled exception " & 
Ada.Exceptions.Exception_Name (E) & ": " &
+              Ada.Exceptions.Exception_Message (E));
+      end if;
+   end Process_One;
+
+end WisiToken.Parse.LR.McKenzie_Recover.Explore;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.ads 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.ads
index 1777728..b80124a 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.ads
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-explore.ads
@@ -1,28 +1,28 @@
---  Abstract :
---
---  Code to explore parse table, enqueuing new configs to check.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Parse.LR.McKenzie_Recover.Base;
-private package WisiToken.Parse.LR.McKenzie_Recover.Explore is
-
-   procedure Process_One
-     (Super         : not null access Base.Supervisor;
-      Shared        : not null access Base.Shared;
-      Config_Status : out             Base.Config_Status);
-
-end WisiToken.Parse.LR.McKenzie_Recover.Explore;
+--  Abstract :
+--
+--  Code to explore parse table, enqueuing new configs to check.
+--
+--  Copyright (C) 2018 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with WisiToken.Parse.LR.McKenzie_Recover.Base;
+private package WisiToken.Parse.LR.McKenzie_Recover.Explore is
+
+   procedure Process_One
+     (Super         : not null access Base.Supervisor;
+      Shared        : not null access Base.Shared;
+      Config_Status : out             Base.Config_Status);
+
+end WisiToken.Parse.LR.McKenzie_Recover.Explore;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.adb 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.adb
index 52ee7f1..963cf1a 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.adb
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.adb
@@ -1,304 +1,325 @@
---  Abstract :
---
---  See spec
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-package body WisiToken.Parse.LR.McKenzie_Recover.Parse is
-
-   procedure Compute_Nonterm
-     (ID              : in     Token_ID;
-      Stack           : in     Recover_Stacks.Stack;
-      Tokens          : in out Recover_Token_Array;
-      Nonterm         :    out Recover_Token;
-      Default_Virtual : in     Boolean)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      Min_Terminal_Index_Set : Boolean := False;
-   begin
-      Nonterm :=
-        (ID      => ID,
-         Virtual => (if Tokens'Length = 0 then Default_Virtual else False),
-         others  => <>);
-
-      for I in Tokens'Range loop
-         Tokens (I) := Stack (Tokens'Last - I + 1).Token;
-      end loop;
-
-      for T of Tokens loop
-         Nonterm.Virtual := Nonterm.Virtual or T.Virtual;
-
-         if Nonterm.Byte_Region.First > T.Byte_Region.First then
-            Nonterm.Byte_Region.First := T.Byte_Region.First;
-         end if;
-
-         if Nonterm.Byte_Region.Last < T.Byte_Region.Last then
-            Nonterm.Byte_Region.Last := T.Byte_Region.Last;
-         end if;
-
-         if not Min_Terminal_Index_Set then
-            if T.Min_Terminal_Index /= Invalid_Token_Index then
-               Min_Terminal_Index_Set     := True;
-               Nonterm.Min_Terminal_Index := T.Min_Terminal_Index;
-            end if;
-         end if;
-      end loop;
-   end Compute_Nonterm;
-
-   function Reduce_Stack
-     (Shared          : not null access Base.Shared;
-      Stack           : in out          Recover_Stacks.Stack;
-      Action          : in              Reduce_Action_Rec;
-      Nonterm         :    out          Recover_Token;
-      Default_Virtual : in              Boolean)
-     return Semantic_Checks.Check_Status
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Semantic_Checks.Semantic_Check;
-      use all type Semantic_Checks.Check_Status_Label;
-
-      Last   : constant SAL.Base_Peek_Type := SAL.Base_Peek_Type 
(Action.Token_Count);
-      Tokens : Recover_Token_Array (1 .. Last);
-   begin
-      Compute_Nonterm (Action.Production.LHS, Stack, Tokens, Nonterm, 
Default_Virtual);
-
-      if Action.Check = null then
-         --  Now we can pop the stack.
-         Stack.Pop (SAL.Base_Peek_Type (Action.Token_Count));
-         return (Label => Ok);
-      else
-         return Status : constant Semantic_Checks.Check_Status :=
-           Action.Check (Shared.Lexer, Nonterm, Tokens, Recover_Active => True)
-         do
-            if Status.Label = Ok then
-               Stack.Pop (SAL.Base_Peek_Type (Action.Token_Count));
-            end if;
-         end return;
-      end if;
-   end Reduce_Stack;
-
-   function Parse_One_Item
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Parse_Items       : in out          Parse_Item_Arrays.Vector;
-      Parse_Item_Index  : in              Positive;
-      Shared_Token_Goal : in              Base_Token_Index;
-      Trace_Prefix      : in              String)
-     return Boolean
-   is
-      --  Perform parse actions on Parse_Items (Parse_Item_Index), until one
-      --  fails (return False) or Shared_Token_Goal is shifted (return
-      --  True).
-      --
-      --  We return Boolean, not Check_Status, because Abandon and Continue
-      --  are up to the caller.
-      --
-      --  If any actions have a conflict, append the conflict config and 
action to
-      --  Parse_Items.
-
-      use all type Ada.Containers.Count_Type;
-      use all type SAL.Base_Peek_Type;
-      use all type Semantic_Checks.Check_Status_Label;
-
-      Trace      : WisiToken.Trace'Class renames Super.Trace.all;
-      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
-      Table      : Parse_Table renames Shared.Table.all;
-
-      Item   : Parse_Item renames Parse_Items (Parse_Item_Index);
-      Config : Configuration renames Item.Config;
-      Action : Parse_Action_Node_Ptr renames Item.Action;
-
-      Restore_Terminals_Current : Base_Token_Index;
-      Current_Token             : Base_Token := McKenzie_Recover.Current_Token
-        (Terminals                 => Shared.Terminals.all,
-         Terminals_Current         => Config.Current_Shared_Token,
-         Restore_Terminals_Current => Restore_Terminals_Current,
-         Insert_Delete             => Config.Insert_Delete,
-         Current_Insert_Delete     => Config.Current_Insert_Delete,
-         Prev_Deleted              => Super.Parser_State 
(Parser_Index).Prev_Deleted);
-
-      New_State : Unknown_State_Index;
-      Success   : Boolean := True;
-
-   begin
-      if Trace_McKenzie > Detail then
-         Base.Put (Trace_Prefix & ": " & Image (Current_Token, Descriptor), 
Super, Shared, Parser_Index, Config);
-         if Shared_Token_Goal /= Invalid_Token_Index then
-            Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & ": 
Shared_Token_Goal :" &
-                        Token_Index'Image (Shared_Token_Goal));
-         end if;
-      end if;
-
-      Item.Parsed := True;
-
-      if Action = null then
-         Action := Action_For (Table, Config.Stack (1).State, 
Current_Token.ID);
-      end if;
-
-      loop
-         if Action.Next /= null then
-            if Parse_Items.Is_Full then
-               if Trace_McKenzie > Outline then
-                  Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & 
": too many conflicts; abandoning");
-               end if;
-            else
-               if Trace_McKenzie > Detail then
-                  Put_Line
-                    (Trace, Super.Label (Parser_Index), Trace_Prefix & ":" & 
State_Index'Image
-                       (Config.Stack.Peek.State) & ": add conflict " &
-                       Image (Action.Next.Item, Descriptor));
-               end if;
-
-               Parse_Items.Append ((Config, Action.Next, Parsed => False, 
Shift_Count => 0));
-            end if;
-         end if;
-
-         if Trace_McKenzie > Extra then
-            Put_Line
-              (Trace, Super.Label (Parser_Index), Trace_Prefix & ":" & 
State_Index'Image (Config.Stack.Peek.State) &
-                 " :" & Token_Index'Image (Config.Current_Shared_Token) &
-                 ":" & Image (Current_Token, Descriptor) &
-                 " : " & Image (Action.Item, Descriptor));
-         end if;
-
-         case Action.Item.Verb is
-         when Shift =>
-            Item.Shift_Count := Item.Shift_Count + 1;
-
-            Config.Stack.Push
-              ((Action.Item.State,
-                Syntax_Trees.Invalid_Node_Index,
-                (Current_Token.ID,
-                 Byte_Region        => Current_Token.Byte_Region,
-                 Min_Terminal_Index =>
-                   (if Config.Current_Insert_Delete = No_Insert_Delete
-                    then Config.Current_Shared_Token
-                    else Invalid_Token_Index),
-                 Name              => Null_Buffer_Region,
-                 Virtual           => Config.Current_Insert_Delete /= 
No_Insert_Delete)));
-
-            Current_Token := Next_Token
-              (Terminals                 => Shared.Terminals.all,
-               Terminals_Current         => Config.Current_Shared_Token,
-               Restore_Terminals_Current => Restore_Terminals_Current,
-               Insert_Delete             => Config.Insert_Delete,
-               Current_Insert_Delete     => Config.Current_Insert_Delete,
-               Prev_Deleted              => Super.Parser_State 
(Parser_Index).Prev_Deleted);
-
-         when Reduce =>
-            declare
-               Nonterm : Recover_Token;
-            begin
-               Config.Check_Status := Reduce_Stack
-                 (Shared, Config.Stack, Action.Item, Nonterm,
-                  Default_Virtual => Config.Current_Insert_Delete /= 
No_Insert_Delete);
-
-               case Config.Check_Status.Label is
-               when Ok =>
-                  New_State := Config.Stack.Peek.State;
-                  New_State := Goto_For (Table, New_State, 
Action.Item.Production.LHS);
-
-                  if New_State = Unknown_State then
-                     --  Most likely from an inappropriate language fix.
-                     if Trace_McKenzie > Outline then
-                        Base.Put (Trace_Prefix & ": Unknown_State: ", Super, 
Shared, Parser_Index, Config);
-                        Put_Line (Trace, Trace_Prefix & ": stack: " & Image 
(Config.Stack, Descriptor));
-                     end if;
-
-                     --  We can't just return False here; user must abandon 
this config.
-                     raise Bad_Config;
-                  end if;
-
-                  Config.Stack.Push ((New_State, 
Syntax_Trees.Invalid_Node_Index, Nonterm));
-
-               when Semantic_Checks.Error =>
-                  Config.Error_Token       := Nonterm;
-                  Config.Check_Token_Count := Action.Item.Token_Count;
-                  Success                  := False;
-               end case;
-            end;
-
-         when Error =>
-
-            Config.Error_Token :=
-              (ID          => Current_Token.ID,
-               Byte_Region => Current_Token.Byte_Region,
-               others      => <>);
-            Success            := False;
-
-         when Accept_It =>
-            null;
-         end case;
-
-         exit when not Success or
-           Action.Item.Verb = Accept_It or
-           (if Shared_Token_Goal = Invalid_Token_Index
-            then Config.Insert_Delete.Length = 0
-            else Config.Current_Shared_Token > Shared_Token_Goal);
-
-         Action := Action_For (Table, Config.Stack (1).State, 
Current_Token.ID);
-      end loop;
-
-      Config.Current_Shared_Token := Restore_Terminals_Current;
-
-      return Success;
-   end Parse_One_Item;
-
-   function Parse
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Parse_Items       :    out          Parse_Item_Arrays.Vector;
-      Config            : in              Configuration;
-      Shared_Token_Goal : in              Base_Token_Index;
-      All_Conflicts     : in              Boolean;
-      Trace_Prefix      : in              String)
-     return Boolean
-   is
-      Trace : WisiToken.Trace'Class renames Super.Trace.all;
-
-      Last_Index : Positive;
-      Success    : Boolean;
-   begin
-      Parse_Items.Clear;
-      Parse_Items.Append ((Config, Action => null, Parsed => False, 
Shift_Count => 0));
-
-      --  Clear any errors; so they reflect the parse result.
-      Parse_Items (Parse_Items.First_Index).Config.Error_Token.ID := 
Invalid_Token_ID;
-      Parse_Items (Parse_Items.First_Index).Config.Check_Status   := (Label => 
Semantic_Checks.Ok);
-
-      loop
-         --  Loop over initial config and any conflicts.
-         Last_Index := Parse_Items.Last_Index;
-
-         Success := Parse_One_Item
-           (Super, Shared, Parser_Index, Parse_Items, Last_Index, 
Shared_Token_Goal, Trace_Prefix);
-
-         exit when Parse_Items.Last_Index = Last_Index;
-
-         exit when Success and not All_Conflicts;
-
-         if Trace_McKenzie > Detail then
-            Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & ": 
parse conflict");
-         end if;
-      end loop;
-
-      return Success;
-   end Parse;
-
-end WisiToken.Parse.LR.McKenzie_Recover.Parse;
+--  Abstract :
+--
+--  See spec
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+package body WisiToken.Parse.LR.McKenzie_Recover.Parse is
+
+   procedure Compute_Nonterm
+     (ID              : in     Token_ID;
+      Stack           : in     Recover_Stacks.Stack;
+      Tokens          : in out Recover_Token_Array;
+      Nonterm         :    out Recover_Token;
+      Default_Virtual : in     Boolean)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      Min_Terminal_Index_Set : Boolean := False;
+   begin
+      Nonterm :=
+        (ID      => ID,
+         Virtual => (if Tokens'Length = 0 then Default_Virtual else False),
+         others  => <>);
+
+      for I in Tokens'Range loop
+         Tokens (I) := Stack (Tokens'Last - I + 1).Token;
+      end loop;
+
+      for T of Tokens loop
+         Nonterm.Virtual := Nonterm.Virtual or T.Virtual;
+
+         if Nonterm.Byte_Region.First > T.Byte_Region.First then
+            Nonterm.Byte_Region.First := T.Byte_Region.First;
+         end if;
+
+         if Nonterm.Byte_Region.Last < T.Byte_Region.Last then
+            Nonterm.Byte_Region.Last := T.Byte_Region.Last;
+         end if;
+
+         if not Min_Terminal_Index_Set then
+            if T.Min_Terminal_Index /= Invalid_Token_Index then
+               Min_Terminal_Index_Set     := True;
+               Nonterm.Min_Terminal_Index := T.Min_Terminal_Index;
+            end if;
+         end if;
+      end loop;
+   end Compute_Nonterm;
+
+   function Reduce_Stack
+     (Shared          : not null access Base.Shared;
+      Stack           : in out          Recover_Stacks.Stack;
+      Action          : in              Reduce_Action_Rec;
+      Nonterm         :    out          Recover_Token;
+      Default_Virtual : in              Boolean)
+     return Semantic_Checks.Check_Status
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Semantic_Checks.Semantic_Check;
+      use all type Semantic_Checks.Check_Status_Label;
+
+      Last   : constant SAL.Base_Peek_Type := SAL.Base_Peek_Type 
(Action.Token_Count);
+      Tokens : Recover_Token_Array (1 .. Last);
+   begin
+      Compute_Nonterm (Action.Production.LHS, Stack, Tokens, Nonterm, 
Default_Virtual);
+
+      if Action.Check = null then
+         --  Now we can pop the stack.
+         Stack.Pop (SAL.Base_Peek_Type (Action.Token_Count));
+         return (Label => Ok);
+      else
+         return Status : constant Semantic_Checks.Check_Status :=
+           Action.Check (Shared.Lexer, Nonterm, Tokens, Recover_Active => True)
+         do
+            if Status.Label = Ok then
+               Stack.Pop (SAL.Base_Peek_Type (Action.Token_Count));
+            end if;
+         end return;
+      end if;
+   end Reduce_Stack;
+
+   function Parse_One_Item
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Parse_Items       : in out          Parse_Item_Arrays.Vector;
+      Parse_Item_Index  : in              Positive;
+      Shared_Token_Goal : in              Base_Token_Index;
+      Trace_Prefix      : in              String)
+     return Boolean
+   is
+      --  Perform parse actions on Parse_Items (Parse_Item_Index), until one
+      --  fails (return False) or Shared_Token_Goal is shifted (return
+      --  True).
+      --
+      --  We return Boolean, not Check_Status, because Abandon and Continue
+      --  are up to the caller.
+      --
+      --  If any actions have conflicts, append the conflict configs and 
actions to
+      --  Parse_Items.
+
+      use all type Ada.Containers.Count_Type;
+      use all type SAL.Base_Peek_Type;
+      use all type Semantic_Checks.Check_Status_Label;
+
+      Trace      : WisiToken.Trace'Class renames Super.Trace.all;
+      Descriptor : WisiToken.Descriptor renames Super.Trace.Descriptor.all;
+      Table      : Parse_Table renames Shared.Table.all;
+
+      Item   : Parse_Item renames Parse_Items (Parse_Item_Index);
+      Config : Configuration renames Item.Config;
+      Action : Parse_Action_Node_Ptr renames Item.Action;
+
+      Conflict : Parse_Action_Node_Ptr;
+
+      Restore_Terminals_Current : Base_Token_Index;
+      Current_Token             : Base_Token := McKenzie_Recover.Current_Token
+        (Terminals                 => Shared.Terminals.all,
+         Terminals_Current         => Config.Current_Shared_Token,
+         Restore_Terminals_Current => Restore_Terminals_Current,
+         Insert_Delete             => Config.Insert_Delete,
+         Current_Insert_Delete     => Config.Current_Insert_Delete,
+         Prev_Deleted              => Super.Parser_State 
(Parser_Index).Prev_Deleted);
+
+      New_State : Unknown_State_Index;
+      Success   : Boolean := True;
+
+   begin
+      if Trace_McKenzie > Detail then
+         if Trace_McKenzie > Extra then
+            if Config.Current_Insert_Delete /= No_Insert_Delete then
+               Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & ": 
Insert_Delete: " &
+                           Image (Insert_Delete_Arrays.Vector 
(Config.Insert_Delete), Trace.Descriptor.all));
+            end if;
+         end if;
+
+         Base.Put (Trace_Prefix & ": " & Image (Current_Token, Descriptor), 
Super, Shared, Parser_Index, Config);
+         if Shared_Token_Goal /= Invalid_Token_Index then
+            Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & ": 
Shared_Token_Goal :" &
+                        WisiToken.Token_Index'Image (Shared_Token_Goal));
+         end if;
+      end if;
+
+      Item.Parsed := True;
+
+      if Action = null then
+         Action := Action_For (Table, Config.Stack (1).State, 
Current_Token.ID);
+      end if;
+
+      loop
+         Conflict := Action.Next;
+         loop
+            exit when Conflict = null;
+            if Parse_Items.Is_Full then
+               if Trace_McKenzie > Outline then
+                  Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & 
": too many conflicts; abandoning");
+               end if;
+            else
+               declare
+                  New_Config : Configuration := Config;
+               begin
+                  New_Config.Current_Shared_Token := Restore_Terminals_Current;
+
+                  if Trace_McKenzie > Detail then
+                     Put_Line
+                       (Trace, Super.Label (Parser_Index), Trace_Prefix & ":" 
& State_Index'Image
+                          (New_Config.Stack.Peek.State) & ": add conflict " &
+                          Image (Conflict.Item, Descriptor));
+                  end if;
+
+                  Parse_Items.Append ((New_Config, Conflict, Parsed => False, 
Shift_Count => Item.Shift_Count));
+               end;
+            end if;
+            Conflict := Conflict.Next;
+         end loop;
+
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Trace, Super.Label (Parser_Index), Trace_Prefix & ":" & 
State_Index'Image (Config.Stack.Peek.State) &
+                 " :" & WisiToken.Token_Index'Image 
(Config.Current_Shared_Token) &
+                 ":" & Image (Current_Token, Descriptor) &
+                 " : " & Image (Action.Item, Descriptor) &
+                 (if Action.Item.Verb = Reduce
+                  then " via" & Config.Stack (SAL.Peek_Type 
(Action.Item.Token_Count + 1)).State'Image
+                  else ""));
+         end if;
+
+         case Action.Item.Verb is
+         when Shift =>
+            Item.Shift_Count := Item.Shift_Count + 1;
+
+            Config.Stack.Push
+              ((Action.Item.State,
+                Syntax_Trees.Invalid_Node_Index,
+                (Current_Token.ID,
+                 Byte_Region        => Current_Token.Byte_Region,
+                 Min_Terminal_Index =>
+                   (if Config.Current_Insert_Delete = No_Insert_Delete
+                    then Config.Current_Shared_Token
+                    else Invalid_Token_Index),
+                 Name              => Null_Buffer_Region,
+                 Virtual           => Config.Current_Insert_Delete /= 
No_Insert_Delete)));
+
+            Current_Token := Next_Token
+              (Terminals                 => Shared.Terminals.all,
+               Terminals_Current         => Config.Current_Shared_Token,
+               Restore_Terminals_Current => Restore_Terminals_Current,
+               Insert_Delete             => Config.Insert_Delete,
+               Current_Insert_Delete     => Config.Current_Insert_Delete,
+               Prev_Deleted              => Super.Parser_State 
(Parser_Index).Prev_Deleted);
+
+         when Reduce =>
+            declare
+               Nonterm : Recover_Token;
+            begin
+               Config.Check_Status := Reduce_Stack
+                 (Shared, Config.Stack, Action.Item, Nonterm,
+                  Default_Virtual => Config.Current_Insert_Delete /= 
No_Insert_Delete);
+
+               case Config.Check_Status.Label is
+               when Ok =>
+                  New_State := Config.Stack.Peek.State;
+                  New_State := Goto_For (Table, New_State, 
Action.Item.Production.LHS);
+
+                  if New_State = Unknown_State then
+                     --  Most likely from an inappropriate language fix.
+                     if Trace_McKenzie > Outline then
+                        Base.Put (Trace_Prefix & ": Unknown_State: ", Super, 
Shared, Parser_Index, Config);
+                        Put_Line (Trace, Trace_Prefix & ": stack: " & Image 
(Config.Stack, Descriptor));
+                     end if;
+
+                     --  We can't just return False here; user must abandon 
this config.
+                     raise Bad_Config;
+                  end if;
+
+                  Config.Stack.Push ((New_State, 
Syntax_Trees.Invalid_Node_Index, Nonterm));
+
+               when Semantic_Checks.Error =>
+                  Config.Error_Token       := Nonterm;
+                  Config.Check_Token_Count := Action.Item.Token_Count;
+                  Success                  := False;
+               end case;
+            end;
+
+         when Error =>
+
+            Config.Error_Token :=
+              (ID          => Current_Token.ID,
+               Byte_Region => Current_Token.Byte_Region,
+               others      => <>);
+            Success            := False;
+
+         when Accept_It =>
+            null;
+         end case;
+
+         exit when not Success or
+           Action.Item.Verb = Accept_It or
+           (if Shared_Token_Goal = Invalid_Token_Index
+            then Config.Insert_Delete.Length = 0
+            else Config.Current_Shared_Token > Shared_Token_Goal);
+
+         Action := Action_For (Table, Config.Stack (1).State, 
Current_Token.ID);
+      end loop;
+
+      Config.Current_Shared_Token := Restore_Terminals_Current;
+
+      return Success;
+   end Parse_One_Item;
+
+   function Parse
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Parse_Items       :    out          Parse_Item_Arrays.Vector;
+      Config            : in              Configuration;
+      Shared_Token_Goal : in              Base_Token_Index;
+      All_Conflicts     : in              Boolean;
+      Trace_Prefix      : in              String)
+     return Boolean
+   is
+      Trace : WisiToken.Trace'Class renames Super.Trace.all;
+
+      Last_Parsed : Natural;
+      Success     : Boolean;
+   begin
+      Parse_Items.Clear;
+      Parse_Items.Append ((Config, Action => null, Parsed => False, 
Shift_Count => 0));
+
+      --  Clear any errors; so they reflect the parse result.
+      Parse_Items (Parse_Items.First_Index).Config.Error_Token.ID := 
Invalid_Token_ID;
+      Parse_Items (Parse_Items.First_Index).Config.Check_Status   := (Label => 
Semantic_Checks.Ok);
+
+      Last_Parsed := Parse_Items.First_Index;
+      loop
+         --  Loop over initial config and any conflicts.
+         Success := Parse_One_Item
+           (Super, Shared, Parser_Index, Parse_Items, Last_Parsed, 
Shared_Token_Goal, Trace_Prefix);
+
+         exit when Parse_Items.Last_Index = Last_Parsed;
+
+         exit when Success and not All_Conflicts;
+
+         Last_Parsed := Last_Parsed + 1;
+         if Trace_McKenzie > Detail then
+            Put_Line (Trace, Super.Label (Parser_Index), Trace_Prefix & ": 
parse conflict");
+         end if;
+      end loop;
+
+      return Success;
+   end Parse;
+
+end WisiToken.Parse.LR.McKenzie_Recover.Parse;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.ads 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.ads
index 0db7178..e5e4d36 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.ads
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover-parse.ads
@@ -1,77 +1,80 @@
---  Abstract :
---
---  Config parsing subprograms.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Parse.LR.McKenzie_Recover.Base;
-private package WisiToken.Parse.LR.McKenzie_Recover.Parse is
-
-   function Reduce_Stack
-     (Shared          : not null access Base.Shared;
-      Stack           : in out          Recover_Stacks.Stack;
-      Action          : in              Reduce_Action_Rec;
-      Nonterm         :    out          Recover_Token;
-      Default_Virtual : in              Boolean)
-     return Semantic_Checks.Check_Status;
-   --  Reduce Stack according to Action, setting Nonterm. If
-   --  Action.Token_Count = 0, set Nonterm.Virtual := Default_Virtual.
-
-   type Parse_Item is record
-      Config      : Configuration;
-      Action      : Parse_Action_Node_Ptr;
-      Parsed      : Boolean;
-      Shift_Count : Natural := 0;
-
-      --  On return from Parse, if Parsed = False, this item was queued by a
-      --  conflict, but not parsed; it should be ignored.
-      --
-      --  Otherwise, if Config.Error_Token.ID = Invalid_Token_ID and
-      --  Config.Check_Status.Label = Ok, Config was parsed successfully to
-      --  the goal.
-      --
-      --  Otherwise, the parser failed a semantic check, or encountered an
-      --  Error action. Shift_Count gives the number of shifts performed. If
-      --  Check_Status.Label is Error, Action.Item.Verb must be Reduce, and
-      --  Config is in the pre-reduce state.
-   end record;
-
-   package Parse_Item_Arrays is new SAL.Gen_Bounded_Definite_Vectors 
(Positive, Parse_Item, Capacity => 10);
-   --  Parse_Item_Arrays.Capacity sets maximum conflicts in one call to Parse
-
-   function Parse
-     (Super             : not null access Base.Supervisor;
-      Shared            : not null access Base.Shared;
-      Parser_Index      : in              SAL.Peek_Type;
-      Parse_Items       :    out          Parse_Item_Arrays.Vector;
-      Config            : in              Configuration;
-      Shared_Token_Goal : in              Base_Token_Index;
-      All_Conflicts     : in              Boolean;
-      Trace_Prefix      : in              String)
-     return Boolean;
-   --  Attempt to parse Config until Config.Inserted is all shifted, and
-   --  either Shared_Token_Goal = Invalid_Token_Index or
-   --  Shared_Token_Goal is shifted.
-   --
-   --  Parsed configs are in Parse_Items; there is more than one if a
-   --  conflict is encountered. Parse returns True if at least one
-   --  Parse_Item parsed successfully to the goal. In that case, the
-   --  other items are either not parsed or failed. See comment in
-   --  Parse_Item for more detail.
-   --
-   --  Raises Bad_Config if parse encounters Unknown_State.
-
-end WisiToken.Parse.LR.McKenzie_Recover.Parse;
+--  Abstract :
+--
+--  Config parsing subprograms.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with WisiToken.Parse.LR.McKenzie_Recover.Base;
+private package WisiToken.Parse.LR.McKenzie_Recover.Parse is
+
+   function Reduce_Stack
+     (Shared          : not null access Base.Shared;
+      Stack           : in out          Recover_Stacks.Stack;
+      Action          : in              Reduce_Action_Rec;
+      Nonterm         :    out          Recover_Token;
+      Default_Virtual : in              Boolean)
+     return Semantic_Checks.Check_Status;
+   --  Reduce Stack according to Action, setting Nonterm. If
+   --  Action.Token_Count = 0, set Nonterm.Virtual := Default_Virtual.
+
+   type Parse_Item is record
+      Config      : Configuration;
+      Action      : Parse_Action_Node_Ptr;
+      Parsed      : Boolean;
+      Shift_Count : Natural := 0;
+
+      --  On return from Parse, if Parsed = False, this item was queued by a
+      --  conflict, but not parsed; it should be ignored.
+      --
+      --  Otherwise, if Config.Error_Token.ID = Invalid_Token_ID and
+      --  Config.Check_Status.Label = Ok, Config was parsed successfully to
+      --  the goal.
+      --
+      --  Otherwise, the parser failed a semantic check, or encountered an
+      --  Error action. Action gives the last action processed. Shift_Count
+      --  gives the number of shifts performed. If Check_Status.Label is
+      --  Error, Action.Item.Verb must be Reduce, and Config is in the
+      --  pre-reduce state.
+   end record;
+
+   package Parse_Item_Arrays is new SAL.Gen_Bounded_Definite_Vectors 
(Positive, Parse_Item, Capacity => 10);
+   --  Parse_Item_Arrays.Capacity sets maximum conflicts in one call to Parse
+
+   function Parse
+     (Super             : not null access Base.Supervisor;
+      Shared            : not null access Base.Shared;
+      Parser_Index      : in              SAL.Peek_Type;
+      Parse_Items       :    out          Parse_Item_Arrays.Vector;
+      Config            : in              Configuration;
+      Shared_Token_Goal : in              Base_Token_Index;
+      All_Conflicts     : in              Boolean;
+      Trace_Prefix      : in              String)
+     return Boolean;
+   --  Attempt to parse Config and any conflict configs. If not
+   --  All_Conflicts, return when Config.Insert_Delete is all processed,
+   --  and either Shared_Token_Goal = Invalid_Token_Index or
+   --  Shared_Token_Goal is shifted. If All_Conflicts, return when all
+   --  conflict configs have been parsed.
+   --
+   --  Parsed configs are in Parse_Items; there is more than one if a
+   --  conflict is encountered. Parse returns True if at least one
+   --  Parse_Item parsed successfully to the goal. In that case, the
+   --  other items are either not parsed or failed. See comment in
+   --  Parse_Item for more detail.
+   --
+   --  Raises Bad_Config if parse encounters Unknown_State.
+
+end WisiToken.Parse.LR.McKenzie_Recover.Parse;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover.adb 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover.adb
index 31c6285..49c2106 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover.adb
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover.adb
@@ -1,1137 +1,1252 @@
---  Abstract :
---
---  See spec
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
---
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Characters.Handling;
-with Ada.Exceptions;
-with Ada.Task_Identification;
-with Ada.Unchecked_Deallocation;
-with GNAT.Traceback.Symbolic;
-with System.Multiprocessors;
-with WisiToken.Parse.LR.McKenzie_Recover.Base;
-with WisiToken.Parse.LR.McKenzie_Recover.Explore;
-with WisiToken.Parse.LR.Parser_Lists;
-package body WisiToken.Parse.LR.McKenzie_Recover is
-   use all type System.Multiprocessors.CPU_Range;
-
-   type Supervisor_Access is access all Base.Supervisor;
-   type Shared_Access is access all Base.Shared;
-
-   task type Worker_Task is
-      entry Start
-        (Super  : in Supervisor_Access;
-         Shared : in Shared_Access);
-      --  Start getting parser/configs to check from Config_Store. Stop when
-      --  Super reports All_Done;
-
-      entry Done;
-      --  Available after Super has reported All_Done.
-   end Worker_Task;
-
-   type Worker_Access is access Worker_Task;
-   procedure Free is new Ada.Unchecked_Deallocation (Worker_Task, 
Worker_Access);
-
-   task body Worker_Task
-   is
-      use all type Base.Config_Status;
-      Super  : Supervisor_Access;
-      Shared : Shared_Access;
-
-      Status : Base.Config_Status := Valid;
-   begin
-      loop
-         select
-            accept Start
-              (Super  : in Supervisor_Access;
-               Shared : in Shared_Access)
-
-            do
-               Worker_Task.Super  := Super;
-               Worker_Task.Shared := Shared;
-            end Start;
-         or
-            terminate;
-         end select;
-
-         loop
-            Explore.Process_One (Super, Shared, Status);
-            exit when Status = All_Done;
-         end loop;
-
-         accept Done;
-
-         Super  := null;
-         Shared := null;
-      end loop;
-
-   exception
-   when E : others =>
-      Super.Fatal (E);
-      if Debug_Mode then
-         Shared.Trace.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback 
(E));
-      end if;
-   end Worker_Task;
-
-   Worker_Tasks : array (1 .. System.Multiprocessors.CPU_Range'Max (1, 
System.Multiprocessors.Number_Of_CPUs - 1)) of
-     Worker_Access;
-   --  Declaring an array of tasks directly causes a circular elaboration
-   --  problem, and would mean a task that terminates due to an exception
-   --  is never restarted.
-
-   function To_Recover
-     (Parser_Stack : in Parser_Lists.Parser_Stacks.Stack;
-      Tree         : in Syntax_Trees.Tree)
-     return Recover_Stacks.Stack
-   is
-      use all type SAL.Base_Peek_Type;
-      Result : Recover_Stacks.Stack;
-      Depth  : constant SAL.Peek_Type := Parser_Stack.Depth;
-   begin
-      Result.Set_Depth (Depth);
-      for I in 1 .. Depth loop
-         declare
-            Item  : Parser_Lists.Parser_Stack_Item renames Parser_Stack (I);
-            Token : constant Recover_Token := (if I = Depth then (others => 
<>) else Tree.Recover_Token (Item.Token));
-         begin
-            Result.Set (I, Depth, (Item.State, Item.Token, Token));
-         end;
-      end loop;
-      return Result;
-   end To_Recover;
-
-   procedure Recover_Init
-     (Shared_Parser : in out LR.Parser.Parser;
-      Parser_State  : in out Parser_Lists.Parser_State)
-   is
-      use all type WisiToken.Parse.LR.Parser.Language_Fixes_Access;
-
-      Trace  : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-      Config : constant Configuration_Access := 
Parser_State.Recover.Config_Heap.Add (Configuration'(others => <>));
-      Error  : Parse_Error renames Parser_State.Errors 
(Parser_State.Errors.Last);
-   begin
-      Parser_State.Recover.Enqueue_Count := Parser_State.Recover.Enqueue_Count 
+ 1;
-
-      Config.Resume_Token_Goal := Parser_State.Shared_Token + 
Shared_Parser.Table.McKenzie_Param.Check_Limit;
-
-      if Trace_McKenzie > Outline then
-         Trace.New_Line;
-         Trace.Put_Line
-           ("parser" & Integer'Image (Parser_State.Label) &
-              ": State" & State_Index'Image (Parser_State.Stack (1).State) &
-              " Current_Token" & Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) &
-              " Resume_Token_Goal" & Token_Index'Image 
(Config.Resume_Token_Goal));
-         Trace.Put_Line (Image (Error, Parser_State.Tree, 
Trace.Descriptor.all));
-         if Trace_McKenzie > Extra then
-            Put_Line
-              (Trace, Parser_State.Label, Parser_Lists.Image
-                 (Parser_State.Stack, Trace.Descriptor.all, 
Parser_State.Tree));
-         end if;
-      end if;
-
-      --  Additional initialization of Parser_State.Recover is done in
-      --  Supervisor.Initialize.
-
-      Config.Stack := To_Recover (Parser_State.Stack, Parser_State.Tree);
-
-      --  Parser_State.Recover_Insert_Delete must be empty (else we would not 
get
-      --  here). Therefore Parser_State current token is in
-      --  Shared_Parser.Shared_Token.
-
-      Config.Current_Shared_Token := Parser_State.Shared_Token;
-
-      case Error.Label is
-      when Action =>
-         Config.Error_Token := Parser_State.Tree.Recover_Token 
(Error.Error_Token);
-         if Trace_McKenzie > Detail then
-            Put ("enqueue", Trace, Parser_State.Label, 
Shared_Parser.Terminals, Config.all,
-                 Task_ID => False);
-         end if;
-
-      when Check =>
-         if Shared_Parser.Language_Fixes = null then
-            --  The only fix is to ignore the error.
-            if Trace_McKenzie > Detail then
-               Put ("enqueue", Trace, Parser_State.Label, 
Shared_Parser.Terminals, Config.all,
-                    Task_ID => False);
-            end if;
-
-         else
-            --  Undo the reduction that encountered the error, let Process_One
-            --  enqueue possible solutions. We leave the cost at 0, since this 
is
-            --  the root config. Later logic will enqueue the 'ignore error'
-            --  solution; see McKenzie_Recover.Explore Process_One.
-
-            Config.Check_Status      := Error.Check_Status;
-            Config.Error_Token       := Config.Stack (1).Token;
-            Config.Check_Token_Count := Undo_Reduce (Config.Stack, 
Parser_State.Tree);
-
-            Config.Ops.Append ((Undo_Reduce, Config.Error_Token.ID, 
Config.Check_Token_Count));
-
-            if Trace_McKenzie > Detail then
-               Put ("undo_reduce " & Image
-                      (Config.Error_Token.ID, Trace.Descriptor.all), Trace, 
Parser_State.Label,
-                    Shared_Parser.Terminals, Config.all, Task_ID => False);
-            end if;
-         end if;
-
-      when Message =>
-         --  Last error entry should be the failure that caused us to enter
-         --  recovery.
-         raise SAL.Programmer_Error;
-      end case;
-   end Recover_Init;
-
-   function Recover (Shared_Parser : in out LR.Parser.Parser) return 
Recover_Status
-   is
-      use all type Parser.Post_Recover_Access;
-      use all type SAL.Base_Peek_Type;
-      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-
-      Parsers : Parser_Lists.List renames Shared_Parser.Parsers;
-
-      Current_Parser : Parser_Lists.Cursor;
-
-      Super : aliased Base.Supervisor
-        (Trace'Access,
-         Cost_Limit        => Shared_Parser.Table.McKenzie_Param.Cost_Limit,
-         Check_Delta_Limit => 
Shared_Parser.Table.McKenzie_Param.Check_Delta_Limit,
-         Enqueue_Limit     => Shared_Parser.Table.McKenzie_Param.Enqueue_Limit,
-         Parser_Count      => Parsers.Count);
-
-      Shared : aliased Base.Shared
-        (Shared_Parser.Trace,
-         Shared_Parser.Lexer.all'Access,
-         Shared_Parser.Table,
-         Shared_Parser.Language_Fixes,
-         Shared_Parser.Language_Use_Minimal_Complete_Actions,
-         Shared_Parser.Language_String_ID_Set,
-         Shared_Parser.Terminals'Access,
-         Shared_Parser.Line_Begin_Token'Access);
-
-      Task_Count : constant System.Multiprocessors.CPU_Range :=
-        (if Shared_Parser.Table.McKenzie_Param.Task_Count = 0
-         then Worker_Tasks'Last
-         --  Keep one CPU free for this main task, and the user.
-         else Shared_Parser.Table.McKenzie_Param.Task_Count);
-
-   begin
-      if Trace_McKenzie > Outline then
-         Trace.New_Line;
-         Trace.Put_Line (" McKenzie error recovery");
-      end if;
-
-      Super.Initialize (Parsers'Unrestricted_Access, 
Shared_Parser.Terminals'Unrestricted_Access);
-
-      for Parser_State of Parsers loop
-         Recover_Init (Shared_Parser, Parser_State);
-      end loop;
-
-      if Trace_McKenzie > Outline then
-         Trace.New_Line;
-         Trace.Put_Line (System.Multiprocessors.CPU_Range'Image 
(Worker_Tasks'Last) & " parallel tasks");
-      end if;
-
-      for I in Worker_Tasks'First .. Task_Count loop
-         if Worker_Tasks (I) = null then
-            Worker_Tasks (I) := new Worker_Task;
-            if Debug_Mode then
-               Trace.Put_Line ("new Worker_Task" & 
System.Multiprocessors.CPU_Range'Image (I));
-            end if;
-
-         elsif Worker_Tasks (I)'Terminated then
-            Free (Worker_Tasks (I));
-            Worker_Tasks (I) := new Worker_Task;
-            if Debug_Mode then
-               Trace.Put_Line ("recreated Worker_Task" & 
System.Multiprocessors.CPU_Range'Image (I));
-            end if;
-         end if;
-
-         Worker_Tasks (I).Start (Super'Unchecked_Access, 
Shared'Unchecked_Access);
-      end loop;
-
-      declare
-         use Ada.Exceptions;
-         ID      : Exception_Id;
-         Message : Ada.Strings.Unbounded.Unbounded_String;
-      begin
-         Super.Done (ID, Message); -- Wait for all parsers to fail or succeed
-
-         --  Ensure all worker tasks stop getting configs before proceeding;
-         --  otherwise local variables disappear while the task is still trying
-         --  to access them.
-         for I in Worker_Tasks'First .. Task_Count loop
-            if not Worker_Tasks (I)'Terminated then
-               Worker_Tasks (I).Done;
-            end if;
-         end loop;
-
-         if ID /= Null_Id then
-            Raise_Exception (ID, -Message);
-         end if;
-      end;
-
-      --  Adjust parser state for each successful recovery.
-      --
-      --  One option here would be to keep only the parser with the least
-      --  cost fix. However, the normal reason for having multiple parsers
-      --  is to resolve a grammar ambiguity; the least cost fix might
-      --  resolve the ambiguity the wrong way. As could any other fix, of
-      --  course.
-
-      --  Spawn new parsers for multiple solutions
-      declare
-         use Parser_Lists;
-         Cur         : Cursor             := Parsers.First;
-         Solutions   : SAL.Base_Peek_Type := 0;
-         Spawn_Limit : SAL.Base_Peek_Type := Shared_Parser.Max_Parallel; -- 
per parser
-      begin
-         for Parser of Parsers loop
-            if Parser.Recover.Success then
-               Solutions := Solutions + Parser.Recover.Results.Count;
-            end if;
-         end loop;
-
-         if Solutions > Shared_Parser.Max_Parallel and Trace_McKenzie > 
Outline then
-            Trace.Put_Line ("too many parallel parsers required in recover; 
dropping some solutions");
-            Spawn_Limit := Shared_Parser.Max_Parallel / Parsers.Count;
-         end if;
-
-         loop
-            declare
-               Data : McKenzie_Data renames State_Ref (Cur).Recover;
-            begin
-               if Data.Success then
-                  if Trace_McKenzie > Outline then
-                     Trace.Put_Line
-                       (Integer'Image (Label (Cur)) &
-                          ": succeed" & SAL.Base_Peek_Type'Image 
(Data.Results.Count) &
-                          ", enqueue" & Integer'Image (Data.Enqueue_Count) &
-                          ", check " & Integer'Image (Data.Check_Count) &
-                          ", cost: " & Integer'Image (Data.Results.Min_Key));
-                  end if;
-
-                  if Data.Results.Count > 1 then
-                     for I in 1 .. SAL.Base_Peek_Type'Min (Spawn_Limit, 
Data.Results.Count - 1) loop
-                        Parsers.Prepend_Copy (Cur); --  does not copy recover
-                        if Trace_McKenzie > Outline or Trace_Parse > Outline 
then
-                           Trace.Put_Line
-                             ("spawn parser" & Integer'Image 
(Parsers.First.Label) & " from " &
-                                Trimmed_Image (Cur.Label) & " (" & 
Trimmed_Image (Integer (Parsers.Count)) &
-                                " active)");
-                           Put ("", Trace, Parsers.First.Label, 
Shared_Parser.Terminals,
-                                Data.Results.Peek, Task_ID => False);
-                        end if;
-
-                        State_Ref (Parsers.First).Recover.Results.Add 
(Data.Results.Remove);
-                        State_Ref (Parsers.First).Recover.Success := True;
-                     end loop;
-                  end if;
-
-                  if Trace_McKenzie > Outline or Trace_Parse > Outline then
-                     Put ("", Trace, Cur.State_Ref.Label, 
Shared_Parser.Terminals, Data.Results.Peek,
-                          Task_ID => False);
-                  end if;
-               else
-                  if Trace_McKenzie > Outline then
-                     Trace.Put_Line
-                       (Integer'Image (Cur.Label) &
-                          ": fail, enqueue" & Integer'Image 
(Data.Enqueue_Count) &
-                          ", check " & Integer'Image (Data.Check_Count) &
-                          ", cost_limit: " & Integer'Image 
(Shared_Parser.Table.McKenzie_Param.Cost_Limit) &
-                          ", max shared_token " & Token_Index'Image 
(Shared_Parser.Terminals.Last_Index));
-                  end if;
-               end if;
-
-            end;
-            Next (Cur);
-            exit when Is_Done (Cur);
-         end loop;
-      end;
-
-      --  Edit Parser_State to apply solutions.
-
-      --  We don't use 'for Parser_State of Parsers loop' here,
-      --  because we might need to terminate a parser.
-      Current_Parser := Parsers.First;
-      loop
-         exit when Current_Parser.Is_Done;
-
-         if Current_Parser.State_Ref.Recover.Success then
-            begin
-               --  Can't have active 'renames State_Ref' when terminate a 
parser
-               declare
-                  use all type Syntax_Trees.Node_Index;
-                  use Parser_Lists;
-
-                  Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-
-                  Descriptor : WisiToken.Descriptor renames 
Shared_Parser.Trace.Descriptor.all;
-                  Tree       : Syntax_Trees.Tree renames Parser_State.Tree;
-                  Data       : McKenzie_Data renames Parser_State.Recover;
-                  Result     : Configuration renames Data.Results.Peek;
-
-                  Min_Op_Token_Index        : WisiToken.Token_Index := 
WisiToken.Token_Index'Last;
-                  Min_Push_Back_Token_Index : WisiToken.Token_Index := 
WisiToken.Token_Index'Last;
-
-                  Stack_Matches_Ops     : Boolean := True;
-                  Shared_Token_Changed  : Boolean := False;
-                  Current_Token_Virtual : Boolean := False;
-
-                  Sorted_Insert_Delete : Sorted_Insert_Delete_Arrays.Vector;
-
-                  procedure Apply_Prev_Token
-                  is begin
-                     loop
-                        exit when not Parser_State.Prev_Deleted.Contains 
(Parser_State.Shared_Token);
-                        Parser_State.Shared_Token := Parser_State.Shared_Token 
+ 1;
-                     end loop;
-                  end Apply_Prev_Token;
-
-               begin
-                  --  The verb will be reset by the main parser; just indicate 
the
-                  --  parser recovered from the error.
-                  Parser_State.Set_Verb (Shift);
-
-                  Parser_State.Errors (Parser_State.Errors.Last).Recover := 
Result;
-
-                  Parser_State.Resume_Token_Goal := Result.Resume_Token_Goal;
-
-                  if Trace_McKenzie > Extra then
-                     Put_Line (Trace, Parser_State.Label, "before Ops 
applied:", Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "stack " & Image 
(Parser_State.Stack, Descriptor, Tree),
-                        Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "Shared_Token  " & Image
-                          (Parser_State.Shared_Token, Shared_Parser.Terminals, 
Descriptor),
-                        Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "Current_Token " & 
Parser_State.Tree.Image
-                          (Parser_State.Current_Token, Descriptor),
-                        Task_ID => False);
-                  end if;
-
-                  --  We don't apply all Ops to the parser stack here, because 
that
-                  --  requires updating the syntax tree as well, and we want 
to let the
-                  --  main parser do that, partly as a double check on the 
algorithms
-                  --  here.
-                  --
-                  --  However, the main parser can only apply Insert and 
Delete ops; we
-                  --  must apply Push_Back and Undo_Reduce here. Note that 
Fast_Forward
-                  --  ops are just for bookkeeping.
-                  --
-                  --  In order to apply Undo_Reduce, we also need to apply any 
preceding
-                  --  ops. See test_mckenzie_recover.adb Missing_Name_2 for an 
example
-                  --  of multiple Undo_Reduce. On the other hand, Push_Back 
can be
-                  --  applied without the preceding ops.
-                  --
-                  --  A Push_Back can go back past preceding ops, including 
Undo_Reduce;
-                  --  there's no point in applying ops that are later 
superceded by such
-                  --  a Push_Back. See test_mckenzie_recover.adb 
Out_Of_Order_Ops for an
-                  --  example.
-                  --
-                  --  Push_Back can also go back past a previous error 
recovery; we must
-                  --  apply Parser_State.Prev_Deleted here as well, when 
computing
-                  --  Shared_Token.
-                  --
-                  --  So first we go thru Ops to find the earliest Push_Back. 
Then we
-                  --  apply ops that are before that point, up to the first 
Insert or
-                  --  Fast_Forward. After that, we enqueue Insert and Delete 
ops on
-                  --  Parser_State.Recover_Insert_Delete, in token_index 
order, and any
-                  --  Undo_Reduce are rejected.
-                  --
-                  --  Then the main parser parses the edited input stream.
-                  --
-                  --  There's no need to modify Parser_State.Tree. Any tree 
nodes
-                  --  created by the failed parse that are pushed back are 
useful for
-                  --  error repair, and will just be ignored in future 
parsing. This
-                  --  also avoids enlarging a non-flushed branched tree, which 
saves
-                  --  time and space.
-
-                  for Op of Result.Ops loop
-                     case Op.Op is
-                     when Fast_Forward =>
-                        if Op.FF_Token_Index < Min_Op_Token_Index then
-                           Min_Op_Token_Index := Op.FF_Token_Index;
-                        end if;
-
-                     when Undo_Reduce =>
-                        null;
-
-                     when Push_Back | Insert | Delete =>
-                        if Op.Token_Index /= Invalid_Token_Index then
-                           if Op.Token_Index < Min_Op_Token_Index then
-                              Min_Op_Token_Index := Op.Token_Index;
-                           end if;
-                           if Op.Token_Index < Min_Push_Back_Token_Index then
-                              Min_Push_Back_Token_Index := Op.Token_Index;
-                           end if;
-                        end if;
-
-                     end case;
-                  end loop;
-
-                  for Op of Result.Ops loop
-                     case Op.Op is
-                     when Fast_Forward =>
-                        Stack_Matches_Ops := False;
-
-                     when Undo_Reduce =>
-                        if not Stack_Matches_Ops then
-                           if Trace_McKenzie > Outline then
-                              Put_Line
-                                (Trace, Parser_State.Label, "Undo_Reduce after 
insert or fast_forward",
-                                 Task_ID => False);
-                           end if;
-                           raise Bad_Config;
-                        end if;
-
-                        declare
-                           Item : constant Parser_Lists.Parser_Stack_Item := 
Parser_State.Stack.Pop;
-                        begin
-                           case Tree.Label (Item.Token) is
-                           when Syntax_Trees.Shared_Terminal | 
Syntax_Trees.Virtual_Terminal =>
-                              raise Bad_Config;
-
-                           when Syntax_Trees.Nonterm =>
-                              for C of Tree.Children (Item.Token) loop
-                                 Parser_State.Stack.Push ((Tree.State (C), C));
-                              end loop;
-                           end case;
-                        end;
-
-                     when Push_Back =>
-                        if Stack_Matches_Ops then
-                           Parser_State.Stack.Pop;
-                           if Op.Token_Index /= Invalid_Token_Index then
-                              Parser_State.Shared_Token := Op.Token_Index;
-                              Shared_Token_Changed      := True;
-                           end if;
-
-                        elsif Op.Token_Index = Min_Op_Token_Index then
-                           loop
-                              --  Multiple push_backs can have the same 
Op.Token_Index, so we may
-                              --  already be at the target.
-                              exit when Parser_State.Shared_Token <= 
Op.Token_Index and
-                                Tree.Min_Terminal_Index (Parser_State.Stack 
(1).Token) /= Invalid_Token_Index;
-                              --  also push back empty tokens.
-
-                              declare
-                                 Item : constant 
Parser_Lists.Parser_Stack_Item := Parser_State.Stack.Pop;
-
-                                 Min_Index : constant Base_Token_Index :=
-                                   Parser_State.Tree.Min_Terminal_Index 
(Item.Token);
-                              begin
-                                 if Min_Index /= Invalid_Token_Index then
-                                    Shared_Token_Changed := True;
-                                    Parser_State.Shared_Token := Min_Index;
-                                 end if;
-                              end;
-                           end loop;
-                           pragma Assert (Parser_State.Shared_Token = 
Op.Token_Index);
-                        end if;
-
-                     when Insert =>
-                        if Stack_Matches_Ops and Op.Token_Index = 
Parser_State.Shared_Token then
-                           --  This is the first Insert. Even if a later 
Push_Back supercedes it,
-                           --  we record Stack_Matches_Ops false here.
-                           Stack_Matches_Ops := False;
-
-                           if Op.Token_Index <= Min_Push_Back_Token_Index then
-                              Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal (Op.ID);
-                              Current_Token_Virtual      := True;
-                           else
-                              Sorted_Insert_Delete.Insert (Op);
-                           end if;
-                        else
-                           Sorted_Insert_Delete.Insert (Op);
-                        end if;
-
-                     when Delete =>
-                        if Stack_Matches_Ops and Op.Token_Index = 
Parser_State.Shared_Token then
-                           --  We can apply multiple deletes.
-                           Parser_State.Shared_Token := Op.Token_Index + 1;
-                           Apply_Prev_Token;
-                           Shared_Token_Changed      := True;
-                        else
-                           Sorted_Insert_Delete.Insert (Op);
-                        end if;
-                     end case;
-                  end loop;
-
-                  --  We may not have processed the current Insert or Delete 
above, if
-                  --  they are after a fast_forward.
-                  for Op of Sorted_Insert_Delete loop
-                     if Op.Token_Index = Parser_State.Shared_Token and not 
Current_Token_Virtual then
-                        case Insert_Delete_Op_Label'(Op.Op) is
-                        when Insert =>
-                           Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal (Op.ID);
-                           Current_Token_Virtual      := True;
-
-                        when Delete =>
-                           Parser_State.Shared_Token := Op.Token_Index + 1;
-                           Apply_Prev_Token;
-                           Shared_Token_Changed      := True;
-                        end case;
-                     else
-                        Parser_State.Recover_Insert_Delete.Put (Op);
-                     end if;
-                  end loop;
-
-                  --  If not Shared_Token_Changed, Shared_Token is the error 
token,
-                  --  which is the next token to read. If 
Shared_Token_Changed, we have
-                  --  set Shared_Token consistent with that; it is the next 
token to
-                  --  read. If Current_Token_Virtual, then after all the 
virtual tokens
-                  --  are inserted, the main parser would normally increment
-                  --  Parser_State.Shared_Token to get the next token, but we 
don't want
-                  --  that now. We could set Shared_Token to 1 less, but this 
way the
-                  --  debug messages all show the expected Shared_Terminal.
-
-                  Parser_State.Inc_Shared_Token := not Current_Token_Virtual;
-
-                  --  The main parser always sets Current_Token to be the 
syntax tree
-                  --  node containing Shared_Token; ensure that is true here 
(virtual
-                  --  tokens where handled above).
-
-                  if (not Current_Token_Virtual) and Shared_Token_Changed then
-                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
-                       (Parser_State.Shared_Token, Shared_Parser.Terminals);
-                  end if;
-
-                  if Trace_McKenzie > Extra then
-                     Put_Line (Trace, Parser_State.Label, "after Ops 
applied:", Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "stack " & 
Parser_Lists.Image
-                          (Parser_State.Stack, Descriptor, Tree),
-                        Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "Shared_Token  " & Image
-                          (Parser_State.Shared_Token, Shared_Parser.Terminals, 
Descriptor), Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "Current_Token " & 
Parser_State.Tree.Image
-                          (Parser_State.Current_Token, Descriptor), Task_ID => 
False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "recover_insert_delete " & 
Image
-                          (Parser_State.Recover_Insert_Delete, Descriptor), 
Task_ID => False);
-                     Put_Line
-                       (Trace, Parser_State.Label, "inc_shared_token " & 
Boolean'Image (Parser_State.Inc_Shared_Token) &
-                          " parser verb " & All_Parse_Action_Verbs'Image 
(Parser_State.Verb),
-                        Task_ID => False);
-                  end if;
-               end;
-            exception
-            when Bad_Config =>
-               if Parsers.Count = 1 then
-                  --  Oops. just give up
-                  return Fail_Programmer_Error;
-               end if;
-               Parsers.Terminate_Parser (Current_Parser, "bad config in 
recover", Trace, Shared_Parser.Terminals);
-            end;
-         end if;
-         Current_Parser.Next;
-      end loop;
-
-      if Shared_Parser.Post_Recover /= null then
-         Shared_Parser.Post_Recover.all;
-      end if;
-
-      return Super.Recover_Result;
-
-   exception
-   when others =>
-      return Fail_Programmer_Error;
-   end Recover;
-
-   ----------
-   --  Spec private subprograms; for language-specific
-   --  child packages.
-
-   procedure Check (ID : Token_ID; Expected_ID : in Token_ID)
-   is begin
-      pragma Assert (ID = Expected_ID, Token_ID'Image (ID) & " /=" & 
Token_ID'Image (Expected_ID));
-   end Check;
-
-   function Current_Token
-     (Terminals                 : in     Base_Token_Arrays.Vector;
-      Terminals_Current         : in out WisiToken.Base_Token_Index;
-      Restore_Terminals_Current :    out WisiToken.Base_Token_Index;
-      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
-      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
-     return Base_Token
-   is
-      use all type SAL.Base_Peek_Type;
-
-      procedure Inc_I_D
-      is begin
-         Current_Insert_Delete := Current_Insert_Delete + 1;
-         if Current_Insert_Delete > Insert_Delete.Last_Index then
-            Current_Insert_Delete := No_Insert_Delete;
-            Insert_Delete.Clear;
-         end if;
-      end Inc_I_D;
-
-   begin
-      if Terminals_Current = Invalid_Token_Index then
-         --  Happens with really bad syntax; see test_mckenzie_recover.adb 
Error_4.
-         raise Bad_Config;
-      end if;
-
-      loop
-         if Current_Insert_Delete = No_Insert_Delete then
-            Restore_Terminals_Current := Terminals_Current;
-            return Terminals (Terminals_Current);
-
-         elsif Insert_Delete (Current_Insert_Delete).Token_Index = 
Terminals_Current then
-            declare
-               Op : Insert_Delete_Op renames Insert_Delete 
(Current_Insert_Delete);
-            begin
-               case Insert_Delete_Op_Label (Op.Op) is
-               when Insert =>
-                  --  Decrement Terminals_Current so Next_Token knows it 
should always
-                  --  increment it. Save the initial value, to restore in case 
of error.
-                  Restore_Terminals_Current := Terminals_Current;
-                  Terminals_Current         := Terminals_Current - 1;
-                  return (ID => Op.ID, others => <>);
-
-               when Delete =>
-                  Terminals_Current    := Terminals_Current + 1;
-                  loop
-                     exit when not Prev_Deleted.Contains (Terminals_Current);
-                     Terminals_Current := Terminals_Current + 1;
-                  end loop;
-                  Restore_Terminals_Current := Terminals_Current;
-                  Inc_I_D;
-               end case;
-            end;
-         else
-            return Terminals (Terminals_Current);
-         end if;
-      end loop;
-   end Current_Token;
-
-   procedure Current_Token_ID_Peek_2
-     (Terminals             : in     Base_Token_Arrays.Vector;
-      Terminals_Current     : in     Base_Token_Index;
-      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete : in     SAL.Base_Peek_Type;
-      Prev_Deleted          : in     Recover_Token_Index_Arrays.Vector;
-      Current_Token         :    out Token_ID;
-      Next_Token            :    out Token_ID)
-   is
-      use all type SAL.Base_Peek_Type;
-      Terminals_Next : Token_Index := Terminals_Current + 1;
-   begin
-      if Terminals_Current = Base_Token_Index'First then
-         --  Happens with really bad syntax; see test_mckenzie_recover.adb 
Error_4.
-         raise Bad_Config;
-      end if;
-
-      loop
-         exit when not Prev_Deleted.Contains (Terminals_Next);
-         Terminals_Next := Terminals_Next + 1;
-      end loop;
-      if Terminals_Next <= Terminals.Last_Index then
-         Next_Token := Terminals (Terminals_Next).ID;
-      else
-         Next_Token := Invalid_Token_ID;
-      end if;
-
-      if Current_Insert_Delete = No_Insert_Delete then
-         Current_Token := Terminals (Terminals_Current).ID;
-
-      elsif Insert_Delete (Current_Insert_Delete).Token_Index = 
Terminals_Current then
-         declare
-            Op : Insert_Delete_Op renames Insert_Delete 
(Current_Insert_Delete);
-         begin
-            case Insert_Delete_Op_Label (Op.Op) is
-            when Insert =>
-               Current_Token := Op.ID;
-
-            when Delete =>
-               --  This should have been handled in Check
-               raise SAL.Programmer_Error;
-            end case;
-         end;
-      else
-         Current_Token := Terminals (Terminals_Current).ID;
-      end if;
-
-      if Current_Insert_Delete = Insert_Delete.Last_Index then
-         null;
-
-      elsif Insert_Delete (Current_Insert_Delete + 1).Token_Index = 
Terminals_Current then
-         declare
-            Op : Insert_Delete_Op renames Insert_Delete (Current_Insert_Delete 
+ 1);
-         begin
-            case Insert_Delete_Op_Label (Op.Op) is
-            when Insert =>
-               Next_Token := Op.ID;
-
-            when Delete =>
-               --  This should have been handled in Check
-               raise SAL.Programmer_Error;
-            end case;
-         end;
-      end if;
-   end Current_Token_ID_Peek_2;
-
-   procedure Delete (Config : in out Configuration; ID : in Token_ID)
-   is
-      Op : constant Config_Op := (Delete, ID, Config.Current_Shared_Token);
-   begin
-      Config.Ops.Append (Op);
-      Config.Insert_Delete.Insert (Op);
-      Config.Current_Insert_Delete := 1;
-   exception
-   when SAL.Container_Full =>
-      raise Bad_Config;
-   end Delete;
-
-   procedure Find_ID
-     (Config         : in     Configuration;
-      ID             : in     Token_ID;
-      Matching_Index : in out SAL.Peek_Type)
-   is
-      use all type SAL.Peek_Type;
-   begin
-      loop
-         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
-         declare
-            Stack_ID : Token_ID renames Config.Stack (Matching_Index).Token.ID;
-         begin
-            exit when Stack_ID = ID;
-         end;
-         Matching_Index := Matching_Index + 1;
-      end loop;
-   end Find_ID;
-
-   procedure Find_ID
-     (Config         : in     Configuration;
-      IDs            : in     Token_ID_Set;
-      Matching_Index : in out SAL.Peek_Type)
-   is
-      use all type SAL.Peek_Type;
-   begin
-      loop
-         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
-         declare
-            ID : Token_ID renames Config.Stack (Matching_Index).Token.ID;
-         begin
-            exit when ID in IDs'First .. IDs'Last and then IDs (ID);
-         end;
-         Matching_Index := Matching_Index + 1;
-      end loop;
-   end Find_ID;
-
-   procedure Find_Descendant_ID
-     (Tree           : in     Syntax_Trees.Tree;
-      Config         : in     Configuration;
-      ID             : in     Token_ID;
-      ID_Set         : in     Token_ID_Set;
-      Matching_Index : in out SAL.Peek_Type)
-   is
-      use Syntax_Trees;
-      use all type SAL.Peek_Type;
-   begin
-      loop
-         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
-         exit when Config.Stack (Matching_Index).Token.ID in ID_Set'Range and 
then
-           (ID_Set (Config.Stack (Matching_Index).Token.ID) and
-              (Config.Stack (Matching_Index).Tree_Index /= Invalid_Node_Index 
and then
-                 Tree.Find_Descendant (Config.Stack 
(Matching_Index).Tree_Index, ID) /= Invalid_Node_Index));
-
-         Matching_Index := Matching_Index + 1;
-      end loop;
-   end Find_Descendant_ID;
-
-   procedure Find_Matching_Name
-     (Config              : in     Configuration;
-      Lexer               : access constant WisiToken.Lexer.Instance'Class;
-      Name                : in     String;
-      Matching_Name_Index : in out SAL.Peek_Type;
-      Case_Insensitive    : in     Boolean)
-   is
-      use Ada.Characters.Handling;
-      use all type SAL.Peek_Type;
-      Match_Name : constant String := (if Case_Insensitive then To_Lower 
(Name) else Name);
-   begin
-      loop
-         exit when Matching_Name_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
-         declare
-            Token       : Recover_Token renames Config.Stack 
(Matching_Name_Index).Token;
-            Name_Region : constant Buffer_Region :=
-              (if Token.Name = Null_Buffer_Region
-               then Token.Byte_Region
-               else Token.Name);
-         begin
-            exit when Name_Region /= Null_Buffer_Region and then
-              Match_Name =
-              (if Case_Insensitive
-               then To_Lower (Lexer.Buffer_Text (Name_Region))
-               else Lexer.Buffer_Text (Name_Region));
-
-            Matching_Name_Index := Matching_Name_Index + 1;
-         end;
-      end loop;
-   end Find_Matching_Name;
-
-   procedure Find_Matching_Name
-     (Config              : in     Configuration;
-      Lexer               : access constant WisiToken.Lexer.Instance'Class;
-      Name                : in     String;
-      Matching_Name_Index : in out SAL.Peek_Type;
-      Other_ID            : in     Token_ID;
-      Other_Count         :    out Integer;
-      Case_Insensitive    : in     Boolean)
-   is
-      use Ada.Characters.Handling;
-      use all type SAL.Peek_Type;
-      Match_Name : constant String := (if Case_Insensitive then To_Lower 
(Name) else Name);
-   begin
-      Other_Count := 0;
-
-      loop
-         exit when Matching_Name_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
-         declare
-            Token       : Recover_Token renames Config.Stack 
(Matching_Name_Index).Token;
-            Name_Region : constant Buffer_Region :=
-              (if Token.Name = Null_Buffer_Region
-               then Token.Byte_Region
-               else Token.Name);
-         begin
-            exit when Name_Region /= Null_Buffer_Region and then
-              Match_Name =
-              (if Case_Insensitive
-               then To_Lower (Lexer.Buffer_Text (Name_Region))
-               else Lexer.Buffer_Text (Name_Region));
-
-            if Other_ID = Token.ID then
-               Other_Count := Other_Count + 1;
-            end if;
-
-            Matching_Name_Index := Matching_Name_Index + 1;
-         end;
-      end loop;
-   end Find_Matching_Name;
-
-   procedure Insert (Config : in out Configuration; ID : in Token_ID)
-   is
-      Op : constant Config_Op := (Insert, ID, Config.Current_Shared_Token);
-   begin
-      Config.Ops.Append (Op);
-      Config.Insert_Delete.Insert (Op);
-      Config.Current_Insert_Delete := 1;
-   exception
-   when SAL.Container_Full =>
-      raise Bad_Config;
-   end Insert;
-
-   procedure Insert (Config : in out Configuration; IDs : in Token_ID_Array)
-   is begin
-      for ID of IDs loop
-         Insert (Config, ID);
-      end loop;
-   end Insert;
-
-   function Next_Token
-     (Terminals                 : in     Base_Token_Arrays.Vector;
-      Terminals_Current         : in out Base_Token_Index;
-      Restore_Terminals_Current : in out WisiToken.Base_Token_Index;
-      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
-      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
-     return Base_Token
-   is
-      use all type SAL.Base_Peek_Type;
-
-      function Next_Terminal return Base_Token
-      is begin
-         Terminals_Current    := Terminals_Current + 1;
-         loop
-            exit when not Prev_Deleted.Contains (Terminals_Current);
-            Terminals_Current := Terminals_Current + 1;
-         end loop;
-
-         Restore_Terminals_Current := Terminals_Current;
-         return Terminals (Terminals_Current);
-      end Next_Terminal;
-
-   begin
-      loop
-         if Insert_Delete.Last_Index > 0 and then Current_Insert_Delete = 
Insert_Delete.Last_Index then
-            Current_Insert_Delete     := No_Insert_Delete;
-            Insert_Delete.Clear;
-            return Next_Terminal;
-
-         elsif Current_Insert_Delete = No_Insert_Delete then
-            return Next_Terminal;
-
-         elsif Insert_Delete (Current_Insert_Delete + 1).Token_Index = 
Terminals_Current + 1 then
-            Current_Insert_Delete := Current_Insert_Delete + 1;
-            declare
-               Op : constant Insert_Delete_Op := Insert_Delete 
(Current_Insert_Delete);
-            begin
-               case Insert_Delete_Op_Label'(Op.Op) is
-               when Insert =>
-                  return (ID => Op.ID, others => <>);
-
-               when Delete =>
-                  Terminals_Current         := Terminals_Current + 1;
-                  Restore_Terminals_Current := Terminals_Current;
-               end case;
-            end;
-
-         else
-            return Next_Terminal;
-         end if;
-      end loop;
-   end Next_Token;
-
-   procedure Push_Back (Config : in out Configuration)
-   is
-      Item        : constant Recover_Stack_Item := Config.Stack.Pop;
-      Token_Index : constant Base_Token_Index   := 
Item.Token.Min_Terminal_Index;
-
-      function Compare (Left : in Base_Token_Index; Right : in Config_Op) 
return Boolean
-        is (case Right.Op is
-            when Fast_Forward    => False,
-            when Undo_Reduce     => False,
-            when Push_Back       => False,
-            when Insert | Delete => Left < Right.Token_Index);
-      --  If Left = Right.Token_Index, we assume the Right ops go _after_
-      --  the Left, so the Left do not need to be repeated.
-   begin
-      if Token_Index /= Invalid_Token_Index then
-         Config.Current_Shared_Token := Token_Index;
-         for I in Config.Ops.First_Index .. Config.Ops.Last_Index loop
-            if Compare (Token_Index, Config.Ops (I)) then
-               Config.Insert_Delete.Insert (Config.Ops (I));
-            end if;
-         end loop;
-      end if;
-
-      Config.Ops.Append ((Push_Back, Item.Token.ID, 
Config.Current_Shared_Token));
-   exception
-   when SAL.Container_Full =>
-      raise Bad_Config;
-   end Push_Back;
-
-   procedure Push_Back_Check (Config : in out Configuration; Expected_ID : in 
Token_ID)
-   is begin
-      Check (Config.Stack (1).Token.ID, Expected_ID);
-      Push_Back (Config);
-   end Push_Back_Check;
-
-   procedure Push_Back_Check (Config : in out Configuration; Expected : in 
Token_ID_Array)
-   is begin
-      for ID of Expected loop
-         Push_Back_Check (Config, ID);
-      end loop;
-   end Push_Back_Check;
-
-   procedure Put
-     (Message      : in     String;
-      Trace        : in out WisiToken.Trace'Class;
-      Parser_Label : in     Natural;
-      Terminals    : in     Base_Token_Arrays.Vector;
-      Config       : in     Configuration;
-      Task_ID      : in     Boolean := True)
-   is
-      --  For debugging output
-
-      --  Build a string, call trace.put_line once, so output from multiple
-      --  tasks is not interleaved (mostly).
-      use all type Ada.Strings.Unbounded.Unbounded_String;
-      use all type SAL.Base_Peek_Type;
-      use all type WisiToken.Semantic_Checks.Check_Status_Label;
-
-      Descriptor : WisiToken.Descriptor renames Trace.Descriptor.all;
-
-      Result : Ada.Strings.Unbounded.Unbounded_String :=
-        (if Task_ID then +Ada.Task_Identification.Image 
(Ada.Task_Identification.Current_Task) else +"") &
-        Integer'Image (Parser_Label) & ": " &
-        (if Message'Length > 0 then Message & ":" else "");
-   begin
-      Result := Result & Natural'Image (Config.Cost) & ", ";
-      if Config.Check_Status.Label /= Ok then
-         Result := Result & Semantic_Checks.Check_Status_Label'Image 
(Config.Check_Status.Label) & " ";
-      elsif Config.Error_Token.ID /= Invalid_Token_ID then
-         Result := Result & "Error " & Image (Config.Error_Token, Descriptor) 
& " ";
-      end if;
-      Result := Result & Image (Config.Stack, Descriptor, Depth => 1);
-
-      if Config.Current_Insert_Delete = No_Insert_Delete then
-         Result := Result & "|" & Image (Config.Current_Shared_Token, 
Terminals, Descriptor) & "|";
-      else
-         Result := Result & "/" & Trimmed_Image (Config.Current_Insert_Delete) 
& ":" &
-           Image (Config.Insert_Delete (Config.Current_Insert_Delete), 
Descriptor) & "/";
-      end if;
-
-      Result := Result & Image (Config.Ops, Descriptor);
-      Trace.Put_Line (-Result);
-   end Put;
-
-   procedure Put_Line
-     (Trace        : in out WisiToken.Trace'Class;
-      Parser_Label : in     Natural;
-      Message      : in     String;
-      Task_ID      : in     Boolean := True)
-   is begin
-      Trace.Put_Line
-        ((if Task_ID then Ada.Task_Identification.Image 
(Ada.Task_Identification.Current_Task) else "") &
-           Integer'Image (Parser_Label) & ": " & Message);
-   end Put_Line;
-
-   function Undo_Reduce
-     (Stack : in out Recover_Stacks.Stack;
-      Tree  : in     Syntax_Trees.Tree)
-     return Ada.Containers.Count_Type
-   is
-      Nonterm_Item : constant Recover_Stack_Item                  := Stack.Pop;
-      Children     : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Nonterm_Item.Tree_Index);
-   begin
-      for C of Children loop
-         Stack.Push ((Tree.State (C), C, Tree.Recover_Token (C)));
-      end loop;
-      return Children'Length;
-   end Undo_Reduce;
-
-   procedure Undo_Reduce_Check
-     (Config   : in out Configuration;
-      Tree     : in     Syntax_Trees.Tree;
-      Expected : in     Token_ID)
-   is begin
-      Check (Config.Stack (1).Token.ID, Expected);
-      Config.Ops.Append ((Undo_Reduce, Expected, Undo_Reduce (Config.Stack, 
Tree)));
-   exception
-   when SAL.Container_Full =>
-      raise Bad_Config;
-   end Undo_Reduce_Check;
-
-   procedure Undo_Reduce_Check
-     (Config   : in out Configuration;
-      Tree     : in     Syntax_Trees.Tree;
-      Expected : in     Token_ID_Array)
-   is begin
-      for ID of Expected loop
-         Undo_Reduce_Check (Config, Tree, ID);
-      end loop;
-   end Undo_Reduce_Check;
-
-end WisiToken.Parse.LR.McKenzie_Recover;
+--  Abstract :
+--
+--  See spec
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Characters.Handling;
+with Ada.Exceptions;
+with Ada.Unchecked_Deallocation;
+with System.Multiprocessors;
+with WisiToken.Parse.LR.McKenzie_Recover.Base;
+with WisiToken.Parse.LR.McKenzie_Recover.Explore;
+with WisiToken.Parse.LR.Parser_Lists;
+package body WisiToken.Parse.LR.McKenzie_Recover is
+   use all type System.Multiprocessors.CPU_Range;
+
+   type Supervisor_Access is access all Base.Supervisor;
+   type Shared_Access is access all Base.Shared;
+
+   task type Worker_Task is
+      entry Start
+        (ID     : in Integer;
+         Super  : in Supervisor_Access;
+         Shared : in Shared_Access);
+      --  Start getting parser/configs to check from Config_Store. Stop when
+      --  Super reports All_Done;
+
+      entry Done;
+      --  Available after Super has reported All_Done.
+   end Worker_Task;
+
+   type Worker_Access is access Worker_Task;
+   procedure Free is new Ada.Unchecked_Deallocation (Worker_Task, 
Worker_Access);
+
+   task body Worker_Task
+   is
+      use all type Base.Config_Status;
+      Super  : Supervisor_Access;
+      Shared : Shared_Access;
+
+      Status : Base.Config_Status := Valid;
+   begin
+      loop
+         select
+            accept Start
+              (ID     : in Integer;
+               Super  : in Supervisor_Access;
+               Shared : in Shared_Access)
+
+            do
+               Task_Attributes.Set_Value (ID);
+               Worker_Task.Super  := Super;
+               Worker_Task.Shared := Shared;
+            end Start;
+         or
+            terminate;
+         end select;
+
+         loop
+            Explore.Process_One (Super, Shared, Status);
+            exit when Status = All_Done;
+         end loop;
+
+         accept Done;
+
+         Super  := null;
+         Shared := null;
+      end loop;
+
+   exception
+   when E : others =>
+      Super.Fatal (E);
+   end Worker_Task;
+
+   Worker_Tasks : array (1 .. System.Multiprocessors.CPU_Range'Max (1, 
System.Multiprocessors.Number_Of_CPUs - 1)) of
+     Worker_Access;
+   --  Declaring an array of tasks directly causes a circular elaboration
+   --  problem, and would mean a task that terminates due to an exception
+   --  is never restarted.
+
+   function To_Recover
+     (Parser_Stack : in Parser_Lists.Parser_Stacks.Stack;
+      Tree         : in Syntax_Trees.Tree)
+     return Recover_Stacks.Stack
+   is
+      use all type SAL.Base_Peek_Type;
+      Result : Recover_Stacks.Stack;
+      Depth  : constant SAL.Peek_Type := Parser_Stack.Depth;
+   begin
+      Result.Set_Depth (Depth);
+      for I in 1 .. Depth loop
+         declare
+            Item  : Parser_Lists.Parser_Stack_Item renames Parser_Stack (I);
+            Token : constant Recover_Token := (if I = Depth then (others => 
<>) else Tree.Recover_Token (Item.Token));
+         begin
+            Result.Set (I, Depth, (Item.State, Item.Token, Token));
+         end;
+      end loop;
+      return Result;
+   end To_Recover;
+
+   procedure Recover_Init
+     (Shared_Parser : in out LR.Parser.Parser;
+      Parser_State  : in out Parser_Lists.Parser_State)
+   is
+      use all type WisiToken.Parse.LR.Parser.Language_Fixes_Access;
+
+      Trace  : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+      Config : constant Configuration_Access := 
Parser_State.Recover.Config_Heap.Add (Configuration'(others => <>));
+      Error  : Parse_Error renames Parser_State.Errors 
(Parser_State.Errors.Last);
+   begin
+      Parser_State.Recover.Enqueue_Count := Parser_State.Recover.Enqueue_Count 
+ 1;
+
+      Config.Resume_Token_Goal := Parser_State.Shared_Token + 
Shared_Parser.Table.McKenzie_Param.Check_Limit;
+
+      if Trace_McKenzie > Outline then
+         Trace.New_Line;
+         Trace.Put_Line
+           ("parser" & Integer'Image (Parser_State.Label) &
+              ": State" & State_Index'Image (Parser_State.Stack (1).State) &
+              " Current_Token" & Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) &
+              " Resume_Token_Goal" & WisiToken.Token_Index'Image 
(Config.Resume_Token_Goal));
+         Trace.Put_Line
+           ((case Error.Label is
+             when Action => "Action",
+             when Check => "Check, " & Semantic_Checks.Image 
(Error.Check_Status, Trace.Descriptor.all),
+             when Message => raise SAL.Programmer_Error));
+         if Trace_McKenzie > Extra then
+            Put_Line
+              (Trace, Parser_State.Label, Parser_Lists.Image
+                 (Parser_State.Stack, Trace.Descriptor.all, 
Parser_State.Tree));
+         end if;
+      end if;
+
+      --  Additional initialization of Parser_State.Recover is done in
+      --  Supervisor.Initialize.
+
+      Config.Stack := To_Recover (Parser_State.Stack, Parser_State.Tree);
+
+      --  Parser_State.Recover_Insert_Delete must be empty (else we would not 
get
+      --  here). Therefore Parser_State current token is in
+      --  Shared_Parser.Shared_Token.
+
+      Config.Current_Shared_Token := Parser_State.Shared_Token;
+
+      case Error.Label is
+      when Action =>
+         Config.Error_Token := Parser_State.Tree.Recover_Token 
(Error.Error_Token);
+         if Trace_McKenzie > Detail then
+            Put ("enqueue", Trace, Parser_State.Label, 
Shared_Parser.Terminals, Config.all,
+                 Task_ID => False);
+         end if;
+
+      when Check =>
+         if Shared_Parser.Language_Fixes = null then
+            --  The only fix is to ignore the error.
+            if Trace_McKenzie > Detail then
+               Put ("enqueue", Trace, Parser_State.Label, 
Shared_Parser.Terminals, Config.all,
+                    Task_ID => False);
+            end if;
+
+         else
+            --  Undo the reduction that encountered the error, let Process_One
+            --  enqueue possible solutions. We leave the cost at 0, since this 
is
+            --  the root config. Later logic will enqueue the 'ignore error'
+            --  solution; see McKenzie_Recover.Explore Process_One.
+
+            Config.Check_Status      := Error.Check_Status;
+            Config.Error_Token       := Config.Stack (1).Token;
+            Config.Check_Token_Count := Undo_Reduce (Config.Stack, 
Parser_State.Tree);
+
+            Config.Ops.Append ((Undo_Reduce, Config.Error_Token.ID, 
Config.Check_Token_Count));
+
+            if Trace_McKenzie > Detail then
+               Put ("undo_reduce " & Image
+                      (Config.Error_Token.ID, Trace.Descriptor.all), Trace, 
Parser_State.Label,
+                    Shared_Parser.Terminals, Config.all, Task_ID => False);
+            end if;
+         end if;
+
+      when Message =>
+         --  Last error entry should be the failure that caused us to enter
+         --  recovery.
+         raise SAL.Programmer_Error;
+      end case;
+   end Recover_Init;
+
+   function Recover (Shared_Parser : in out LR.Parser.Parser) return 
Recover_Status
+   is
+      use all type Parser.Post_Recover_Access;
+      use all type SAL.Base_Peek_Type;
+      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+
+      Parsers : Parser_Lists.List renames Shared_Parser.Parsers;
+
+      Current_Parser : Parser_Lists.Cursor;
+
+      Super : aliased Base.Supervisor
+        (Trace'Access,
+         Check_Delta_Limit => 
Shared_Parser.Table.McKenzie_Param.Check_Delta_Limit,
+         Enqueue_Limit     => Shared_Parser.Table.McKenzie_Param.Enqueue_Limit,
+         Parser_Count      => Parsers.Count);
+
+      Shared : aliased Base.Shared
+        (Shared_Parser.Trace,
+         Shared_Parser.Lexer.all'Access,
+         Shared_Parser.Table,
+         Shared_Parser.Language_Fixes,
+         Shared_Parser.Language_Matching_Begin_Tokens,
+         Shared_Parser.Language_String_ID_Set,
+         Shared_Parser.Terminals'Access,
+         Shared_Parser.Line_Begin_Token'Access);
+
+      Task_Count : constant System.Multiprocessors.CPU_Range :=
+        (if Shared_Parser.Table.McKenzie_Param.Task_Count = 0
+         then Worker_Tasks'Last
+         --  Keep one CPU free for this main task, and the user.
+         else Shared_Parser.Table.McKenzie_Param.Task_Count);
+
+   begin
+      if Trace_McKenzie > Outline then
+         Trace.New_Line;
+         Trace.Put_Line (" McKenzie error recovery");
+      end if;
+
+      Super.Initialize (Parsers'Unrestricted_Access, 
Shared_Parser.Terminals'Unrestricted_Access);
+
+      for Parser_State of Parsers loop
+         Recover_Init (Shared_Parser, Parser_State);
+      end loop;
+
+      if Trace_McKenzie > Outline then
+         Trace.New_Line;
+         Trace.Put_Line (System.Multiprocessors.CPU_Range'Image 
(Worker_Tasks'Last) & " parallel tasks");
+      end if;
+
+      for I in Worker_Tasks'First .. Task_Count loop
+         if Worker_Tasks (I) = null then
+            Worker_Tasks (I) := new Worker_Task;
+            if Debug_Mode then
+               Trace.Put_Line ("new Worker_Task" & 
System.Multiprocessors.CPU_Range'Image (I));
+            end if;
+
+         elsif Worker_Tasks (I)'Terminated then
+            Free (Worker_Tasks (I));
+            Worker_Tasks (I) := new Worker_Task;
+            if Debug_Mode then
+               Trace.Put_Line ("recreated Worker_Task" & 
System.Multiprocessors.CPU_Range'Image (I));
+            end if;
+         end if;
+
+         Worker_Tasks (I).Start (Integer (I), Super'Unchecked_Access, 
Shared'Unchecked_Access);
+      end loop;
+
+      declare
+         use Ada.Exceptions;
+         ID      : Exception_Id;
+         Message : Ada.Strings.Unbounded.Unbounded_String;
+      begin
+         Super.Done (ID, Message); -- Wait for all parsers to fail or succeed
+
+         --  Ensure all worker tasks stop getting configs before proceeding;
+         --  otherwise local variables disappear while the task is still trying
+         --  to access them.
+         for I in Worker_Tasks'First .. Task_Count loop
+            if not Worker_Tasks (I)'Terminated then
+               Worker_Tasks (I).Done;
+            end if;
+         end loop;
+
+         if ID /= Null_Id then
+            Raise_Exception (ID, -Message);
+         end if;
+      end;
+
+      --  Adjust parser state for each successful recovery.
+      --
+      --  One option here would be to keep only the parser with the least
+      --  cost fix. However, the normal reason for having multiple parsers
+      --  is to resolve a grammar ambiguity; the least cost fix might
+      --  resolve the ambiguity the wrong way. As could any other fix, of
+      --  course.
+
+      --  Spawn new parsers for multiple solutions.
+      --
+      --  We could try to check here for redundant solutions; configs for a
+      --  parser that have the same or "equivalent" ops. But those will be
+      --  caught in the main parse by the check for duplicate state; doing
+      --  the same check here is premature optimization.
+      declare
+         use Parser_Lists;
+         Cur         : Cursor             := Parsers.First;
+         Solutions   : SAL.Base_Peek_Type := 0;
+         Spawn_Limit : SAL.Base_Peek_Type := Shared_Parser.Max_Parallel; -- 
per parser
+      begin
+         for Parser of Parsers loop
+            if Parser.Recover.Success then
+               Solutions := Solutions + Parser.Recover.Results.Count;
+            end if;
+         end loop;
+
+         if Solutions > Shared_Parser.Max_Parallel and Trace_McKenzie > 
Outline then
+            Trace.Put_Line ("too many parallel parsers required in recover; 
dropping some solutions");
+            Spawn_Limit := Shared_Parser.Max_Parallel / Parsers.Count;
+         end if;
+
+         loop
+            declare
+               Data : McKenzie_Data renames State_Ref (Cur).Recover;
+            begin
+               if Data.Success then
+                  if Trace_McKenzie > Outline then
+                     Trace.Put_Line
+                       (Integer'Image (Label (Cur)) &
+                          ": succeed" & SAL.Base_Peek_Type'Image 
(Data.Results.Count) &
+                          ", enqueue" & Integer'Image (Data.Enqueue_Count) &
+                          ", check " & Integer'Image (Data.Check_Count) &
+                          ", cost: " & Integer'Image (Data.Results.Min_Key));
+                  end if;
+
+                  if Data.Results.Count > 1 then
+                     for I in 1 .. SAL.Base_Peek_Type'Min (Spawn_Limit, 
Data.Results.Count - 1) loop
+                        Parsers.Prepend_Copy (Cur); --  does not copy recover
+                        if Trace_McKenzie > Outline or Trace_Parse > Outline 
then
+                           Trace.Put_Line
+                             ("spawn parser" & Integer'Image 
(Parsers.First.Label) & " from " &
+                                Trimmed_Image (Cur.Label) & " (" & 
Trimmed_Image (Integer (Parsers.Count)) &
+                                " active)");
+                           Put ("", Trace, Parsers.First.Label, 
Shared_Parser.Terminals,
+                                Data.Results.Peek, Task_ID => False, Strategy 
=> True);
+                        end if;
+
+                        State_Ref (Parsers.First).Recover.Results.Add 
(Data.Results.Remove);
+                        State_Ref (Parsers.First).Recover.Success := True;
+                     end loop;
+                  end if;
+
+                  if Trace_McKenzie > Outline or Trace_Parse > Outline then
+                     Put ("", Trace, Cur.State_Ref.Label, 
Shared_Parser.Terminals, Data.Results.Peek,
+                          Task_ID => False, Strategy => True);
+                  end if;
+               else
+                  if Trace_McKenzie > Outline then
+                     Trace.Put_Line
+                       (Integer'Image (Cur.Label) &
+                          ": fail, enqueue" & Integer'Image 
(Data.Enqueue_Count) &
+                          ", check " & Integer'Image (Data.Check_Count) &
+                          ", max shared_token " & WisiToken.Token_Index'Image 
(Shared_Parser.Terminals.Last_Index));
+                  end if;
+               end if;
+
+            end;
+            Next (Cur);
+            exit when Is_Done (Cur);
+         end loop;
+      end;
+
+      --  Edit Parser_State to apply solutions.
+
+      --  We don't use 'for Parser_State of Parsers loop' here,
+      --  because we might need to terminate a parser.
+      Current_Parser := Parsers.First;
+      loop
+         exit when Current_Parser.Is_Done;
+
+         if Current_Parser.State_Ref.Recover.Success then
+            begin
+               --  Can't have active 'renames State_Ref' when terminate a 
parser
+               declare
+                  use Parser_Lists;
+
+                  Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+
+                  Descriptor : WisiToken.Descriptor renames 
Shared_Parser.Trace.Descriptor.all;
+                  Tree       : Syntax_Trees.Tree renames Parser_State.Tree;
+                  Data       : McKenzie_Data renames Parser_State.Recover;
+                  Result     : Configuration renames Data.Results.Peek;
+
+                  Min_Op_Token_Index        : WisiToken.Token_Index := 
WisiToken.Token_Index'Last;
+                  Min_Push_Back_Token_Index : WisiToken.Token_Index := 
WisiToken.Token_Index'Last;
+
+                  Stack_Matches_Ops     : Boolean := True;
+                  Shared_Token_Changed  : Boolean := False;
+                  Current_Token_Virtual : Boolean := False;
+
+                  Sorted_Insert_Delete : Sorted_Insert_Delete_Arrays.Vector;
+
+                  procedure Apply_Prev_Token
+                  is begin
+                     loop
+                        exit when not Parser_State.Prev_Deleted.Contains 
(Parser_State.Shared_Token);
+                        Parser_State.Shared_Token := Parser_State.Shared_Token 
+ 1;
+                     end loop;
+                  end Apply_Prev_Token;
+
+               begin
+                  --  The verb will be reset by the main parser; just indicate 
the
+                  --  parser recovered from the error.
+                  Parser_State.Set_Verb (Shift);
+
+                  Parser_State.Errors (Parser_State.Errors.Last).Recover := 
Result;
+
+                  Parser_State.Resume_Token_Goal := Result.Resume_Token_Goal;
+
+                  if Trace_McKenzie > Extra then
+                     Put_Line (Trace, Parser_State.Label, "before Ops 
applied:", Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "stack " & Image 
(Parser_State.Stack, Descriptor, Tree),
+                        Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "Shared_Token  " & Image
+                          (Parser_State.Shared_Token, Shared_Parser.Terminals, 
Descriptor),
+                        Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "Current_Token " & 
Parser_State.Tree.Image
+                          (Parser_State.Current_Token, Descriptor),
+                        Task_ID => False);
+                  end if;
+
+                  --  We don't apply all Ops to the parser stack here, because 
that
+                  --  requires updating the syntax tree as well, and we want 
to let the
+                  --  main parser do that, partly as a double check on the 
algorithms
+                  --  here.
+                  --
+                  --  However, the main parser can only apply Insert and 
Delete ops; we
+                  --  must apply Push_Back and Undo_Reduce here. Note that 
Fast_Forward
+                  --  ops are just for bookkeeping.
+                  --
+                  --  In order to apply Undo_Reduce, we also need to apply any 
preceding
+                  --  ops. See test_mckenzie_recover.adb Missing_Name_2 for an 
example
+                  --  of multiple Undo_Reduce. On the other hand, Push_Back 
can be
+                  --  applied without the preceding ops.
+                  --
+                  --  A Push_Back can go back past preceding ops, including 
Undo_Reduce;
+                  --  there's no point in applying ops that are later 
superceded by such
+                  --  a Push_Back. See test_mckenzie_recover.adb 
Out_Of_Order_Ops for an
+                  --  example.
+                  --
+                  --  Push_Back can also go back past a previous error 
recovery; we must
+                  --  apply Parser_State.Prev_Deleted here as well, when 
computing
+                  --  Shared_Token.
+                  --
+                  --  So first we go thru Ops to find the earliest Push_Back. 
Then we
+                  --  apply ops that are before that point, up to the first 
Insert or
+                  --  Fast_Forward. After that, we enqueue Insert and Delete 
ops on
+                  --  Parser_State.Recover_Insert_Delete, in token_index 
order, and any
+                  --  Undo_Reduce are rejected.
+                  --
+                  --  Then the main parser parses the edited input stream.
+                  --
+                  --  There's no need to modify Parser_State.Tree. Any tree 
nodes
+                  --  created by the failed parse that are pushed back are 
useful for
+                  --  error repair, and will just be ignored in future 
parsing. This
+                  --  also avoids enlarging a non-flushed branched tree, which 
saves
+                  --  time and space.
+
+                  for Op of Result.Ops loop
+                     case Op.Op is
+                     when Fast_Forward =>
+                        if Op.FF_Token_Index < Min_Op_Token_Index then
+                           Min_Op_Token_Index := Op.FF_Token_Index;
+                        end if;
+
+                     when Undo_Reduce =>
+                        null;
+
+                     when Push_Back =>
+                        if Op.PB_Token_Index /= Invalid_Token_Index then
+                           if Op.PB_Token_Index < Min_Op_Token_Index then
+                              Min_Op_Token_Index := Op.PB_Token_Index;
+                           end if;
+                           if Op.PB_Token_Index < Min_Push_Back_Token_Index 
then
+                              Min_Push_Back_Token_Index := Op.PB_Token_Index;
+                           end if;
+                        end if;
+
+                     when Insert =>
+                        if Op.Ins_Token_Index /= Invalid_Token_Index then
+                           if Op.Ins_Token_Index < Min_Op_Token_Index then
+                              Min_Op_Token_Index := Op.Ins_Token_Index;
+                           end if;
+                           if Op.Ins_Token_Index < Min_Push_Back_Token_Index 
then
+                              Min_Push_Back_Token_Index := Op.Ins_Token_Index;
+                           end if;
+                        end if;
+
+                     when Delete =>
+                        if Op.Del_Token_Index /= Invalid_Token_Index then
+                           if Op.Del_Token_Index < Min_Op_Token_Index then
+                              Min_Op_Token_Index := Op.Del_Token_Index;
+                           end if;
+                           if Op.Del_Token_Index < Min_Push_Back_Token_Index 
then
+                              Min_Push_Back_Token_Index := Op.Del_Token_Index;
+                           end if;
+                        end if;
+
+                     end case;
+                  end loop;
+
+                  for Op of Result.Ops loop
+                     case Op.Op is
+                     when Fast_Forward =>
+                        Stack_Matches_Ops := False;
+
+                     when Undo_Reduce =>
+                        if not Stack_Matches_Ops then
+                           if Trace_McKenzie > Outline then
+                              Put_Line
+                                (Trace, Parser_State.Label, "Undo_Reduce after 
insert or fast_forward",
+                                 Task_ID => False);
+                           end if;
+                           raise Bad_Config;
+                        end if;
+
+                        declare
+                           Item : constant Parser_Lists.Parser_Stack_Item := 
Parser_State.Stack.Pop;
+                        begin
+                           case Tree.Label (Item.Token) is
+                           when Syntax_Trees.Shared_Terminal |
+                             Syntax_Trees.Virtual_Identifier |
+                             Syntax_Trees.Virtual_Terminal =>
+                              if Trace_McKenzie > Outline then
+                                 Put_Line
+                                   (Trace, Parser_State.Label, "expecting 
nonterminal, found " &
+                                      Image (Tree.ID (Item.Token), 
Trace.Descriptor.all),
+                                    Task_ID => False);
+                              end if;
+                              raise Bad_Config;
+
+                           when Syntax_Trees.Nonterm =>
+                              for C of Tree.Children (Item.Token) loop
+                                 Parser_State.Stack.Push ((Tree.State (C), C));
+                              end loop;
+                           end case;
+                        end;
+
+                     when Push_Back =>
+                        if Stack_Matches_Ops then
+                           Parser_State.Stack.Pop;
+                           if Op.PB_Token_Index /= Invalid_Token_Index then
+                              Parser_State.Shared_Token := Op.PB_Token_Index;
+                              Shared_Token_Changed      := True;
+                           end if;
+
+                        elsif Op.PB_Token_Index = Min_Op_Token_Index then
+                           loop
+                              --  Multiple push_backs can have the same 
Op.PB_Token_Index, so we may
+                              --  already be at the target.
+                              exit when Parser_State.Shared_Token <= 
Op.PB_Token_Index and
+                                (Parser_State.Stack.Depth = 1 or else
+                                   Tree.Min_Terminal_Index (Parser_State.Stack 
(1).Token) /= Invalid_Token_Index);
+                              --  also push back empty tokens.
+
+                              declare
+                                 Item : constant 
Parser_Lists.Parser_Stack_Item := Parser_State.Stack.Pop;
+
+                                 Min_Index : constant Base_Token_Index :=
+                                   Parser_State.Tree.Min_Terminal_Index 
(Item.Token);
+                              begin
+                                 if Min_Index /= Invalid_Token_Index then
+                                    Shared_Token_Changed := True;
+                                    Parser_State.Shared_Token := Min_Index;
+                                 end if;
+                              end;
+                           end loop;
+                           pragma Assert (Parser_State.Shared_Token = 
Op.PB_Token_Index);
+                        end if;
+
+                     when Insert =>
+                        if Stack_Matches_Ops and Op.Ins_Token_Index = 
Parser_State.Shared_Token then
+                           --  This is the first Insert. Even if a later 
Push_Back supercedes it,
+                           --  we record Stack_Matches_Ops false here.
+                           Stack_Matches_Ops := False;
+
+                           if Op.Ins_Token_Index <= Min_Push_Back_Token_Index 
then
+                              Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal (Op.Ins_ID);
+                              Current_Token_Virtual      := True;
+                           else
+                              Sorted_Insert_Delete.Insert (Op);
+                           end if;
+                        else
+                           Sorted_Insert_Delete.Insert (Op);
+                        end if;
+
+                     when Delete =>
+                        if Stack_Matches_Ops and Op.Del_Token_Index = 
Parser_State.Shared_Token then
+                           --  We can apply multiple deletes.
+                           Parser_State.Shared_Token := Op.Del_Token_Index + 1;
+                           Apply_Prev_Token;
+                           Shared_Token_Changed      := True;
+                        else
+                           Sorted_Insert_Delete.Insert (Op);
+                        end if;
+                     end case;
+                  end loop;
+
+                  --  We may not have processed the current Insert or Delete 
above, if
+                  --  they are after a fast_forward.
+                  for Op of Sorted_Insert_Delete loop
+                     if Token_Index (Op) = Parser_State.Shared_Token and not 
Current_Token_Virtual then
+                        case Insert_Delete_Op_Label'(Op.Op) is
+                        when Insert =>
+                           Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal (ID (Op));
+                           Current_Token_Virtual      := True;
+
+                        when Delete =>
+                           Parser_State.Shared_Token := Op.Del_Token_Index + 1;
+                           Apply_Prev_Token;
+                           Shared_Token_Changed      := True;
+                        end case;
+                     else
+                        Parser_State.Recover_Insert_Delete.Put (Op);
+                     end if;
+                  end loop;
+
+                  --  If not Shared_Token_Changed, Shared_Token is the error 
token,
+                  --  which is the next token to read. If 
Shared_Token_Changed, we have
+                  --  set Shared_Token consistent with that; it is the next 
token to
+                  --  read. If Current_Token_Virtual, then after all the 
virtual tokens
+                  --  are inserted, the main parser would normally increment
+                  --  Parser_State.Shared_Token to get the next token, but we 
don't want
+                  --  that now. We could set Shared_Token to 1 less, but this 
way the
+                  --  debug messages all show the expected Shared_Terminal.
+
+                  Parser_State.Inc_Shared_Token := not Current_Token_Virtual;
+
+                  --  The main parser always sets Current_Token to be the 
syntax tree
+                  --  node containing Shared_Token; ensure that is true here 
(virtual
+                  --  tokens where handled above).
+
+                  if (not Current_Token_Virtual) and Shared_Token_Changed then
+                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
+                       (Parser_State.Shared_Token, Shared_Parser.Terminals);
+                  end if;
+
+                  if Trace_McKenzie > Extra then
+                     Put_Line (Trace, Parser_State.Label, "after Ops 
applied:", Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "stack " & 
Parser_Lists.Image
+                          (Parser_State.Stack, Descriptor, Tree),
+                        Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "Shared_Token  " & Image
+                          (Parser_State.Shared_Token, Shared_Parser.Terminals, 
Descriptor), Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "Current_Token " & 
Parser_State.Tree.Image
+                          (Parser_State.Current_Token, Descriptor), Task_ID => 
False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "recover_insert_delete " & 
Image
+                          (Parser_State.Recover_Insert_Delete, Descriptor), 
Task_ID => False);
+                     Put_Line
+                       (Trace, Parser_State.Label, "inc_shared_token " & 
Boolean'Image (Parser_State.Inc_Shared_Token) &
+                          " parser verb " & All_Parse_Action_Verbs'Image 
(Parser_State.Verb),
+                        Task_ID => False);
+                  end if;
+               end;
+            exception
+            when Bad_Config =>
+               if Parsers.Count = 1 then
+                  --  Oops. just give up
+                  return Fail_Programmer_Error;
+               end if;
+               Parsers.Terminate_Parser (Current_Parser, "bad config in 
recover", Trace, Shared_Parser.Terminals);
+            end;
+         end if;
+         Current_Parser.Next;
+      end loop;
+
+      if Shared_Parser.Post_Recover /= null then
+         Shared_Parser.Post_Recover.all;
+      end if;
+
+      return Super.Recover_Result;
+
+   exception
+   when others =>
+      return Fail_Programmer_Error;
+   end Recover;
+
+   ----------
+   --  Spec private subprograms; for language-specific
+   --  child packages.
+
+   procedure Check (ID : Token_ID; Expected_ID : in Token_ID)
+   is begin
+      pragma Assert (ID = Expected_ID, Token_ID'Image (ID) & " /=" & 
Token_ID'Image (Expected_ID));
+   end Check;
+
+   function Current_Token
+     (Terminals                 : in     Base_Token_Arrays.Vector;
+      Terminals_Current         : in out WisiToken.Base_Token_Index;
+      Restore_Terminals_Current :    out WisiToken.Base_Token_Index;
+      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
+      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
+     return Base_Token
+   is
+      use all type SAL.Base_Peek_Type;
+
+      procedure Inc_I_D
+      is begin
+         Current_Insert_Delete := Current_Insert_Delete + 1;
+         if Current_Insert_Delete > Insert_Delete.Last_Index then
+            Current_Insert_Delete := No_Insert_Delete;
+            Insert_Delete.Clear;
+         end if;
+      end Inc_I_D;
+
+   begin
+      if Terminals_Current = Invalid_Token_Index then
+         --  Happens with really bad syntax; see test_mckenzie_recover.adb 
Error_4.
+         raise Bad_Config;
+      end if;
+
+      loop
+         if Current_Insert_Delete = No_Insert_Delete then
+            Restore_Terminals_Current := Terminals_Current;
+            return Terminals (Terminals_Current);
+
+         elsif Token_Index (Insert_Delete (Current_Insert_Delete)) = 
Terminals_Current then
+            declare
+               Op : Insert_Delete_Op renames Insert_Delete 
(Current_Insert_Delete);
+            begin
+               case Insert_Delete_Op_Label (Op.Op) is
+               when Insert =>
+                  --  Decrement Terminals_Current so Next_Token knows it 
should always
+                  --  increment it. Save the initial value, to restore in case 
of error.
+                  Restore_Terminals_Current := Terminals_Current;
+                  Terminals_Current         := Terminals_Current - 1;
+                  return (ID => ID (Op), others => <>);
+
+               when Delete =>
+                  Terminals_Current    := Terminals_Current + 1;
+                  loop
+                     exit when not Prev_Deleted.Contains (Terminals_Current);
+                     Terminals_Current := Terminals_Current + 1;
+                  end loop;
+                  Restore_Terminals_Current := Terminals_Current;
+                  Inc_I_D;
+               end case;
+            end;
+         else
+            return Terminals (Terminals_Current);
+         end if;
+      end loop;
+   end Current_Token;
+
+   function Current_Token_ID_Peek
+     (Terminals             : in     Base_Token_Arrays.Vector;
+      Terminals_Current     : in     Base_Token_Index;
+      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete : in     SAL.Base_Peek_Type)
+     return Token_ID
+   is
+      use all type SAL.Base_Peek_Type;
+      Result : Token_ID;
+   begin
+      if Terminals_Current = Base_Token_Index'First then
+         --  Happens with really bad syntax.
+         raise Bad_Config;
+      end if;
+
+      --  First set Result from Terminals; may be overridden by
+      --  Insert_Delete below.
+      Result := Terminals (Terminals_Current).ID;
+
+      if Current_Insert_Delete = No_Insert_Delete then
+         null;
+
+      elsif Token_Index (Insert_Delete (Current_Insert_Delete)) = 
Terminals_Current then
+         declare
+            Op : Insert_Delete_Op renames Insert_Delete 
(Current_Insert_Delete);
+         begin
+            case Insert_Delete_Op_Label (Op.Op) is
+            when Insert =>
+               Result := Op.Ins_ID;
+
+            when Delete =>
+               --  This should have been handled in Check
+               raise SAL.Programmer_Error;
+            end case;
+         end;
+      end if;
+      return Result;
+   end Current_Token_ID_Peek;
+
+   procedure Current_Token_ID_Peek_3
+     (Terminals             : in     Base_Token_Arrays.Vector;
+      Terminals_Current     : in     Base_Token_Index;
+      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete : in     SAL.Base_Peek_Type;
+      Prev_Deleted          : in     Recover_Token_Index_Arrays.Vector;
+      Tokens                :    out Token_ID_Array_1_3)
+   is
+      use all type SAL.Base_Peek_Type;
+      Terminals_Next : WisiToken.Token_Index := Terminals_Current + 1;
+   begin
+      if Terminals_Current = Base_Token_Index'First then
+         --  Happens with really bad syntax; see test_mckenzie_recover.adb 
Error_4.
+         raise Bad_Config;
+      end if;
+
+      --  First set Tokens from Terminals; may be overridden by
+      --  Insert_Delete below.
+      Tokens (1) := Terminals (Terminals_Current).ID;
+      loop
+         exit when not Prev_Deleted.Contains (Terminals_Next);
+         Terminals_Next := Terminals_Next + 1;
+      end loop;
+      if Terminals_Next <= Terminals.Last_Index then
+         Tokens (2) := Terminals (Terminals_Next).ID;
+         loop
+            Terminals_Next := Terminals_Next + 1;
+            exit when not Prev_Deleted.Contains (Terminals_Next);
+         end loop;
+         if Terminals_Next <= Terminals.Last_Index then
+            Tokens (3) := Terminals (Terminals_Next).ID;
+         else
+            Tokens (3) := Invalid_Token_ID;
+         end if;
+      else
+         Tokens (2) := Invalid_Token_ID;
+         Tokens (3) := Invalid_Token_ID;
+      end if;
+
+      if Current_Insert_Delete = No_Insert_Delete then
+         null;
+      else
+         for I in Tokens'Range loop
+            declare
+               J : constant SAL.Base_Peek_Type := Current_Insert_Delete + 
SAL.Peek_Type (I) - 1;
+            begin
+               if (J >= Insert_Delete.First_Index and J <= 
Insert_Delete.Last_Index) and then
+                 Token_Index (Insert_Delete (J)) = Terminals_Current
+               then
+                  declare
+                     Op : Insert_Delete_Op renames Insert_Delete (J);
+                  begin
+                     case Insert_Delete_Op_Label (Op.Op) is
+                     when Insert =>
+                        Tokens (I) := Op.Ins_ID;
+
+                     when Delete =>
+                        --  This should have been handled in Check
+                        raise SAL.Programmer_Error;
+                     end case;
+                  end;
+               end if;
+            end;
+         end loop;
+      end if;
+   end Current_Token_ID_Peek_3;
+
+   procedure Delete_Check
+     (Terminals : in     Base_Token_Arrays.Vector;
+      Config    : in out Configuration;
+      ID        : in     Token_ID)
+   is
+      Op : constant Config_Op := (Delete, ID, Config.Current_Shared_Token);
+   begin
+      Check (Terminals (Config.Current_Shared_Token).ID, ID);
+      Config.Ops.Append (Op);
+      Config.Insert_Delete.Insert (Op);
+      Config.Current_Insert_Delete := 1;
+   exception
+   when SAL.Container_Full =>
+      raise Bad_Config;
+   end Delete_Check;
+
+   procedure Delete_Check
+     (Terminals : in     Base_Token_Arrays.Vector;
+      Config    : in out Configuration;
+      Index     : in out     WisiToken.Token_Index;
+      ID        : in     Token_ID)
+   is
+      Op : constant Config_Op := (Delete, ID, Index);
+   begin
+      Check (Terminals (Index).ID, ID);
+      Config.Ops.Append (Op);
+      Config.Insert_Delete.Insert (Op);
+      Config.Current_Insert_Delete := 1;
+      Index := Index + 1;
+   exception
+   when SAL.Container_Full =>
+      raise Bad_Config;
+   end Delete_Check;
+
+   procedure Find_ID
+     (Config         : in     Configuration;
+      ID             : in     Token_ID;
+      Matching_Index : in out SAL.Peek_Type)
+   is
+      use all type SAL.Peek_Type;
+   begin
+      loop
+         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
+         declare
+            Stack_ID : Token_ID renames Config.Stack (Matching_Index).Token.ID;
+         begin
+            exit when Stack_ID = ID;
+         end;
+         Matching_Index := Matching_Index + 1;
+      end loop;
+   end Find_ID;
+
+   procedure Find_ID
+     (Config         : in     Configuration;
+      IDs            : in     Token_ID_Set;
+      Matching_Index : in out SAL.Peek_Type)
+   is
+      use all type SAL.Peek_Type;
+   begin
+      loop
+         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
+         declare
+            ID : Token_ID renames Config.Stack (Matching_Index).Token.ID;
+         begin
+            exit when ID in IDs'First .. IDs'Last and then IDs (ID);
+         end;
+         Matching_Index := Matching_Index + 1;
+      end loop;
+   end Find_ID;
+
+   procedure Find_Descendant_ID
+     (Tree           : in     Syntax_Trees.Tree;
+      Config         : in     Configuration;
+      ID             : in     Token_ID;
+      ID_Set         : in     Token_ID_Set;
+      Matching_Index : in out SAL.Peek_Type)
+   is
+      use Syntax_Trees;
+      use all type SAL.Peek_Type;
+   begin
+      loop
+         exit when Matching_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
+         exit when Config.Stack (Matching_Index).Token.ID in ID_Set'Range and 
then
+           (ID_Set (Config.Stack (Matching_Index).Token.ID) and
+              (Config.Stack (Matching_Index).Tree_Index /= Invalid_Node_Index 
and then
+                 Tree.Find_Descendant (Config.Stack 
(Matching_Index).Tree_Index, ID) /= Invalid_Node_Index));
+
+         Matching_Index := Matching_Index + 1;
+      end loop;
+   end Find_Descendant_ID;
+
+   procedure Find_Matching_Name
+     (Config              : in     Configuration;
+      Lexer               : access constant WisiToken.Lexer.Instance'Class;
+      Name                : in     String;
+      Matching_Name_Index : in out SAL.Peek_Type;
+      Case_Insensitive    : in     Boolean)
+   is
+      use Ada.Characters.Handling;
+      use all type SAL.Peek_Type;
+      Match_Name : constant String := (if Case_Insensitive then To_Lower 
(Name) else Name);
+   begin
+      loop
+         exit when Matching_Name_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
+         declare
+            Token       : Recover_Token renames Config.Stack 
(Matching_Name_Index).Token;
+            Name_Region : constant Buffer_Region :=
+              (if Token.Name = Null_Buffer_Region
+               then Token.Byte_Region
+               else Token.Name);
+         begin
+            exit when Name_Region /= Null_Buffer_Region and then
+              Match_Name =
+              (if Case_Insensitive
+               then To_Lower (Lexer.Buffer_Text (Name_Region))
+               else Lexer.Buffer_Text (Name_Region));
+
+            Matching_Name_Index := Matching_Name_Index + 1;
+         end;
+      end loop;
+   end Find_Matching_Name;
+
+   procedure Find_Matching_Name
+     (Config              : in     Configuration;
+      Lexer               : access constant WisiToken.Lexer.Instance'Class;
+      Name                : in     String;
+      Matching_Name_Index : in out SAL.Peek_Type;
+      Other_ID            : in     Token_ID;
+      Other_Count         :    out Integer;
+      Case_Insensitive    : in     Boolean)
+   is
+      use Ada.Characters.Handling;
+      use all type SAL.Peek_Type;
+      Match_Name : constant String := (if Case_Insensitive then To_Lower 
(Name) else Name);
+   begin
+      Other_Count := 0;
+
+      loop
+         exit when Matching_Name_Index = Config.Stack.Depth; -- Depth has 
Invalid_Token_ID
+         declare
+            Token       : Recover_Token renames Config.Stack 
(Matching_Name_Index).Token;
+            Name_Region : constant Buffer_Region :=
+              (if Token.Name = Null_Buffer_Region
+               then Token.Byte_Region -- FIXME: why not only Token.name?
+               else Token.Name);
+         begin
+            exit when Name_Region /= Null_Buffer_Region and then
+              Match_Name =
+              (if Case_Insensitive
+               then To_Lower (Lexer.Buffer_Text (Name_Region))
+               else Lexer.Buffer_Text (Name_Region));
+
+            if Other_ID = Token.ID then
+               Other_Count := Other_Count + 1;
+            end if;
+
+            Matching_Name_Index := Matching_Name_Index + 1;
+         end;
+      end loop;
+   end Find_Matching_Name;
+
+   procedure Insert (Config : in out Configuration; ID : in Token_ID)
+   is
+      Op : constant Config_Op := (Insert, ID, Config.Current_Shared_Token, 
Unknown_State, 0);
+   begin
+      Config.Ops.Append (Op);
+      Config.Insert_Delete.Insert (Op);
+      Config.Current_Insert_Delete := 1;
+   exception
+   when SAL.Container_Full =>
+      raise Bad_Config;
+   end Insert;
+
+   procedure Insert (Config : in out Configuration; IDs : in Token_ID_Array)
+   is begin
+      for ID of IDs loop
+         Insert (Config, ID);
+      end loop;
+   end Insert;
+
+   function Next_Token
+     (Terminals                 : in     Base_Token_Arrays.Vector;
+      Terminals_Current         : in out Base_Token_Index;
+      Restore_Terminals_Current : in out WisiToken.Base_Token_Index;
+      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
+      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
+     return Base_Token
+   is
+      use all type SAL.Base_Peek_Type;
+
+      function Next_Terminal return Base_Token
+      is begin
+         Terminals_Current    := Terminals_Current + 1;
+         loop
+            exit when not Prev_Deleted.Contains (Terminals_Current);
+            Terminals_Current := Terminals_Current + 1;
+         end loop;
+
+         Restore_Terminals_Current := Terminals_Current;
+         return Terminals (Terminals_Current);
+      end Next_Terminal;
+
+   begin
+      loop
+         if Insert_Delete.Last_Index > 0 and then Current_Insert_Delete = 
Insert_Delete.Last_Index then
+            Current_Insert_Delete     := No_Insert_Delete;
+            Insert_Delete.Clear;
+            return Next_Terminal;
+
+         elsif Current_Insert_Delete = No_Insert_Delete then
+            return Next_Terminal;
+
+         elsif Token_Index (Insert_Delete (Current_Insert_Delete + 1)) = 
Terminals_Current + 1 then
+            Current_Insert_Delete := Current_Insert_Delete + 1;
+            declare
+               Op : constant Insert_Delete_Op := Insert_Delete 
(Current_Insert_Delete);
+            begin
+               case Insert_Delete_Op_Label'(Op.Op) is
+               when Insert =>
+                  return (ID => Op.Ins_ID, others => <>);
+
+               when Delete =>
+                  Terminals_Current         := Terminals_Current + 1;
+                  Restore_Terminals_Current := Terminals_Current;
+               end case;
+            end;
+
+         else
+            return Next_Terminal;
+         end if;
+      end loop;
+   end Next_Token;
+
+   procedure Push_Back (Config : in out Configuration)
+   is
+      Item        : constant Recover_Stack_Item := Config.Stack.Pop;
+      Token_Index : constant Base_Token_Index   := 
Item.Token.Min_Terminal_Index;
+
+      function Compare (Left : in Base_Token_Index; Right : in Config_Op) 
return Boolean
+        is (case Right.Op is
+            when Fast_Forward    => False,
+            when Undo_Reduce     => False,
+            when Push_Back       => False,
+            when Insert => Left < Right.Ins_Token_Index,
+            when Delete => Left < Right.Del_Token_Index);
+      --  If Left = Right.Token_Index, we assume the Right ops go _after_
+      --  the Left, so the Left do not need to be repeated.
+   begin
+      if Token_Index /= Invalid_Token_Index then
+         Config.Current_Shared_Token := Token_Index;
+         for I in Config.Ops.First_Index .. Config.Ops.Last_Index loop
+            if Compare (Token_Index, Config.Ops (I)) then
+               Config.Insert_Delete.Insert (Config.Ops (I), Ignore_If_Equal => 
True);
+            end if;
+         end loop;
+      end if;
+
+      Config.Ops.Append ((Push_Back, Item.Token.ID, 
Config.Current_Shared_Token));
+   exception
+   when SAL.Container_Full =>
+      raise Bad_Config;
+   end Push_Back;
+
+   procedure Push_Back_Check (Config : in out Configuration; Expected_ID : in 
Token_ID)
+   is begin
+      Check (Config.Stack (1).Token.ID, Expected_ID);
+      Push_Back (Config);
+   end Push_Back_Check;
+
+   procedure Push_Back_Check (Config : in out Configuration; Expected : in 
Token_ID_Array)
+   is begin
+      for ID of Expected loop
+         Push_Back_Check (Config, ID);
+      end loop;
+   end Push_Back_Check;
+
+   procedure Put
+     (Message      : in     String;
+      Trace        : in out WisiToken.Trace'Class;
+      Parser_Label : in     Natural;
+      Terminals    : in     Base_Token_Arrays.Vector;
+      Config       : in     Configuration;
+      Task_ID      : in     Boolean := True;
+      Strategy     : in     Boolean := False)
+   is
+      --  For debugging output
+
+      --  Build a string, call trace.put_line once, so output from multiple
+      --  tasks is not interleaved (mostly).
+      use all type Ada.Strings.Unbounded.Unbounded_String;
+      use all type SAL.Base_Peek_Type;
+      use all type WisiToken.Semantic_Checks.Check_Status_Label;
+
+      Descriptor : WisiToken.Descriptor renames Trace.Descriptor.all;
+
+      Result : Ada.Strings.Unbounded.Unbounded_String :=
+        (if Task_ID then +"task" & Task_Attributes.Value'Image else +"") &
+        Integer'Image (Parser_Label) & ": " &
+        (if Message'Length > 0 then Message & ":" else "");
+   begin
+      Result := Result & Natural'Image (Config.Cost);
+      if Strategy or Trace_McKenzie > Extra then
+         Result := Result & ", (";
+         for C of Config.Strategy_Counts loop
+            Result := Result & Integer'Image (C);
+         end loop;
+         Result := Result & "), ";
+      else
+         Result := Result & ", ";
+      end if;
+      if Config.Check_Status.Label /= Ok then
+         Result := Result & Semantic_Checks.Check_Status_Label'Image 
(Config.Check_Status.Label) & " ";
+      elsif Config.Error_Token.ID /= Invalid_Token_ID then
+         Result := Result & "Error " & Image (Config.Error_Token, Descriptor) 
& " ";
+      end if;
+      Result := Result & Image (Config.Stack, Descriptor, Depth => 1);
+
+      if Config.Current_Insert_Delete = No_Insert_Delete then
+         Result := Result & "|" & Image (Config.Current_Shared_Token, 
Terminals, Descriptor) & "|";
+      else
+         Result := Result & "/" & Trimmed_Image (Config.Current_Insert_Delete) 
& ":" &
+           Image (Config.Insert_Delete (Config.Current_Insert_Delete), 
Descriptor) & "/";
+      end if;
+
+      Result := Result & Image (Config.Ops, Descriptor);
+      if Config.Minimal_Complete_State /= None then
+         Result := Result & " minimal_complete " & 
Config.Minimal_Complete_State'Image;
+      end if;
+      Trace.Put_Line (-Result);
+   end Put;
+
+   procedure Put_Line
+     (Trace        : in out WisiToken.Trace'Class;
+      Parser_Label : in     Natural;
+      Message      : in     String;
+      Task_ID      : in     Boolean := True)
+   is begin
+      Trace.Put_Line
+        ((if Task_ID then "task" & Task_Attributes.Value'Image else "") &
+           Integer'Image (Parser_Label) & ": " & Message);
+   end Put_Line;
+
+   function Undo_Reduce
+     (Stack : in out Recover_Stacks.Stack;
+      Tree  : in     Syntax_Trees.Tree)
+     return Ada.Containers.Count_Type
+   is
+      Nonterm_Item : constant Recover_Stack_Item := Stack.Pop;
+   begin
+      if Nonterm_Item.Token.Byte_Region = Null_Buffer_Region then
+         return 0;
+      end if;
+      declare
+         Children : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Nonterm_Item.Tree_Index);
+      begin
+         for C of Children loop
+            Stack.Push ((Tree.State (C), C, Tree.Recover_Token (C)));
+         end loop;
+         return Children'Length;
+      end;
+   end Undo_Reduce;
+
+   procedure Undo_Reduce_Check
+     (Config   : in out Configuration;
+      Tree     : in     Syntax_Trees.Tree;
+      Expected : in     Token_ID)
+   is begin
+      Check (Config.Stack (1).Token.ID, Expected);
+      Config.Ops.Append ((Undo_Reduce, Expected, Undo_Reduce (Config.Stack, 
Tree)));
+   exception
+   when SAL.Container_Full =>
+      raise Bad_Config;
+   end Undo_Reduce_Check;
+
+   procedure Undo_Reduce_Check
+     (Config   : in out Configuration;
+      Tree     : in     Syntax_Trees.Tree;
+      Expected : in     Token_ID_Array)
+   is begin
+      for ID of Expected loop
+         Undo_Reduce_Check (Config, Tree, ID);
+      end loop;
+   end Undo_Reduce_Check;
+
+end WisiToken.Parse.LR.McKenzie_Recover;
diff --git a/packages/wisi/wisitoken-parse-lr-mckenzie_recover.ads 
b/packages/wisi/wisitoken-parse-lr-mckenzie_recover.ads
index eba872a..b143866 100644
--- a/packages/wisi/wisitoken-parse-lr-mckenzie_recover.ads
+++ b/packages/wisi/wisitoken-parse-lr-mckenzie_recover.ads
@@ -1,227 +1,273 @@
---  Abstract :
---
---  Implement [McKenzie] error recovery, extended to parallel parsers.
---
---  References:
---
---  [McKenzie] McKenzie, Bruce J., Yeatman, Corey, and De Vere,
---  Lorraine. Error repair in shift reduce parsers. ACM Trans. Prog.
---  Lang. Syst., 17(4):672-689, July 1995.  Described in [Grune 2008] ref 321.
---
---  [Grune 2008] Parsing Techniques, A Practical Guide, Second
---  Edition. Dick Grune, Ceriel J.H. Jacobs.
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
---
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Parse.LR.Parser;
-with WisiToken.Lexer;
-package WisiToken.Parse.LR.McKenzie_Recover is
-
-   Bad_Config : exception;
-   --  Raised when a config is determined to violate some programming
-   --  convention; abandon it.
-
-   type Recover_Status is
-     (Fail_Check_Delta, Fail_Enqueue_Limit, Fail_Cost, Fail_No_Configs_Left, 
Fail_Programmer_Error,
-      Success);
-
-   function Recover (Shared_Parser : in out WisiToken.Parse.LR.Parser.Parser) 
return Recover_Status;
-   --  Attempt to modify Parser.Parsers state and Parser.Lookahead to
-   --  allow recovering from an error state.
-
-   Force_Full_Explore        : Boolean := False;
-   --  Sometimes recover throws an exception in a race condition case
-   --  that is hard to reproduce. Setting this True ignores all Success,
-   --  so all configs are checked.
-
-   Force_High_Cost_Solutions : Boolean := False;
-   --  Similarly, setting this true keeps all solutions that are found,
-   --  and forces at least three.
-
-private
-
-   ----------
-   --  Visible for language-specific child packages. Alphabetical.
-
-   procedure Check (ID : Token_ID; Expected_ID : in Token_ID)
-   with Inline => True;
-   --  Check that ID = Expected_ID; raise Assertion_Error if not.
-   --  Implemented using 'pragma Assert'.
-
-   function Current_Token
-     (Terminals                 : in     Base_Token_Arrays.Vector;
-      Terminals_Current         : in out Base_Token_Index;
-      Restore_Terminals_Current :    out WisiToken.Base_Token_Index;
-      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
-      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
-     return Base_Token;
-   --  Return the current token, from either Terminals or Insert_Delete;
-   --  set up for Next_Token.
-   --
-   --  See Next_Token for more info.
-
-   procedure Current_Token_ID_Peek_2
-     (Terminals             : in     Base_Token_Arrays.Vector;
-      Terminals_Current     : in     Base_Token_Index;
-      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete : in     SAL.Base_Peek_Type;
-      Prev_Deleted          : in     Recover_Token_Index_Arrays.Vector;
-      Current_Token         :    out Token_ID;
-      Next_Token            :    out Token_ID);
-   --  Return the current token, from either Terminals or Insert_Delete,
-   --  without setting up for Next_Token.
-
-   procedure Delete (Config : in out Configuration; ID : in Token_ID);
-   --  Append a Delete op to Config.Ops, and insert it in
-   --  Config.Insert_Deleted in token_index order.
-
-   procedure Find_ID
-     (Config         : in     Configuration;
-      ID             : in     Token_ID;
-      Matching_Index : in out SAL.Peek_Type);
-   --  Search Config.Stack for a token with ID, starting at
-   --  Matching_Index. If found, Matching_Index points to it.
-   --  If not found, Matching_Index = Config.Stack.Depth.
-
-   procedure Find_ID
-     (Config         : in     Configuration;
-      IDs            : in     Token_ID_Set;
-      Matching_Index : in out SAL.Peek_Type);
-   --  Search Config.Stack for a token with ID in IDs, starting at
-   --  Matching_Index. If found, Matching_Index points to it.
-   --  If not found, Matching_Index = Config.Stack.Depth.
-
-   procedure Find_Descendant_ID
-     (Tree           : in     Syntax_Trees.Tree;
-      Config         : in     Configuration;
-      ID             : in     Token_ID;
-      ID_Set         : in     Token_ID_Set;
-      Matching_Index : in out SAL.Peek_Type);
-   --  Search Config.Stack for a token with id in ID_Set, with a
-   --  descendant with id = ID, starting at Matching_Index. If found,
-   --  Matching_Index points to it. If not found, Matching_Index =
-   --  Config.Stack.Depth.
-
-   procedure Find_Matching_Name
-     (Config              : in     Configuration;
-      Lexer               : access constant WisiToken.Lexer.Instance'Class;
-      Name                : in     String;
-      Matching_Name_Index : in out SAL.Peek_Type;
-      Case_Insensitive    : in     Boolean);
-   --  Search Config.Stack for a token matching Name, starting at
-   --  Matching_Name_Index. If found, Matching_Name_Index points to it.
-   --  If not found, Matching_Name_Index = Config.Stack.Depth.
-
-   procedure Find_Matching_Name
-     (Config              : in     Configuration;
-      Lexer               : access constant WisiToken.Lexer.Instance'Class;
-      Name                : in     String;
-      Matching_Name_Index : in out SAL.Peek_Type;
-      Other_ID            : in     Token_ID;
-      Other_Count         :    out Integer;
-      Case_Insensitive    : in     Boolean);
-   --  Search Config.Stack for a token matching Name, starting at
-   --  Matching_Name_Index. If found, Matching_Name_Index points to it.
-   --  If not found, Matching_Name_Index = Config.Stack.Depth.
-   --
-   --  Also count tokens with ID = Other_ID.
-
-   procedure Insert (Config : in out Configuration; ID : in Token_ID);
-   --  Append an Insert op to Config.Ops, and insert it in
-   --  Config.Insert_Deleted in token_index order.
-
-   procedure Insert (Config : in out Configuration; IDs : in Token_ID_Array);
-   --  Call Insert for each item in IDs.
-
-   function Next_Token
-     (Terminals                 : in     Base_Token_Arrays.Vector;
-      Terminals_Current         : in out Base_Token_Index;
-      Restore_Terminals_Current : in out WisiToken.Base_Token_Index;
-      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
-      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
-      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
-     return Base_Token;
-   --  Return the next token, from either Terminals or Insert_Delete;
-   --  update Terminals_Current or Current_Insert_Delete.
-   --
-   --  If result is Insert_Delete.Last_Index, Current_Insert_Delete =
-   --  Last_Index; Insert_Delete is cleared and Current_Insert_Delete
-   --  reset on next call.
-   --
-   --  When done parsing, reset actual Terminals_Current to
-   --  Restore_Terminals_Current.
-   --
-   --  Insert_Delete contains only Insert and Delete ops, in token_index
-   --  order. Those ops are applied when Terminals_Current =
-   --  op.token_index.
-   --
-   --  Prev_Deleted contains tokens deleted in previous recover
-   --  operations; those are skipped.
-
-   procedure Push_Back (Config : in out Configuration);
-   --  Pop the top Config.Stack item, set Config.Current_Shared_Token to
-   --  the first terminal in that item. If the item is empty,
-   --  Config.Current_Shared_Token is unchanged.
-   --
-   --  If any earlier Insert or Delete items in Config.Ops are for a
-   --  token_index after that first terminal, they are added to
-   --  Config.Insert_Delete in token_index order.
-
-   procedure Push_Back_Check (Config : in out Configuration; Expected_ID : in 
Token_ID);
-   --  In effect, call Check and Push_Back.
-
-   procedure Push_Back_Check (Config : in out Configuration; Expected : in 
Token_ID_Array);
-   --  Call Push_Back_Check for each item in Expected.
-
-   procedure Put
-     (Message      : in     String;
-      Trace        : in out WisiToken.Trace'Class;
-      Parser_Label : in     Natural;
-      Terminals    : in     Base_Token_Arrays.Vector;
-      Config       : in     Configuration;
-      Task_ID      : in     Boolean := True);
-   --  Put Message and an image of Config to Trace.
-
-   procedure Put_Line
-     (Trace        : in out WisiToken.Trace'Class;
-      Parser_Label : in     Natural;
-      Message      : in     String;
-      Task_ID      : in     Boolean := True);
-   --  Put message to Trace, with parser and task info.
-
-   function Undo_Reduce
-     (Stack : in out Recover_Stacks.Stack;
-      Tree  : in     Syntax_Trees.Tree)
-     return Ada.Containers.Count_Type
-   with Pre => Tree.Is_Nonterm (Stack (1).Tree_Index);
-   --  Undo the reduction that produced the top stack item, return the
-   --  token count for that reduction.
-
-   procedure Undo_Reduce_Check
-     (Config   : in out Configuration;
-      Tree     : in     Syntax_Trees.Tree;
-      Expected : in     Token_ID)
-   with Inline => True;
-   --  Call Check, Undo_Reduce.
-
-   procedure Undo_Reduce_Check
-     (Config   : in out Configuration;
-      Tree     : in     Syntax_Trees.Tree;
-      Expected : in     Token_ID_Array);
-   --  Call Undo_Reduce_Check for each item in Expected.
-
-end WisiToken.Parse.LR.McKenzie_Recover;
+--  Abstract :
+--
+--  Implement [McKenzie] error recovery, extended to parallel parsers.
+--
+--  References:
+--
+--  [McKenzie] McKenzie, Bruce J., Yeatman, Corey, and De Vere,
+--  Lorraine. Error repair in shift reduce parsers. ACM Trans. Prog.
+--  Lang. Syst., 17(4):672-689, July 1995.  Described in [Grune 2008] ref 321.
+--
+--  [Grune 2008] Parsing Techniques, A Practical Guide, Second
+--  Edition. Dick Grune, Ceriel J.H. Jacobs.
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Task_Attributes;
+with WisiToken.Parse.LR.Parser;
+with WisiToken.Lexer;
+package WisiToken.Parse.LR.McKenzie_Recover is
+
+   Bad_Config : exception;
+   --  Raised when a config is determined to violate some programming
+   --  convention; abandon it.
+
+   type Recover_Status is (Fail_Check_Delta, Fail_Enqueue_Limit, 
Fail_No_Configs_Left, Fail_Programmer_Error, Success);
+
+   function Recover (Shared_Parser : in out WisiToken.Parse.LR.Parser.Parser) 
return Recover_Status;
+   --  Attempt to modify Parser.Parsers state and Parser.Lookahead to
+   --  allow recovering from an error state.
+
+   Force_Full_Explore        : Boolean := False;
+   --  Sometimes recover throws an exception in a race condition case
+   --  that is hard to reproduce. Setting this True ignores all Success,
+   --  so all configs are checked.
+
+   Force_High_Cost_Solutions : Boolean := False;
+   --  Similarly, setting this true keeps all solutions that are found,
+   --  and forces at least three.
+
+private
+   use all type WisiToken.Syntax_Trees.Node_Index;
+
+   ----------
+   --  Visible for language-specific child packages. Alphabetical.
+
+   procedure Check (ID : Token_ID; Expected_ID : in Token_ID)
+   with Inline => True;
+   --  Check that ID = Expected_ID; raise Assertion_Error if not.
+   --  Implemented using 'pragma Assert'.
+
+   function Current_Token
+     (Terminals                 : in     Base_Token_Arrays.Vector;
+      Terminals_Current         : in out Base_Token_Index;
+      Restore_Terminals_Current :    out WisiToken.Base_Token_Index;
+      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
+      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
+     return Base_Token;
+   --  Return the current token, from either Terminals or Insert_Delete;
+   --  set up for Next_Token.
+   --
+   --  See Next_Token for more info.
+
+   function Current_Token_ID_Peek
+     (Terminals             : in     Base_Token_Arrays.Vector;
+      Terminals_Current     : in     Base_Token_Index;
+      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete : in     SAL.Base_Peek_Type)
+     return Token_ID;
+   --  Return the current token from either Terminals or
+   --  Insert_Delete, without setting up for Next_Token.
+
+   procedure Current_Token_ID_Peek_3
+     (Terminals             : in     Base_Token_Arrays.Vector;
+      Terminals_Current     : in     Base_Token_Index;
+      Insert_Delete         : in     Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete : in     SAL.Base_Peek_Type;
+      Prev_Deleted          : in     Recover_Token_Index_Arrays.Vector;
+      Tokens                :    out Token_ID_Array_1_3);
+   --  Return the current token (in Tokens (1)) from either Terminals or
+   --  Insert_Delete, without setting up for Next_Token. Return the two
+   --  following tokens in Tokens (2 .. 3).
+
+   procedure Delete_Check
+     (Terminals : in     Base_Token_Arrays.Vector;
+      Config    : in out Configuration;
+      ID        : in     Token_ID);
+   --  Check that Terminals (Config.Current_Shared_Token) = ID. Append a
+   --  Delete op to Config.Ops, and insert it in Config.Insert_Delete in
+   --  token_index order.
+   --
+   --  This or the next routine must be used instead of Config.Ops.Append
+   --  (Delete...) unless the code also takes care of changing
+   --  Config.Current_Shared_Token. Note that this routine does _not_
+   --  increment Config.Current_Shared_Token, so it can only be used to
+   --  delete one token.
+
+   procedure Delete_Check
+     (Terminals : in     Base_Token_Arrays.Vector;
+      Config    : in out Configuration;
+      Index     : in out     WisiToken.Token_Index;
+      ID        : in     Token_ID);
+   --  Check that Terminals (Index) = ID. Append a Delete op to
+   --  Config.Ops, and insert it in Config.Insert_Delete in token_index
+   --  order. Increments Index, for convenience when deleting several
+   --  tokens.
+
+   procedure Find_ID
+     (Config         : in     Configuration;
+      ID             : in     Token_ID;
+      Matching_Index : in out SAL.Peek_Type);
+   --  Search Config.Stack for a token with ID, starting at
+   --  Matching_Index. If found, Matching_Index points to it.
+   --  If not found, Matching_Index = Config.Stack.Depth.
+
+   procedure Find_ID
+     (Config         : in     Configuration;
+      IDs            : in     Token_ID_Set;
+      Matching_Index : in out SAL.Peek_Type);
+   --  Search Config.Stack for a token with ID in IDs, starting at
+   --  Matching_Index. If found, Matching_Index points to it.
+   --  If not found, Matching_Index = Config.Stack.Depth.
+
+   procedure Find_Descendant_ID
+     (Tree           : in     Syntax_Trees.Tree;
+      Config         : in     Configuration;
+      ID             : in     Token_ID;
+      ID_Set         : in     Token_ID_Set;
+      Matching_Index : in out SAL.Peek_Type);
+   --  Search Config.Stack for a token with id in ID_Set, with a
+   --  descendant with id = ID, starting at Matching_Index. If found,
+   --  Matching_Index points to it. If not found, Matching_Index =
+   --  Config.Stack.Depth.
+
+   procedure Find_Matching_Name
+     (Config              : in     Configuration;
+      Lexer               : access constant WisiToken.Lexer.Instance'Class;
+      Name                : in     String;
+      Matching_Name_Index : in out SAL.Peek_Type;
+      Case_Insensitive    : in     Boolean);
+   --  Search Config.Stack for a token matching Name, starting at
+   --  Matching_Name_Index. If found, Matching_Name_Index points to it.
+   --  If not found, Matching_Name_Index = Config.Stack.Depth.
+
+   procedure Find_Matching_Name
+     (Config              : in     Configuration;
+      Lexer               : access constant WisiToken.Lexer.Instance'Class;
+      Name                : in     String;
+      Matching_Name_Index : in out SAL.Peek_Type;
+      Other_ID            : in     Token_ID;
+      Other_Count         :    out Integer;
+      Case_Insensitive    : in     Boolean);
+   --  Search Config.Stack for a token matching Name, starting at
+   --  Matching_Name_Index. If found, Matching_Name_Index points to it.
+   --  If not found, Matching_Name_Index = Config.Stack.Depth.
+   --
+   --  Also count tokens with ID = Other_ID.
+
+   procedure Insert (Config : in out Configuration; ID : in Token_ID);
+   --  Append an Insert op to Config.Ops, and insert it in
+   --  Config.Insert_Deleted in token_index order.
+
+   procedure Insert (Config : in out Configuration; IDs : in Token_ID_Array);
+   --  Call Insert for each item in IDs.
+
+   function Next_Token
+     (Terminals                 : in     Base_Token_Arrays.Vector;
+      Terminals_Current         : in out Base_Token_Index;
+      Restore_Terminals_Current : in out WisiToken.Base_Token_Index;
+      Insert_Delete             : in out Sorted_Insert_Delete_Arrays.Vector;
+      Current_Insert_Delete     : in out SAL.Base_Peek_Type;
+      Prev_Deleted              : in     Recover_Token_Index_Arrays.Vector)
+     return Base_Token;
+   --  Return the next token, from either Terminals or Insert_Delete;
+   --  update Terminals_Current or Current_Insert_Delete.
+   --
+   --  If result is Insert_Delete.Last_Index, Current_Insert_Delete =
+   --  Last_Index; Insert_Delete is cleared and Current_Insert_Delete
+   --  reset on next call.
+   --
+   --  When done parsing, caller must reset actual Terminals_Current to
+   --  Restore_Terminals_Current.
+   --
+   --  Insert_Delete contains only Insert and Delete ops, in token_index
+   --  order. Those ops are applied when Terminals_Current =
+   --  op.token_index.
+   --
+   --  Prev_Deleted contains tokens deleted in previous recover
+   --  operations; those are skipped.
+
+   procedure Push_Back (Config : in out Configuration);
+   --  Pop the top Config.Stack item, set Config.Current_Shared_Token to
+   --  the first terminal in that item. If the item is empty,
+   --  Config.Current_Shared_Token is unchanged.
+   --
+   --  If any earlier Insert or Delete items in Config.Ops are for a
+   --  token_index after that first terminal, they are added to
+   --  Config.Insert_Delete in token_index order.
+
+   procedure Push_Back_Check (Config : in out Configuration; Expected_ID : in 
Token_ID);
+   --  In effect, call Check and Push_Back.
+
+   procedure Push_Back_Check (Config : in out Configuration; Expected : in 
Token_ID_Array);
+   --  Call Push_Back_Check for each item in Expected.
+
+   procedure Put
+     (Message      : in     String;
+      Trace        : in out WisiToken.Trace'Class;
+      Parser_Label : in     Natural;
+      Terminals    : in     Base_Token_Arrays.Vector;
+      Config       : in     Configuration;
+      Task_ID      : in     Boolean := True;
+      Strategy     : in     Boolean := False);
+   --  Put Message and an image of Config to Trace.
+
+   procedure Put_Line
+     (Trace        : in out WisiToken.Trace'Class;
+      Parser_Label : in     Natural;
+      Message      : in     String;
+      Task_ID      : in     Boolean := True);
+   --  Put message to Trace, with parser and task info.
+
+   function Undo_Reduce_Valid
+     (Stack : in out Recover_Stacks.Stack;
+      Tree  : in     Syntax_Trees.Tree)
+     return Boolean
+     is ((Stack.Peek.Tree_Index /= WisiToken.Syntax_Trees.Invalid_Node_Index 
and then
+            Tree.Is_Nonterm (Stack.Peek.Tree_Index)) or
+           (Stack.Peek.Tree_Index = WisiToken.Syntax_Trees.Invalid_Node_Index 
and
+              (not Stack.Peek.Token.Virtual and
+                 Stack.Peek.Token.Byte_Region = Null_Buffer_Region)));
+   --  Undo_Reduce needs to know what tokens the nonterm contains, to
+   --  push them on the stack. Thus we need either a valid Tree index, or
+   --  an empty nonterm. If Token.Virtual, we can't trust
+   --  Token.Byte_Region to determine empty.
+
+   function Undo_Reduce
+     (Stack : in out Recover_Stacks.Stack;
+      Tree  : in     Syntax_Trees.Tree)
+     return Ada.Containers.Count_Type
+   with Pre => Undo_Reduce_Valid (Stack, Tree);
+   --  Undo the reduction that produced the top stack item, return the
+   --  token count for that reduction.
+
+   procedure Undo_Reduce_Check
+     (Config   : in out Configuration;
+      Tree     : in     Syntax_Trees.Tree;
+      Expected : in     Token_ID)
+   with Inline => True;
+   --  Call Check, Undo_Reduce.
+
+   procedure Undo_Reduce_Check
+     (Config   : in out Configuration;
+      Tree     : in     Syntax_Trees.Tree;
+      Expected : in     Token_ID_Array);
+   --  Call Undo_Reduce_Check for each item in Expected.
+
+   package Task_Attributes is new Ada.Task_Attributes (Integer, 0);
+
+end WisiToken.Parse.LR.McKenzie_Recover;
diff --git a/packages/wisi/wisitoken-parse-lr-parser.adb 
b/packages/wisi/wisitoken-parse-lr-parser.adb
index 09df9ed..986675d 100644
--- a/packages/wisi/wisitoken-parse-lr-parser.adb
+++ b/packages/wisi/wisitoken-parse-lr-parser.adb
@@ -1,1121 +1,1161 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under the terms of the GNU General Public License
---  as published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. The WisiToken package is
---  distributed in the hope that it will be useful, but WITHOUT ANY
---  WARRANTY; without even the implied warranty of MERCHANTABILITY or
---  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
---  License for more details. You should have received a copy of the
---  GNU General Public License distributed with the WisiToken package;
---  see file GPL.txt. If not, write to the Free Software Foundation,
---  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
---  As a special exception, if other files instantiate generics from
---  this unit, or you link this unit with other files to produce an
---  executable, this unit does not by itself cause the resulting
---  executable to be covered by the GNU General Public License. This
---  exception does not however invalidate any other reasons why the
---  executable file might be covered by the GNU Public License.
-
-pragma License (Modified_GPL);
-
-with Ada.Calendar.Formatting;
-with Ada.Exceptions;
-with GNAT.Traceback.Symbolic;
-with WisiToken.Parse.LR.McKenzie_Recover;
-package body WisiToken.Parse.LR.Parser is
-
-   function Reduce_Stack_1
-     (Current_Parser : in     Parser_Lists.Cursor;
-      Action         : in     Reduce_Action_Rec;
-      Nonterm        :    out WisiToken.Syntax_Trees.Valid_Node_Index;
-      Lexer          : in     WisiToken.Lexer.Handle;
-      Trace          : in out WisiToken.Trace'Class)
-     return WisiToken.Semantic_Checks.Check_Status_Label
-   is
-      --  We treat semantic check errors as parse errors here, to allow
-      --  error recovery to take better advantage of them. One recovery
-      --  strategy is to fix things so the semantic check passes.
-
-      use all type SAL.Base_Peek_Type;
-      use all type Semantic_Checks.Check_Status_Label;
-      use all type Semantic_Checks.Semantic_Check;
-
-      Parser_State  : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
-      Children_Tree : Syntax_Trees.Valid_Node_Index_Array (1 .. 
SAL.Base_Peek_Type (Action.Token_Count));
-   begin
-      for I in reverse Children_Tree'Range loop
-         Children_Tree (I) := Parser_State.Stack.Pop.Token;
-      end loop;
-
-      Nonterm := Parser_State.Tree.Add_Nonterm
-        (Action.Production, Children_Tree, Action.Action,
-         Default_Virtual => Parser_State.Tree.Is_Virtual 
(Parser_State.Current_Token));
-      --  Computes Nonterm.Byte_Region, Virtual
-
-      if Trace_Parse > Detail then
-         Trace.Put_Line (Parser_State.Tree.Image (Nonterm, 
Trace.Descriptor.all, Include_Children => True));
-      end if;
-
-      if Action.Check = null then
-         return Ok;
-
-      else
-         declare
-            Nonterm_Token  : Recover_Token                := 
Parser_State.Tree.Recover_Token (Nonterm);
-            Children_Token : constant Recover_Token_Array := 
Parser_State.Tree.Recover_Token_Array (Children_Tree);
-            Status         : Semantic_Checks.Check_Status;
-         begin
-            Status := Action.Check (Lexer, Nonterm_Token, Children_Token, 
Recover_Active => False);
-
-            Parser_State.Tree.Set_Name_Region (Nonterm, Nonterm_Token.Name);
-
-            if Trace_Parse > Detail then
-               Trace.Put_Line ("semantic check " & Semantic_Checks.Image 
(Status, Trace.Descriptor.all));
-            end if;
-
-            case Status.Label is
-            when Ok =>
-               return Ok;
-
-            when Semantic_Checks.Error =>
-               if Parser_State.Resume_Active then
-                  --  Ignore this error; that's how McKenzie_Recover decided 
to fix it
-                  return Ok;
-
-               else
-                  Parser_State.Errors.Append
-                    ((Label          => Check,
-                      First_Terminal => Trace.Descriptor.First_Terminal,
-                      Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                      Check_Status   => Status,
-                      Recover        => (others => <>)));
-                  return Status.Label;
-               end if;
-            end case;
-         exception
-         when Partial_Parse =>
-            --  From Action.Check
-            Parser_State.Tree.Set_Root (Nonterm);
-            raise;
-         end;
-      end if;
-   end Reduce_Stack_1;
-
-   procedure Do_Action
-     (Action         : in Parse_Action_Rec;
-      Current_Parser : in Parser_Lists.Cursor;
-      Shared_Parser  : in LR.Parser.Parser)
-   is
-      use all type Semantic_Checks.Check_Status_Label;
-
-      Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-      Trace        : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-      Nonterm      : WisiToken.Syntax_Trees.Valid_Node_Index;
-      Status       : Semantic_Checks.Check_Status_Label;
-   begin
-      if Trace_Parse > Detail then
-         Trace.Put
-           (Integer'Image (Current_Parser.Label) & ": " &
-              Trimmed_Image (Parser_State.Stack.Peek.State) & ": " &
-              Parser_State.Tree.Image (Parser_State.Current_Token, 
Trace.Descriptor.all) & " : ");
-         Put (Trace, Action);
-         Trace.New_Line;
-      end if;
-
-      case Action.Verb is
-      when Shift =>
-         Current_Parser.Set_Verb (Shift);
-         Parser_State.Stack.Push ((Action.State, Parser_State.Current_Token));
-         Parser_State.Tree.Set_State (Parser_State.Current_Token, 
Action.State);
-
-      when Reduce =>
-         Status := Reduce_Stack_1 (Current_Parser, Action, Nonterm, 
Shared_Parser.Lexer, Trace);
-
-         --  Even when Reduce_Stack_1 returns Error, it did reduce the stack, 
so
-         --  push Nonterm.
-         Parser_State.Stack.Push
-           ((State    => Goto_For
-               (Table => Shared_Parser.Table.all,
-                State => Parser_State.Stack (1).State,
-                ID    => Action.Production.LHS),
-             Token    => Nonterm));
-
-         Parser_State.Tree.Set_State (Nonterm, Parser_State.Stack (1).State);
-
-         case Status is
-         when Ok =>
-            Current_Parser.Set_Verb (Reduce);
-
-            if Trace_Parse > Detail then
-               Trace.Put_Line (" ... goto state " & Trimmed_Image 
(Parser_State.Stack.Peek.State));
-            end if;
-
-         when Semantic_Checks.Error =>
-            Current_Parser.Set_Verb (Error);
-            Parser_State.Zombie_Token_Count := 1;
-         end case;
-
-      when Accept_It =>
-         case Reduce_Stack_1
-           (Current_Parser,
-            (Reduce, Action.Production, Action.Action, Action.Check, 
Action.Token_Count),
-            Nonterm, Shared_Parser.Lexer, Trace)
-         is
-         when Ok =>
-            Current_Parser.Set_Verb (Action.Verb);
-
-            Parser_State.Tree.Set_Root (Nonterm);
-
-         when Semantic_Checks.Error =>
-            Current_Parser.Set_Verb (Error);
-            Parser_State.Zombie_Token_Count := 1;
-         end case;
-
-      when Error =>
-         Current_Parser.Set_Verb (Action.Verb);
-
-         Parser_State.Zombie_Token_Count := 1;
-
-         declare
-            Expecting : constant Token_ID_Set := LR.Expecting
-              (Shared_Parser.Table.all, Parser_State.Stack.Peek.State);
-         begin
-            Parser_State.Errors.Append
-              ((Label          => LR.Action,
-                First_Terminal => Trace.Descriptor.First_Terminal,
-                Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                Error_Token    => Parser_State.Current_Token,
-                Expecting      => Expecting,
-                Recover        => (others => <>)));
-
-            if Trace_Parse > Outline then
-               Put
-                 (Trace,
-                  Integer'Image (Current_Parser.Label) & ":" &
-                    Unknown_State_Index'Image (Parser_State.Stack.Peek.State) 
& ": expecting: " &
-                    Image (Expecting, Trace.Descriptor.all));
-               Trace.New_Line;
-            end if;
-         end;
-      end case;
-   end Do_Action;
-
-   procedure Do_Deletes
-     (Shared_Parser : in out LR.Parser.Parser;
-      Parser_State  : in out Parser_Lists.Parser_State)
-   is
-      use all type SAL.Base_Peek_Type;
-   begin
-      if Trace_Parse > Extra then
-         Shared_Parser.Trace.Put_Line
-           (Integer'Image (Parser_State.Label) & ": shared_token:" & 
Token_Index'Image (Parser_State.Shared_Token) &
-              " inc_shared_token: " & Boolean'Image 
(Parser_State.Inc_Shared_Token) &
-              " recover_insert_delete: " &
-              Image (Parser_State.Recover_Insert_Delete, 
Shared_Parser.Trace.Descriptor.all));
-      end if;
-
-      loop
-         if Parser_State.Recover_Insert_Delete.Length > 0 and then
-           Parser_State.Recover_Insert_Delete.Peek.Op = Delete and then
-           Parser_State.Recover_Insert_Delete.Peek.Token_Index =
-           (if Parser_State.Inc_Shared_Token
-            then Parser_State.Shared_Token + 1
-            else Parser_State.Shared_Token)
-         then
-            Parser_State.Shared_Token     := Parser_State.Shared_Token + 1;
-            --  We don't reset Inc_Shared_Token here; only after the next 
token is
-            --  actually used.
-            Parser_State.Prev_Deleted.Append 
(Parser_State.Recover_Insert_Delete.Peek.Token_Index);
-            Parser_State.Recover_Insert_Delete.Drop;
-
-         elsif Parser_State.Prev_Deleted.Contains
-           ((if Parser_State.Inc_Shared_Token
-             then Parser_State.Shared_Token + 1
-             else Parser_State.Shared_Token))
-         then
-            Parser_State.Shared_Token := Parser_State.Shared_Token + 1;
-
-         else
-            exit;
-         end if;
-      end loop;
-   end Do_Deletes;
-
-   --  Verb: the type of parser cycle to execute;
-   --
-   --  Accept : all Parsers.Verb return Accept - done parsing.
-   --
-   --  Shift : some Parsers.Verb return Shift, all with the same current
-   --  token in Shared_Parser.Terminals.
-   --
-   --  Pause : Resume is active, and this parser has reached Resume_Goal,
-   --  so it is waiting for the others to catch up.
-   --
-   --  Reduce : some Parsers.Verb return Reduce.
-   --
-   --  Error : all Parsers.Verb return Error.
-   --
-   --  Zombie_Count: count of parsers in Error state
-   procedure Parse_Verb
-     (Shared_Parser : in out LR.Parser.Parser;
-      Verb          :    out All_Parse_Action_Verbs;
-      Zombie_Count  :    out SAL.Base_Peek_Type)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      Shift_Count   : SAL.Base_Peek_Type := 0;
-      Accept_Count  : SAL.Base_Peek_Type := 0;
-      Error_Count   : SAL.Base_Peek_Type := 0;
-      Resume_Active : Boolean            := False;
-   begin
-      Zombie_Count := 0;
-
-      for Parser_State of Shared_Parser.Parsers loop
-         case Parser_State.Verb is
-         when Pause | Shift =>
-            Do_Deletes (Shared_Parser, Parser_State);
-
-            Shift_Count := Shift_Count + 1;
-            Parser_State.Set_Verb (Shift);
-
-            if Parser_State.Resume_Active then
-               if Parser_State.Resume_Token_Goal <= Parser_State.Shared_Token 
then
-                  Parser_State.Resume_Active := False;
-                  if Trace_Parse > Detail then
-                     Shared_Parser.Trace.Put_Line (Integer'Image 
(Parser_State.Label) & ": resume_active: False");
-                  end if;
-               else
-                  Resume_Active := True;
-               end if;
-            end if;
-
-         when Reduce =>
-            Verb := Reduce;
-            return;
-
-         when Accept_It =>
-            Accept_Count := Accept_Count + 1;
-
-         when Error =>
-            if Shared_Parser.Enable_McKenzie_Recover then
-               --  This parser is waiting for others to error; they can 
continue
-               --  parsing.
-               Zombie_Count := Zombie_Count + 1;
-            else
-               Error_Count := Error_Count + 1;
-            end if;
-         end case;
-      end loop;
-
-      if Accept_Count > 0 and Shared_Parser.Parsers.Count = Accept_Count + 
Zombie_Count then
-         Verb := Accept_It;
-
-      elsif Shared_Parser.Parsers.Count = Error_Count + Zombie_Count then
-         Verb := Error;
-
-      elsif Shift_Count > 0 then
-         Verb := Shift;
-
-      else
-         raise SAL.Programmer_Error;
-      end if;
-
-      if Resume_Active then
-         for Parser_State of Shared_Parser.Parsers loop
-            if Parser_State.Verb = Shift and not Parser_State.Resume_Active 
then
-               Parser_State.Set_Verb (Pause);
-            end if;
-         end loop;
-      end if;
-   end Parse_Verb;
-
-   ----------
-   --  Public subprograms, declaration order
-
-   overriding procedure Finalize (Object : in out LR.Parser.Parser)
-   is begin
-      Free_Table (Object.Table);
-   end Finalize;
-
-   procedure New_Parser
-     (Parser                                :    out          LR.Parser.Parser;
-      Trace                                 : not null access 
WisiToken.Trace'Class;
-      Lexer                                 : in              
WisiToken.Lexer.Handle;
-      Table                                 : in              Parse_Table_Ptr;
-      Language_Fixes                        : in              
Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in              
Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set                : in              
Language_String_ID_Set_Access;
-      User_Data                             : in              
WisiToken.Syntax_Trees.User_Data_Access;
-      Max_Parallel                          : in              
SAL.Base_Peek_Type := Default_Max_Parallel;
-      Terminate_Same_State                  : in              Boolean          
  := True)
-   is
-      use all type Syntax_Trees.User_Data_Access;
-   begin
-      Parser.Lexer                               := Lexer;
-      Parser.Trace                               := Trace;
-      Parser.Table                               := Table;
-      Parser.Language_Fixes                      := Language_Fixes;
-      Parser.Language_Use_Minimal_Complete_Actions := 
Language_Use_Minimal_Complete_Actions;
-      Parser.Language_String_ID_Set              := Language_String_ID_Set;
-      Parser.User_Data                           := User_Data;
-
-      --  We can't use Table.McKenzie_Param /= Default_McKenzie_Param here,
-      --  because the discriminants are different. We also can't use just
-      --  Table.McKenzie_Param.Cost_Limit /=
-      --  Default_McKenzie_Param.Cost_Limit, because some grammars don't set
-      --  a Cost_Limit, just some other limit.
-      Parser.Enable_McKenzie_Recover :=
-        Table.McKenzie_Param.Cost_Limit /= Default_McKenzie_Param.Cost_Limit or
-          Table.McKenzie_Param.Check_Limit /= 
Default_McKenzie_Param.Check_Limit or
-          Table.McKenzie_Param.Check_Delta_Limit /= 
Default_McKenzie_Param.Check_Delta_Limit or
-          Table.McKenzie_Param.Enqueue_Limit /= 
Default_McKenzie_Param.Enqueue_Limit;
-
-      Parser.Max_Parallel         := Max_Parallel;
-      Parser.Terminate_Same_State := Terminate_Same_State;
-
-      if User_Data /= null then
-         User_Data.Set_Lexer_Terminals (Lexer, 
Parser.Terminals'Unchecked_Access);
-      end if;
-   end New_Parser;
-
-   overriding procedure Parse (Shared_Parser : aliased in out LR.Parser.Parser)
-   is
-      use all type Ada.Strings.Unbounded.Unbounded_String;
-      use all type Syntax_Trees.User_Data_Access;
-      use all type Ada.Containers.Count_Type;
-      use all type SAL.Base_Peek_Type;
-
-      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-
-      Current_Verb    : All_Parse_Action_Verbs;
-      Error_Recovered : Boolean := False;
-      Current_Parser  : Parser_Lists.Cursor;
-      Action          : Parse_Action_Node_Ptr;
-      Zombie_Count    : SAL.Base_Peek_Type;
-
-      procedure Check_Error (Check_Parser : in out Parser_Lists.Cursor)
-      is begin
-         if Check_Parser.Verb = Error then
-            --  This parser errored on last input. This is how grammar 
conflicts
-            --  are resolved when the input text is valid, in which case we 
should
-            --  just terminate this parser. However, this may be due to invalid
-            --  input text, so we keep the parser alive but suspended for a few
-            --  tokens, to see if the other parsers also error, in which case 
they
-            --  all participate in error recovery.
-
-            --  We do not create zombie parsers during resume.
-            if not Check_Parser.State_Ref.Resume_Active then
-               --  Parser is now a zombie
-               if Trace_Parse > Detail then
-                  Trace.Put_Line (Integer'Image (Check_Parser.Label) & ": 
zombie");
-               end if;
-               Check_Parser.Next;
-
-            else
-               if Shared_Parser.Parsers.Count = 1 then
-                  if Trace_Parse > Outline then
-                     Trace.Put_Line (Integer'Image (Check_Parser.Label) & ": 
error during resume");
-                  end if;
-                  Shared_Parser.Parsers.First_State_Ref.Errors.Append
-                    ((Label          => LR.Message,
-                      First_Terminal => Trace.Descriptor.First_Terminal,
-                      Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                      Recover        => <>,
-                      Msg            => +"error during resume"));
-                  raise Syntax_Error;
-
-               else
-                  --  This is ok if a conflict occured during resume - we 
assume this is
-                  --  a branch that failed during recover as well. Otherwise 
it's a
-                  --  programmer error.
-                  if Check_Parser.State_Ref.Conflict_During_Resume then
-                     Shared_Parser.Parsers.Terminate_Parser
-                       (Check_Parser, "error in conflict during resume", 
Shared_Parser.Trace.all,
-                        Shared_Parser.Terminals);
-                  else
-                     raise SAL.Programmer_Error with "error during resume";
-                  end if;
-               end if;
-            end if;
-         else
-            Check_Parser.Next;
-         end if;
-      end Check_Error;
-
-   begin
-      if Debug_Mode then
-         Trace.Put_Clock ("start");
-      end if;
-
-      if Shared_Parser.User_Data /= null then
-         Shared_Parser.User_Data.Reset;
-      end if;
-
-      Shared_Parser.Lex_All;
-
-      Shared_Parser.String_Quote_Checked := Invalid_Line_Number;
-      Shared_Parser.Shared_Tree.Clear;
-      Shared_Parser.Parsers              := Parser_Lists.New_List
-        (Shared_Tree => Shared_Parser.Shared_Tree'Unchecked_Access);
-
-      Shared_Parser.Parsers.First.State_Ref.Stack.Push 
((Shared_Parser.Table.State_First, others => <>));
-
-      Main_Loop :
-      loop
-         --  exit on Accept_It action or syntax error.
-
-         Parse_Verb (Shared_Parser, Current_Verb, Zombie_Count);
-
-         if Trace_Parse > Extra then
-            Trace.Put_Line ("cycle start; current_verb: " & 
Parse_Action_Verbs'Image (Current_Verb));
-         end if;
-
-         case Current_Verb is
-         when Pause =>
-            null;
-
-         when Shift =>
-            --  We just shifted a token; get the next token from
-            --  Shared_Parser.Terminals.
-
-            for Parser_State of Shared_Parser.Parsers loop
-               if Parser_State.Verb = Error then
-                  if Shared_Parser.Enable_McKenzie_Recover then
-                     Parser_State.Zombie_Token_Count := 
Parser_State.Zombie_Token_Count + 1;
-                     if Trace_Parse > Extra then
-                        Trace.Put_Line
-                          (Integer'Image (Parser_State.Label) & ": zombie (" &
-                             Token_Index'Image
-                               (Shared_Parser.Table.McKenzie_Param.Check_Limit 
- Parser_State.Zombie_Token_Count) &
-                             " tokens remaining)");
-                     end if;
-                  end if;
-
-               elsif Parser_State.Verb = Shift then
-                  if Parser_State.Recover_Insert_Delete.Length > 0 and then
-                    Parser_State.Recover_Insert_Delete.Peek.Op = Insert and 
then
-                    Parser_State.Recover_Insert_Delete.Peek.Token_Index =
-                    (if Parser_State.Inc_Shared_Token
-                     then Parser_State.Shared_Token + 1
-                     else Parser_State.Shared_Token)
-                  then
-                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
-                       (Parser_State.Recover_Insert_Delete.Get.ID);
-
-                  elsif (if Parser_State.Inc_Shared_Token
-                         then Parser_State.Shared_Token + 1
-                         else Parser_State.Shared_Token) <= 
Shared_Parser.Terminals.Last_Index
-                  then
-                     if Parser_State.Inc_Shared_Token then
-                        --  Inc_Shared_Token is only set False by 
McKenzie_Recover; see there
-                        --  for when/why. Don't increment past wisi_eoi 
(happens when input
-                        --  buffer is empty; test_mckenzie_recover.adb 
Empty_Comments).
-                        Parser_State.Shared_Token := Parser_State.Shared_Token 
+ 1;
-                     else
-                        Parser_State.Inc_Shared_Token := True;
-                     end if;
-
-                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
-                       (Parser_State.Shared_Token, Shared_Parser.Terminals);
-
-                  end if;
-
-                  if Trace_Parse > Extra then
-                     Trace.Put_Line
-                       (Integer'Image (Parser_State.Label) & ": current_token" 
& Parser_State.Tree.Image
-                          (Parser_State.Current_Token, Trace.Descriptor.all));
-                  end if;
-               end if;
-            end loop;
-
-         when Accept_It =>
-            --  All parsers accepted or are zombies.
-            declare
-               Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
-               Temp  : Parser_Lists.Cursor;
-            begin
-               if Count = 1 then
-                  --  Nothing more to do
-                  if Trace_Parse > Outline then
-                     Trace.Put_Line (Integer'Image 
(Shared_Parser.Parsers.First.Label) & ": succeed");
-                  end if;
-                  exit Main_Loop;
-
-               elsif Zombie_Count + 1 = Count then
-                  --  All but one are zombies
-                  Current_Parser := Shared_Parser.Parsers.First;
-                  loop
-                     if Current_Parser.Verb = Accept_It then
-                        if Trace_Parse > Outline then
-                           Trace.Put_Line (Integer'Image 
(Current_Parser.Label) & ": succeed with zombies");
-                        end if;
-                        Current_Parser.Next;
-                     else
-                        Temp := Current_Parser;
-                        Current_Parser.Next;
-                        Shared_Parser.Parsers.Terminate_Parser
-                          (Temp, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-                     end if;
-                     exit when Current_Parser.Is_Done;
-                  end loop;
-
-                  exit Main_Loop;
-
-               else
-                  --  More than one parser is active.
-                  declare
-                     use all type Parser_Lists.Cursor;
-                     Error_Parser_Count     : Integer := (if 
Shared_Parser.Lexer.Errors.Length > 0 then 1 else 0);
-                     Recover_Ops_Length     : Ada.Containers.Count_Type;
-                     Min_Recover_Ops_Length : Ada.Containers.Count_Type := 
Ada.Containers.Count_Type'Last;
-                     Min_Recover_Ops_Cur    : Parser_Lists.Cursor;
-                  begin
-                     Current_Parser := Shared_Parser.Parsers.First;
-                     loop
-                        if Current_Parser.Verb = Accept_It then
-                           if Current_Parser.State_Ref.Errors.Length > 0 then
-                              Error_Parser_Count := Error_Parser_Count + 1;
-                           end if;
-                           Current_Parser.Next;
-                        else
-                           Temp := Current_Parser;
-                           Current_Parser.Next;
-                           Shared_Parser.Parsers.Terminate_Parser
-                             (Temp, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-                        end if;
-                        exit when Current_Parser.Is_Done;
-                     end loop;
-
-                     if Error_Parser_Count > 0 then
-                        --  There was at least one error. We assume that 
caused the ambiguous
-                        --  parse, and we pick the parser with the minimum 
recover ops length
-                        --  to allow the parse to succeed. We terminate the 
other parsers so
-                        --  the first parser executes actions.
-                        --
-                        --  Note all surviving parsers must have the same 
error count, or only
-                        --  the one with the lowest would get here.
-                        Current_Parser := Shared_Parser.Parsers.First;
-                        loop
-                           Recover_Ops_Length := 
Current_Parser.Max_Recover_Ops_Length;
-                           if Recover_Ops_Length < Min_Recover_Ops_Length then
-                              Min_Recover_Ops_Length := Recover_Ops_Length;
-                              Min_Recover_Ops_Cur    := Current_Parser;
-                           end if;
-                           Current_Parser.Next;
-                           exit when Current_Parser.Is_Done;
-                        end loop;
-
-                        Current_Parser := Shared_Parser.Parsers.First;
-                        loop
-                           if Current_Parser = Min_Recover_Ops_Cur then
-                              Current_Parser.Next;
-                           else
-                              Temp := Current_Parser;
-                              Current_Parser.Next;
-                              Shared_Parser.Parsers.Terminate_Parser
-                                (Temp, "errors", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-                           end if;
-                           exit when Current_Parser.Is_Done;
-                        end loop;
-
-                        exit Main_Loop;
-
-                     else
-                        --  There were no previous errors. We allow the parse 
to fail, on the
-                        --  assumption that an otherwise correct input should 
not yield an
-                        --  ambiguous parse.
-                        declare
-                           Token : Base_Token renames Shared_Parser.Terminals 
(Shared_Parser.Terminals.Last_Index);
-                        begin
-                           raise WisiToken.Parse_Error with Error_Message
-                             (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
-                              "Ambiguous parse:" & SAL.Base_Peek_Type'Image 
(Count) & " parsers active.");
-                        end;
-                     end if;
-                  end;
-               end if;
-            end;
-
-         when Reduce =>
-            null;
-
-         when Error =>
-            --  All parsers errored; attempt recovery
-            declare
-               use all type McKenzie_Recover.Recover_Status;
-
-               Recover_Result : McKenzie_Recover.Recover_Status := 
McKenzie_Recover.Recover_Status'First;
-
-               Pre_Recover_Parser_Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
-            begin
-               --  Recover algorithms expect current token at
-               --  Parsers(*).Current_Token, will set
-               --  Parsers(*).Recover_Insert_Delete with new input tokens and
-               --  deletions, adjust Parsers(*).Stack, and set
-               --  Parsers(*).Current_Token and Parsers(*).Verb.
-
-               if Shared_Parser.Enable_McKenzie_Recover then
-                  if Trace_Parse > Outline then
-                     Trace.Put_Line ("recover");
-                  end if;
-                  if Debug_Mode then
-                     Trace.Put_Clock ("pre-recover" & 
Shared_Parser.Parsers.Count'Img & " active");
-                  end if;
-                  Recover_Result := McKenzie_Recover.Recover (Shared_Parser);
-                  if Debug_Mode then
-                     Trace.Put_Clock ("post-recover" & 
Shared_Parser.Parsers.Count'Img & " active");
-                  end if;
-
-                  if Trace_Parse > Outline then
-                     if Recover_Result = Success  then
-                        Trace.Put_Line
-                          ("recover: succeed, parser count" & 
SAL.Base_Peek_Type'Image (Shared_Parser.Parsers.Count));
-                     else
-                        Trace.Put_Line
-                          ("recover: fail " & 
McKenzie_Recover.Recover_Status'Image (Recover_Result) &
-                             ", parser count" & SAL.Base_Peek_Type'Image 
(Shared_Parser.Parsers.Count));
-                     end if;
-                  end if;
-
-                  if Ada.Text_IO.Is_Open (Shared_Parser.Recover_Log_File) then
-                     declare
-                        use Ada.Text_IO;
-                        Strategy_Counts : LR.Strategy_Counts := (others => 0);
-                     begin
-                        Put
-                          (Shared_Parser.Recover_Log_File,
-                           Ada.Calendar.Formatting.Image (Ada.Calendar.Clock) 
& " " &
-                             McKenzie_Recover.Recover_Status'Image 
(Recover_Result) & " " &
-                             SAL.Base_Peek_Type'Image 
(Pre_Recover_Parser_Count) & " '" &
-                             Shared_Parser.Lexer.File_Name & "'");
-
-                        Put (Shared_Parser.Recover_Log_File, '(');
-                        for Parser of Shared_Parser.Parsers loop
-                           Accumulate (Parser.Recover, Strategy_Counts);
-                           Put
-                             (Shared_Parser.Recover_Log_File,
-                              Integer'Image (Parser.Recover.Enqueue_Count) &
-                                Integer'Image (Parser.Recover.Check_Count) & " 
" &
-                                Boolean'Image (Parser.Recover.Success));
-                        end loop;
-                        Put (Shared_Parser.Recover_Log_File, ')');
-
-                        Put (Shared_Parser.Recover_Log_File, Image 
(Strategy_Counts));
-                        New_Line (Shared_Parser.Recover_Log_File);
-                        Flush (Shared_Parser.Recover_Log_File);
-                     end;
-                  end if;
-               else
-                  if Trace_Parse > Outline then
-                     Trace.Put_Line ("recover disabled");
-                  end if;
-               end if;
-
-               if Recover_Result = Success then
-                  for Parser_State of Shared_Parser.Parsers loop
-                     Parser_State.Resume_Active          := True;
-                     Parser_State.Conflict_During_Resume := False;
-
-                     if Trace_Parse > Outline then
-                        Trace.Put_Line
-                          (Integer'Image (Parser_State.Label) & ": 
Current_Token " &
-                             Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) &
-                             " Shared_Token " & Image
-                               (Parser_State.Shared_Token, 
Shared_Parser.Terminals, Trace.Descriptor.all));
-
-                        if Trace_Parse > Detail then
-                           Shared_Parser.Trace.Put_Line
-                             (Integer'Image (Parser_State.Label) & ": 
resume_active: True, token goal" &
-                                Token_Index'Image 
(Parser_State.Resume_Token_Goal));
-                        end if;
-                     end if;
-
-                     Parser_State.Zombie_Token_Count := 0;
-
-                     case Parser_State.Verb is
-                     when Reduce =>
-                        null;
-
-                     when Error =>
-                        --  Force this parser to be terminated.
-                        if Shared_Parser.Enable_McKenzie_Recover then
-                           Parser_State.Zombie_Token_Count := 
Shared_Parser.Table.McKenzie_Param.Check_Limit + 1;
-                        end if;
-
-                     when Shift =>
-                        null;
-
-                     when Pause | Accept_It =>
-                        raise SAL.Programmer_Error;
-                     end case;
-                  end loop;
-
-               else
-                  --  Terminate with error. Parser_State has all the required 
info on
-                  --  the original error (recorded by Error in Do_Action); 
report reason
-                  --  recover failed.
-                  for Parser_State of Shared_Parser.Parsers loop
-                     Parser_State.Errors.Append
-                       ((Label          => LR.Message,
-                         First_Terminal => Trace.Descriptor.First_Terminal,
-                         Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                         Recover        => <>,
-                         Msg            => +"recover: fail " & 
McKenzie_Recover.Recover_Status'Image (Recover_Result)));
-                  end loop;
-                  raise WisiToken.Syntax_Error;
-               end if;
-
-               --  Immediately execute Do_Action for Current_Token, since it 
changed
-               --  in error recovery; this sets Parser.Verb. This replaces the
-               --  execution of Do_Action that resulted in Error.
-               Error_Recovered := True;
-
-            end;
-         end case;
-
-         --  We don't use 'for Parser_State of Parsers loop' here,
-         --  because terminate on error and spawn on conflict require
-         --  changing the parser list.
-         Current_Parser := Shared_Parser.Parsers.First;
-         Action_Loop :
-         loop
-            exit Action_Loop when Current_Parser.Is_Done;
-
-            --  We don't check duplicate state during resume, because the 
tokens
-            --  inserted/deleted by error recover may cause initially duplicate
-            --  states to diverge.
-            if not Current_Parser.State_Ref.Resume_Active and
-              Shared_Parser.Terminate_Same_State and
-              Current_Verb = Shift and
-              (for all Parser of Shared_Parser.Parsers => 
Parser.Recover_Insert_Delete.Count = 0)
-            then
-               Shared_Parser.Parsers.Duplicate_State
-                 (Current_Parser, Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-               --  If Duplicate_State terminated Current_Parser, 
Current_Parser now
-               --  points to the next parser. Otherwise it is unchanged.
-            end if;
-
-            exit Action_Loop when Current_Parser.Is_Done;
-
-            if Trace_Parse > Extra then
-               if Error_Recovered then
-                  Trace.Put_Line (Integer'Image (Current_Parser.Label) & 
".error_recovered");
-               else
-                  Trace.Put_Line
-                    ("current_verb: " & Parse_Action_Verbs'Image 
(Current_Verb) &
-                       "," & Integer'Image (Current_Parser.Label) &
-                       ".verb: " & Parse_Action_Verbs'Image 
(Current_Parser.Verb));
-               end if;
-            end if;
-
-            --  Each branch of the following 'if' calls either 
Current_Parser.Free
-            --  (which advances to the next parser) or Current_Parser.Next.
-
-            if Current_Parser.Verb = Error then
-               --  This parser is a zombie; see Check_Error above.
-               --
-               --  Check to see if it is time to terminate it
-               if Shared_Parser.Enable_McKenzie_Recover and then
-                 Current_Parser.State_Ref.Zombie_Token_Count <= 
Shared_Parser.Table.McKenzie_Param.Check_Limit
-               then
-                  if Trace_Parse > Detail then
-                     Trace.Put_Line (Integer'Image (Current_Parser.Label) & ": 
zombie");
-                  end if;
-
-                  Current_Parser.Next;
-               else
-                  Shared_Parser.Parsers.Terminate_Parser
-                    (Current_Parser, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-               end if;
-
-            elsif Current_Parser.Verb = Current_Verb or Error_Recovered then
-
-               if Trace_Parse > Extra then
-                  Parser_Lists.Put_Top_10 (Trace, Current_Parser);
-               end if;
-
-               declare
-                  State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
-               begin
-                  Action := Action_For
-                    (Table => Shared_Parser.Table.all,
-                     State => State.Stack.Peek.State,
-                     ID    => State.Tree.ID (State.Current_Token));
-               end;
-
-               if Action.Next /= null then
-                  --  Conflict; spawn a new parser (before modifying 
Current_Parser
-                  --  stack).
-
-                  Current_Parser.State_Ref.Conflict_During_Resume := 
Current_Parser.State_Ref.Resume_Active;
-
-                  if Shared_Parser.Parsers.Count = Shared_Parser.Max_Parallel 
then
-                     --  If errors were recovered, terminate a parser that 
used the
-                     --  highest cost solution.
-                     declare
-                        use all type WisiToken.Parse.LR.Parser_Lists.Cursor;
-                        Max_Recover_Cost : Integer             := 0;
-                        Max_Parser       : Parser_Lists.Cursor;
-                        Cur              : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
-                     begin
-                        loop
-                           exit when Cur.Is_Done;
-                           if Cur.Total_Recover_Cost > Max_Recover_Cost then
-                              Max_Parser       := Cur;
-                              Max_Recover_Cost := Cur.Total_Recover_Cost;
-                           end if;
-                           Cur.Next;
-                        end loop;
-
-                        if Max_Recover_Cost > 0 then
-                           if Max_Parser = Current_Parser then
-                              Current_Parser.Next;
-                              Shared_Parser.Parsers.Terminate_Parser
-                                (Current_Parser, "too many parsers; max error 
repair cost", Trace,
-                                 Shared_Parser.Terminals);
-                              exit Action_Loop;
-                           else
-                              Shared_Parser.Parsers.Terminate_Parser
-                                (Max_Parser, "too many parsers; max error 
repair cost", Trace,
-                                 Shared_Parser.Terminals);
-                           end if;
-                        end if;
-                     end;
-                  end if;
-
-                  if Shared_Parser.Parsers.Count = Shared_Parser.Max_Parallel 
then
-                     declare
-                        Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-                        Token : Base_Token renames Shared_Parser.Terminals 
(Parser_State.Shared_Token);
-                     begin
-                        raise WisiToken.Parse_Error with Error_Message
-                          (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
-                           "too many parallel parsers required in grammar 
state" &
-                             State_Index'Image (Parser_State.Stack.Peek.State) 
&
-                             "; simplify grammar, or increase max-parallel (" &
-                             SAL.Base_Peek_Type'Image 
(Shared_Parser.Max_Parallel) & ")");
-                     end;
-
-                  else
-                     if Trace_Parse > Outline then
-                        declare
-                           Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-                        begin
-                           Trace.Put_Line
-                             (Integer'Image (Current_Parser.Label) & ": " &
-                                Trimmed_Image (Parser_State.Stack.Peek.State) 
& ": " &
-                                Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) & " : " &
-                                "spawn" & Integer'Image 
(Shared_Parser.Parsers.Last_Label + 1) & ", (" &
-                                Trimmed_Image (1 + Integer 
(Shared_Parser.Parsers.Count)) & " active)");
-                        end;
-                     end if;
-
-                     Shared_Parser.Parsers.Prepend_Copy (Current_Parser);
-                     Do_Action (Action.Next.Item, Shared_Parser.Parsers.First, 
Shared_Parser);
-
-                     --  We must terminate error parsers immediately in order 
to avoid
-                     --  zombie parsers during recovery.
-                     declare
-                        Temp : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
-                     begin
-                        Check_Error (Temp);
-                     end;
-                  end if;
-               end if;
-
-               Do_Action (Action.Item, Current_Parser, Shared_Parser);
-               Check_Error (Current_Parser);
-
-            else
-               --  Current parser is waiting for others to catch up
-               Current_Parser.Next;
-            end if;
-         end loop Action_Loop;
-         Error_Recovered := False;
-      end loop Main_Loop;
-      if Debug_Mode then
-         Trace.Put_Clock ("finish");
-      end if;
-
-      --  We don't raise Syntax_Error for lexer errors, since they are all
-      --  recovered, either by inserting a quote, or by ignoring the
-      --  character.
-   exception
-   when Syntax_Error | WisiToken.Parse_Error | Partial_Parse =>
-      if Debug_Mode then
-         Trace.Put_Clock ("finish - error");
-      end if;
-      raise;
-
-   when E : others =>
-      declare
-         Msg : constant String := Ada.Exceptions.Exception_Name (E) & ": " & 
Ada.Exceptions.Exception_Message (E);
-      begin
-         if Shared_Parser.Parsers.Count > 0 then
-            --  Emacs displays errors in the *syntax-errors* buffer
-            Shared_Parser.Parsers.First_State_Ref.Errors.Append
-              ((Label          => LR.Message,
-                First_Terminal => Trace.Descriptor.First_Terminal,
-                Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                Recover        => <>,
-                Msg            => +Msg));
-         end if;
-
-         if Debug_Mode then
-            Ada.Text_IO.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback 
(E));
-         end if;
-
-         --  Emacs displays the exception message in the echo area; easy to 
miss
-         raise WisiToken.Parse_Error with Msg;
-      end;
-   end Parse;
-
-   overriding function Tree (Shared_Parser : in Parser) return 
Syntax_Trees.Tree
-   is
-      use all type SAL.Base_Peek_Type;
-   begin
-      if Shared_Parser.Parsers.Count > 1 then
-         raise WisiToken.Parse_Error with "ambigous parse";
-      else
-         return Shared_Parser.Parsers.First_State_Ref.Tree;
-      end if;
-   end Tree;
-
-   overriding
-   procedure Execute_Actions (Parser : in out LR.Parser.Parser)
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Syntax_Trees.User_Data_Access;
-      use all type WisiToken.Syntax_Trees.Semantic_Action;
-
-      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-
-      procedure Process_Node
-        (Tree : in out Syntax_Trees.Tree;
-         Node : in     Syntax_Trees.Valid_Node_Index)
-      is
-         use all type Syntax_Trees.Node_Label;
-      begin
-         if Tree.Label (Node) /= Nonterm then
-            return;
-         end if;
-
-         declare
-            Tree_Children : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Node);
-         begin
-            Parser.User_Data.Reduce (Tree, Node, Tree_Children);
-            if Tree.Action (Node) /= null then
-               Tree.Action (Node) (Parser.User_Data.all, Tree, Node, 
Tree_Children);
-            end if;
-         end;
-      end Process_Node;
-
-   begin
-      if Parser.User_Data /= null then
-         if Parser.Parsers.Count > 1 then
-            raise Syntax_Error with "ambiguous parse; can't execute actions";
-         end if;
-
-         declare
-            Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_State_Ref.Element.all;
-         begin
-            if Trace_Action > Outline then
-               Parser.Trace.Put_Line
-                 (Integer'Image (Parser_State.Label) & ": root node: " & 
Parser_State.Tree.Image
-                 (Parser_State.Tree.Root, Descriptor));
-            end if;
-
-            if (for some Err of Parser_State.Errors => Any (Err.Recover.Ops, 
Delete)) then
-               for Err of Parser_State.Errors loop
-                  for Op of Err.Recover.Ops loop
-                     case Op.Op is
-                     when Delete =>
-                        Parser.User_Data.Delete_Token (Op.Token_Index);
-                     when others =>
-                        null;
-                     end case;
-                  end loop;
-               end loop;
-            end if;
-
-            Parser_State.Tree.Process_Tree (Process_Node'Access);
-         end;
-      end if;
-   end Execute_Actions;
-
-   overriding function Any_Errors (Parser : in LR.Parser.Parser) return Boolean
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Ada.Containers.Count_Type;
-      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
-   begin
-      pragma Assert (Parser_State.Tree.Flushed);
-      return Parser.Parsers.Count > 1 or Parser_State.Errors.Length > 0 or 
Parser.Lexer.Errors.Length > 0;
-   end Any_Errors;
-
-   overriding procedure Put_Errors (Parser : in LR.Parser.Parser)
-   is
-      use all type SAL.Base_Peek_Type;
-      use Ada.Text_IO;
-
-      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
-      Descriptor   : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-   begin
-      for Item of Parser.Lexer.Errors loop
-         Put_Line
-           (Current_Error,
-            Parser.Lexer.File_Name & ":0:0: lexer unrecognized character at" & 
Buffer_Pos'Image (Item.Char_Pos));
-      end loop;
-
-      for Item of Parser_State.Errors loop
-         case Item.Label is
-         when Action =>
-            declare
-               Index : constant Base_Token_Index := 
Parser_State.Tree.Min_Terminal_Index (Item.Error_Token);
-            begin
-               if Index = Invalid_Token_Index then
-                  --  Error_Token is virtual
-                  Put_Line
-                    (Current_Error,
-                     Error_Message
-                       (Parser.Lexer.File_Name, 1, 0,
-                        "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
-                          ", found " & Image (Parser_State.Tree.ID 
(Item.Error_Token), Descriptor)));
-               else
-                  declare
-                     Token : Base_Token renames Parser.Terminals (Index);
-                  begin
-                     Put_Line
-                       (Current_Error,
-                        Error_Message
-                          (Parser.Lexer.File_Name, Token.Line, Token.Column,
-                           "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
-                             ", found '" & Parser.Lexer.Buffer_Text 
(Token.Byte_Region) & "'"));
-                  end;
-               end if;
-            end;
-         when Check =>
-            Put_Line
-              (Current_Error,
-               Parser.Lexer.File_Name & ":0:0: semantic check error: " &
-                 Semantic_Checks.Image (Item.Check_Status, Descriptor));
-         when Message =>
-            Put_Line (Current_Error, -Item.Msg);
-         end case;
-
-         if Item.Recover.Stack.Depth /= 0 then
-            Put_Line (Current_Error, "   recovered: " & Image 
(Item.Recover.Ops, Descriptor));
-         end if;
-      end loop;
-   end Put_Errors;
-
-end WisiToken.Parse.LR.Parser;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under the terms of the GNU General Public License
+--  as published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. The WisiToken package is
+--  distributed in the hope that it will be useful, but WITHOUT ANY
+--  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+--  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+--  License for more details. You should have received a copy of the
+--  GNU General Public License distributed with the WisiToken package;
+--  see file GPL.txt. If not, write to the Free Software Foundation,
+--  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this unit does not by itself cause the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file might be covered by the GNU Public License.
+
+pragma License (Modified_GPL);
+
+with Ada.Calendar.Formatting;
+with Ada.Exceptions;
+with GNAT.Traceback.Symbolic;
+with WisiToken.Parse.LR.McKenzie_Recover;
+package body WisiToken.Parse.LR.Parser is
+
+   function Reduce_Stack_1
+     (Current_Parser : in     Parser_Lists.Cursor;
+      Action         : in     Reduce_Action_Rec;
+      Nonterm        :    out WisiToken.Syntax_Trees.Valid_Node_Index;
+      Lexer          : in     WisiToken.Lexer.Handle;
+      Trace          : in out WisiToken.Trace'Class)
+     return WisiToken.Semantic_Checks.Check_Status_Label
+   is
+      --  We treat semantic check errors as parse errors here, to allow
+      --  error recovery to take better advantage of them. One recovery
+      --  strategy is to fix things so the semantic check passes.
+
+      use all type SAL.Base_Peek_Type;
+      use all type Semantic_Checks.Check_Status_Label;
+      use all type Semantic_Checks.Semantic_Check;
+
+      Parser_State  : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
+      Children_Tree : Syntax_Trees.Valid_Node_Index_Array (1 .. 
SAL.Base_Peek_Type (Action.Token_Count));
+   begin
+      for I in reverse Children_Tree'Range loop
+         Children_Tree (I) := Parser_State.Stack.Pop.Token;
+      end loop;
+
+      Nonterm := Parser_State.Tree.Add_Nonterm
+        (Action.Production, Children_Tree, Action.Action,
+         Default_Virtual => Parser_State.Tree.Is_Virtual 
(Parser_State.Current_Token));
+      --  Computes Nonterm.Byte_Region, Virtual
+
+      if Trace_Parse > Detail then
+         Trace.Put_Line (Parser_State.Tree.Image (Nonterm, 
Trace.Descriptor.all, Include_Children => True));
+      end if;
+
+      if Action.Check = null then
+         return Ok;
+
+      else
+         declare
+            Nonterm_Token  : Recover_Token                := 
Parser_State.Tree.Recover_Token (Nonterm);
+            Children_Token : constant Recover_Token_Array := 
Parser_State.Tree.Recover_Token_Array (Children_Tree);
+            Status         : Semantic_Checks.Check_Status;
+         begin
+            Status := Action.Check (Lexer, Nonterm_Token, Children_Token, 
Recover_Active => False);
+
+            Parser_State.Tree.Set_Name_Region (Nonterm, Nonterm_Token.Name);
+
+            if Trace_Parse > Detail then
+               Trace.Put_Line ("semantic check " & Semantic_Checks.Image 
(Status, Trace.Descriptor.all));
+            end if;
+
+            case Status.Label is
+            when Ok =>
+               return Ok;
+
+            when Semantic_Checks.Error =>
+               if Parser_State.Resume_Active then
+                  --  Ignore this error; that's how McKenzie_Recover decided 
to fix it
+                  return Ok;
+
+               else
+                  Parser_State.Errors.Append
+                    ((Label          => Check,
+                      First_Terminal => Trace.Descriptor.First_Terminal,
+                      Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                      Check_Status   => Status,
+                      Recover        => (others => <>)));
+                  return Status.Label;
+               end if;
+            end case;
+         exception
+         when Partial_Parse =>
+            --  From Action.Check
+            Parser_State.Tree.Set_Root (Nonterm);
+            raise;
+         end;
+      end if;
+   end Reduce_Stack_1;
+
+   procedure Do_Action
+     (Action         : in Parse_Action_Rec;
+      Current_Parser : in Parser_Lists.Cursor;
+      Shared_Parser  : in LR.Parser.Parser)
+   is
+      use all type Semantic_Checks.Check_Status_Label;
+
+      Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+      Trace        : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+      Nonterm      : WisiToken.Syntax_Trees.Valid_Node_Index;
+      Status       : Semantic_Checks.Check_Status_Label;
+   begin
+      if Trace_Parse > Detail then
+         Trace.Put
+           (Integer'Image (Current_Parser.Label) & ": " &
+              Trimmed_Image (Parser_State.Stack.Peek.State) & ": " &
+              Parser_State.Tree.Image (Parser_State.Current_Token, 
Trace.Descriptor.all) & " : ");
+         Put (Trace, Action);
+         Trace.New_Line;
+      end if;
+
+      case Action.Verb is
+      when Shift =>
+         Current_Parser.Set_Verb (Shift);
+         Parser_State.Stack.Push ((Action.State, Parser_State.Current_Token));
+         Parser_State.Tree.Set_State (Parser_State.Current_Token, 
Action.State);
+
+      when Reduce =>
+         declare
+            use all type SAL.Base_Peek_Type;
+
+            New_State : constant Unknown_State_Index := Goto_For
+              (Table => Shared_Parser.Table.all,
+               State => Parser_State.Stack (SAL.Base_Peek_Type 
(Action.Token_Count) + 1).State,
+               ID    => Action.Production.LHS);
+         begin
+            if New_State = Unknown_State then
+               --  This is due to a bug in the LALR parser generator (see
+               --  lalr_generator_bug_01.wy); we treat it as a syntax error.
+               Current_Parser.Set_Verb (Error);
+               if Trace_Parse > Detail then
+                  Trace.Put_Line (" ... error");
+               end if;
+
+            else
+               Status := Reduce_Stack_1 (Current_Parser, Action, Nonterm, 
Shared_Parser.Lexer, Trace);
+
+               --  Even when Reduce_Stack_1 returns Error, it did reduce the 
stack, so
+               --  push Nonterm.
+               Parser_State.Stack.Push ((New_State, Nonterm));
+
+               Parser_State.Tree.Set_State (Nonterm, New_State);
+
+               case Status is
+               when Ok =>
+                  Current_Parser.Set_Verb (Reduce);
+
+                  if Trace_Parse > Detail then
+                     Trace.Put_Line (" ... goto state " & Trimmed_Image 
(New_State));
+                  end if;
+
+               when Semantic_Checks.Error =>
+                  Current_Parser.Set_Verb (Error);
+                  Parser_State.Zombie_Token_Count := 1;
+               end case;
+            end if;
+         end;
+
+      when Accept_It =>
+         case Reduce_Stack_1
+           (Current_Parser,
+            (Reduce, Action.Production, Action.Action, Action.Check, 
Action.Token_Count),
+            Nonterm, Shared_Parser.Lexer, Trace)
+         is
+         when Ok =>
+            Current_Parser.Set_Verb (Action.Verb);
+
+            Parser_State.Tree.Set_Root (Nonterm);
+
+         when Semantic_Checks.Error =>
+            Current_Parser.Set_Verb (Error);
+            Parser_State.Zombie_Token_Count := 1;
+         end case;
+
+      when Error =>
+         Current_Parser.Set_Verb (Action.Verb);
+
+         Parser_State.Zombie_Token_Count := 1;
+
+         declare
+            Expecting : constant Token_ID_Set := LR.Expecting
+              (Shared_Parser.Table.all, Parser_State.Stack.Peek.State);
+         begin
+            Parser_State.Errors.Append
+              ((Label          => LR.Action,
+                First_Terminal => Trace.Descriptor.First_Terminal,
+                Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                Error_Token    => Parser_State.Current_Token,
+                Expecting      => Expecting,
+                Recover        => (others => <>)));
+
+            if Trace_Parse > Outline then
+               Put
+                 (Trace,
+                  Integer'Image (Current_Parser.Label) & ":" &
+                    Unknown_State_Index'Image (Parser_State.Stack.Peek.State) 
& ": expecting: " &
+                    Image (Expecting, Trace.Descriptor.all));
+               Trace.New_Line;
+            end if;
+         end;
+      end case;
+   end Do_Action;
+
+   procedure Do_Deletes
+     (Shared_Parser : in out LR.Parser.Parser;
+      Parser_State  : in out Parser_Lists.Parser_State)
+   is
+      use all type SAL.Base_Peek_Type;
+   begin
+      if Trace_Parse > Extra then
+         Shared_Parser.Trace.Put_Line
+           (Integer'Image (Parser_State.Label) & ": shared_token:" &
+              WisiToken.Token_Index'Image (Parser_State.Shared_Token) &
+              " inc_shared_token: " & Boolean'Image 
(Parser_State.Inc_Shared_Token) &
+              " recover_insert_delete: " &
+              Image (Parser_State.Recover_Insert_Delete, 
Shared_Parser.Trace.Descriptor.all));
+      end if;
+
+      loop
+         if Parser_State.Recover_Insert_Delete.Length > 0 and then
+           Parser_State.Recover_Insert_Delete.Peek.Op = Delete and then
+           Parser_State.Recover_Insert_Delete.Peek.Del_Token_Index =
+           (if Parser_State.Inc_Shared_Token
+            then Parser_State.Shared_Token + 1
+            else Parser_State.Shared_Token)
+         then
+            Parser_State.Shared_Token     := Parser_State.Shared_Token + 1;
+            --  We don't reset Inc_Shared_Token here; only after the next 
token is
+            --  actually used.
+            Parser_State.Prev_Deleted.Append 
(Parser_State.Recover_Insert_Delete.Peek.Del_Token_Index);
+            Parser_State.Recover_Insert_Delete.Drop;
+
+         elsif Parser_State.Prev_Deleted.Contains
+           ((if Parser_State.Inc_Shared_Token
+             then Parser_State.Shared_Token + 1
+             else Parser_State.Shared_Token))
+         then
+            Parser_State.Shared_Token := Parser_State.Shared_Token + 1;
+
+         else
+            exit;
+         end if;
+      end loop;
+   end Do_Deletes;
+
+   --  Verb: the type of parser cycle to execute;
+   --
+   --  Accept : all Parsers.Verb return Accept - done parsing.
+   --
+   --  Shift : some Parsers.Verb return Shift, all with the same current
+   --  token in Shared_Parser.Terminals.
+   --
+   --  Pause : Resume is active, and this parser has reached Resume_Goal,
+   --  so it is waiting for the others to catch up.
+   --
+   --  Reduce : some Parsers.Verb return Reduce.
+   --
+   --  Error : all Parsers.Verb return Error.
+   --
+   --  Zombie_Count: count of parsers in Error state
+   procedure Parse_Verb
+     (Shared_Parser : in out LR.Parser.Parser;
+      Verb          :    out All_Parse_Action_Verbs;
+      Zombie_Count  :    out SAL.Base_Peek_Type)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      Shift_Count   : SAL.Base_Peek_Type := 0;
+      Accept_Count  : SAL.Base_Peek_Type := 0;
+      Error_Count   : SAL.Base_Peek_Type := 0;
+      Resume_Active : Boolean            := False;
+   begin
+      Zombie_Count := 0;
+
+      for Parser_State of Shared_Parser.Parsers loop
+         case Parser_State.Verb is
+         when Pause | Shift =>
+            Do_Deletes (Shared_Parser, Parser_State);
+
+            Shift_Count := Shift_Count + 1;
+            Parser_State.Set_Verb (Shift);
+
+            if Parser_State.Resume_Active then
+               if Parser_State.Resume_Token_Goal <= Parser_State.Shared_Token 
then
+                  Parser_State.Resume_Active := False;
+                  if Trace_Parse > Detail then
+                     Shared_Parser.Trace.Put_Line (Integer'Image 
(Parser_State.Label) & ": resume_active: False");
+                  end if;
+               else
+                  Resume_Active := True;
+               end if;
+            end if;
+
+         when Reduce =>
+            Verb := Reduce;
+            return;
+
+         when Accept_It =>
+            Accept_Count := Accept_Count + 1;
+
+         when Error =>
+            if Shared_Parser.Enable_McKenzie_Recover then
+               --  This parser is waiting for others to error; they can 
continue
+               --  parsing.
+               Zombie_Count := Zombie_Count + 1;
+            else
+               Error_Count := Error_Count + 1;
+            end if;
+         end case;
+      end loop;
+
+      if Accept_Count > 0 and Shared_Parser.Parsers.Count = Accept_Count + 
Zombie_Count then
+         Verb := Accept_It;
+
+      elsif Shared_Parser.Parsers.Count = Error_Count + Zombie_Count then
+         Verb := Error;
+
+      elsif Shift_Count > 0 then
+         Verb := Shift;
+
+      else
+         raise SAL.Programmer_Error;
+      end if;
+
+      if Resume_Active then
+         for Parser_State of Shared_Parser.Parsers loop
+            if Parser_State.Verb = Shift and not Parser_State.Resume_Active 
then
+               Parser_State.Set_Verb (Pause);
+            end if;
+         end loop;
+      end if;
+   end Parse_Verb;
+
+   ----------
+   --  Public subprograms, declaration order
+
+   overriding procedure Finalize (Object : in out LR.Parser.Parser)
+   is begin
+      Free_Table (Object.Table);
+   end Finalize;
+
+   procedure New_Parser
+     (Parser                         :    out          LR.Parser.Parser;
+      Trace                          : not null access WisiToken.Trace'Class;
+      Lexer                          : in              WisiToken.Lexer.Handle;
+      Table                          : in              Parse_Table_Ptr;
+      Language_Fixes                 : in              Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
Language_String_ID_Set_Access;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access;
+      Max_Parallel                   : in              SAL.Base_Peek_Type := 
Default_Max_Parallel;
+      Terminate_Same_State           : in              Boolean            := 
True)
+   is
+      use all type Syntax_Trees.User_Data_Access;
+   begin
+      Parser.Lexer                          := Lexer;
+      Parser.Trace                          := Trace;
+      Parser.Table                          := Table;
+      Parser.Language_Fixes                 := Language_Fixes;
+      Parser.Language_Matching_Begin_Tokens := Language_Matching_Begin_Tokens;
+      Parser.Language_String_ID_Set         := Language_String_ID_Set;
+      Parser.User_Data                      := User_Data;
+
+      --  We can't use Table.McKenzie_Param /= Default_McKenzie_Param here,
+      --  because the discriminants are different.
+      Parser.Enable_McKenzie_Recover :=
+        Table.McKenzie_Param.Check_Limit /= Default_McKenzie_Param.Check_Limit 
or
+          Table.McKenzie_Param.Check_Delta_Limit /= 
Default_McKenzie_Param.Check_Delta_Limit or
+          Table.McKenzie_Param.Enqueue_Limit /= 
Default_McKenzie_Param.Enqueue_Limit;
+
+      Parser.Max_Parallel         := Max_Parallel;
+      Parser.Terminate_Same_State := Terminate_Same_State;
+
+      if User_Data /= null then
+         User_Data.Set_Lexer_Terminals (Lexer, 
Parser.Terminals'Unchecked_Access);
+      end if;
+   end New_Parser;
+
+   overriding procedure Parse (Shared_Parser : aliased in out LR.Parser.Parser)
+   is
+      use all type Ada.Strings.Unbounded.Unbounded_String;
+      use all type Syntax_Trees.User_Data_Access;
+      use all type Ada.Containers.Count_Type;
+      use all type SAL.Base_Peek_Type;
+
+      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+
+      Current_Verb    : All_Parse_Action_Verbs;
+      Error_Recovered : Boolean := False;
+      Current_Parser  : Parser_Lists.Cursor;
+      Action          : Parse_Action_Node_Ptr;
+      Zombie_Count    : SAL.Base_Peek_Type;
+
+      procedure Check_Error (Check_Parser : in out Parser_Lists.Cursor)
+      is begin
+         if Check_Parser.Verb = Error then
+            --  This parser errored on last input. This is how grammar 
conflicts
+            --  are resolved when the input text is valid, in which case we 
should
+            --  just terminate this parser. However, this may be due to invalid
+            --  input text, so we keep the parser alive but suspended for a few
+            --  tokens, to see if the other parsers also error, in which case 
they
+            --  all participate in error recovery.
+
+            --  We do not create zombie parsers during resume.
+            if not Check_Parser.State_Ref.Resume_Active then
+               --  Parser is now a zombie
+               if Trace_Parse > Detail then
+                  Trace.Put_Line (Integer'Image (Check_Parser.Label) & ": 
zombie");
+               end if;
+               Check_Parser.Next;
+
+            else
+               if Shared_Parser.Parsers.Count = 1 then
+                  if Trace_Parse > Outline then
+                     Trace.Put_Line (Integer'Image (Check_Parser.Label) & ": 
error during resume");
+                  end if;
+                  Shared_Parser.Parsers.First_State_Ref.Errors.Append
+                    ((Label          => LR.Message,
+                      First_Terminal => Trace.Descriptor.First_Terminal,
+                      Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                      Recover        => <>,
+                      Msg            => +"error during resume"));
+                  raise Syntax_Error;
+
+               else
+                  --  This is ok if a conflict occured during resume - we 
assume this is
+                  --  a branch that failed during recover as well. Otherwise 
it's a
+                  --  programmer error.
+                  if Check_Parser.State_Ref.Conflict_During_Resume then
+                     Shared_Parser.Parsers.Terminate_Parser
+                       (Check_Parser, "error in conflict during resume", 
Shared_Parser.Trace.all,
+                        Shared_Parser.Terminals);
+                  else
+                     raise SAL.Programmer_Error with "error during resume";
+                  end if;
+               end if;
+            end if;
+         else
+            Check_Parser.Next;
+         end if;
+      end Check_Error;
+
+   begin
+      if Debug_Mode then
+         Trace.Put_Clock ("start");
+      end if;
+
+      if Shared_Parser.User_Data /= null then
+         Shared_Parser.User_Data.Reset;
+      end if;
+
+      Shared_Parser.Lex_All;
+
+      Shared_Parser.String_Quote_Checked := Invalid_Line_Number;
+      Shared_Parser.Shared_Tree.Clear;
+      Shared_Parser.Parsers              := Parser_Lists.New_List
+        (Shared_Tree => Shared_Parser.Shared_Tree'Unchecked_Access);
+
+      Shared_Parser.Parsers.First.State_Ref.Stack.Push 
((Shared_Parser.Table.State_First, others => <>));
+
+      Main_Loop :
+      loop
+         --  exit on Accept_It action or syntax error.
+
+         Parse_Verb (Shared_Parser, Current_Verb, Zombie_Count);
+
+         if Trace_Parse > Extra then
+            Trace.Put_Line ("cycle start; current_verb: " & 
Parse_Action_Verbs'Image (Current_Verb));
+         end if;
+
+         case Current_Verb is
+         when Pause =>
+            null;
+
+         when Shift =>
+            --  We just shifted a token; get the next token from
+            --  Shared_Parser.Terminals.
+
+            for Parser_State of Shared_Parser.Parsers loop
+               if Parser_State.Verb = Error then
+                  if Shared_Parser.Enable_McKenzie_Recover then
+                     Parser_State.Zombie_Token_Count := 
Parser_State.Zombie_Token_Count + 1;
+                     if Trace_Parse > Extra then
+                        Trace.Put_Line
+                          (Integer'Image (Parser_State.Label) & ": zombie (" &
+                             WisiToken.Token_Index'Image
+                               (Shared_Parser.Table.McKenzie_Param.Check_Limit 
- Parser_State.Zombie_Token_Count) &
+                             " tokens remaining)");
+                     end if;
+                  end if;
+
+               elsif Parser_State.Verb = Shift then
+                  if Parser_State.Recover_Insert_Delete.Length > 0 and then
+                    Parser_State.Recover_Insert_Delete.Peek.Op = Insert and 
then
+                    Parser_State.Recover_Insert_Delete.Peek.Ins_Token_Index =
+                    (if Parser_State.Inc_Shared_Token
+                     then Parser_State.Shared_Token + 1
+                     else Parser_State.Shared_Token)
+                  then
+                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
+                       (Parser_State.Recover_Insert_Delete.Get.Ins_ID);
+
+                  elsif (if Parser_State.Inc_Shared_Token
+                         then Parser_State.Shared_Token + 1
+                         else Parser_State.Shared_Token) <= 
Shared_Parser.Terminals.Last_Index
+                  then
+                     if Parser_State.Inc_Shared_Token then
+                        --  Inc_Shared_Token is only set False by 
McKenzie_Recover; see there
+                        --  for when/why. Don't increment past wisi_eoi 
(happens when input
+                        --  buffer is empty; test_mckenzie_recover.adb 
Empty_Comments).
+                        Parser_State.Shared_Token := Parser_State.Shared_Token 
+ 1;
+                     else
+                        Parser_State.Inc_Shared_Token := True;
+                     end if;
+
+                     Parser_State.Current_Token := 
Parser_State.Tree.Add_Terminal
+                       (Parser_State.Shared_Token, Shared_Parser.Terminals);
+
+                  end if;
+
+                  if Trace_Parse > Extra then
+                     Trace.Put_Line
+                       (Integer'Image (Parser_State.Label) & ": current_token" 
& Parser_State.Tree.Image
+                          (Parser_State.Current_Token, Trace.Descriptor.all));
+                  end if;
+               end if;
+            end loop;
+
+         when Accept_It =>
+            --  All parsers accepted or are zombies.
+            declare
+               Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
+               Temp  : Parser_Lists.Cursor;
+            begin
+               if Count = 1 then
+                  --  Nothing more to do
+                  exit Main_Loop;
+
+               elsif Zombie_Count + 1 = Count then
+                  --  All but one are zombies
+                  Current_Parser := Shared_Parser.Parsers.First;
+                  loop
+                     if Current_Parser.Verb = Accept_It then
+                        Current_Parser.Next;
+                     else
+                        Temp := Current_Parser;
+                        Current_Parser.Next;
+                        Shared_Parser.Parsers.Terminate_Parser
+                          (Temp, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+                     end if;
+                     exit when Current_Parser.Is_Done;
+                  end loop;
+
+                  exit Main_Loop;
+
+               else
+                  --  More than one parser is active.
+                  declare
+                     use all type Parser_Lists.Cursor;
+                     Error_Parser_Count : Integer := (if 
Shared_Parser.Lexer.Errors.Length > 0 then 1 else 0);
+
+                     Recover_Cost           : Integer;
+                     Min_Recover_Cost       : Integer                   := 
Integer'Last;
+                     Recover_Ops_Length     : Ada.Containers.Count_Type;
+                     Max_Recover_Ops_Length : Ada.Containers.Count_Type := 
Ada.Containers.Count_Type'First;
+                     Recover_Cur            : Parser_Lists.Cursor;
+                  begin
+                     Current_Parser := Shared_Parser.Parsers.First;
+                     loop
+                        if Current_Parser.Verb = Accept_It then
+                           if Current_Parser.State_Ref.Errors.Length > 0 then
+                              Error_Parser_Count := Error_Parser_Count + 1;
+                           end if;
+                           Current_Parser.Next;
+                        else
+                           Temp := Current_Parser;
+                           Current_Parser.Next;
+                           Shared_Parser.Parsers.Terminate_Parser
+                             (Temp, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+                        end if;
+                        exit when Current_Parser.Is_Done;
+                     end loop;
+
+                     if Error_Parser_Count > 0 then
+                        --  There was at least one error. We assume that 
caused the ambiguous
+                        --  parse, and we pick the parser with the minimum 
cost and maximum
+                        --  recover ops length to allow the parse to succeed. 
We terminate the
+                        --  other parsers so the remaining parser executes 
actions. Among
+                        --  equal costs, we pick the maximum recover ops 
length because it's
+                        --  probably due to Minimal_Complete_Actions finishing 
a
+                        --  statement/declaration.
+                        --
+                        --  If there are multiple errors, this metric is not 
very meaningful.
+                        --
+                        --  Note all surviving parsers must have the same 
error count.
+                        Current_Parser := Shared_Parser.Parsers.First;
+                        loop
+                           Recover_Cost := Current_Parser.Min_Recover_Cost;
+                           if Recover_Cost < Min_Recover_Cost then
+                              Min_Recover_Cost       := Recover_Cost;
+                              Max_Recover_Ops_Length := 
Current_Parser.Max_Recover_Ops_Length;
+                              Recover_Cur            := Current_Parser;
+
+                           elsif Recover_Cost = Min_Recover_Cost then
+                              Recover_Ops_Length := 
Current_Parser.Max_Recover_Ops_Length;
+                              if Recover_Ops_Length > Max_Recover_Ops_Length 
then
+                                 Max_Recover_Ops_Length := Recover_Ops_Length;
+                                 Recover_Cur    := Current_Parser;
+                              end if;
+                           end if;
+                           Current_Parser.Next;
+                           exit when Current_Parser.Is_Done;
+                        end loop;
+
+                        Current_Parser := Shared_Parser.Parsers.First;
+                        loop
+                           if Current_Parser = Recover_Cur then
+                              Current_Parser.Next;
+                           else
+                              Temp := Current_Parser;
+                              Current_Parser.Next;
+                              Shared_Parser.Parsers.Terminate_Parser
+                                (Temp, "recover cost/length", 
Shared_Parser.Trace.all, Shared_Parser.Terminals);
+                           end if;
+                           exit when Current_Parser.Is_Done;
+                        end loop;
+
+                        exit Main_Loop;
+
+                     else
+                        --  There were no previous errors. We allow the parse 
to fail, on the
+                        --  assumption that an otherwise correct input should 
not yield an
+                        --  ambiguous parse.
+                        declare
+                           Token : Base_Token renames Shared_Parser.Terminals 
(Shared_Parser.Terminals.Last_Index);
+                        begin
+                           raise WisiToken.Parse_Error with Error_Message
+                             (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
+                              "Ambiguous parse:" & SAL.Base_Peek_Type'Image 
(Count) & " parsers active.");
+                        end;
+                     end if;
+                  end;
+               end if;
+            end;
+
+         when Reduce =>
+            null;
+
+         when Error =>
+            --  All parsers errored; attempt recovery
+            declare
+               use all type McKenzie_Recover.Recover_Status;
+
+               Recover_Result : McKenzie_Recover.Recover_Status := 
McKenzie_Recover.Recover_Status'First;
+
+               Pre_Recover_Parser_Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
+            begin
+               --  Recover algorithms expect current token at
+               --  Parsers(*).Current_Token, will set
+               --  Parsers(*).Recover_Insert_Delete with new input tokens and
+               --  deletions, adjust Parsers(*).Stack, and set
+               --  Parsers(*).Current_Token and Parsers(*).Verb.
+
+               if Shared_Parser.Enable_McKenzie_Recover then
+                  if Debug_Mode then
+                     Trace.Put_Clock ("pre-recover" & 
Shared_Parser.Parsers.Count'Img & " active");
+                  end if;
+                  Recover_Result := McKenzie_Recover.Recover (Shared_Parser);
+                  if Debug_Mode then
+                     Trace.Put_Clock ("post-recover" & 
Shared_Parser.Parsers.Count'Img & " active");
+                  end if;
+
+                  if Trace_Parse > Outline then
+                     if Recover_Result = Success  then
+                        Trace.Put_Line
+                          ("recover: succeed, parser count" & 
SAL.Base_Peek_Type'Image (Shared_Parser.Parsers.Count));
+                     else
+                        Trace.Put_Line
+                          ("recover: fail " & 
McKenzie_Recover.Recover_Status'Image (Recover_Result) &
+                             ", parser count" & SAL.Base_Peek_Type'Image 
(Shared_Parser.Parsers.Count));
+                     end if;
+                  end if;
+
+                  if Ada.Text_IO.Is_Open (Shared_Parser.Recover_Log_File) then
+                     declare
+                        use Ada.Text_IO;
+                        Strategy_Counts : LR.Strategy_Counts := (others => 0);
+                     begin
+                        Put
+                          (Shared_Parser.Recover_Log_File,
+                           Ada.Calendar.Formatting.Image (Ada.Calendar.Clock) 
& " " &
+                             McKenzie_Recover.Recover_Status'Image 
(Recover_Result) & " " &
+                             SAL.Base_Peek_Type'Image 
(Pre_Recover_Parser_Count) & " '" &
+                             Shared_Parser.Lexer.File_Name & "'");
+
+                        Put (Shared_Parser.Recover_Log_File, '(');
+                        for Parser of Shared_Parser.Parsers loop
+                           Accumulate (Parser.Recover, Strategy_Counts);
+                           Put
+                             (Shared_Parser.Recover_Log_File,
+                              Integer'Image (Parser.Recover.Enqueue_Count) &
+                                Integer'Image (Parser.Recover.Check_Count) & " 
" &
+                                Boolean'Image (Parser.Recover.Success));
+                        end loop;
+                        Put (Shared_Parser.Recover_Log_File, ')');
+
+                        Put (Shared_Parser.Recover_Log_File, Image 
(Strategy_Counts));
+                        New_Line (Shared_Parser.Recover_Log_File);
+                        Flush (Shared_Parser.Recover_Log_File);
+                     end;
+                  end if;
+               else
+                  if Trace_Parse > Outline then
+                     Trace.Put_Line ("recover disabled");
+                  end if;
+               end if;
+
+               if Recover_Result = Success then
+                  for Parser_State of Shared_Parser.Parsers loop
+                     Parser_State.Resume_Active          := True;
+                     Parser_State.Conflict_During_Resume := False;
+
+                     if Trace_Parse > Outline then
+                        Trace.Put_Line
+                          (Integer'Image (Parser_State.Label) & ": 
Current_Token " &
+                             Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) &
+                             " Shared_Token " & Image
+                               (Parser_State.Shared_Token, 
Shared_Parser.Terminals, Trace.Descriptor.all));
+
+                        if Trace_Parse > Detail then
+                           Shared_Parser.Trace.Put_Line
+                             (Integer'Image (Parser_State.Label) & ": 
resume_active: True, token goal" &
+                                WisiToken.Token_Index'Image 
(Parser_State.Resume_Token_Goal));
+                        end if;
+                     end if;
+
+                     Parser_State.Zombie_Token_Count := 0;
+
+                     case Parser_State.Verb is
+                     when Reduce =>
+                        null;
+
+                     when Error =>
+                        --  Force this parser to be terminated.
+                        if Shared_Parser.Enable_McKenzie_Recover then
+                           Parser_State.Zombie_Token_Count := 
Shared_Parser.Table.McKenzie_Param.Check_Limit + 1;
+                        end if;
+
+                     when Shift =>
+                        null;
+
+                     when Pause | Accept_It =>
+                        raise SAL.Programmer_Error;
+                     end case;
+                  end loop;
+
+               else
+                  --  Terminate with error. Parser_State has all the required 
info on
+                  --  the original error (recorded by Error in Do_Action); 
report reason
+                  --  recover failed.
+                  for Parser_State of Shared_Parser.Parsers loop
+                     Parser_State.Errors.Append
+                       ((Label          => LR.Message,
+                         First_Terminal => Trace.Descriptor.First_Terminal,
+                         Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                         Recover        => <>,
+                         Msg            => +"recover: fail " & 
McKenzie_Recover.Recover_Status'Image (Recover_Result)));
+                  end loop;
+                  raise WisiToken.Syntax_Error;
+               end if;
+
+               --  Immediately execute Do_Action for Current_Token, since it 
changed
+               --  in error recovery; this sets Parser.Verb. This replaces the
+               --  execution of Do_Action that resulted in Error.
+               Error_Recovered := True;
+
+            end;
+         end case;
+
+         --  We don't use 'for Parser_State of Parsers loop' here,
+         --  because terminate on error and spawn on conflict require
+         --  changing the parser list.
+         Current_Parser := Shared_Parser.Parsers.First;
+         Action_Loop :
+         loop
+            exit Action_Loop when Current_Parser.Is_Done;
+
+            --  We don't check duplicate state during resume, because the 
tokens
+            --  inserted/deleted by error recover may cause initially duplicate
+            --  states to diverge.
+            if not Current_Parser.State_Ref.Resume_Active and
+              Shared_Parser.Terminate_Same_State and
+              Current_Verb = Shift and
+              (for all Parser of Shared_Parser.Parsers => 
Parser.Recover_Insert_Delete.Count = 0)
+            then
+               Shared_Parser.Parsers.Duplicate_State
+                 (Current_Parser, Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+               --  If Duplicate_State terminated Current_Parser, 
Current_Parser now
+               --  points to the next parser. Otherwise it is unchanged.
+            end if;
+
+            exit Action_Loop when Current_Parser.Is_Done;
+
+            if Trace_Parse > Extra then
+               if Error_Recovered then
+                  Trace.Put_Line (Integer'Image (Current_Parser.Label) & 
".error_recovered");
+               else
+                  Trace.Put_Line
+                    ("current_verb: " & Parse_Action_Verbs'Image 
(Current_Verb) &
+                       "," & Integer'Image (Current_Parser.Label) &
+                       ".verb: " & Parse_Action_Verbs'Image 
(Current_Parser.Verb));
+               end if;
+            end if;
+
+            --  Each branch of the following 'if' calls either 
Current_Parser.Free
+            --  (which advances to the next parser) or Current_Parser.Next.
+
+            if Current_Parser.Verb = Error then
+               --  This parser is a zombie; see Check_Error above.
+               --
+               --  Check to see if it is time to terminate it
+               if Shared_Parser.Enable_McKenzie_Recover and then
+                 Current_Parser.State_Ref.Zombie_Token_Count <= 
Shared_Parser.Table.McKenzie_Param.Check_Limit
+               then
+                  if Trace_Parse > Detail then
+                     Trace.Put_Line (Integer'Image (Current_Parser.Label) & ": 
zombie");
+                  end if;
+
+                  Current_Parser.Next;
+               else
+                  Shared_Parser.Parsers.Terminate_Parser
+                    (Current_Parser, "zombie", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+               end if;
+
+            elsif Current_Parser.Verb = Current_Verb or Error_Recovered then
+
+               if Trace_Parse > Extra then
+                  Parser_Lists.Put_Top_10 (Trace, Current_Parser);
+               end if;
+
+               declare
+                  State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
+               begin
+                  Action := Action_For
+                    (Table => Shared_Parser.Table.all,
+                     State => State.Stack.Peek.State,
+                     ID    => State.Tree.ID (State.Current_Token));
+               end;
+
+               declare
+                  Conflict : Parse_Action_Node_Ptr := Action.Next;
+               begin
+                  loop
+                     exit when Conflict = null;
+                     --  Spawn a new parser (before modifying Current_Parser 
stack).
+
+                     Current_Parser.State_Ref.Conflict_During_Resume := 
Current_Parser.State_Ref.Resume_Active;
+
+                     if Shared_Parser.Parsers.Count = 
Shared_Parser.Max_Parallel then
+                        --  If errors were recovered, terminate a parser that 
used the
+                        --  highest cost solution.
+                        declare
+                           use all type WisiToken.Parse.LR.Parser_Lists.Cursor;
+                           Max_Recover_Cost : Integer             := 0;
+                           Max_Parser       : Parser_Lists.Cursor;
+                           Cur              : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
+                        begin
+                           loop
+                              exit when Cur.Is_Done;
+                              if Cur.Total_Recover_Cost > Max_Recover_Cost then
+                                 Max_Parser       := Cur;
+                                 Max_Recover_Cost := Cur.Total_Recover_Cost;
+                              end if;
+                              Cur.Next;
+                           end loop;
+
+                           if Max_Recover_Cost > 0 then
+                              if Max_Parser = Current_Parser then
+                                 Current_Parser.Next;
+                                 Shared_Parser.Parsers.Terminate_Parser
+                                   (Current_Parser, "too many parsers; max 
error repair cost", Trace,
+                                    Shared_Parser.Terminals);
+                                 exit Action_Loop;
+                              else
+                                 Shared_Parser.Parsers.Terminate_Parser
+                                   (Max_Parser, "too many parsers; max error 
repair cost", Trace,
+                                    Shared_Parser.Terminals);
+                              end if;
+                           end if;
+                        end;
+                     end if;
+
+                     if Shared_Parser.Parsers.Count = 
Shared_Parser.Max_Parallel then
+                        declare
+                           Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+                           Token : Base_Token renames Shared_Parser.Terminals 
(Parser_State.Shared_Token);
+                        begin
+                           raise WisiToken.Parse_Error with Error_Message
+                             (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
+                              "too many parallel parsers required in grammar 
state" &
+                                State_Index'Image 
(Parser_State.Stack.Peek.State) &
+                                "; simplify grammar, or increase max-parallel 
(" &
+                                SAL.Base_Peek_Type'Image 
(Shared_Parser.Max_Parallel) & ")");
+                        end;
+
+                     else
+                        if Trace_Parse > Outline then
+                           declare
+                              Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+                           begin
+                              Trace.Put_Line
+                                (Integer'Image (Current_Parser.Label) & ": " &
+                                   Trimmed_Image 
(Parser_State.Stack.Peek.State) & ": " &
+                                   Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) & " : " &
+                                   "spawn" & Integer'Image 
(Shared_Parser.Parsers.Last_Label + 1) & ", (" &
+                                   Trimmed_Image (1 + Integer 
(Shared_Parser.Parsers.Count)) & " active)");
+                           end;
+                        end if;
+
+                        Shared_Parser.Parsers.Prepend_Copy (Current_Parser);
+                        Do_Action (Conflict.Item, Shared_Parser.Parsers.First, 
Shared_Parser);
+
+                        --  We must terminate error parsers immediately in 
order to avoid
+                        --  zombie parsers during recovery.
+                        declare
+                           Temp : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
+                        begin
+                           Check_Error (Temp);
+                        end;
+                     end if;
+
+                     Conflict := Conflict.Next;
+                  end loop;
+               end;
+               Do_Action (Action.Item, Current_Parser, Shared_Parser);
+               Check_Error (Current_Parser);
+
+            else
+               --  Current parser is waiting for others to catch up
+               Current_Parser.Next;
+            end if;
+         end loop Action_Loop;
+         Error_Recovered := False;
+      end loop Main_Loop;
+
+      if Trace_Parse > Outline then
+         Trace.Put_Line (Shared_Parser.Parsers.First.Label'Image & ": 
succeed");
+      end if;
+
+      if Debug_Mode then
+         Trace.Put_Clock ("finish");
+      end if;
+
+      --  We don't raise Syntax_Error for lexer errors, since they are all
+      --  recovered, either by inserting a quote, or by ignoring the
+      --  character.
+   exception
+   when Syntax_Error | WisiToken.Parse_Error | Partial_Parse =>
+      if Debug_Mode then
+         Trace.Put_Clock ("finish - error");
+      end if;
+      raise;
+
+   when E : others =>
+      declare
+         Msg : constant String := Ada.Exceptions.Exception_Name (E) & ": " & 
Ada.Exceptions.Exception_Message (E);
+      begin
+         if Shared_Parser.Parsers.Count > 0 then
+            --  Emacs displays errors in the *syntax-errors* buffer
+            Shared_Parser.Parsers.First_State_Ref.Errors.Append
+              ((Label          => LR.Message,
+                First_Terminal => Trace.Descriptor.First_Terminal,
+                Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                Recover        => <>,
+                Msg            => +Msg));
+         end if;
+
+         if Debug_Mode then
+            Ada.Text_IO.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback 
(E));
+         end if;
+
+         --  Emacs displays the exception message in the echo area; easy to 
miss
+         raise WisiToken.Parse_Error with Msg;
+      end;
+   end Parse;
+
+   overriding function Tree (Shared_Parser : in Parser) return 
Syntax_Trees.Tree
+   is
+      use all type SAL.Base_Peek_Type;
+   begin
+      if Shared_Parser.Parsers.Count > 1 then
+         raise WisiToken.Parse_Error with "ambigous parse";
+      else
+         return Shared_Parser.Parsers.First_State_Ref.Tree;
+      end if;
+   end Tree;
+
+   overriding
+   procedure Execute_Actions (Parser : in out LR.Parser.Parser)
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Syntax_Trees.User_Data_Access;
+      use all type WisiToken.Syntax_Trees.Semantic_Action;
+
+      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+
+      procedure Process_Node
+        (Tree : in out Syntax_Trees.Tree;
+         Node : in     Syntax_Trees.Valid_Node_Index)
+      is
+         use all type Syntax_Trees.Node_Label;
+      begin
+         if Tree.Label (Node) /= Nonterm then
+            return;
+         end if;
+
+         declare
+            Tree_Children : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Node);
+         begin
+            Parser.User_Data.Reduce (Tree, Node, Tree_Children);
+            if Tree.Action (Node) /= null then
+               begin
+                  Tree.Action (Node) (Parser.User_Data.all, Tree, Node, 
Tree_Children);
+               exception
+               when E : others =>
+                  declare
+                     Token : Base_Token renames Parser.Terminals 
(Tree.Min_Terminal_Index (Node));
+                  begin
+                     raise WisiToken.Parse_Error with Error_Message
+                       (Parser.Lexer.File_Name, Token.Line, Token.Column,
+                        "action raised exception " & 
Ada.Exceptions.Exception_Name (E) & ": " &
+                          Ada.Exceptions.Exception_Message (E));
+                  end;
+               end;
+            end if;
+         end;
+      end Process_Node;
+
+   begin
+      if Parser.User_Data /= null then
+         if Parser.Parsers.Count > 1 then
+            raise Syntax_Error with "ambiguous parse; can't execute actions";
+         end if;
+
+         declare
+            Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_State_Ref.Element.all;
+         begin
+            if Trace_Action > Outline then
+               Parser.Trace.Put_Line
+                 (Integer'Image (Parser_State.Label) & ": root node: " & 
Parser_State.Tree.Image
+                 (Parser_State.Tree.Root, Descriptor));
+            end if;
+
+            if (for some Err of Parser_State.Errors => Any (Err.Recover.Ops, 
Delete)) then
+               for Err of Parser_State.Errors loop
+                  for Op of Err.Recover.Ops loop
+                     case Op.Op is
+                     when Delete =>
+                        Parser.User_Data.Delete_Token (Op.Del_Token_Index);
+                     when others =>
+                        null;
+                     end case;
+                  end loop;
+               end loop;
+            end if;
+
+            Parser.User_Data.Initialize_Actions (Parser_State.Tree);
+            Parser_State.Tree.Process_Tree (Process_Node'Access);
+         end;
+      end if;
+   end Execute_Actions;
+
+   overriding function Any_Errors (Parser : in LR.Parser.Parser) return Boolean
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Ada.Containers.Count_Type;
+      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
+   begin
+      pragma Assert (Parser_State.Tree.Flushed);
+      return Parser.Parsers.Count > 1 or Parser_State.Errors.Length > 0 or 
Parser.Lexer.Errors.Length > 0;
+   end Any_Errors;
+
+   overriding procedure Put_Errors (Parser : in LR.Parser.Parser)
+   is
+      use all type SAL.Base_Peek_Type;
+      use Ada.Text_IO;
+
+      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
+      Descriptor   : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+   begin
+      for Item of Parser.Lexer.Errors loop
+         Put_Line
+           (Current_Error,
+            Parser.Lexer.File_Name & ":0:0: lexer unrecognized character at" & 
Buffer_Pos'Image (Item.Char_Pos));
+      end loop;
+
+      for Item of Parser_State.Errors loop
+         case Item.Label is
+         when Action =>
+            declare
+               Index : constant Base_Token_Index := 
Parser_State.Tree.Min_Terminal_Index (Item.Error_Token);
+            begin
+               if Index = Invalid_Token_Index then
+                  --  Error_Token is virtual
+                  Put_Line
+                    (Current_Error,
+                     Error_Message
+                       (Parser.Lexer.File_Name, 1, 0,
+                        "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
+                          ", found " & Image (Parser_State.Tree.ID 
(Item.Error_Token), Descriptor)));
+               else
+                  declare
+                     Token : Base_Token renames Parser.Terminals (Index);
+                  begin
+                     Put_Line
+                       (Current_Error,
+                        Error_Message
+                          (Parser.Lexer.File_Name, Token.Line, Token.Column,
+                           "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
+                             ", found '" & Parser.Lexer.Buffer_Text 
(Token.Byte_Region) & "'"));
+                  end;
+               end if;
+            end;
+         when Check =>
+            Put_Line
+              (Current_Error,
+               Parser.Lexer.File_Name & ":0:0: semantic check error: " &
+                 Semantic_Checks.Image (Item.Check_Status, Descriptor));
+         when Message =>
+            Put_Line (Current_Error, -Item.Msg);
+         end case;
+
+         if Item.Recover.Stack.Depth /= 0 then
+            Put_Line (Current_Error, "   recovered: " & Image 
(Item.Recover.Ops, Descriptor));
+         end if;
+      end loop;
+   end Put_Errors;
+
+end WisiToken.Parse.LR.Parser;
diff --git a/packages/wisi/wisitoken-parse-lr-parser.ads 
b/packages/wisi/wisitoken-parse-lr-parser.ads
index 3324165..a88e3af 100644
--- a/packages/wisi/wisitoken-parse-lr-parser.ads
+++ b/packages/wisi/wisitoken-parse-lr-parser.ads
@@ -53,19 +53,21 @@ package WisiToken.Parse.LR.Parser is
    --  For an Error action, Config.Error_Token gives the terminal that
    --  caused the error.
 
-   type Language_Use_Minimal_Complete_Actions_Access is access procedure
-     (Current_Token        : in     Token_ID;
-      Next_Token           : in     Token_ID;
-      Config               : in     Configuration;
-      Use_Complete         :    out Boolean;
-      Matching_Begin_Token :    out Token_ID);
-   --  Set Use_Complete True if using Minimal_Complete_Actions is
-   --  appropriate. Set Matching_Begin_Token to token that starts a production
-   --  matching Next_Token (and following tokens, if any).
+   type Language_Matching_Begin_Tokens_Access is access procedure
+     (Tokens                  : in     Token_ID_Array_1_3;
+      Config                  : in     Configuration;
+      Matching_Tokens         :    out Token_ID_Arrays.Vector;
+      Forbid_Minimal_Complete :    out Boolean);
+   --  Tokens (1) caused a parse error; Tokens (2 .. 3) are the following
+   --  tokens (Invalid_Token_ID if none). Set Matching_Tokens to a token
+   --  sequence that starts a production matching Tokens. If
+   --  Minimal_Complete would produce a bad solution at this error point,
+   --  set Forbid_Minimal_Complete True.
    --
-   --  For example, if Next_Token is a block end, return True to complete
-   --  the current statement/declaration as quickly as possible, and
-   --  Matching_Begin_Token to the corresponding block begin.
+   --  For example, if Tokens is a block end, return tokens that are the
+   --  corresponding block begin. If the error point is inside a
+   --  multi-token 'end' (ie 'end if;', or 'end <name>;'), set
+   --  Forbid_Minimal_Complete True.
 
    type Language_String_ID_Set_Access is access function
      (Descriptor        : in WisiToken.Descriptor;
@@ -73,14 +75,14 @@ package WisiToken.Parse.LR.Parser is
      return Token_ID_Set;
    --  Return a Token_ID_Set containing String_Literal_ID and
    --  nonterminals that can contain String_Literal_ID as part of an
-   --  expression.
+   --  expression. Used in placing a missing string quote.
 
    type Post_Recover_Access is access procedure;
 
    type Parser is new WisiToken.Parse.Base_Parser with record
       Table                                 : Parse_Table_Ptr;
       Language_Fixes                        : Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : 
Language_Use_Minimal_Complete_Actions_Access;
+      Language_Matching_Begin_Tokens : Language_Matching_Begin_Tokens_Access;
       Language_String_ID_Set                : Language_String_ID_Set_Access;
 
       String_Quote_Checked : Line_Number_Type := Invalid_Line_Number;
@@ -113,16 +115,16 @@ package WisiToken.Parse.LR.Parser is
    --  Deep free Object.Table.
 
    procedure New_Parser
-     (Parser                                :    out          LR.Parser.Parser;
-      Trace                                 : not null access 
WisiToken.Trace'Class;
-      Lexer                                 : in              
WisiToken.Lexer.Handle;
-      Table                                 : in              Parse_Table_Ptr;
-      Language_Fixes                        : in              
Language_Fixes_Access;
-      Language_Use_Minimal_Complete_Actions : in              
Language_Use_Minimal_Complete_Actions_Access;
-      Language_String_ID_Set                : in              
Language_String_ID_Set_Access;
-      User_Data                             : in              
WisiToken.Syntax_Trees.User_Data_Access;
-      Max_Parallel                          : in              
SAL.Base_Peek_Type := Default_Max_Parallel;
-      Terminate_Same_State                  : in              Boolean          
  := True);
+     (Parser                         :    out          LR.Parser.Parser;
+      Trace                          : not null access WisiToken.Trace'Class;
+      Lexer                          : in              WisiToken.Lexer.Handle;
+      Table                          : in              Parse_Table_Ptr;
+      Language_Fixes                 : in              Language_Fixes_Access;
+      Language_Matching_Begin_Tokens : in              
Language_Matching_Begin_Tokens_Access;
+      Language_String_ID_Set         : in              
Language_String_ID_Set_Access;
+      User_Data                      : in              
WisiToken.Syntax_Trees.User_Data_Access;
+      Max_Parallel                   : in              SAL.Base_Peek_Type := 
Default_Max_Parallel;
+      Terminate_Same_State           : in              Boolean            := 
True);
 
    overriding procedure Parse (Shared_Parser : aliased in out 
LR.Parser.Parser);
    --  Attempt a parse. Calls Parser.Lexer.Reset, runs lexer to end of
diff --git a/packages/wisi/wisitoken-parse-lr-parser_lists.adb 
b/packages/wisi/wisitoken-parse-lr-parser_lists.adb
index 590af07..e2a0918 100644
--- a/packages/wisi/wisitoken-parse-lr-parser_lists.adb
+++ b/packages/wisi/wisitoken-parse-lr-parser_lists.adb
@@ -27,7 +27,6 @@ package body WisiToken.Parse.LR.Parser_Lists is
       Depth      : in SAL.Base_Peek_Type := 0)
      return String
    is
-      use all type Syntax_Trees.Node_Index;
       use all type SAL.Base_Peek_Type;
       use Ada.Strings.Unbounded;
 
@@ -40,6 +39,7 @@ package body WisiToken.Parse.LR.Parser_Lists is
    begin
       for I in 1 .. Last loop
          declare
+            use all type WisiToken.Syntax_Trees.Node_Index;
             Item : Parser_Stack_Item renames Stack.Peek (I);
          begin
             Result := Result &
@@ -131,6 +131,19 @@ package body WisiToken.Parse.LR.Parser_Lists is
       return Result;
    end Max_Recover_Ops_Length;
 
+   function Min_Recover_Cost (Cursor : in Parser_Lists.Cursor) return Integer
+   is
+      Result : Integer := Integer'Last;
+      Errors : Parse_Error_Lists.List renames 
Parser_State_Lists.Constant_Reference (Cursor.Ptr).Errors;
+   begin
+      for Error of Errors loop
+         if Error.Recover.Cost < Result then
+            Result := Error.Recover.Cost;
+         end if;
+      end loop;
+      return Result;
+   end Min_Recover_Cost;
+
    procedure Set_Verb (Cursor : in Parser_Lists.Cursor; Verb : in 
All_Parse_Action_Verbs)
    is begin
       Parser_State_Lists.Reference (Cursor.Ptr).Verb := Verb;
@@ -292,7 +305,7 @@ package body WisiToken.Parse.LR.Parser_Lists is
 
          --  We specify all items individually, rather copy Item and then
          --  override a few, to avoid copying large items like Recover.
-         --  We copy Recover.Enqueue_Count, .Check_Count for unit tests.
+         --  We copy Recover.Enqueue_Count .. Check_Count for unit tests.
          New_Item :=
            (Shared_Token           => Item.Shared_Token,
             Recover_Insert_Delete  => Item.Recover_Insert_Delete,
@@ -303,6 +316,7 @@ package body WisiToken.Parse.LR.Parser_Lists is
             Tree                   => Item.Tree,
             Recover                =>
               (Enqueue_Count       => Item.Recover.Enqueue_Count,
+               Config_Full_Count   => Item.Recover.Config_Full_Count,
                Check_Count         => Item.Recover.Check_Count,
                others              => <>),
             Resume_Active          => Item.Resume_Active,
diff --git a/packages/wisi/wisitoken-parse-lr-parser_lists.ads 
b/packages/wisi/wisitoken-parse-lr-parser_lists.ads
index 0dae578..a5af546 100644
--- a/packages/wisi/wisitoken-parse-lr-parser_lists.ads
+++ b/packages/wisi/wisitoken-parse-lr-parser_lists.ads
@@ -131,6 +131,7 @@ package WisiToken.Parse.LR.Parser_Lists is
    function Label (Cursor : in Parser_Lists.Cursor) return Natural;
    function Total_Recover_Cost (Cursor : in Parser_Lists.Cursor) return 
Integer;
    function Max_Recover_Ops_Length (Cursor : in Parser_Lists.Cursor) return 
Ada.Containers.Count_Type;
+   function Min_Recover_Cost (Cursor : in Parser_Lists.Cursor) return Integer;
 
    procedure Set_Verb (Cursor : in Parser_Lists.Cursor; Verb : in 
All_Parse_Action_Verbs);
    function Verb (Cursor : in Parser_Lists.Cursor) return 
All_Parse_Action_Verbs;
diff --git a/packages/wisi/wisitoken-parse-lr-parser_no_recover.adb 
b/packages/wisi/wisitoken-parse-lr-parser_no_recover.adb
index d8ce31e..67371f1 100644
--- a/packages/wisi/wisitoken-parse-lr-parser_no_recover.adb
+++ b/packages/wisi/wisitoken-parse-lr-parser_no_recover.adb
@@ -1,511 +1,549 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under the terms of the GNU General Public License
---  as published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. The WisiToken package is
---  distributed in the hope that it will be useful, but WITHOUT ANY
---  WARRANTY; without even the implied warranty of MERCHANTABILITY or
---  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
---  License for more details. You should have received a copy of the
---  GNU General Public License distributed with the WisiToken package;
---  see file GPL.txt. If not, write to the Free Software Foundation,
---  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
---  As a special exception, if other files instantiate generics from
---  this unit, or you link this unit with other files to produce an
---  executable, this unit does not by itself cause the resulting
---  executable to be covered by the GNU General Public License. This
---  exception does not however invalidate any other reasons why the
---  executable file might be covered by the GNU Public License.
-
-pragma License (Modified_GPL);
-
-package body WisiToken.Parse.LR.Parser_No_Recover is
-
-   procedure Reduce_Stack_1
-     (Current_Parser : in     Parser_Lists.Cursor;
-      Action         : in     Reduce_Action_Rec;
-      Nonterm        :    out WisiToken.Syntax_Trees.Valid_Node_Index;
-      Trace          : in out WisiToken.Trace'Class)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      Parser_State  : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
-      Children_Tree : Syntax_Trees.Valid_Node_Index_Array (1 .. 
SAL.Base_Peek_Type (Action.Token_Count));
-      --  for Set_Children.
-   begin
-      for I in reverse Children_Tree'Range loop
-         Children_Tree (I) := Parser_State.Stack.Pop.Token;
-      end loop;
-
-      Nonterm := Parser_State.Tree.Add_Nonterm
-        (Action.Production, Children_Tree, Action.Action, Default_Virtual => 
False);
-      --  Computes Nonterm.Byte_Region
-
-      if Trace_Parse > Detail then
-         Trace.Put_Line (Parser_State.Tree.Image (Nonterm, 
Trace.Descriptor.all, Include_Children => True));
-      end if;
-   end Reduce_Stack_1;
-
-   procedure Do_Action
-     (Action         : in Parse_Action_Rec;
-      Current_Parser : in Parser_Lists.Cursor;
-      Shared_Parser  : in Parser)
-   is
-      Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-      Trace        : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-      Nonterm      : WisiToken.Syntax_Trees.Valid_Node_Index;
-   begin
-      if Trace_Parse > Detail then
-         Trace.Put
-           (Integer'Image (Current_Parser.Label) & ": " &
-              Trimmed_Image (Parser_State.Stack.Peek.State) & ": " &
-              Parser_State.Tree.Image (Parser_State.Current_Token, 
Trace.Descriptor.all) & " : ");
-         Put (Trace, Action);
-         Trace.New_Line;
-      end if;
-
-      case Action.Verb is
-      when Shift =>
-         Current_Parser.Set_Verb (Shift);
-         Parser_State.Stack.Push ((Action.State, Parser_State.Current_Token));
-         Parser_State.Tree.Set_State (Parser_State.Current_Token, 
Action.State);
-
-      when Reduce =>
-         Current_Parser.Set_Verb (Reduce);
-
-         Reduce_Stack_1 (Current_Parser, Action, Nonterm, Trace);
-
-         Parser_State.Stack.Push
-           ((State    => Goto_For
-               (Table => Shared_Parser.Table.all,
-                State => Parser_State.Stack (1).State,
-                ID    => Action.Production.LHS),
-             Token    => Nonterm));
-
-         Parser_State.Tree.Set_State (Nonterm, Parser_State.Stack (1).State);
-
-         if Trace_Parse > Detail then
-            Trace.Put_Line (" ... goto state " & Trimmed_Image 
(Parser_State.Stack.Peek.State));
-         end if;
-
-      when Accept_It =>
-         Current_Parser.Set_Verb (Accept_It);
-         Reduce_Stack_1
-           (Current_Parser,
-            (Reduce, Action.Production, Action.Action, Action.Check, 
Action.Token_Count),
-            Nonterm, Trace);
-
-         Parser_State.Tree.Set_Root (Nonterm);
-
-      when Error =>
-         Current_Parser.Set_Verb (Action.Verb);
-
-         --  We don't raise Syntax_Error here; another parser may be able to
-         --  continue.
-
-         declare
-            Expecting : constant Token_ID_Set := LR.Expecting
-              (Shared_Parser.Table.all, 
Current_Parser.State_Ref.Stack.Peek.State);
-         begin
-            Parser_State.Errors.Append
-              ((Label          => LR.Action,
-                First_Terminal => Trace.Descriptor.First_Terminal,
-                Last_Terminal  => Trace.Descriptor.Last_Terminal,
-                Error_Token    => Parser_State.Current_Token,
-                Expecting      => Expecting,
-                Recover        => (others => <>)));
-
-            if Trace_Parse > Outline then
-               Put
-                 (Trace,
-                  Integer'Image (Current_Parser.Label) & ": expecting: " &
-                    Image (Expecting, Trace.Descriptor.all));
-               Trace.New_Line;
-            end if;
-         end;
-      end case;
-   end Do_Action;
-
-   --  Return the type of parser cycle to execute.
-   --
-   --  Accept : all Parsers.Verb return Accept - done parsing.
-   --
-   --  Shift : some Parsers.Verb return Shift.
-   --
-   --  Reduce : some Parsers.Verb return Reduce.
-   --
-   --  Error : all Parsers.Verb return Error.
-   procedure Parse_Verb
-     (Shared_Parser : in out Parser;
-      Verb          :    out All_Parse_Action_Verbs)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      Shift_Count  : SAL.Base_Peek_Type := 0;
-      Accept_Count : SAL.Base_Peek_Type := 0;
-      Error_Count  : SAL.Base_Peek_Type := 0;
-   begin
-      for Parser_State of Shared_Parser.Parsers loop
-         case Parser_State.Verb is
-         when Shift =>
-            Shift_Count := Shift_Count + 1;
-
-         when Reduce =>
-            Verb := Reduce;
-            return;
-
-         when Accept_It =>
-            Accept_Count := Accept_Count + 1;
-
-         when Error =>
-            Error_Count := Error_Count + 1;
-
-         when Pause =>
-            --  This is parser_no_recover
-            raise SAL.Programmer_Error;
-         end case;
-      end loop;
-
-      if Shared_Parser.Parsers.Count = Accept_Count then
-         Verb := Accept_It;
-
-      elsif Shared_Parser.Parsers.Count = Error_Count then
-         Verb := Error;
-
-      elsif Shift_Count > 0 then
-         Verb := Shift;
-
-      else
-         raise SAL.Programmer_Error;
-      end if;
-   end Parse_Verb;
-
-   ----------
-   --  Public subprograms, declaration order
-
-   overriding procedure Finalize (Object : in out Parser)
-   is begin
-      Free_Table (Object.Table);
-   end Finalize;
-
-   procedure New_Parser
-     (Parser               :    out          LR.Parser_No_Recover.Parser;
-      Trace                : not null access WisiToken.Trace'Class;
-      Lexer                : in              WisiToken.Lexer.Handle;
-      Table                : in              Parse_Table_Ptr;
-      User_Data            : in              
WisiToken.Syntax_Trees.User_Data_Access;
-      Max_Parallel         : in              SAL.Base_Peek_Type := 
Default_Max_Parallel;
-      First_Parser_Label   : in              Integer            := 1;
-      Terminate_Same_State : in              Boolean            := True)
-   is
-      use all type Syntax_Trees.User_Data_Access;
-   begin
-      Parser.Lexer                := Lexer;
-      Parser.Trace                := Trace;
-      Parser.Table                := Table;
-      Parser.User_Data            := User_Data;
-      Parser.Max_Parallel         := Max_Parallel;
-      Parser.First_Parser_Label   := First_Parser_Label;
-      Parser.Terminate_Same_State := Terminate_Same_State;
-
-      if User_Data /= null then
-         User_Data.Set_Lexer_Terminals (Lexer, 
Parser.Terminals'Unchecked_Access);
-      end if;
-   end New_Parser;
-
-   overriding procedure Parse (Shared_Parser : aliased in out Parser)
-   is
-      use all type Syntax_Trees.User_Data_Access;
-      use all type SAL.Base_Peek_Type;
-
-      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
-
-      Current_Verb   : All_Parse_Action_Verbs;
-      Current_Parser : Parser_Lists.Cursor;
-      Action         : Parse_Action_Node_Ptr;
-
-      procedure Check_Error (Check_Parser : in out Parser_Lists.Cursor)
-      is begin
-         if Check_Parser.Verb = Error then
-            --  This parser errored on last input. This is how grammar 
conflicts
-            --  are resolved when the input text is valid, so we terminate this
-            --  parser.
-
-            if Shared_Parser.Parsers.Count = 1 then
-               raise Syntax_Error;
-            else
-               Shared_Parser.Parsers.Terminate_Parser
-                 (Check_Parser, "", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-            end if;
-         else
-            Check_Parser.Next;
-         end if;
-      end Check_Error;
-
-   begin
-      if Shared_Parser.User_Data /= null then
-         Shared_Parser.User_Data.Reset;
-      end if;
-
-      Shared_Parser.Lex_All;
-
-      Shared_Parser.Shared_Tree.Clear;
-
-      Shared_Parser.Parsers := Parser_Lists.New_List
-        (Shared_Tree => Shared_Parser.Shared_Tree'Unchecked_Access);
-
-      Shared_Parser.Parsers.First.State_Ref.Stack.Push 
((Shared_Parser.Table.State_First, others => <>));
-
-      Main_Loop :
-      loop
-         --  exit on Accept_It action or syntax error.
-
-         Parse_Verb (Shared_Parser, Current_Verb);
-
-         case Current_Verb is
-         when Shift =>
-            --  All parsers just shifted a token; get the next token
-
-            for Parser_State of Shared_Parser.Parsers loop
-               Parser_State.Shared_Token  := Parser_State.Shared_Token + 1;
-               Parser_State.Current_Token := Parser_State.Tree.Add_Terminal
-                 (Parser_State.Shared_Token, Shared_Parser.Terminals);
-            end loop;
-
-         when Accept_It =>
-            --  All parsers accepted.
-            declare
-               Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
-            begin
-               if Count = 1 then
-                  --  Nothing more to do
-                  if Trace_Parse > Outline then
-                     Trace.Put_Line (Integer'Image 
(Shared_Parser.Parsers.First.Label) & ": succeed");
-                  end if;
-                  exit Main_Loop;
-
-               else
-                  --  More than one parser is active; ambiguous parse.
-                  declare
-                     Token : Base_Token renames Shared_Parser.Terminals 
(Shared_Parser.Terminals.Last_Index);
-                  begin
-                     raise WisiToken.Parse_Error with Error_Message
-                       (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
-                        "Ambiguous parse:" & SAL.Base_Peek_Type'Image (Count) 
& " parsers active.");
-                  end;
-               end if;
-            end;
-
-         when Reduce =>
-            null;
-
-         when Error =>
-            --  All parsers errored; terminate with error. Semantic_State has 
all
-            --  the required info (recorded by Error in Do_Action), so we just
-            --  raise the exception.
-            raise Syntax_Error;
-
-         when Pause =>
-            --  This is parser_no_recover
-            raise SAL.Programmer_Error;
-         end case;
-
-         --  We don't use 'for Parser_State of Parsers loop' here,
-         --  because terminate on error and spawn on conflict require
-         --  changing the parser list.
-         Current_Parser := Shared_Parser.Parsers.First;
-         loop
-            exit when Current_Parser.Is_Done;
-
-            if Shared_Parser.Terminate_Same_State and
-              Current_Verb = Shift
-            then
-               Shared_Parser.Parsers.Duplicate_State
-                 (Current_Parser, Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
-               --  If Duplicate_State terminated Current_Parser, 
Current_Parser now
-               --  points to the next parser. Otherwise it is unchanged.
-            end if;
-
-            exit when Current_Parser.Is_Done;
-
-            if Trace_Parse > Extra then
-               Trace.Put_Line
-                 ("current_verb: " & Parse_Action_Verbs'Image (Current_Verb) &
-                    "," & Integer'Image (Current_Parser.Label) &
-                    ".verb: " & Parse_Action_Verbs'Image 
(Current_Parser.Verb));
-            end if;
-
-            --  Each branch of the following 'if' calls either 
Current_Parser.Free
-            --  (which advances to the next parser) or Current_Parser.Next.
-
-            if Current_Parser.Verb = Current_Verb then
-               if Trace_Parse > Extra then
-                  Parser_Lists.Put_Top_10 (Trace, Current_Parser);
-               end if;
-
-               declare
-                  State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
-               begin
-                  Action := Action_For
-                    (Table => Shared_Parser.Table.all,
-                     State => State.Stack.Peek.State,
-                     ID    => State.Tree.ID (State.Current_Token));
-               end;
-
-               if Action.Next /= null then
-                  --  Conflict; spawn a new parser (before modifying 
Current_Parser
-                  --  stack).
-
-                  if Shared_Parser.Parsers.Count = Shared_Parser.Max_Parallel 
then
-                     declare
-                        Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
-                        Token : Base_Token renames Shared_Parser.Terminals 
(Parser_State.Shared_Token);
-                     begin
-                        raise WisiToken.Parse_Error with Error_Message
-                          (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
-                           ": too many parallel parsers required in grammar 
state" &
-                             State_Index'Image (Parser_State.Stack.Peek.State) 
&
-                             "; simplify grammar, or increase max-parallel (" &
-                             SAL.Base_Peek_Type'Image 
(Shared_Parser.Max_Parallel) & ")");
-                     end;
-                  else
-                     if Trace_Parse > Outline then
-                        Trace.Put_Line
-                          ("spawn parser from " & Trimmed_Image 
(Current_Parser.Label) &
-                             " (" & Trimmed_Image (1 + Integer 
(Shared_Parser.Parsers.Count)) & " active)");
-                     end if;
-
-                     Shared_Parser.Parsers.Prepend_Copy (Current_Parser);
-                     Do_Action (Action.Next.Item, Shared_Parser.Parsers.First, 
Shared_Parser);
-
-                     declare
-                        Temp : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
-                     begin
-                        Check_Error (Temp);
-                     end;
-                  end if;
-               end if;
-
-               Do_Action (Action.Item, Current_Parser, Shared_Parser);
-               Check_Error (Current_Parser);
-
-            else
-               --  Current parser is waiting for others to catch up
-               Current_Parser.Next;
-            end if;
-         end loop;
-      end loop Main_Loop;
-
-      --  We don't raise Syntax_Error for lexer errors, since they are all
-      --  recovered, either by inserting a quote, or by ignoring the
-      --  character.
-   end Parse;
-
-   overriding procedure Execute_Actions (Parser : in out 
LR.Parser_No_Recover.Parser)
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Syntax_Trees.User_Data_Access;
-
-      procedure Process_Node
-        (Tree : in out Syntax_Trees.Tree;
-         Node : in     Syntax_Trees.Valid_Node_Index)
-      is
-         use all type Syntax_Trees.Node_Label;
-      begin
-         if Tree.Label (Node) /= Nonterm then
-            return;
-         end if;
-
-         declare
-            use all type Syntax_Trees.Semantic_Action;
-            Tree_Children : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Node);
-         begin
-            Parser.User_Data.Reduce (Tree, Node, Tree_Children);
-
-            if Tree.Action (Node) /= null then
-               Tree.Action (Node) (Parser.User_Data.all, Tree, Node, 
Tree_Children);
-            end if;
-         end;
-      end Process_Node;
-
-   begin
-      if Parser.User_Data /= null then
-         if Parser.Parsers.Count > 1 then
-            raise Syntax_Error with "ambiguous parse; can't execute actions";
-         end if;
-
-         declare
-            Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_State_Ref.Element.all;
-         begin
-            Parser_State.Tree.Process_Tree (Process_Node'Access);
-         end;
-      end if;
-   end Execute_Actions;
-
-   overriding function Tree (Parser : in LR.Parser_No_Recover.Parser) return 
Syntax_Trees.Tree
-   is
-      use all type SAL.Base_Peek_Type;
-   begin
-      if Parser.Parsers.Count > 1 then
-         raise WisiToken.Parse_Error with "ambigous parse";
-      else
-         return Parser.Parsers.First_State_Ref.Tree;
-      end if;
-   end Tree;
-
-   overriding function Any_Errors (Parser : in LR.Parser_No_Recover.Parser) 
return Boolean
-   is
-      use all type SAL.Base_Peek_Type;
-      use all type Ada.Containers.Count_Type;
-      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
-   begin
-      pragma Assert (Parser_State.Tree.Flushed);
-      return Parser.Parsers.Count > 1 or Parser_State.Errors.Length > 0 or 
Parser.Lexer.Errors.Length > 0;
-   end Any_Errors;
-
-   overriding procedure Put_Errors (Parser : in LR.Parser_No_Recover.Parser)
-   is
-      use Ada.Text_IO;
-
-      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
-      Descriptor   : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-   begin
-      for Item of Parser.Lexer.Errors loop
-         Put_Line
-           (Current_Error,
-            Parser.Lexer.File_Name & ":0:0: lexer unrecognized character at" & 
Buffer_Pos'Image (Item.Char_Pos));
-      end loop;
-
-      for Item of Parser_State.Errors loop
-         case Item.Label is
-         when Action =>
-            declare
-               Token : Base_Token renames Parser.Terminals 
(Parser_State.Tree.Min_Terminal_Index (Item.Error_Token));
-            begin
-               Put_Line
-                 (Current_Error,
-                  Error_Message
-                    (Parser.Lexer.File_Name, Token.Line, Token.Column,
-                     "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
-                       ", found '" & Parser.Lexer.Buffer_Text 
(Token.Byte_Region) & "'"));
-            end;
-
-         when Check =>
-            null;
-
-         when Message =>
-            Put_Line (Current_Error, -Item.Msg);
-         end case;
-
-      end loop;
-   end Put_Errors;
-
-end WisiToken.Parse.LR.Parser_No_Recover;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2002 - 2005, 2008 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under the terms of the GNU General Public License
+--  as published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. The WisiToken package is
+--  distributed in the hope that it will be useful, but WITHOUT ANY
+--  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+--  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+--  License for more details. You should have received a copy of the
+--  GNU General Public License distributed with the WisiToken package;
+--  see file GPL.txt. If not, write to the Free Software Foundation,
+--  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this unit does not by itself cause the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file might be covered by the GNU Public License.
+
+pragma License (Modified_GPL);
+
+with Ada.Exceptions;
+package body WisiToken.Parse.LR.Parser_No_Recover is
+
+   procedure Reduce_Stack_1
+     (Current_Parser : in     Parser_Lists.Cursor;
+      Action         : in     Reduce_Action_Rec;
+      Nonterm        :    out WisiToken.Syntax_Trees.Valid_Node_Index;
+      Trace          : in out WisiToken.Trace'Class)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      Parser_State  : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
+      Children_Tree : Syntax_Trees.Valid_Node_Index_Array (1 .. 
SAL.Base_Peek_Type (Action.Token_Count));
+      --  for Set_Children.
+   begin
+      for I in reverse Children_Tree'Range loop
+         Children_Tree (I) := Parser_State.Stack.Pop.Token;
+      end loop;
+
+      Nonterm := Parser_State.Tree.Add_Nonterm
+        (Action.Production, Children_Tree, Action.Action, Default_Virtual => 
False);
+      --  Computes Nonterm.Byte_Region
+
+      if Trace_Parse > Detail then
+         Trace.Put_Line (Parser_State.Tree.Image (Nonterm, 
Trace.Descriptor.all, Include_Children => True));
+      end if;
+   end Reduce_Stack_1;
+
+   procedure Do_Action
+     (Action         : in Parse_Action_Rec;
+      Current_Parser : in Parser_Lists.Cursor;
+      Shared_Parser  : in Parser)
+   is
+      Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+      Trace        : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+      Nonterm      : WisiToken.Syntax_Trees.Valid_Node_Index;
+   begin
+      if Trace_Parse > Detail then
+         Trace.Put
+           (Integer'Image (Current_Parser.Label) & ": " &
+              Trimmed_Image (Parser_State.Stack.Peek.State) & ": " &
+              Parser_State.Tree.Image (Parser_State.Current_Token, 
Trace.Descriptor.all) & " : ");
+         Put (Trace, Action);
+         Trace.New_Line;
+      end if;
+
+      case Action.Verb is
+      when Shift =>
+         Current_Parser.Set_Verb (Shift);
+         Parser_State.Stack.Push ((Action.State, Parser_State.Current_Token));
+         Parser_State.Tree.Set_State (Parser_State.Current_Token, 
Action.State);
+
+      when Reduce =>
+         Current_Parser.Set_Verb (Reduce);
+
+         declare
+            use all type SAL.Base_Peek_Type;
+
+            New_State : constant Unknown_State_Index := Goto_For
+              (Table => Shared_Parser.Table.all,
+               State => Parser_State.Stack (SAL.Base_Peek_Type 
(Action.Token_Count) + 1).State,
+               ID    => Action.Production.LHS);
+         begin
+            if New_State = Unknown_State then
+               --  This is due to a bug in the LALR parser generator (see
+               --  lalr_generator_bug_01.wy); we treat it as a syntax error.
+               Current_Parser.Set_Verb (Error);
+               if Trace_Parse > Detail then
+                  Trace.Put_Line (" ... error");
+               end if;
+            else
+               Reduce_Stack_1 (Current_Parser, Action, Nonterm, Trace);
+               Parser_State.Stack.Push ((New_State, Nonterm));
+               Parser_State.Tree.Set_State (Nonterm, New_State);
+
+               if Trace_Parse > Detail then
+                  Trace.Put_Line (" ... goto state " & Trimmed_Image 
(New_State));
+               end if;
+            end if;
+         end;
+
+      when Accept_It =>
+         Current_Parser.Set_Verb (Accept_It);
+         Reduce_Stack_1
+           (Current_Parser,
+            (Reduce, Action.Production, Action.Action, Action.Check, 
Action.Token_Count),
+            Nonterm, Trace);
+
+         Parser_State.Tree.Set_Root (Nonterm);
+
+      when Error =>
+         Current_Parser.Set_Verb (Action.Verb);
+
+         --  We don't raise Syntax_Error here; another parser may be able to
+         --  continue.
+
+         declare
+            Expecting : constant Token_ID_Set := LR.Expecting
+              (Shared_Parser.Table.all, 
Current_Parser.State_Ref.Stack.Peek.State);
+         begin
+            Parser_State.Errors.Append
+              ((Label          => LR.Action,
+                First_Terminal => Trace.Descriptor.First_Terminal,
+                Last_Terminal  => Trace.Descriptor.Last_Terminal,
+                Error_Token    => Parser_State.Current_Token,
+                Expecting      => Expecting,
+                Recover        => (others => <>)));
+
+            if Trace_Parse > Outline then
+               Put
+                 (Trace,
+                  Integer'Image (Current_Parser.Label) & ": expecting: " &
+                    Image (Expecting, Trace.Descriptor.all));
+               Trace.New_Line;
+            end if;
+         end;
+      end case;
+   end Do_Action;
+
+   --  Return the type of parser cycle to execute.
+   --
+   --  Accept : all Parsers.Verb return Accept - done parsing.
+   --
+   --  Shift : some Parsers.Verb return Shift.
+   --
+   --  Reduce : some Parsers.Verb return Reduce.
+   --
+   --  Error : all Parsers.Verb return Error.
+   procedure Parse_Verb
+     (Shared_Parser : in out Parser;
+      Verb          :    out All_Parse_Action_Verbs)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      Shift_Count  : SAL.Base_Peek_Type := 0;
+      Accept_Count : SAL.Base_Peek_Type := 0;
+      Error_Count  : SAL.Base_Peek_Type := 0;
+   begin
+      for Parser_State of Shared_Parser.Parsers loop
+         case Parser_State.Verb is
+         when Shift =>
+            Shift_Count := Shift_Count + 1;
+
+         when Reduce =>
+            Verb := Reduce;
+            return;
+
+         when Accept_It =>
+            Accept_Count := Accept_Count + 1;
+
+         when Error =>
+            Error_Count := Error_Count + 1;
+
+         when Pause =>
+            --  This is parser_no_recover
+            raise SAL.Programmer_Error;
+         end case;
+      end loop;
+
+      if Shared_Parser.Parsers.Count = Accept_Count then
+         Verb := Accept_It;
+
+      elsif Shared_Parser.Parsers.Count = Error_Count then
+         Verb := Error;
+
+      elsif Shift_Count > 0 then
+         Verb := Shift;
+
+      else
+         raise SAL.Programmer_Error;
+      end if;
+   end Parse_Verb;
+
+   ----------
+   --  Public subprograms, declaration order
+
+   overriding procedure Finalize (Object : in out Parser)
+   is begin
+      Free_Table (Object.Table);
+   end Finalize;
+
+   procedure New_Parser
+     (Parser               :    out          LR.Parser_No_Recover.Parser;
+      Trace                : not null access WisiToken.Trace'Class;
+      Lexer                : in              WisiToken.Lexer.Handle;
+      Table                : in              Parse_Table_Ptr;
+      User_Data            : in              
WisiToken.Syntax_Trees.User_Data_Access;
+      Max_Parallel         : in              SAL.Base_Peek_Type := 
Default_Max_Parallel;
+      First_Parser_Label   : in              Integer            := 1;
+      Terminate_Same_State : in              Boolean            := True)
+   is
+      use all type Syntax_Trees.User_Data_Access;
+   begin
+      Parser.Lexer                := Lexer;
+      Parser.Trace                := Trace;
+      Parser.Table                := Table;
+      Parser.User_Data            := User_Data;
+      Parser.Max_Parallel         := Max_Parallel;
+      Parser.First_Parser_Label   := First_Parser_Label;
+      Parser.Terminate_Same_State := Terminate_Same_State;
+
+      if User_Data /= null then
+         User_Data.Set_Lexer_Terminals (Lexer, 
Parser.Terminals'Unchecked_Access);
+      end if;
+   end New_Parser;
+
+   overriding procedure Parse (Shared_Parser : aliased in out Parser)
+   is
+      use all type Syntax_Trees.User_Data_Access;
+      use all type SAL.Base_Peek_Type;
+
+      Trace : WisiToken.Trace'Class renames Shared_Parser.Trace.all;
+
+      Current_Verb   : All_Parse_Action_Verbs;
+      Current_Parser : Parser_Lists.Cursor;
+      Action         : Parse_Action_Node_Ptr;
+
+      procedure Check_Error (Check_Parser : in out Parser_Lists.Cursor)
+      is begin
+         if Check_Parser.Verb = Error then
+            --  This parser errored on last input. This is how grammar 
conflicts
+            --  are resolved when the input text is valid, so we terminate this
+            --  parser.
+
+            if Shared_Parser.Parsers.Count = 1 then
+               raise Syntax_Error;
+            else
+               Shared_Parser.Parsers.Terminate_Parser
+                 (Check_Parser, "", Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+            end if;
+         else
+            Check_Parser.Next;
+         end if;
+      end Check_Error;
+
+   begin
+      if Shared_Parser.User_Data /= null then
+         Shared_Parser.User_Data.Reset;
+      end if;
+
+      Shared_Parser.Lex_All;
+
+      Shared_Parser.Shared_Tree.Clear;
+
+      Shared_Parser.Parsers := Parser_Lists.New_List
+        (Shared_Tree => Shared_Parser.Shared_Tree'Unchecked_Access);
+
+      Shared_Parser.Parsers.First.State_Ref.Stack.Push 
((Shared_Parser.Table.State_First, others => <>));
+
+      Main_Loop :
+      loop
+         --  exit on Accept_It action or syntax error.
+
+         Parse_Verb (Shared_Parser, Current_Verb);
+
+         case Current_Verb is
+         when Shift =>
+            --  All parsers just shifted a token; get the next token
+
+            for Parser_State of Shared_Parser.Parsers loop
+               Parser_State.Shared_Token  := Parser_State.Shared_Token + 1;
+               Parser_State.Current_Token := Parser_State.Tree.Add_Terminal
+                 (Parser_State.Shared_Token, Shared_Parser.Terminals);
+            end loop;
+
+         when Accept_It =>
+            --  All parsers accepted.
+            declare
+               Count : constant SAL.Base_Peek_Type := 
Shared_Parser.Parsers.Count;
+            begin
+               if Count = 1 then
+                  --  Nothing more to do
+                  if Trace_Parse > Outline then
+                     Trace.Put_Line (Integer'Image 
(Shared_Parser.Parsers.First.Label) & ": succeed");
+                  end if;
+                  exit Main_Loop;
+
+               else
+                  --  More than one parser is active; ambiguous parse.
+                  declare
+                     Token : Base_Token renames Shared_Parser.Terminals 
(Shared_Parser.Terminals.Last_Index);
+                  begin
+                     raise WisiToken.Parse_Error with Error_Message
+                       (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
+                        "Ambiguous parse:" & SAL.Base_Peek_Type'Image (Count) 
& " parsers active.");
+                  end;
+               end if;
+            end;
+
+         when Reduce =>
+            null;
+
+         when Error =>
+            --  All parsers errored; terminate with error. Semantic_State has 
all
+            --  the required info (recorded by Error in Do_Action), so we just
+            --  raise the exception.
+            raise Syntax_Error;
+
+         when Pause =>
+            --  This is parser_no_recover
+            raise SAL.Programmer_Error;
+         end case;
+
+         --  We don't use 'for Parser_State of Parsers loop' here,
+         --  because terminate on error and spawn on conflict require
+         --  changing the parser list.
+         Current_Parser := Shared_Parser.Parsers.First;
+         loop
+            exit when Current_Parser.Is_Done;
+
+            if Shared_Parser.Terminate_Same_State and
+              Current_Verb = Shift
+            then
+               Shared_Parser.Parsers.Duplicate_State
+                 (Current_Parser, Shared_Parser.Trace.all, 
Shared_Parser.Terminals);
+               --  If Duplicate_State terminated Current_Parser, 
Current_Parser now
+               --  points to the next parser. Otherwise it is unchanged.
+            end if;
+
+            exit when Current_Parser.Is_Done;
+
+            if Trace_Parse > Extra then
+               Trace.Put_Line
+                 ("current_verb: " & Parse_Action_Verbs'Image (Current_Verb) &
+                    "," & Integer'Image (Current_Parser.Label) &
+                    ".verb: " & Parse_Action_Verbs'Image 
(Current_Parser.Verb));
+            end if;
+
+            --  Each branch of the following 'if' calls either 
Current_Parser.Free
+            --  (which advances to the next parser) or Current_Parser.Next.
+
+            if Current_Parser.Verb = Current_Verb then
+               if Trace_Parse > Extra then
+                  Parser_Lists.Put_Top_10 (Trace, Current_Parser);
+               end if;
+
+               declare
+                  State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref.Element.all;
+               begin
+                  Action := Action_For
+                    (Table => Shared_Parser.Table.all,
+                     State => State.Stack.Peek.State,
+                     ID    => State.Tree.ID (State.Current_Token));
+               end;
+
+               declare
+                  Conflict : Parse_Action_Node_Ptr := Action.Next;
+               begin
+                  loop
+                     exit when Conflict = null;
+                     --  Spawn a new parser (before modifying Current_Parser 
stack).
+
+                     if Shared_Parser.Parsers.Count = 
Shared_Parser.Max_Parallel then
+                        declare
+                           Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+                           Token : Base_Token renames Shared_Parser.Terminals 
(Parser_State.Shared_Token);
+                        begin
+                           raise WisiToken.Parse_Error with Error_Message
+                             (Shared_Parser.Lexer.File_Name, Token.Line, 
Token.Column,
+                              ": too many parallel parsers required in grammar 
state" &
+                                State_Index'Image 
(Parser_State.Stack.Peek.State) &
+                                "; simplify grammar, or increase max-parallel 
(" &
+                                SAL.Base_Peek_Type'Image 
(Shared_Parser.Max_Parallel) & ")");
+                        end;
+                     else
+                        if Trace_Parse > Outline then
+                           declare
+                              Parser_State : Parser_Lists.Parser_State renames 
Current_Parser.State_Ref;
+                           begin
+                              Trace.Put_Line
+                                (Integer'Image (Current_Parser.Label) & ": " &
+                                   Trimmed_Image 
(Parser_State.Stack.Peek.State) & ": " &
+                                   Parser_State.Tree.Image 
(Parser_State.Current_Token, Trace.Descriptor.all) & " : " &
+                                   "spawn" & Integer'Image 
(Shared_Parser.Parsers.Last_Label + 1) & ", (" &
+                                   Trimmed_Image (1 + Integer 
(Shared_Parser.Parsers.Count)) & " active)");
+                           end;
+                        end if;
+
+                        Shared_Parser.Parsers.Prepend_Copy (Current_Parser);
+                        Do_Action (Conflict.Item, Shared_Parser.Parsers.First, 
Shared_Parser);
+
+                        declare
+                           Temp : Parser_Lists.Cursor := 
Shared_Parser.Parsers.First;
+                        begin
+                           Check_Error (Temp);
+                        end;
+                     end if;
+
+                     Conflict := Conflict.Next;
+                  end loop;
+               end;
+
+               Do_Action (Action.Item, Current_Parser, Shared_Parser);
+               Check_Error (Current_Parser);
+
+            else
+               --  Current parser is waiting for others to catch up
+               Current_Parser.Next;
+            end if;
+         end loop;
+      end loop Main_Loop;
+
+      --  We don't raise Syntax_Error for lexer errors, since they are all
+      --  recovered, either by inserting a quote, or by ignoring the
+      --  character.
+   end Parse;
+
+   overriding procedure Execute_Actions (Parser : in out 
LR.Parser_No_Recover.Parser)
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Syntax_Trees.User_Data_Access;
+
+      procedure Process_Node
+        (Tree : in out Syntax_Trees.Tree;
+         Node : in     Syntax_Trees.Valid_Node_Index)
+      is
+         use all type Syntax_Trees.Node_Label;
+      begin
+         if Tree.Label (Node) /= Nonterm then
+            return;
+         end if;
+
+         declare
+            use all type Syntax_Trees.Semantic_Action;
+            Tree_Children : constant Syntax_Trees.Valid_Node_Index_Array := 
Tree.Children (Node);
+         begin
+            Parser.User_Data.Reduce (Tree, Node, Tree_Children);
+
+            if Tree.Action (Node) /= null then
+               begin
+                  Tree.Action (Node) (Parser.User_Data.all, Tree, Node, 
Tree_Children);
+               exception
+               when E : others =>
+                  declare
+                     Token : Base_Token renames Parser.Terminals 
(Tree.Min_Terminal_Index (Node));
+                  begin
+                     raise WisiToken.Parse_Error with Error_Message
+                       (Parser.Lexer.File_Name, Token.Line, Token.Column,
+                        "action raised exception " & 
Ada.Exceptions.Exception_Name (E) & ": " &
+                          Ada.Exceptions.Exception_Message (E));
+                  end;
+               end;
+            end if;
+         end;
+      end Process_Node;
+
+   begin
+      if Parser.User_Data /= null then
+         if Parser.Parsers.Count > 1 then
+            raise Syntax_Error with "ambiguous parse; can't execute actions";
+         end if;
+
+         declare
+            Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_State_Ref.Element.all;
+         begin
+            Parser.User_Data.Initialize_Actions (Parser_State.Tree);
+            Parser_State.Tree.Process_Tree (Process_Node'Access);
+         end;
+      end if;
+   end Execute_Actions;
+
+   overriding function Tree (Parser : in LR.Parser_No_Recover.Parser) return 
Syntax_Trees.Tree
+   is
+      use all type SAL.Base_Peek_Type;
+   begin
+      if Parser.Parsers.Count > 1 then
+         raise WisiToken.Parse_Error with "ambigous parse";
+      else
+         return Parser.Parsers.First_State_Ref.Tree;
+      end if;
+   end Tree;
+
+   overriding function Any_Errors (Parser : in LR.Parser_No_Recover.Parser) 
return Boolean
+   is
+      use all type SAL.Base_Peek_Type;
+      use all type Ada.Containers.Count_Type;
+      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
+   begin
+      pragma Assert (Parser_State.Tree.Flushed);
+      return Parser.Parsers.Count > 1 or Parser_State.Errors.Length > 0 or 
Parser.Lexer.Errors.Length > 0;
+   end Any_Errors;
+
+   overriding procedure Put_Errors (Parser : in LR.Parser_No_Recover.Parser)
+   is
+      use Ada.Text_IO;
+
+      Parser_State : Parser_Lists.Parser_State renames 
Parser.Parsers.First_Constant_State_Ref;
+      Descriptor   : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+   begin
+      for Item of Parser.Lexer.Errors loop
+         Put_Line
+           (Current_Error,
+            Parser.Lexer.File_Name & ":0:0: lexer unrecognized character at" & 
Buffer_Pos'Image (Item.Char_Pos));
+      end loop;
+
+      for Item of Parser_State.Errors loop
+         case Item.Label is
+         when Action =>
+            declare
+               Token : Base_Token renames Parser.Terminals 
(Parser_State.Tree.Min_Terminal_Index (Item.Error_Token));
+            begin
+               Put_Line
+                 (Current_Error,
+                  Error_Message
+                    (Parser.Lexer.File_Name, Token.Line, Token.Column,
+                     "syntax error: expecting " & Image (Item.Expecting, 
Descriptor) &
+                       ", found '" & Parser.Lexer.Buffer_Text 
(Token.Byte_Region) & "'"));
+            end;
+
+         when Check =>
+            null;
+
+         when Message =>
+            Put_Line (Current_Error, -Item.Msg);
+         end case;
+
+      end loop;
+   end Put_Errors;
+
+end WisiToken.Parse.LR.Parser_No_Recover;
diff --git a/packages/wisi/wisitoken-parse-lr.adb 
b/packages/wisi/wisitoken-parse-lr.adb
index 79f4f2e..8900d4c 100644
--- a/packages/wisi/wisitoken-parse-lr.adb
+++ b/packages/wisi/wisitoken-parse-lr.adb
@@ -1,874 +1,890 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2013-2015, 2017, 2018, 2019 Free Software Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under the terms of the GNU General Public License
---  as published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. The WisiToken package is
---  distributed in the hope that it will be useful, but WITHOUT ANY
---  WARRANTY; without even the implied warranty of MERCHANTABILITY or
---  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
---  License for more details. You should have received a copy of the
---  GNU General Public License distributed with the WisiToken package;
---  see file GPL.txt. If not, write to the Free Software Foundation,
---  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
---  As a special exception, if other files instantiate generics from
---  this unit, or you link this unit with other files to produce an
---  executable, this unit does not by itself cause the resulting
---  executable to be covered by the GNU General Public License. This
---  exception does not however invalidate any other reasons why the
---  executable file might be covered by the GNU Public License.
-
-pragma License (GPL);
-
-with Ada.Exceptions;
-with Ada.Strings.Maps;
-with Ada.Strings.Fixed;
-with Ada.Text_IO;
-with GNATCOLL.Mmap;
-package body WisiToken.Parse.LR is
-
-   ----------
-   --  Public subprograms, declaration order
-
-   function Image (Item : in Parse_Action_Rec; Descriptor : in 
WisiToken.Descriptor) return String
-   is
-      use Ada.Containers;
-   begin
-      case Item.Verb is
-      when Shift =>
-         return "(Shift," & State_Index'Image (Item.State) & ")";
-
-      when Reduce =>
-         return "(Reduce," & Count_Type'Image (Item.Token_Count) & ", " &
-           Image (Item.Production.LHS, Descriptor) & "," & Trimmed_Image 
(Item.Production.RHS) & ")";
-      when Accept_It =>
-         return "(Accept It)";
-      when Error =>
-         return "(Error)";
-      end case;
-   end Image;
-
-   procedure Put (Trace : in out WisiToken.Trace'Class; Item : in 
Parse_Action_Rec)
-   is
-      use Ada.Containers;
-   begin
-      case Item.Verb is
-      when Shift =>
-         Trace.Put ("shift and goto state" & State_Index'Image (Item.State), 
Prefix => False);
-
-      when Reduce =>
-         Trace.Put
-           ("reduce" & Count_Type'Image (Item.Token_Count) & " tokens to " &
-              Image (Item.Production.LHS, Trace.Descriptor.all),
-            Prefix => False);
-      when Accept_It =>
-         Trace.Put ("accept it", Prefix => False);
-      when Error =>
-         Trace.Put ("ERROR", Prefix => False);
-      end case;
-   end Put;
-
-   function Equal (Left, Right : in Parse_Action_Rec) return Boolean
-   is
-      use all type Ada.Containers.Count_Type;
-   begin
-      if Left.Verb = Right.Verb then
-         case Left.Verb is
-         when Shift =>
-            return Left.State = Right.State;
-
-         when Reduce | Accept_It =>
-            return Left.Production.LHS = Right.Production.LHS and 
Left.Token_Count = Right.Token_Count;
-
-         when Error =>
-            return True;
-         end case;
-      else
-         return False;
-      end if;
-   end Equal;
-
-   procedure Add
-     (List   : in out Action_Node_Ptr;
-      Symbol : in     Token_ID;
-      Action : in     Parse_Action_Rec)
-   is
-      New_Item : constant Action_Node_Ptr := new Action_Node'(Symbol, new 
Parse_Action_Node'(Action, null), null);
-      I        : Action_Node_Ptr          := List;
-   begin
-      if I = null then
-         List := New_Item;
-      else
-         if List.Symbol > Symbol then
-            New_Item.Next := List;
-            List          := New_Item;
-         else
-            if List.Next = null then
-               List.Next := New_Item;
-            else
-               I := List;
-               loop
-                  exit when I.Next = null or else I.Next.Symbol > Symbol;
-                  I := I.Next;
-               end loop;
-               New_Item.Next := I.Next;
-               I.Next        := New_Item;
-            end if;
-         end if;
-      end if;
-   end Add;
-
-   function Symbol (List : in Goto_Node_Ptr) return Token_ID
-   is begin
-      return List.Symbol;
-   end Symbol;
-
-   function State (List : in Goto_Node_Ptr) return State_Index
-   is begin
-      return List.State;
-   end State;
-
-   function Next (List : in Goto_Node_Ptr) return Goto_Node_Ptr
-   is begin
-      return List.Next;
-   end Next;
-
-   function Strict_Image (Item : in Minimal_Action) return String
-   is begin
-      case Item.Verb is
-      when Pause =>
-         return "(Verb => Shift)";
-      when Shift =>
-         return "(Shift," & Token_ID'Image (Item.ID) & "," & State_Index'Image 
(Item.State) & ")";
-      when Reduce =>
-         return "(Reduce," & Token_ID'Image (Item.Nonterm) & "," &
-           Ada.Containers.Count_Type'Image (Item.Token_Count) & ")";
-      end case;
-   end Strict_Image;
-
-   function First (State : in Parse_State) return Action_List_Iterator
-   is begin
-      return Iter : Action_List_Iterator := (Node => State.Action_List, Item 
=> null) do
-         loop
-            exit when Iter.Node = null;
-            Iter.Item := Iter.Node.Action;
-            exit when Iter.Item /= null;
-            Iter.Node := Iter.Node.Next;
-         end loop;
-      end return;
-   end First;
-
-   function Is_Done (Iter : in Action_List_Iterator) return Boolean
-   is begin
-      return Iter.Node = null;
-   end Is_Done;
-
-   procedure Next (Iter : in out Action_List_Iterator)
-   is begin
-      if Iter.Node = null then
-         return;
-      end if;
-
-      if Iter.Item.Next = null then
-         loop
-            Iter.Node := Iter.Node.Next;
-            exit when Iter.Node = null;
-            Iter.Item := Iter.Node.Action;
-            exit when Iter.Item /= null;
-         end loop;
-      else
-         Iter.Item := Iter.Item.Next; -- a conflict
-      end if;
-   end Next;
-
-   function Symbol (Iter : in Action_List_Iterator) return Token_ID
-   is begin
-      return Iter.Node.Symbol;
-   end Symbol;
-
-   function Action (Iter : in Action_List_Iterator) return Parse_Action_Rec
-   is begin
-      return Iter.Item.Item;
-   end Action;
-
-   procedure Add_Action
-     (State       : in out LR.Parse_State;
-      Symbol      : in     Token_ID;
-      State_Index : in     WisiToken.State_Index)
-   is
-      Action   : constant Parse_Action_Rec := (Shift, State_Index);
-      New_Node : constant Action_Node_Ptr  := new Action_Node'(Symbol, new 
Parse_Action_Node'(Action, null), null);
-      Node     : Action_Node_Ptr;
-   begin
-      if State.Action_List = null then
-         State.Action_List := New_Node;
-      else
-         Node := State.Action_List;
-         loop
-            exit when Node.Next = null;
-            Node := Node.Next;
-         end loop;
-         Node.Next := New_Node;
-      end if;
-   end Add_Action;
-
-   procedure Add_Action
-     (State           : in out LR.Parse_State;
-      Symbol          : in     Token_ID;
-      Verb            : in     LR.Parse_Action_Verbs;
-      Production      : in     Production_ID;
-      RHS_Token_Count : in     Ada.Containers.Count_Type;
-      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check  : in     Semantic_Checks.Semantic_Check)
-   is
-      Action   : Parse_Action_Rec;
-      New_Node : Action_Node_Ptr;
-      Node     : Action_Node_Ptr;
-   begin
-      case Verb is
-      when Reduce =>
-         Action := (Reduce, Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
-      when Accept_It =>
-         Action := (Accept_It, Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
-      when others =>
-         null;
-      end case;
-      New_Node := new Action_Node'(Symbol, new Parse_Action_Node'(Action, 
null), null);
-      if State.Action_List = null then
-         State.Action_List := New_Node;
-      else
-         Node := State.Action_List;
-         loop
-            exit when Node.Next = null;
-            Node := Node.Next;
-         end loop;
-         Node.Next := New_Node;
-      end if;
-   end Add_Action;
-
-   procedure Add_Action
-     (State           : in out Parse_State;
-      Symbols         : in     Token_ID_Array;
-      Production      : in     Production_ID;
-      RHS_Token_Count : in     Ada.Containers.Count_Type;
-      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check)
-   is begin
-      --  We assume Duplicate_Reduce is True for this state; no
-      --  conflicts, all the same action.
-      for Symbol of Symbols loop
-         Add_Action
-           (State, Symbol, Reduce, Production, RHS_Token_Count,
-            Semantic_Action, Semantic_Check);
-      end loop;
-      Add_Error (State);
-   end Add_Action;
-
-   procedure Add_Action
-     (State             : in out LR.Parse_State;
-      Symbol            : in     Token_ID;
-      State_Index       : in     WisiToken.State_Index;
-      Reduce_Production : in     Production_ID;
-      RHS_Token_Count   : in     Ada.Containers.Count_Type;
-      Semantic_Action   : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check    : in     Semantic_Checks.Semantic_Check)
-   is
-      Action_1 : constant Parse_Action_Rec := (Shift, State_Index);
-      Action_2 : constant Parse_Action_Rec :=
-        (Reduce, Reduce_Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
-   begin
-      State.Action_List := new Action_Node'
-        (Symbol, new Parse_Action_Node'(Action_1, new 
Parse_Action_Node'(Action_2, null)), State.Action_List);
-   end Add_Action;
-
-   procedure Add_Action
-     (State             : in out LR.Parse_State;
-      Symbol            : in     Token_ID;
-      Verb              : in     LR.Parse_Action_Verbs;
-      Production_1      : in     Production_ID;
-      RHS_Token_Count_1 : in     Ada.Containers.Count_Type;
-      Semantic_Action_1 : in     Syntax_Trees.Semantic_Action;
-      Semantic_Check_1  : in     Semantic_Checks.Semantic_Check;
-      Production_2      : in     Production_ID;
-      RHS_Token_Count_2 : in     Ada.Containers.Count_Type;
-      Semantic_Action_2 : in     Syntax_Trees.Semantic_Action;
-      Semantic_Check_2  : in     Semantic_Checks.Semantic_Check)
-   is
-      Action_1 : constant Parse_Action_Rec :=
-        (case Verb is
-         when Reduce    =>
-           (Reduce, Production_1, Semantic_Action_1, Semantic_Check_1, 
RHS_Token_Count_1),
-         when Accept_It =>
-           (Accept_It, Production_1, Semantic_Action_1, Semantic_Check_1, 
RHS_Token_Count_1),
-         when others => raise SAL.Programmer_Error);
-
-      Action_2 : constant Parse_Action_Rec :=
-        (Reduce, Production_2, Semantic_Action_2, Semantic_Check_2, 
RHS_Token_Count_2);
-   begin
-      State.Action_List := new Action_Node'
-        (Symbol, new Parse_Action_Node'(Action_1, new 
Parse_Action_Node'(Action_2, null)), State.Action_List);
-   end Add_Action;
-
-   procedure Add_Error (State  : in out LR.Parse_State)
-   is
-      Action : constant Parse_Action_Rec := (Verb => Error);
-      Node   : Action_Node_Ptr           := State.Action_List;
-   begin
-      if Node = null then
-         raise SAL.Programmer_Error with "adding an error action to a parse 
table state before other actions.";
-      end if;
-      loop
-         exit when Node.Next = null;
-         Node := Node.Next;
-      end loop;
-      Node.Next := new Action_Node'(Invalid_Token_ID, new 
Parse_Action_Node'(Action, null), null);
-   end Add_Error;
-
-   procedure Add_Goto
-     (State      : in out LR.Parse_State;
-      Symbol     : in     Token_ID;
-      To_State   : in     State_Index)
-   is
-      List     : Goto_Node_Ptr renames State.Goto_List;
-      New_Item : constant Goto_Node_Ptr := new Goto_Node'(Symbol, To_State, 
null);
-      I        : Goto_Node_Ptr := List;
-   begin
-      if I = null then
-         List := New_Item;
-      else
-         if List.Symbol > Symbol then
-            New_Item.Next := List;
-            List          := New_Item;
-         else
-            if List.Next = null then
-               List.Next := New_Item;
-            else
-               I := List;
-               loop
-                  exit when I.Next = null or List.Symbol > Symbol;
-                  I := I.Next;
-               end loop;
-               New_Item.Next := I.Next;
-               I.Next        := New_Item;
-            end if;
-         end if;
-      end if;
-   end Add_Goto;
-
-   procedure Set_Production
-     (Prod     : in out Productions.Instance;
-      LHS      : in     Token_ID;
-      RHS_Last : in     Natural)
-   is begin
-      Prod.LHS := LHS;
-      Prod.RHSs.Set_First (0);
-      Prod.RHSs.Set_Last (RHS_Last);
-   end Set_Production;
-
-   procedure Set_RHS
-     (Prod      : in out Productions.Instance;
-      RHS_Index : in     Natural;
-      Tokens    : in     Token_ID_Array;
-      Action    : in     WisiToken.Syntax_Trees.Semantic_Action   := null;
-      Check     : in     WisiToken.Semantic_Checks.Semantic_Check := null)
-   is begin
-      if Tokens'Length > 0 then
-         Prod.RHSs (RHS_Index).Tokens.Set_First (1);
-         Prod.RHSs (RHS_Index).Tokens.Set_Last (Tokens'Length);
-         for I in Tokens'Range loop
-            Prod.RHSs (RHS_Index).Tokens (I) := Tokens (I);
-         end loop;
-         Prod.RHSs (RHS_Index).Action := Action;
-         Prod.RHSs (RHS_Index).Check  := Check;
-      end if;
-   end Set_RHS;
-
-   function Goto_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Unknown_State_Index
-   is
-      Goto_Node : constant Goto_Node_Ptr := Goto_For (Table, State, ID);
-   begin
-      if Goto_Node = null then
-         --  We can only get here during error recovery.
-         return Unknown_State;
-      else
-         return Goto_Node.State;
-      end if;
-   end Goto_For;
-
-   function Goto_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Goto_Node_Ptr
-   is
-      Goto_Node : Goto_Node_Ptr := Table.States (State).Goto_List;
-   begin
-      while Goto_Node /= null and then Goto_Node.Symbol /= ID loop
-         Goto_Node := Goto_Node.Next;
-      end loop;
-
-      return Goto_Node;
-   end Goto_For;
-
-   function Action_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Parse_Action_Node_Ptr
-   is
-      Action_Node : Action_Node_Ptr := Table.States (State).Action_List;
-   begin
-      if Action_Node = null then
-         raise SAL.Programmer_Error with "no actions for state" & 
Unknown_State_Index'Image (State);
-      end if;
-
-      while Action_Node.Next /= null and Action_Node.Symbol /= ID loop
-         Action_Node := Action_Node.Next;
-      end loop;
-
-      return Action_Node.Action;
-   end Action_For;
-
-   function Expecting (Table : in Parse_Table; State : in State_Index) return 
Token_ID_Set
-   is
-      Result : Token_ID_Set    := (Table.First_Terminal .. Table.Last_Terminal 
=> False);
-      Action : Action_Node_Ptr := Table.States (State).Action_List;
-   begin
-      loop
-         --  Last action is error; don't include it.
-         exit when Action.Next = null;
-
-         Result (Action.Symbol) := True;
-         Action := Action.Next;
-      end loop;
-      return Result;
-   end Expecting;
-
-   procedure Free_Table (Table : in out Parse_Table_Ptr)
-   is
-
-      procedure Free is new Ada.Unchecked_Deallocation (Parse_Table, 
Parse_Table_Ptr);
-      Action            : Action_Node_Ptr;
-      Temp_Action       : Action_Node_Ptr;
-      Parse_Action      : Parse_Action_Node_Ptr;
-      Temp_Parse_Action : Parse_Action_Node_Ptr;
-      Got               : Goto_Node_Ptr;
-      Temp_Got          : Goto_Node_Ptr;
-   begin
-      if Table = null then
-         return;
-      end if;
-
-      for State of Table.States loop
-         Action := State.Action_List;
-         loop
-            exit when Action = null;
-            Parse_Action := Action.Action;
-            loop
-               exit when Parse_Action = null;
-               Temp_Parse_Action := Parse_Action;
-               Parse_Action := Parse_Action.Next;
-               Free (Temp_Parse_Action);
-            end loop;
-
-            Temp_Action := Action;
-            Action := Action.Next;
-            Free (Temp_Action);
-         end loop;
-
-         Got := State.Goto_List;
-         loop
-            exit when Got = null;
-            Temp_Got := Got;
-            Got := Got.Next;
-            Free (Temp_Got);
-         end loop;
-      end loop;
-
-      Free (Table);
-   end Free_Table;
-
-   function Get_Action
-     (Prod        : in Production_ID;
-      Productions : in WisiToken.Productions.Prod_Arrays.Vector)
-     return WisiToken.Syntax_Trees.Semantic_Action
-   is begin
-      return Productions (Prod.LHS).RHSs (Prod.RHS).Action;
-   end Get_Action;
-
-   function Get_Check
-     (Prod        : in Production_ID;
-      Productions : in WisiToken.Productions.Prod_Arrays.Vector)
-     return WisiToken.Semantic_Checks.Semantic_Check
-   is begin
-      return Productions (Prod.LHS).RHSs (Prod.RHS).Check;
-   end Get_Check;
-
-   function Get_Text_Rep
-     (File_Name      : in String;
-      McKenzie_Param : in McKenzie_Param_Type;
-      Productions    : in WisiToken.Productions.Prod_Arrays.Vector)
-     return Parse_Table_Ptr
-   is
-      use Ada.Text_IO;
-
-      File            : GNATCOLL.Mmap.Mapped_File;
-      Region          : GNATCOLL.Mmap.Mapped_Region;
-      Buffer          : GNATCOLL.Mmap.Str_Access;
-      Buffer_Abs_Last : Integer; --  Buffer'Last, except Buffer has no bounds
-      Buffer_Last     : Integer := 0; -- Last char read from Buffer
-
-      Delimiters : constant Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.To_Set (" ;" & ASCII.LF);
-
-      function Check_Semicolon return Boolean
-      is begin
-         if Buffer (Buffer_Last) = ';' then
-            --  There is a space, newline, or newline and space after ';'. 
Leave
-            --  Buffer_Last on newline for Check_New_Line.
-            Buffer_Last := Buffer_Last + 1;
-            return True;
-         else
-            return False;
-         end if;
-      end Check_Semicolon;
-
-      procedure Check_Semicolon
-      is begin
-         if Buffer (Buffer_Last) = ';' then
-            --  There is a space, newline, or newline and space after ';'. 
Leave
-            --  Buffer_Last on newline for Check_New_Line.
-            Buffer_Last := Buffer_Last + 1;
-         else
-            raise SAL.Programmer_Error with Error_Message
-              (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
-               "expecting semicolon, found '" & Buffer (Buffer_Last) & "'");
-         end if;
-      end Check_Semicolon;
-
-      function Check_EOI return Boolean
-      is begin
-         return Buffer_Last >= Buffer_Abs_Last;
-      end Check_EOI;
-
-      procedure Check_New_Line
-      is
-         use Ada.Strings.Maps;
-      begin
-         if Buffer (Buffer_Last) = ASCII.LF then
-            --  There is a space or semicolon after some newlines.
-            if Is_In (Buffer (Buffer_Last + 1), Delimiters) then
-               Buffer_Last := Buffer_Last + 1;
-            end if;
-         else
-            raise SAL.Programmer_Error with Error_Message
-              (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
-               "expecting new_line, found '" & Buffer (Buffer_Last) & "'");
-         end if;
-      end Check_New_Line;
-
-      type Buffer_Region is record
-         First : Integer;
-         Last  : Integer;
-      end record;
-
-      function Next_Value return Buffer_Region;
-      pragma Inline (Next_Value);
-
-      function Next_Value return Buffer_Region
-      is
-         use Ada.Strings.Fixed;
-         First : constant Integer := Buffer_Last + 1;
-      begin
-         Buffer_Last := Index (Buffer.all, Delimiters, First);
-         return (First, Buffer_Last - 1);
-      end Next_Value;
-
-      procedure Raise_Gen_Next_Value_Constraint_Error (Name : String; Region : 
Buffer_Region);
-      pragma No_Return (Raise_Gen_Next_Value_Constraint_Error);
-
-      procedure Raise_Gen_Next_Value_Constraint_Error (Name : String; Region : 
Buffer_Region)
-      is begin
-         --  Factored out from Gen_Next_Value to make Inline efficient.
-         raise SAL.Programmer_Error with Error_Message
-           (File_Name, 1, Ada.Text_IO.Count (Region.First),
-            "expecting " & Name & ", found '" & Buffer (Region.First .. 
Region.Last) & "'");
-      end Raise_Gen_Next_Value_Constraint_Error;
-
-      generic
-         type Value_Type is (<>);
-         Name : in String;
-      function Gen_Next_Value return Value_Type;
-      pragma Inline (Gen_Next_Value);
-
-      function Gen_Next_Value return Value_Type
-      is
-         Region : constant Buffer_Region := Next_Value;
-      begin
-         return Value_Type'Value (Buffer (Region.First .. Region.Last));
-      exception
-      when Constraint_Error =>
-         Raise_Gen_Next_Value_Constraint_Error (Name, Region);
-      end Gen_Next_Value;
-
-      function Next_State_Index is new Gen_Next_Value (State_Index, 
"State_Index");
-      function Next_Token_ID is new Gen_Next_Value (Token_ID, "Token_ID");
-      function Next_Integer is new Gen_Next_Value (Integer, "Integer");
-      function Next_Parse_Action_Verbs is new Gen_Next_Value 
(Parse_Action_Verbs, "Parse_Action_Verbs");
-      function Next_Boolean is new Gen_Next_Value (Boolean, "Boolean");
-      function Next_Count_Type is new Gen_Next_Value 
(Ada.Containers.Count_Type, "Count_Type");
-   begin
-      File            := GNATCOLL.Mmap.Open_Read (File_Name);
-      Region          := GNATCOLL.Mmap.Read (File);
-      Buffer          := GNATCOLL.Mmap.Data (Region);
-      Buffer_Abs_Last := GNATCOLL.Mmap.Last (Region);
-
-      declare
-         --  We don't read the discriminants in the aggregate, because
-         --  aggregate evaluation order is not guaranteed.
-         State_First       : constant State_Index := Next_State_Index;
-         State_Last        : constant State_Index := Next_State_Index;
-         First_Terminal    : constant Token_ID    := Next_Token_ID;
-         Last_Terminal     : constant Token_ID    := Next_Token_ID;
-         First_Nonterminal : constant Token_ID    := Next_Token_ID;
-         Last_Nonterminal  : constant Token_ID    := Next_Token_ID;
-
-         Table : constant Parse_Table_Ptr := new Parse_Table
-           (State_First, State_Last, First_Terminal, Last_Terminal, 
First_Nonterminal, Last_Nonterminal);
-      begin
-         Check_New_Line;
-
-         Table.McKenzie_Param := McKenzie_Param;
-
-         for State of Table.States loop
-            State.Productions.Set_First (Next_Integer);
-            State.Productions.Set_Last (Next_Integer);
-            for I in State.Productions.First_Index .. 
State.Productions.Last_Index loop
-               State.Productions (I).LHS := Next_Token_ID;
-               State.Productions (I).RHS := Next_Integer;
-            end loop;
-            Check_New_Line;
-
-            declare
-               Node_I       : Action_Node_Ptr := new Action_Node;
-               Actions_Done : Boolean         := False;
-            begin
-               State.Action_List := Node_I;
-               loop
-                  declare
-                     Node_J      : Parse_Action_Node_Ptr := new 
Parse_Action_Node;
-                     Action_Done : Boolean := False;
-                     Verb        : Parse_Action_Verbs;
-                  begin
-                     Node_I.Action := Node_J;
-                     loop
-                        Verb := Next_Parse_Action_Verbs;
-                        Node_J.Item :=
-                          (case Verb is
-                           when Shift     => (Verb => Shift, others => <>),
-                           when Reduce    => (Verb => Reduce, others => <>),
-                           when Accept_It => (Verb => Accept_It, others => <>),
-                           when Error     => (Verb => Error));
-
-                        case Verb is
-                        when Shift =>
-                           Node_J.Item.State := Next_State_Index;
-
-                        when Reduce | Accept_It =>
-                           Node_J.Item.Production.LHS := Next_Token_ID;
-                           Node_J.Item.Production.RHS := Next_Integer;
-                           if Next_Boolean then
-                              Node_J.Item.Action := Get_Action 
(Node_J.Item.Production, Productions);
-                           else
-                              Node_J.Item.Action := null;
-                           end if;
-                           if Next_Boolean then
-                              Node_J.Item.Check := Get_Check 
(Node_J.Item.Production, Productions);
-                           else
-                              Node_J.Item.Check := null;
-                           end if;
-                           Node_J.Item.Token_Count := Next_Count_Type;
-
-                        when Error =>
-                           Actions_Done := True;
-                        end case;
-
-                        if Check_Semicolon then
-                           Action_Done := True;
-
-                           if not Actions_Done then
-                              Node_I.Symbol := Next_Token_ID;
-                           end if;
-                        end if;
-
-                        exit when Action_Done;
-
-                        Node_J.Next := new Parse_Action_Node;
-                        Node_J      := Node_J.Next;
-                     end loop;
-
-                     Check_New_Line;
-                  end;
-
-                  exit when Actions_Done;
-                  Node_I.Next := new Action_Node;
-                  Node_I      := Node_I.Next;
-               end loop;
-            end;
-
-            if Check_Semicolon then
-               --  No Gotos
-               null;
-            else
-               declare
-                  Node_I : Goto_Node_Ptr := new Goto_Node;
-               begin
-                  State.Goto_List  := Node_I;
-                  loop
-                     Node_I.Symbol := Next_Token_ID;
-                     Node_I.State  := Next_State_Index;
-                     exit when Check_Semicolon;
-                     Node_I.Next   := new Goto_Node;
-                     Node_I        := Node_I.Next;
-                  end loop;
-               end;
-            end if;
-            Check_New_Line;
-
-            if Check_Semicolon then
-               --  No minimal action
-               null;
-            else
-               declare
-                  Verb         : constant Minimal_Verbs := 
Next_Parse_Action_Verbs;
-                  ID           : Token_ID;
-                  Action_State : State_Index;
-                  Count        : Ada.Containers.Count_Type;
-               begin
-                  case Verb is
-                  when Pause =>
-                     null; --  Generate.LR.Put_Text_Rep does not output this
-
-                  when Shift =>
-                     ID           := Next_Token_ID;
-                     Action_State := Next_State_Index;
-                     State.Minimal_Complete_Action := (Shift, ID, 
Action_State);
-                  when Reduce =>
-                     ID    := Next_Token_ID;
-                     Count := Next_Count_Type;
-                     State.Minimal_Complete_Action := (Reduce, ID, Count);
-                  end case;
-               end;
-               Check_Semicolon;
-            end if;
-            Check_New_Line;
-
-            exit when Check_EOI;
-         end loop;
-         return Table;
-      end;
-   exception
-   when Name_Error =>
-      raise User_Error with "parser table text file '" & File_Name & "' not 
found.";
-
-   when SAL.Programmer_Error =>
-      raise;
-
-   when E : others =>
-      raise SAL.Programmer_Error with Error_Message
-        (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
-         Ada.Exceptions.Exception_Name (E) & ": " & 
Ada.Exceptions.Exception_Message (E));
-   end Get_Text_Rep;
-
-   function Compare (Left, Right : in Insert_Delete_Op) return 
SAL.Compare_Result
-   is begin
-      if Left.Token_Index < Right.Token_Index then
-         return SAL.Less;
-      elsif Left.Token_Index = Right.Token_Index then
-         return SAL.Equal;
-      else
-         return SAL.Greater;
-      end if;
-   end Compare;
-
-   function None_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean
-   is begin
-      for O of reverse Ops loop
-         exit when O.Op = Fast_Forward;
-         if O.Op = Op then
-            return False;
-         end if;
-      end loop;
-      return True;
-   end None_Since_FF;
-
-   function Match_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op) return Boolean
-   is begin
-      for O of reverse Ops loop
-         exit when O.Op = Fast_Forward;
-         if O = Op then
-            return True;
-         end if;
-      end loop;
-      return False;
-   end Match_Since_FF;
-
-   function Valid_Tree_Indices (Stack : in Recover_Stacks.Stack; Depth : in 
SAL.Base_Peek_Type) return Boolean
-   is
-      use all type Syntax_Trees.Node_Index;
-   begin
-      for I in 1 .. Depth loop
-         if Stack (I).Tree_Index = Syntax_Trees.Invalid_Node_Index then
-            return False;
-         end if;
-      end loop;
-      return True;
-   end Valid_Tree_Indices;
-
-   procedure Set_Key (Item : in out Configuration; Key : in Integer)
-   is begin
-      Item.Cost := Key;
-   end Set_Key;
-
-   procedure Accumulate (Data : in McKenzie_Data; Counts : in out 
Strategy_Counts)
-   is
-      procedure Proc (Config : in Configuration)
-      is begin
-         for I in Config.Strategy_Counts'Range loop
-            Counts (I) := Counts (I) + Config.Strategy_Counts (I);
-         end loop;
-      end Proc;
-   begin
-      Data.Results.Process (Proc'Unrestricted_Access);
-   end Accumulate;
-
-   function Image
-     (Item       : in Parse_Error;
-      Tree       : in Syntax_Trees.Tree;
-      Descriptor : in WisiToken.Descriptor)
-     return String
-   is begin
-      case Item.Label is
-      when Action =>
-         return "Action, expecting: " & Image (Item.Expecting, Descriptor) &
-           ", found" & Tree.Image (Item.Error_Token, Descriptor);
-
-      when Check =>
-         return "Check, " & Semantic_Checks.Image (Item.Check_Status, 
Descriptor);
-
-      when Message =>
-         return -Item.Msg;
-      end case;
-   end Image;
-
-end WisiToken.Parse.LR;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2013-2015, 2017, 2018, 2019 Free Software Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under the terms of the GNU General Public License
+--  as published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. The WisiToken package is
+--  distributed in the hope that it will be useful, but WITHOUT ANY
+--  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+--  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+--  License for more details. You should have received a copy of the
+--  GNU General Public License distributed with the WisiToken package;
+--  see file GPL.txt. If not, write to the Free Software Foundation,
+--  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this unit does not by itself cause the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file might be covered by the GNU Public License.
+
+pragma License (GPL);
+
+with Ada.Exceptions;
+with Ada.Strings.Maps;
+with Ada.Strings.Fixed;
+with Ada.Text_IO;
+with GNATCOLL.Mmap;
+package body WisiToken.Parse.LR is
+
+   ----------
+   --  Public subprograms, declaration order
+
+   function Image (Item : in Parse_Action_Rec; Descriptor : in 
WisiToken.Descriptor) return String
+   is
+      use Ada.Containers;
+   begin
+      case Item.Verb is
+      when Shift =>
+         return "(Shift," & State_Index'Image (Item.State) & ")";
+
+      when Reduce =>
+         return "(Reduce," & Count_Type'Image (Item.Token_Count) & ", " &
+           Image (Item.Production.LHS, Descriptor) & "," & Trimmed_Image 
(Item.Production.RHS) & ")";
+      when Accept_It =>
+         return "(Accept It)";
+      when Error =>
+         return "(Error)";
+      end case;
+   end Image;
+
+   procedure Put (Trace : in out WisiToken.Trace'Class; Item : in 
Parse_Action_Rec)
+   is
+      use Ada.Containers;
+   begin
+      case Item.Verb is
+      when Shift =>
+         Trace.Put ("shift and goto state" & State_Index'Image (Item.State), 
Prefix => False);
+
+      when Reduce =>
+         Trace.Put
+           ("reduce" & Count_Type'Image (Item.Token_Count) & " tokens to " &
+              Image (Item.Production.LHS, Trace.Descriptor.all),
+            Prefix => False);
+      when Accept_It =>
+         Trace.Put ("accept it", Prefix => False);
+      when Error =>
+         Trace.Put ("ERROR", Prefix => False);
+      end case;
+   end Put;
+
+   function Equal (Left, Right : in Parse_Action_Rec) return Boolean
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      if Left.Verb = Right.Verb then
+         case Left.Verb is
+         when Shift =>
+            return Left.State = Right.State;
+
+         when Reduce | Accept_It =>
+            return Left.Production.LHS = Right.Production.LHS and 
Left.Token_Count = Right.Token_Count;
+
+         when Error =>
+            return True;
+         end case;
+      else
+         return False;
+      end if;
+   end Equal;
+
+   function Is_In (Item : in Parse_Action_Rec; List : in 
Parse_Action_Node_Ptr) return Boolean
+   is
+      Node : Parse_Action_Node_Ptr := List;
+   begin
+      loop
+         exit when Node = null;
+         if Equal (Item, Node.Item) then
+            return True;
+         end if;
+         Node := Node.Next;
+      end loop;
+      return False;
+   end Is_In;
+
+   function Find
+     (Symbol      : in Token_ID;
+      Action_List : in Action_Node_Ptr)
+     return Action_Node_Ptr
+   is
+      Action_Node : Action_Node_Ptr := Action_List;
+   begin
+      while Action_Node /= null loop
+         if Action_Node.Symbol = Symbol then
+            return Action_Node;
+         end if;
+         Action_Node := Action_Node.Next;
+      end loop;
+
+      return null;
+   end Find;
+
+   procedure Add
+     (List   : in out Action_Node_Ptr;
+      Symbol : in     Token_ID;
+      Action : in     Parse_Action_Rec)
+   is
+      New_Item : constant Action_Node_Ptr := new Action_Node'(Symbol, new 
Parse_Action_Node'(Action, null), null);
+      I        : Action_Node_Ptr          := List;
+   begin
+      if I = null then
+         List := New_Item;
+      else
+         if List.Symbol > Symbol then
+            New_Item.Next := List;
+            List          := New_Item;
+         else
+            if List.Next = null then
+               List.Next := New_Item;
+            else
+               I := List;
+               loop
+                  exit when I.Next = null or else I.Next.Symbol > Symbol;
+                  I := I.Next;
+               end loop;
+               New_Item.Next := I.Next;
+               I.Next        := New_Item;
+            end if;
+         end if;
+      end if;
+   end Add;
+
+   function Symbol (List : in Goto_Node_Ptr) return Token_ID
+   is begin
+      return List.Symbol;
+   end Symbol;
+
+   function State (List : in Goto_Node_Ptr) return State_Index
+   is begin
+      return List.State;
+   end State;
+
+   function Next (List : in Goto_Node_Ptr) return Goto_Node_Ptr
+   is begin
+      return List.Next;
+   end Next;
+
+   function To_Vector (Item : in Kernel_Info_Array) return 
Kernel_Info_Arrays.Vector
+   is begin
+      return Result : Kernel_Info_Arrays.Vector do
+         Result.Set_First_Last (Item'First, Item'Last);
+         for I in Item'Range loop
+            Result (I) := Item (I);
+         end loop;
+      end return;
+   end To_Vector;
+
+   function Strict_Image (Item : in Kernel_Info) return String
+   is begin
+      return "(" & Trimmed_Image (Item.LHS) & "," & Token_ID'Image 
(Item.Before_Dot) & "," &
+        Ada.Containers.Count_Type'Image (Item.Length_After_Dot) & ", " &
+        (if Item.Recursive then "True" else "False") & ")";
+   end Strict_Image;
+
+   function Strict_Image (Item : in Minimal_Action) return String
+   is begin
+      case Item.Verb is
+      when Shift =>
+         return "(Shift," & Token_ID'Image (Item.ID) & "," & State_Index'Image 
(Item.State) & ")";
+      when Reduce =>
+         return "(Reduce," & Token_ID'Image (Item.Nonterm) & "," &
+           Ada.Containers.Count_Type'Image (Item.Token_Count) & ")";
+      end case;
+   end Strict_Image;
+
+   function Image (Item : in Minimal_Action; Descriptor : in 
WisiToken.Descriptor) return String
+   is begin
+      case Item.Verb is
+      when Shift =>
+         return "Shift " & Image (Item.ID, Descriptor);
+      when Reduce =>
+         return "Reduce to " & Image (Item.Nonterm, Descriptor);
+      end case;
+   end Image;
+
+   function To_Vector (Item : in Minimal_Action_Array) return 
Minimal_Action_Arrays.Vector
+   is begin
+      return Result : Minimal_Action_Arrays.Vector do
+         Result.Set_First_Last (Item'First, Item'Last);
+         for I in Item'Range loop
+            Result.Replace_Element (I, Item (I));
+         end loop;
+      end return;
+   end To_Vector;
+
+   function First (State : in Parse_State) return Action_List_Iterator
+   is begin
+      return Iter : Action_List_Iterator := (Node => State.Action_List, Item 
=> null) do
+         loop
+            exit when Iter.Node = null;
+            Iter.Item := Iter.Node.Action;
+            exit when Iter.Item /= null;
+            Iter.Node := Iter.Node.Next;
+         end loop;
+      end return;
+   end First;
+
+   function Is_Done (Iter : in Action_List_Iterator) return Boolean
+   is begin
+      return Iter.Node = null;
+   end Is_Done;
+
+   procedure Next (Iter : in out Action_List_Iterator)
+   is begin
+      if Iter.Node = null then
+         return;
+      end if;
+
+      if Iter.Item.Next = null then
+         loop
+            Iter.Node := Iter.Node.Next;
+            exit when Iter.Node = null;
+            Iter.Item := Iter.Node.Action;
+            exit when Iter.Item /= null;
+         end loop;
+      else
+         Iter.Item := Iter.Item.Next; -- a conflict
+      end if;
+   end Next;
+
+   function Symbol (Iter : in Action_List_Iterator) return Token_ID
+   is begin
+      return Iter.Node.Symbol;
+   end Symbol;
+
+   function Action (Iter : in Action_List_Iterator) return Parse_Action_Rec
+   is begin
+      return Iter.Item.Item;
+   end Action;
+
+   procedure Add_Action
+     (State       : in out LR.Parse_State;
+      Symbol      : in     Token_ID;
+      State_Index : in     WisiToken.State_Index)
+   is
+      Action   : constant Parse_Action_Rec := (Shift, State_Index);
+      New_Node : constant Action_Node_Ptr  := new Action_Node'(Symbol, new 
Parse_Action_Node'(Action, null), null);
+      Node     : Action_Node_Ptr;
+   begin
+      if State.Action_List = null then
+         State.Action_List := New_Node;
+      else
+         Node := State.Action_List;
+         loop
+            exit when Node.Next = null;
+            Node := Node.Next;
+         end loop;
+         Node.Next := New_Node;
+      end if;
+   end Add_Action;
+
+   procedure Add_Action
+     (State           : in out LR.Parse_State;
+      Symbol          : in     Token_ID;
+      Verb            : in     LR.Parse_Action_Verbs;
+      Production      : in     Production_ID;
+      RHS_Token_Count : in     Ada.Containers.Count_Type;
+      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check  : in     Semantic_Checks.Semantic_Check)
+   is
+      Action   : Parse_Action_Rec;
+      New_Node : Action_Node_Ptr;
+      Node     : Action_Node_Ptr;
+   begin
+      case Verb is
+      when Reduce =>
+         Action := (Reduce, Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
+      when Accept_It =>
+         Action := (Accept_It, Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
+      when others =>
+         null;
+      end case;
+      New_Node := new Action_Node'(Symbol, new Parse_Action_Node'(Action, 
null), null);
+      if State.Action_List = null then
+         State.Action_List := New_Node;
+      else
+         Node := State.Action_List;
+         loop
+            exit when Node.Next = null;
+            Node := Node.Next;
+         end loop;
+         Node.Next := New_Node;
+      end if;
+   end Add_Action;
+
+   procedure Add_Action
+     (State           : in out Parse_State;
+      Symbols         : in     Token_ID_Array;
+      Production      : in     Production_ID;
+      RHS_Token_Count : in     Ada.Containers.Count_Type;
+      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check)
+   is begin
+      --  We assume Duplicate_Reduce is True for this state; no
+      --  conflicts, all the same action.
+      for Symbol of Symbols loop
+         Add_Action
+           (State, Symbol, Reduce, Production, RHS_Token_Count,
+            Semantic_Action, Semantic_Check);
+      end loop;
+      Add_Error (State);
+   end Add_Action;
+
+   procedure Add_Conflict
+     (State             : in out LR.Parse_State;
+      Symbol            : in     Token_ID;
+      Reduce_Production : in     Production_ID;
+      RHS_Token_Count   : in     Ada.Containers.Count_Type;
+      Semantic_Action   : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check    : in     Semantic_Checks.Semantic_Check)
+   is
+      Conflict : constant Parse_Action_Rec :=
+        (Reduce, Reduce_Production, Semantic_Action, Semantic_Check, 
RHS_Token_Count);
+      Node : Parse_Action_Node_Ptr := Find (Symbol, State.Action_List).Action;
+   begin
+      loop
+         exit when Node.Next = null;
+         Node := Node.Next;
+      end loop;
+      Node.Next := new Parse_Action_Node'(Conflict, null);
+   end Add_Conflict;
+
+   procedure Add_Error (State  : in out LR.Parse_State)
+   is
+      Action : constant Parse_Action_Rec := (Verb => Error);
+      Node   : Action_Node_Ptr           := State.Action_List;
+   begin
+      if Node = null then
+         raise SAL.Programmer_Error with "adding an error action to a parse 
table state before other actions.";
+      end if;
+      loop
+         exit when Node.Next = null;
+         Node := Node.Next;
+      end loop;
+      Node.Next := new Action_Node'(Invalid_Token_ID, new 
Parse_Action_Node'(Action, null), null);
+   end Add_Error;
+
+   procedure Add_Goto
+     (State      : in out LR.Parse_State;
+      Symbol     : in     Token_ID;
+      To_State   : in     State_Index)
+   is
+      List     : Goto_Node_Ptr renames State.Goto_List;
+      New_Item : constant Goto_Node_Ptr := new Goto_Node'(Symbol, To_State, 
null);
+      I        : Goto_Node_Ptr := List;
+   begin
+      if I = null then
+         List := New_Item;
+      else
+         if List.Symbol > Symbol then
+            New_Item.Next := List;
+            List          := New_Item;
+         else
+            if List.Next = null then
+               List.Next := New_Item;
+            else
+               I := List;
+               loop
+                  exit when I.Next = null or List.Symbol > Symbol;
+                  I := I.Next;
+               end loop;
+               New_Item.Next := I.Next;
+               I.Next        := New_Item;
+            end if;
+         end if;
+      end if;
+   end Add_Goto;
+
+   function Goto_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Unknown_State_Index
+   is
+      Goto_Node : constant Goto_Node_Ptr := Goto_For (Table, State, ID);
+   begin
+      if Goto_Node = null then
+         --  We can only get here during error recovery.
+         return Unknown_State;
+      else
+         return Goto_Node.State;
+      end if;
+   end Goto_For;
+
+   function Goto_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Goto_Node_Ptr
+   is
+      Goto_Node : Goto_Node_Ptr := Table.States (State).Goto_List;
+   begin
+      while Goto_Node /= null and then Goto_Node.Symbol /= ID loop
+         Goto_Node := Goto_Node.Next;
+      end loop;
+
+      return Goto_Node;
+   end Goto_For;
+
+   function Action_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Parse_Action_Node_Ptr
+   is
+      Action_Node : Action_Node_Ptr := Table.States (State).Action_List;
+   begin
+      if Action_Node = null then
+         raise SAL.Programmer_Error with "no actions for state" & 
Unknown_State_Index'Image (State);
+      end if;
+
+      while Action_Node.Next /= null and Action_Node.Symbol /= ID loop
+         Action_Node := Action_Node.Next;
+      end loop;
+
+      return Action_Node.Action;
+   end Action_For;
+
+   function Expecting (Table : in Parse_Table; State : in State_Index) return 
Token_ID_Set
+   is
+      Result : Token_ID_Set    := (Table.First_Terminal .. Table.Last_Terminal 
=> False);
+      Action : Action_Node_Ptr := Table.States (State).Action_List;
+   begin
+      loop
+         --  Last action is error; don't include it.
+         exit when Action.Next = null;
+
+         Result (Action.Symbol) := True;
+         Action := Action.Next;
+      end loop;
+      return Result;
+   end Expecting;
+
+   procedure Free_Table (Table : in out Parse_Table_Ptr)
+   is
+
+      procedure Free is new Ada.Unchecked_Deallocation (Parse_Table, 
Parse_Table_Ptr);
+      Action            : Action_Node_Ptr;
+      Temp_Action       : Action_Node_Ptr;
+      Parse_Action      : Parse_Action_Node_Ptr;
+      Temp_Parse_Action : Parse_Action_Node_Ptr;
+      Got               : Goto_Node_Ptr;
+      Temp_Got          : Goto_Node_Ptr;
+   begin
+      if Table = null then
+         return;
+      end if;
+
+      for State of Table.States loop
+         Action := State.Action_List;
+         loop
+            exit when Action = null;
+            Parse_Action := Action.Action;
+            loop
+               exit when Parse_Action = null;
+               Temp_Parse_Action := Parse_Action;
+               Parse_Action := Parse_Action.Next;
+               Free (Temp_Parse_Action);
+            end loop;
+
+            Temp_Action := Action;
+            Action := Action.Next;
+            Free (Temp_Action);
+         end loop;
+
+         Got := State.Goto_List;
+         loop
+            exit when Got = null;
+            Temp_Got := Got;
+            Got := Got.Next;
+            Free (Temp_Got);
+         end loop;
+      end loop;
+
+      Free (Table);
+   end Free_Table;
+
+   function Get_Text_Rep
+     (File_Name      : in String;
+      McKenzie_Param : in McKenzie_Param_Type;
+      Actions        : in Semantic_Action_Array_Arrays.Vector)
+     return Parse_Table_Ptr
+   is
+      use Ada.Text_IO;
+
+      File            : GNATCOLL.Mmap.Mapped_File;
+      Region          : GNATCOLL.Mmap.Mapped_Region;
+      Buffer          : GNATCOLL.Mmap.Str_Access;
+      Buffer_Abs_Last : Integer; --  Buffer'Last, except Buffer has no bounds
+      Buffer_Last     : Integer := 0; -- Last char read from Buffer
+
+      Delimiters : constant Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.To_Set (" ;" & ASCII.LF);
+
+      function Check_Semicolon return Boolean
+      is begin
+         if Buffer (Buffer_Last) = ';' then
+            --  There is a space, newline, or newline and space after ';'. 
Leave
+            --  Buffer_Last on newline for Check_New_Line.
+            Buffer_Last := Buffer_Last + 1;
+            return True;
+         else
+            return False;
+         end if;
+      end Check_Semicolon;
+
+      procedure Check_Semicolon
+      is begin
+         if Buffer (Buffer_Last) = ';' then
+            --  There is a space, newline, or newline and space after ';'. 
Leave
+            --  Buffer_Last on newline for Check_New_Line.
+            Buffer_Last := Buffer_Last + 1;
+         else
+            raise SAL.Programmer_Error with Error_Message
+              (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
+               "expecting semicolon, found '" & Buffer (Buffer_Last) & "'");
+         end if;
+      end Check_Semicolon;
+
+      function Check_EOI return Boolean
+      is begin
+         return Buffer_Last >= Buffer_Abs_Last;
+      end Check_EOI;
+
+      procedure Check_New_Line
+      is
+         use Ada.Strings.Maps;
+      begin
+         if Buffer (Buffer_Last) = ASCII.LF then
+            --  There is a space or semicolon after some newlines.
+            if Is_In (Buffer (Buffer_Last + 1), Delimiters) then
+               Buffer_Last := Buffer_Last + 1;
+            end if;
+         else
+            raise SAL.Programmer_Error with Error_Message
+              (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
+               "expecting new_line, found '" & Buffer (Buffer_Last) & "'");
+         end if;
+      end Check_New_Line;
+
+      type Buffer_Region is record
+         First : Integer;
+         Last  : Integer;
+      end record;
+
+      function Next_Value return Buffer_Region;
+      pragma Inline (Next_Value);
+
+      function Next_Value return Buffer_Region
+      is
+         use Ada.Strings.Fixed;
+         First : constant Integer := Buffer_Last + 1;
+      begin
+         Buffer_Last := Index (Buffer.all, Delimiters, First);
+         return (First, Buffer_Last - 1);
+      end Next_Value;
+
+      procedure Raise_Gen_Next_Value_Constraint_Error (Name : String; Region : 
Buffer_Region);
+      pragma No_Return (Raise_Gen_Next_Value_Constraint_Error);
+
+      procedure Raise_Gen_Next_Value_Constraint_Error (Name : String; Region : 
Buffer_Region)
+      is begin
+         --  Factored out from Gen_Next_Value to make Inline efficient.
+         raise SAL.Programmer_Error with Error_Message
+           (File_Name, 1, Ada.Text_IO.Count (Region.First),
+            "expecting " & Name & ", found '" & Buffer (Region.First .. 
Region.Last) & "'");
+      end Raise_Gen_Next_Value_Constraint_Error;
+
+      generic
+         type Value_Type is (<>);
+         Name : in String;
+      function Gen_Next_Value return Value_Type;
+      pragma Inline (Gen_Next_Value);
+
+      function Gen_Next_Value return Value_Type
+      is
+         Region : constant Buffer_Region := Next_Value;
+      begin
+         return Value_Type'Value (Buffer (Region.First .. Region.Last));
+      exception
+      when Constraint_Error =>
+         Raise_Gen_Next_Value_Constraint_Error (Name, Region);
+      end Gen_Next_Value;
+
+      function Next_State_Index is new Gen_Next_Value (State_Index, 
"State_Index");
+      function Next_Token_ID is new Gen_Next_Value (Token_ID, "Token_ID");
+      function Next_Integer is new Gen_Next_Value (Integer, "Integer");
+      function Next_Parse_Action_Verbs is new Gen_Next_Value 
(Parse_Action_Verbs, "Parse_Action_Verbs");
+      function Next_Boolean is new Gen_Next_Value (Boolean, "Boolean");
+      function Next_Count_Type is new Gen_Next_Value 
(Ada.Containers.Count_Type, "Count_Type");
+   begin
+      File            := GNATCOLL.Mmap.Open_Read (File_Name);
+      Region          := GNATCOLL.Mmap.Read (File);
+      Buffer          := GNATCOLL.Mmap.Data (Region);
+      Buffer_Abs_Last := GNATCOLL.Mmap.Last (Region);
+
+      declare
+         use Ada.Containers;
+
+         --  We don't read the discriminants in the aggregate, because
+         --  aggregate evaluation order is not guaranteed.
+         State_First       : constant State_Index := Next_State_Index;
+         State_Last        : constant State_Index := Next_State_Index;
+         First_Terminal    : constant Token_ID    := Next_Token_ID;
+         Last_Terminal     : constant Token_ID    := Next_Token_ID;
+         First_Nonterminal : constant Token_ID    := Next_Token_ID;
+         Last_Nonterminal  : constant Token_ID    := Next_Token_ID;
+
+         Table : constant Parse_Table_Ptr := new Parse_Table
+           (State_First, State_Last, First_Terminal, Last_Terminal, 
First_Nonterminal, Last_Nonterminal);
+      begin
+         Check_New_Line;
+
+         Table.McKenzie_Param := McKenzie_Param;
+
+         for State of Table.States loop
+            declare
+               Node_I       : Action_Node_Ptr := new Action_Node;
+               Actions_Done : Boolean         := False;
+            begin
+               State.Action_List := Node_I;
+               loop
+                  declare
+                     Node_J      : Parse_Action_Node_Ptr := new 
Parse_Action_Node;
+                     Action_Done : Boolean := False;
+                     Verb        : Parse_Action_Verbs;
+                  begin
+                     Node_I.Action := Node_J;
+                     loop
+                        Verb := Next_Parse_Action_Verbs;
+                        Node_J.Item :=
+                          (case Verb is
+                           when Shift     => (Verb => Shift, others => <>),
+                           when Reduce    => (Verb => Reduce, others => <>),
+                           when Accept_It => (Verb => Accept_It, others => <>),
+                           when Error     => (Verb => Error));
+
+                        case Verb is
+                        when Shift =>
+                           Node_J.Item.State := Next_State_Index;
+
+                        when Reduce | Accept_It =>
+                           Node_J.Item.Production.LHS := Next_Token_ID;
+                           Node_J.Item.Production.RHS := Next_Integer;
+                           if Next_Boolean then
+                              Node_J.Item.Action := Actions
+                                
(Node_J.Item.Production.LHS)(Node_J.Item.Production.RHS).Action;
+                           else
+                              Node_J.Item.Action := null;
+                           end if;
+                           if Next_Boolean then
+                              Node_J.Item.Check := Actions
+                                
(Node_J.Item.Production.LHS)(Node_J.Item.Production.RHS).Check;
+                           else
+                              Node_J.Item.Check := null;
+                           end if;
+                           Node_J.Item.Token_Count := Next_Count_Type;
+
+                        when Error =>
+                           Actions_Done := True;
+                        end case;
+
+                        if Check_Semicolon then
+                           Action_Done := True;
+
+                           if not Actions_Done then
+                              Node_I.Symbol := Next_Token_ID;
+                           end if;
+                        end if;
+
+                        exit when Action_Done;
+
+                        Node_J.Next := new Parse_Action_Node;
+                        Node_J      := Node_J.Next;
+                     end loop;
+
+                     Check_New_Line;
+                  end;
+
+                  exit when Actions_Done;
+                  Node_I.Next := new Action_Node;
+                  Node_I      := Node_I.Next;
+               end loop;
+            end;
+
+            if Check_Semicolon then
+               --  No Gotos
+               null;
+            else
+               declare
+                  Node_I : Goto_Node_Ptr := new Goto_Node;
+               begin
+                  State.Goto_List  := Node_I;
+                  loop
+                     Node_I.Symbol := Next_Token_ID;
+                     Node_I.State  := Next_State_Index;
+                     exit when Check_Semicolon;
+                     Node_I.Next   := new Goto_Node;
+                     Node_I        := Node_I.Next;
+                  end loop;
+               end;
+            end if;
+            Check_New_Line;
+
+            declare
+               First : constant Integer := Next_Integer;
+               Last  : constant Integer := Next_Integer;
+            begin
+               if Last = -1 then
+                  --  State.Kernel not set for state 0
+                  null;
+               else
+                  State.Kernel.Set_First (Count_Type (First));
+                  State.Kernel.Set_Last (Count_Type (Last));
+
+                  for I in State.Kernel.First_Index .. State.Kernel.Last_Index 
loop
+                     State.Kernel (I).LHS := Next_Token_ID;
+                     State.Kernel (I).Before_Dot := Next_Token_ID;
+                     State.Kernel (I).Length_After_Dot := Count_Type 
(Next_Integer);
+                  end loop;
+               end if;
+            end;
+            Check_New_Line;
+
+            if Check_Semicolon then
+               --  No minimal action
+               null;
+            else
+               State.Minimal_Complete_Actions.Set_First (Count_Type 
(Next_Integer));
+               State.Minimal_Complete_Actions.Set_Last (Count_Type 
(Next_Integer));
+               for I in State.Minimal_Complete_Actions.First_Index .. 
State.Minimal_Complete_Actions.Last_Index loop
+                  declare
+                     Verb         : constant Minimal_Verbs := 
Next_Parse_Action_Verbs;
+                     ID           : Token_ID;
+                     Action_State : State_Index;
+                     Count        : Ada.Containers.Count_Type;
+                  begin
+                     case Verb is
+                     when Shift =>
+                        ID           := Next_Token_ID;
+                        Action_State := Next_State_Index;
+                        State.Minimal_Complete_Actions.Replace_Element (I, 
(Shift, ID, Action_State));
+                     when Reduce =>
+                        ID    := Next_Token_ID;
+                        Count := Next_Count_Type;
+                        State.Minimal_Complete_Actions.Replace_Element (I, 
(Reduce, ID, Count));
+                     end case;
+                  end;
+               end loop;
+               Check_Semicolon;
+            end if;
+            Check_New_Line;
+
+            exit when Check_EOI;
+         end loop;
+         return Table;
+      end;
+   exception
+   when Name_Error =>
+      raise User_Error with "parser table text file '" & File_Name & "' not 
found.";
+
+   when SAL.Programmer_Error =>
+      raise;
+
+   when E : others =>
+      raise SAL.Programmer_Error with Error_Message
+        (File_Name, 1, Ada.Text_IO.Count (Buffer_Last),
+         Ada.Exceptions.Exception_Name (E) & ": " & 
Ada.Exceptions.Exception_Message (E));
+   end Get_Text_Rep;
+
+   function Compare (Left, Right : in Insert_Delete_Op) return 
SAL.Compare_Result
+   is
+      Left_Token_Index : constant WisiToken.Token_Index :=
+        (case Insert_Delete_Op_Label'(Left.Op) is
+         when Insert => Left.Ins_Token_Index,
+         when Delete => Left.Del_Token_Index);
+      Right_Token_Index : constant WisiToken.Token_Index :=
+        (case Insert_Delete_Op_Label'(Right.Op) is
+         when Insert => Right.Ins_Token_Index,
+         when Delete => Right.Del_Token_Index);
+   begin
+      if Left_Token_Index < Right_Token_Index then
+         return SAL.Less;
+      elsif Left_Token_Index = Right_Token_Index then
+         return SAL.Equal;
+      else
+         return SAL.Greater;
+      end if;
+   end Compare;
+
+   function Equal (Left : in Config_Op; Right : in Insert_Op) return Boolean
+   is begin
+      return Left.Op = Insert and then
+        Left.Ins_ID = Right.Ins_ID and then
+        Left.Ins_Token_Index = Right.Ins_Token_Index;
+   end Equal;
+
+   function None_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean
+   is begin
+      for O of reverse Ops loop
+         exit when O.Op = Fast_Forward;
+         if O.Op = Op then
+            return False;
+         end if;
+      end loop;
+      return True;
+   end None_Since_FF;
+
+   function Only_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      if Ops.Length = 0 or else Ops (Ops.Last_Index).Op /= Op then
+         return False;
+      else
+         for O of reverse Ops loop
+            exit when O.Op = Fast_Forward;
+            if O.Op /= Op then
+               return False;
+            end if;
+         end loop;
+         return True;
+      end if;
+   end Only_Since_FF;
+
+   function Valid_Tree_Indices (Stack : in Recover_Stacks.Stack; Depth : in 
SAL.Base_Peek_Type) return Boolean
+   is
+      use all type WisiToken.Syntax_Trees.Node_Index;
+   begin
+      for I in 1 .. Depth loop
+         if Stack (I).Tree_Index = Syntax_Trees.Invalid_Node_Index then
+            return False;
+         end if;
+      end loop;
+      return True;
+   end Valid_Tree_Indices;
+
+   procedure Set_Key (Item : in out Configuration; Key : in Integer)
+   is begin
+      Item.Cost := Key;
+   end Set_Key;
+
+   procedure Accumulate (Data : in McKenzie_Data; Counts : in out 
Strategy_Counts)
+   is
+      procedure Proc (Config : in Configuration)
+      is begin
+         for I in Config.Strategy_Counts'Range loop
+            Counts (I) := Counts (I) + Config.Strategy_Counts (I);
+         end loop;
+      end Proc;
+   begin
+      Data.Results.Process (Proc'Unrestricted_Access);
+   end Accumulate;
+
+end WisiToken.Parse.LR;
diff --git a/packages/wisi/wisitoken-parse-lr.ads 
b/packages/wisi/wisitoken-parse-lr.ads
index 24ca512..91b55c8 100644
--- a/packages/wisi/wisitoken-parse-lr.ads
+++ b/packages/wisi/wisitoken-parse-lr.ads
@@ -1,627 +1,683 @@
---  Abstract :
---
---  Root package of an implementation of an LR (Left-to-right scanning
---  Rightmost-deriving) parser. Includes operations for building the
---  parse table at runtime. See the child packages .Parse and
---  .Parse_No_Recover for running the parser.
---
---  References :
---
---  See wisitoken.ads
---
---  Copyright (C) 2002, 2003, 2009, 2010, 2013 - 2015, 2017 - 2019 Free 
Software Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under the terms of the GNU General Public License
---  as published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. The WisiToken package is
---  distributed in the hope that it will be useful, but WITHOUT ANY
---  WARRANTY; without even the implied warranty of MERCHANTABILITY or
---  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
---  License for more details. You should have received a copy of the
---  GNU General Public License distributed with the WisiToken package;
---  see file GPL.txt. If not, write to the Free Software Foundation,
---  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
---  As a special exception, if other files instantiate generics from
---  this unit, or you link this unit with other files to produce an
---  executable, this unit does not by itself cause the resulting
---  executable to be covered by the GNU General Public License. This
---  exception does not however invalidate any other reasons why the
---  executable file might be covered by the GNU Public License.
-
-pragma License (Modified_GPL);
-
-with Ada.Containers.Indefinite_Doubly_Linked_Lists;
-with Ada.Unchecked_Deallocation;
-with SAL.Gen_Array_Image;
-with SAL.Gen_Bounded_Definite_Vectors.Gen_Image_Aux;
-with SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted;
-with SAL.Gen_Unbounded_Definite_Min_Heaps_Fibonacci;
-with SAL.Gen_Unbounded_Definite_Queues.Gen_Image_Aux;
-with SAL.Gen_Unbounded_Definite_Stacks.Gen_Image_Aux;
-with System.Multiprocessors;
-with WisiToken.Productions;
-with WisiToken.Semantic_Checks;
-with WisiToken.Syntax_Trees;
-package WisiToken.Parse.LR is
-
-   type All_Parse_Action_Verbs is (Pause, Shift, Reduce, Accept_It, Error);
-   subtype Parse_Action_Verbs is All_Parse_Action_Verbs range Shift .. Error;
-   subtype Minimal_Verbs is All_Parse_Action_Verbs range Pause .. Reduce;
-   --  Pause is only used for error recovery.
-
-   type Parse_Action_Rec (Verb : Parse_Action_Verbs := Shift) is record
-      case Verb is
-      when Shift =>
-         State : State_Index := State_Index'Last;
-
-      when Reduce | Accept_It =>
-         Production : Production_ID;
-         --  The result nonterm and production index. Most uses need only
-         --  Production.LHS; elisp code generation, and debug output, needs
-         --  Production.RHS
-
-         Action      : WisiToken.Syntax_Trees.Semantic_Action   := null;
-         Check       : WisiToken.Semantic_Checks.Semantic_Check := null;
-         Token_Count : Ada.Containers.Count_Type                := 0;
-
-      when Error =>
-         null;
-      end case;
-   end record;
-   subtype Shift_Action_Rec is Parse_Action_Rec (Shift);
-   subtype Reduce_Action_Rec is Parse_Action_Rec (Reduce);
-
-   function Image (Item : in Parse_Action_Rec; Descriptor : in 
WisiToken.Descriptor) return String;
-   --  Ada aggregate syntax, leaving out Action, Check in reduce; for debug 
output
-
-   procedure Put (Trace : in out WisiToken.Trace'Class; Item : in 
Parse_Action_Rec);
-   --  Put a line for Item in parse trace format, with no prefix.
-
-   function Equal (Left, Right : in Parse_Action_Rec) return Boolean;
-   --  Ignore Action, Check.
-
-   type Parse_Action_Node;
-   type Parse_Action_Node_Ptr is access Parse_Action_Node;
-
-   type Parse_Action_Node is record
-      Item : Parse_Action_Rec;
-      Next : Parse_Action_Node_Ptr; -- non-null only for conflicts
-   end record;
-   procedure Free is new Ada.Unchecked_Deallocation (Parse_Action_Node, 
Parse_Action_Node_Ptr);
-
-   type Action_Node;
-   type Action_Node_Ptr is access Action_Node;
-
-   type Action_Node is record
-      Symbol : Token_ID := Invalid_Token_ID; -- ignored if Action is Error
-      Action : Parse_Action_Node_Ptr;
-      Next   : Action_Node_Ptr;
-   end record;
-   procedure Free is new Ada.Unchecked_Deallocation (Action_Node, 
Action_Node_Ptr);
-
-   procedure Add
-     (List   : in out Action_Node_Ptr;
-      Symbol : in     Token_ID;
-      Action : in     Parse_Action_Rec);
-   --  Add action to List, sorted on ascending Symbol.
-
-   type Goto_Node is private;
-   type Goto_Node_Ptr is access Goto_Node;
-
-   function Symbol (List : in Goto_Node_Ptr) return Token_ID;
-   function State (List : in Goto_Node_Ptr) return State_Index;
-   function Next (List : in Goto_Node_Ptr) return Goto_Node_Ptr;
-
-   type Minimal_Action (Verb : Minimal_Verbs := Pause) is record
-      case Verb is
-      when Pause =>
-         --  In this case, 'Pause' means no minimal action.
-         null;
-
-      when Shift =>
-         ID    : Token_ID;
-         State : State_Index;
-
-      when Reduce =>
-         Nonterm     : Token_ID;
-         Token_Count : Ada.Containers.Count_Type;
-      end case;
-   end record;
-
-   function Strict_Image (Item : in Minimal_Action) return String;
-   --  Strict Ada aggregate syntax, for generated code.
-
-   type Parse_State is record
-      Productions : Production_ID_Arrays.Vector;
-      --  Used in some language-specfic error recovery.
-      Action_List : Action_Node_Ptr;
-      Goto_List   : Goto_Node_Ptr;
-
-      Minimal_Complete_Action : Minimal_Action;
-      --  Parse action that will most quickly complete a
-      --  production in this state; used in error recovery
-   end record;
-
-   type Parse_State_Array is array (State_Index range <>) of Parse_State;
-
-   type Action_List_Iterator is tagged private;
-   --  Iterates over all shift/reduce actions for a state, including
-   --  conflicts.
-
-   function First (State : in Parse_State) return Action_List_Iterator;
-   function Is_Done (Iter : in Action_List_Iterator) return Boolean;
-   procedure Next (Iter : in out Action_List_Iterator);
-
-   function Symbol (Iter : in Action_List_Iterator) return Token_ID;
-   function Action (Iter : in Action_List_Iterator) return Parse_Action_Rec;
-
-   procedure Add_Action
-     (State       : in out Parse_State;
-      Symbol      : in     Token_ID;
-      State_Index : in     WisiToken.State_Index);
-   --  Add a Shift action to tail of State action list.
-
-   procedure Add_Action
-     (State           : in out Parse_State;
-      Symbol          : in     Token_ID;
-      Verb            : in     Parse_Action_Verbs;
-      Production      : in     Production_ID;
-      RHS_Token_Count : in     Ada.Containers.Count_Type;
-      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check);
-   --  Add a Reduce or Accept_It action to tail of State action list.
-
-   procedure Add_Action
-     (State           : in out Parse_State;
-      Symbols         : in     Token_ID_Array;
-      Production      : in     Production_ID;
-      RHS_Token_Count : in     Ada.Containers.Count_Type;
-      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check);
-   --  Add duplicate Reduce actions, and final Error action, to tail of
-   --  State action list.
-
-   procedure Add_Action
-     (State             : in out Parse_State;
-      Symbol            : in     Token_ID;
-      State_Index       : in     WisiToken.State_Index;
-      Reduce_Production : in     Production_ID;
-      RHS_Token_Count   : in     Ada.Containers.Count_Type;
-      Semantic_Action   : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check    : in     WisiToken.Semantic_Checks.Semantic_Check);
-   --  Add a Shift/Reduce conflict to State.
-
-   procedure Add_Action
-     (State             : in out Parse_State;
-      Symbol            : in     Token_ID;
-      Verb              : in     Parse_Action_Verbs;
-      Production_1      : in     Production_ID;
-      RHS_Token_Count_1 : in     Ada.Containers.Count_Type;
-      Semantic_Action_1 : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check_1  : in     WisiToken.Semantic_Checks.Semantic_Check;
-      Production_2      : in     Production_ID;
-      RHS_Token_Count_2 : in     Ada.Containers.Count_Type;
-      Semantic_Action_2 : in     WisiToken.Syntax_Trees.Semantic_Action;
-      Semantic_Check_2  : in     WisiToken.Semantic_Checks.Semantic_Check);
-   --  Add an Accept/Reduce or Reduce/Reduce conflict action to State.
-
-   procedure Add_Error (State  : in out Parse_State);
-   --  Add an Error action to State, at tail of action list.
-
-   procedure Add_Goto
-     (State    : in out Parse_State;
-      Symbol   : in     Token_ID;
-      To_State : in     State_Index);
-   --  Add a goto item to State goto list; keep goto list sorted in ascending 
order on Symbol.
-
-   type McKenzie_Param_Type
-     (First_Terminal    : Token_ID;
-      Last_Terminal     : Token_ID;
-      First_Nonterminal : Token_ID;
-      Last_Nonterminal  : Token_ID)
-   is record
-      Insert    : Token_ID_Array_Natural (First_Terminal .. Last_Terminal);
-      Delete    : Token_ID_Array_Natural (First_Terminal .. Last_Terminal);
-      Push_Back : Token_ID_Array_Natural (First_Terminal .. Last_Nonterminal);
-      --  Cost of operations on config stack, input.
-
-      Ignore_Check_Fail : Natural;
-      --  Cost of ignoring a semantic check failure. Should be at least the
-      --  cost of a typical fix for such a failure.
-
-      Task_Count : System.Multiprocessors.CPU_Range;
-      --  Number of parallel tasks during recovery. If 0, use
-      --  System.Multiprocessors.Number_Of_CPUs - 1.
-
-      Cost_Limit        : Natural;     -- max cost of configurations to look at
-      Check_Limit       : Token_Index; -- max tokens to parse ahead when 
checking a configuration.
-      Check_Delta_Limit : Natural;     -- max configs checked, delta over 
successful parser.
-      Enqueue_Limit     : Natural;     -- max configs enqueued.
-   end record;
-
-   Default_McKenzie_Param : constant McKenzie_Param_Type :=
-     (First_Terminal    => Token_ID'Last,
-      Last_Terminal     => Token_ID'First,
-      First_Nonterminal => Token_ID'Last,
-      Last_Nonterminal  => Token_ID'First,
-      Insert            => (others => 0),
-      Delete            => (others => 0),
-      Push_Back         => (others => 0),
-      Ignore_Check_Fail => 0,
-      Task_Count        => System.Multiprocessors.CPU_Range'Last,
-      Cost_Limit        => Natural'Last,
-      Check_Limit       => Token_Index'Last,
-      Check_Delta_Limit => Natural'Last,
-      Enqueue_Limit     => Natural'Last);
-
-   procedure Set_Production
-     (Prod     : in out Productions.Instance;
-      LHS      : in     Token_ID;
-      RHS_Last : in     Natural);
-
-   procedure Set_RHS
-     (Prod      : in out Productions.Instance;
-      RHS_Index : in     Natural;
-      Tokens    : in     Token_ID_Array;
-      Action    : in     WisiToken.Syntax_Trees.Semantic_Action   := null;
-      Check     : in     WisiToken.Semantic_Checks.Semantic_Check := null);
-
-   type Parse_Table
-     (State_First       : State_Index;
-      State_Last        : State_Index;
-      First_Terminal    : Token_ID;
-      Last_Terminal     : Token_ID;
-      First_Nonterminal : Token_ID;
-      Last_Nonterminal  : Token_ID)
-     is tagged
-   record
-      States         : Parse_State_Array (State_First .. State_Last);
-      McKenzie_Param : McKenzie_Param_Type (First_Terminal, Last_Terminal, 
First_Nonterminal, Last_Nonterminal);
-   end record;
-
-   function Goto_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Unknown_State_Index;
-   function Goto_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Goto_Node_Ptr;
-   --  Return next state after reducing stack by nonterminal ID;
-   --  Unknown_State if none (only possible during error recovery).
-   --  Second form allows retrieving Production.
-
-   function Action_For
-     (Table : in Parse_Table;
-      State : in State_Index;
-      ID    : in Token_ID)
-     return Parse_Action_Node_Ptr;
-   --  Return the action for State, terminal ID.
-
-   function Expecting (Table : in Parse_Table; State : in State_Index) return 
Token_ID_Set;
-
-   type Parse_Table_Ptr is access Parse_Table;
-   procedure Free_Table (Table : in out Parse_Table_Ptr);
-
-   function Get_Action
-     (Prod        : in Production_ID;
-      Productions : in WisiToken.Productions.Prod_Arrays.Vector)
-     return WisiToken.Syntax_Trees.Semantic_Action;
-
-   function Get_Check
-     (Prod        : in Production_ID;
-      Productions : in WisiToken.Productions.Prod_Arrays.Vector)
-     return WisiToken.Semantic_Checks.Semantic_Check;
-
-   function Get_Text_Rep
-     (File_Name      : in String;
-      McKenzie_Param : in McKenzie_Param_Type;
-      Productions    : in WisiToken.Productions.Prod_Arrays.Vector)
-     return Parse_Table_Ptr;
-   --  Read machine-readable text format of states (as output by
-   --  WisiToken.Generate.LR.Put_Text_Rep) from file File_Name. Result
-   --  has actions, checks from Productions.
-
-   ----------
-   --  For McKenzie_Recover. Declared here because Parser_Lists needs
-   --  these, Mckenzie_Recover needs Parser_Lists.
-   --
-   --  We don't maintain a syntax tree during recover; it's too slow, and
-   --  not needed for any operations. The parser syntax tree is used for
-   --  Undo_Reduce, which is only done on nonterms reduced by the main
-   --  parser, not virtual nonterms produced by recover.
-
-   package Fast_Token_ID_Arrays is new SAL.Gen_Bounded_Definite_Vectors
-     (SAL.Peek_Type, Token_ID, Capacity => 20);
-
-   No_Insert_Delete : constant SAL.Base_Peek_Type := 0;
-
-   function Image
-     (Index      : in SAL.Peek_Type;
-      Tokens     : in Fast_Token_ID_Arrays.Vector;
-      Descriptor : in WisiToken.Descriptor)
-     return String
-     is (SAL.Peek_Type'Image (Index) & ":" & SAL.Peek_Type'Image 
(Tokens.Last_Index) & ":" &
-           Image (Tokens (Index), Descriptor));
-
-   type Config_Op_Label is (Fast_Forward, Undo_Reduce, Push_Back, Insert, 
Delete);
-   subtype Insert_Delete_Op_Label is Config_Op_Label range Insert .. Delete;
-   --  Fast_Forward is a placeholder to mark a fast_forward parse; that
-   --  resets what operations are allowed to be done on a config.
-   --
-   --  Undo_Reduce is the inverse of Reduce.
-   --
-   --  Push_Back pops the top stack item, and moves the input stream
-   --  pointer back to the first shared_terminal contained by that item.
-   --
-   --  Insert inserts a new token in the token input stream, before the
-   --  given point in Terminals.
-   --
-   --  Delete deletes one item from the token input stream, at the given
-   --  point.
-
-   type Config_Op (Op : Config_Op_Label := Fast_Forward) is record
-      --  We store enough information to perform the operation on the main
-      --  parser stack and input stream point when the config is the result
-      --  of a successful recover.
-      --
-      --  After a recover, the main parser must reparse any inserted tokens,
-      --  and skip any deleted tokens. Therefore, when all the recover ops
-      --  are applied, the main parser stack will be the same or shorter
-      --  than it was, so we only need to store token counts for stack
-      --  operations (Unknown_State is pushed when a state is needed; none
-      --  will be left on the main stack). We also store IDs, so we can
-      --  check that everything is in sync, and for debugging.
-
-      case Op is
-      when Fast_Forward =>
-         FF_Token_Index : WisiToken.Token_Index;
-         --  Config.Current_Shared_Token after the operation is done; the last
-         --  token shifted.
-
-      when Undo_Reduce =>
-         Nonterm : Token_ID;
-         --  The nonterminal popped off the stack.
-
-         Token_Count : Ada.Containers.Count_Type;
-         --  The number of tokens pushed on the stack.
-
-      when Push_Back | Insert | Delete =>
-         ID : Token_ID;
-         --  For Push_Back, ID is the nonterm ID popped off the stack.
-         --  For Insert | Delete, ID is the token inserted or deleted.
-
-         Token_Index : WisiToken.Base_Token_Index;
-         --  For Push_Back, Token_Index is Config.Current_Shared_Token after
-         --  the operation is done. If the token is empty, Token_Index is
-         --  Invalid_Token_Index.
-         --
-         --  For Insert, ID is inserted before Token_Index.
-         --
-         --  For Delete, token at Token_Index is deleted.
-
-      end case;
-   end record;
-   subtype Insert_Delete_Op is Config_Op with Dynamic_Predicate => 
(Insert_Delete_Op.Op in Insert_Delete_Op_Label);
-
-   function Compare (Left, Right : in Insert_Delete_Op) return 
SAL.Compare_Result;
-
-   package Config_Op_Queues is new SAL.Gen_Unbounded_Definite_Queues 
(Config_Op);
-
-   package Config_Op_Arrays is new SAL.Gen_Bounded_Definite_Vectors
-     (Positive_Index_Type, Config_Op, Capacity => 80);
-   --  Using a fixed size vector significantly speeds up
-   --  McKenzie_Recover. The capacity is determined by the maximum number
-   --  of repair operations, which is limited by the cost_limit McKenzie
-   --  parameter plus an arbitrary number from the language-specific
-   --  repairs; in practice, a capacity of 80 is enough so far. If a
-   --  config does hit that limit, it is abandoned; some other config is
-   --  likely to be cheaper.
-
-   package Insert_Delete_Arrays is new SAL.Gen_Bounded_Definite_Vectors
-     (Positive_Index_Type, Insert_Delete_Op, Capacity => 80);
-
-   package Sorted_Insert_Delete_Arrays is new Insert_Delete_Arrays.Gen_Sorted 
(Compare);
-
-   function Config_Op_Image (Item : in Config_Op; Descriptor : in 
WisiToken.Descriptor) return String
-     is ("(" & Config_Op_Label'Image (Item.Op) & ", " &
-           (case Item.Op is
-            when Fast_Forward => WisiToken.Token_Index'Image 
(Item.FF_Token_Index),
-            when Undo_Reduce => Image (Item.Nonterm, Descriptor) & "," &
-                 Ada.Containers.Count_Type'Image (Item.Token_Count),
-            when Push_Back | Insert | Delete => Image (Item.ID, Descriptor) & 
"," &
-                 WisiToken.Token_Index'Image (Item.Token_Index))
-           & ")");
-
-   function Image (Item : in Config_Op; Descriptor : in WisiToken.Descriptor) 
return String
-     renames Config_Op_Image;
-
-   function Image is new Config_Op_Queues.Gen_Image_Aux (WisiToken.Descriptor, 
Image);
-   function Config_Op_Array_Image is new Config_Op_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
-   function Image (Item : in Config_Op_Arrays.Vector; Descriptor : in 
WisiToken.Descriptor) return String
-     renames Config_Op_Array_Image;
-
-   function None (Ops : in Config_Op_Arrays.Vector; Op : in Config_Op_Label) 
return Boolean
-   is (for all O of Ops => O.Op /= Op);
-   --  True if Ops contains no Op.
-
-   function None_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean;
-   --  True if Ops contains no Op after the last Fast_Forward (or ops.first, if
-   --  no Fast_Forward).
-
-   function Match_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op) return Boolean;
-   --  True if Ops contains an Op after the last Fast_Forward (or ops.first, if
-   --  no Fast_Forward) that equals Op.
-
-   function Any (Ops : in Config_Op_Arrays.Vector; Op : in Config_Op_Label) 
return Boolean
-   is (for some O of Ops => O.Op = Op);
-   --  True if Ops contains at least one Op.
-
-   type Recover_Stack_Item is record
-      State      : Unknown_State_Index;
-      Tree_Index : Syntax_Trees.Node_Index;
-      Token      : Recover_Token;
-   end record;
-
-   package Recover_Stacks is new SAL.Gen_Unbounded_Definite_Stacks 
(Recover_Stack_Item);
-
-   function Image (Item : in Recover_Stack_Item; Descriptor : in 
WisiToken.Descriptor) return String
-     is ((if Item.State = Unknown_State then " " else Trimmed_Image 
(Item.State)) & " : " &
-           Image (Item.Token, Descriptor));
-
-   function Recover_Stack_Image is new Recover_Stacks.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
-   --  Unique name for calling from debugger
-
-   function Image
-     (Stack      : in Recover_Stacks.Stack;
-      Descriptor : in WisiToken.Descriptor;
-      Depth      : in SAL.Base_Peek_Type := 0)
-     return String
-     renames Recover_Stack_Image;
-
-   function Valid_Tree_Indices (Stack : in Recover_Stacks.Stack; Depth : in 
SAL.Base_Peek_Type) return Boolean;
-   --  Return True if Stack top Depth items have valid Tree_Indices,
-   --  which is true if they were copied from the parser stack, and not
-   --  pushed by recover.
-
-   type Strategies is (Language_Fix, Minimal_Complete, Matching_Begin, 
Explore_Table, String_Quote);
-
-   type Strategy_Counts is array (Strategies) of Natural;
-   function Image is new SAL.Gen_Array_Image (Strategies, Natural, 
Strategy_Counts, Trimmed_Image);
-
-   type Configuration is record
-      Stack : Recover_Stacks.Stack;
-      --  Initially built from the parser stack, then the stack after the
-      --  Ops below have been performed.
-
-      Resume_Token_Goal : Token_Index := Token_Index'Last;
-      --  A successful solution shifts this token. Per-config because it
-      --  increases with Delete; we increase Shared_Parser.Resume_Token_Goal
-      --  only from successful configs.
-
-      Current_Shared_Token : Base_Token_Index := Token_Index'Last;
-      --  Index into Shared_Parser.Terminals for current input token, after
-      --  all of Inserted is input. Initially the error token.
-
-      String_Quote_Checked : Line_Number_Type := Invalid_Line_Number;
-      --  Max line checked for missing string quote.
-
-      Insert_Delete : Sorted_Insert_Delete_Arrays.Vector;
-      --  Edits to the input stream that are not yet parsed; contains only
-      --  Insert and Delete ops, in token_index order.
-
-      Current_Insert_Delete : SAL.Base_Peek_Type := No_Insert_Delete;
-      --  Index of the next op in Insert_Delete. If No_Insert_Delete, use
-      --  Current_Shared_Token.
-
-      Error_Token       : Recover_Token;
-      Check_Token_Count : Ada.Containers.Count_Type;
-      Check_Status      : Semantic_Checks.Check_Status;
-      --  If parsing this config ended with a parse error, Error_Token is
-      --  the token that failed to shift, Check_Status.Label is Ok.
-      --
-      --  If parsing this config ended with a semantic check fail,
-      --  Error_Token is the nonterm created by the reduction,
-      --  Check_Token_Count the number of tokens in the right hand side, and
-      --  Check_Status is the error.
-      --
-      --  Error_Token is set to Invalid_Token_ID when Config is parsed
-      --  successfully, or modified so the error is no longer meaningful (ie
-      --  in explore when adding an op, or in language_fixes when adding a
-      --  fix).
-
-      Ops : Config_Op_Arrays.Vector;
-      --  Record of operations applied to this Config, in application order.
-      --  Insert and Delete ops that are not yet parsed are reflected in
-      --  Insert_Delete, in token_index order.
-
-      Current_Ops : SAL.Base_Peek_Type := No_Insert_Delete;
-      --  If No_Insert_Delete, append new ops to Ops. Otherwise insert
-      --  before Current_Ops. This happens when Fast_Forward fails with the
-      --  remaining ops at Current_Shared_Token.
-
-      Cost : Natural := 0;
-
-      Strategy_Counts : LR.Strategy_Counts := (others => 0);
-      --  Count of strategies that produced Ops.
-   end record;
-   type Configuration_Access is access all Configuration;
-   for Configuration_Access'Storage_Size use 0;
-
-   function Key (A : in Configuration) return Integer is (A.Cost);
-
-   procedure Set_Key (Item : in out Configuration; Key : in Integer);
-
-   package Config_Heaps is new SAL.Gen_Unbounded_Definite_Min_Heaps_Fibonacci
-     (Element_Type   => Configuration,
-      Element_Access => Configuration_Access,
-      Key_Type       => Integer,
-      Key            => Key,
-      Set_Key        => Set_Key);
-
-   type Check_Status is (Success, Abandon, Continue);
-   subtype Non_Success_Status is Check_Status range Abandon .. Continue;
-
-   type McKenzie_Data is tagged record
-      Config_Heap   : Config_Heaps.Heap_Type;
-      Enqueue_Count : Integer := 0;
-      Check_Count   : Integer := 0;
-      Results       : Config_Heaps.Heap_Type;
-      Success       : Boolean := False;
-   end record;
-   type McKenzie_Access is access all McKenzie_Data;
-
-   procedure Accumulate (Data : in McKenzie_Data; Counts : in out 
Strategy_Counts);
-   --  Sum Results.Strategy_Counts.
-
-   type Parse_Error_Label is (Action, Check, Message);
-
-   type Parse_Error
-     (Label          : Parse_Error_Label;
-      First_Terminal : Token_ID;
-      Last_Terminal  : Token_ID)
-   is record
-      Recover : Configuration;
-
-      case Label is
-      when Action =>
-         Error_Token : Syntax_Trees.Valid_Node_Index; -- index into Parser.Tree
-         Expecting   : Token_ID_Set (First_Terminal .. Last_Terminal);
-
-      when Check =>
-         Check_Status : Semantic_Checks.Check_Status;
-
-      when Message =>
-         Msg : Ada.Strings.Unbounded.Unbounded_String;
-      end case;
-   end record;
-
-   package Parse_Error_Lists is new 
Ada.Containers.Indefinite_Doubly_Linked_Lists (Parse_Error);
-
-   function Image
-     (Item       : in Parse_Error;
-      Tree       : in Syntax_Trees.Tree;
-      Descriptor : in WisiToken.Descriptor)
-     return String;
-
-private
-
-   type Goto_Node is record
-      Symbol     : Token_ID;
-      State      : State_Index;
-      Next       : Goto_Node_Ptr;
-   end record;
-   procedure Free is new Ada.Unchecked_Deallocation (Goto_Node, Goto_Node_Ptr);
-
-   type Action_List_Iterator is tagged record
-      Node : Action_Node_Ptr;
-      Item : Parse_Action_Node_Ptr;
-   end record;
-
-end WisiToken.Parse.LR;
+--  Abstract :
+--
+--  Root package of an implementation of an LR (Left-to-right scanning
+--  Rightmost-deriving) parser. Includes operations for building the
+--  parse table at runtime. See the child packages .Parse and
+--  .Parse_No_Recover for running the parser.
+--
+--  References :
+--
+--  See wisitoken.ads
+--
+--  Copyright (C) 2002, 2003, 2009, 2010, 2013 - 2015, 2017 - 2019 Free 
Software Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  The WisiToken package is free software; you can redistribute it
+--  and/or modify it under the terms of the GNU General Public License
+--  as published by the Free Software Foundation; either version 3, or
+--  (at your option) any later version. The WisiToken package is
+--  distributed in the hope that it will be useful, but WITHOUT ANY
+--  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+--  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+--  License for more details. You should have received a copy of the
+--  GNU General Public License distributed with the WisiToken package;
+--  see file GPL.txt. If not, write to the Free Software Foundation,
+--  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+--  As a special exception, if other files instantiate generics from
+--  this unit, or you link this unit with other files to produce an
+--  executable, this unit does not by itself cause the resulting
+--  executable to be covered by the GNU General Public License. This
+--  exception does not however invalidate any other reasons why the
+--  executable file might be covered by the GNU Public License.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers.Indefinite_Doubly_Linked_Lists;
+with Ada.Unchecked_Deallocation;
+with SAL.Gen_Array_Image;
+with SAL.Gen_Bounded_Definite_Vectors.Gen_Image_Aux;
+with SAL.Gen_Bounded_Definite_Vectors.Gen_Sorted;
+with SAL.Gen_Unbounded_Definite_Min_Heaps_Fibonacci;
+with SAL.Gen_Unbounded_Definite_Queues.Gen_Image_Aux;
+with SAL.Gen_Unbounded_Definite_Stacks.Gen_Image_Aux;
+with System.Multiprocessors;
+with WisiToken.Semantic_Checks;
+with WisiToken.Syntax_Trees;
+package WisiToken.Parse.LR is
+
+   type All_Parse_Action_Verbs is (Pause, Shift, Reduce, Accept_It, Error);
+   subtype Parse_Action_Verbs is All_Parse_Action_Verbs range Shift .. Error;
+   subtype Minimal_Verbs is All_Parse_Action_Verbs range Shift .. Reduce;
+   --  Pause is only used for error recovery, to allow parallel parsers
+   --  to re-sync on the same input terminal.
+
+   subtype Token_ID_Array_1_3 is Token_ID_Array (1 .. 3);
+   --  For Use_Minimal_Complete_Actions in McDenzie_Recover.
+
+   type Parse_Action_Rec (Verb : Parse_Action_Verbs := Shift) is record
+      case Verb is
+      when Shift =>
+         State : State_Index := State_Index'Last;
+
+      when Reduce | Accept_It =>
+         Production : Production_ID;
+         --  The result nonterm and production index. Most uses need only
+         --  Production.LHS; elisp code generation, and debug output, needs
+         --  Production.RHS
+
+         Action      : WisiToken.Syntax_Trees.Semantic_Action   := null;
+         Check       : WisiToken.Semantic_Checks.Semantic_Check := null;
+         Token_Count : Ada.Containers.Count_Type                := 0;
+
+      when Error =>
+         null;
+      end case;
+   end record;
+   subtype Shift_Action_Rec is Parse_Action_Rec (Shift);
+   subtype Reduce_Action_Rec is Parse_Action_Rec (Reduce);
+
+   function Image (Item : in Parse_Action_Rec; Descriptor : in 
WisiToken.Descriptor) return String;
+   --  Ada aggregate syntax, leaving out Action, Check in reduce; for debug 
output
+
+   procedure Put (Trace : in out WisiToken.Trace'Class; Item : in 
Parse_Action_Rec);
+   --  Put a line for Item in parse trace format, with no prefix.
+
+   function Equal (Left, Right : in Parse_Action_Rec) return Boolean;
+   --  Ignore Action, Check.
+
+   type Parse_Action_Node;
+   type Parse_Action_Node_Ptr is access Parse_Action_Node;
+
+   type Parse_Action_Node is record
+      Item : Parse_Action_Rec;
+      Next : Parse_Action_Node_Ptr; -- non-null only for conflicts
+   end record;
+   procedure Free is new Ada.Unchecked_Deallocation (Parse_Action_Node, 
Parse_Action_Node_Ptr);
+
+   function Is_In (Item : in Parse_Action_Rec; List : in 
Parse_Action_Node_Ptr) return Boolean;
+   --  True if Item is Equal to any element of List.
+
+   type Action_Node;
+   type Action_Node_Ptr is access Action_Node;
+
+   type Action_Node is record
+      Symbol : Token_ID := Invalid_Token_ID; -- ignored if Action is Error
+      Action : Parse_Action_Node_Ptr;
+      Next   : Action_Node_Ptr;
+   end record;
+   procedure Free is new Ada.Unchecked_Deallocation (Action_Node, 
Action_Node_Ptr);
+
+   function Find
+     (Symbol      : in Token_ID;
+      Action_List : in Action_Node_Ptr)
+     return Action_Node_Ptr;
+
+   procedure Add
+     (List   : in out Action_Node_Ptr;
+      Symbol : in     Token_ID;
+      Action : in     Parse_Action_Rec);
+   --  Add action to List, sorted on ascending Symbol.
+
+   type Goto_Node is private;
+   type Goto_Node_Ptr is access Goto_Node;
+
+   function Symbol (List : in Goto_Node_Ptr) return Token_ID;
+   function State (List : in Goto_Node_Ptr) return State_Index;
+   function Next (List : in Goto_Node_Ptr) return Goto_Node_Ptr;
+
+   type Kernel_Info is record
+      LHS              : Token_ID                  := Token_ID'First;
+      Before_Dot       : Token_ID                  := Token_ID'First;
+      Length_After_Dot : Ada.Containers.Count_Type := 0;
+      Recursive        : Boolean                   := False;
+   end record;
+
+   function Strict_Image (Item : in Kernel_Info) return String;
+
+   type Kernel_Info_Array is array (Ada.Containers.Count_Type range <>) of 
Kernel_Info;
+   package Kernel_Info_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Ada.Containers.Count_Type, Kernel_Info, (others => <>));
+
+   function To_Vector (Item : in Kernel_Info_Array) return 
Kernel_Info_Arrays.Vector;
+
+   function Image is new Kernel_Info_Arrays.Gen_Image (Strict_Image);
+
+   type Minimal_Action (Verb : Minimal_Verbs := Shift) is record
+      case Verb is
+      when Shift =>
+         ID    : Token_ID    := Invalid_Token_ID;
+         State : State_Index := State_Index'Last;
+
+      when Reduce =>
+         Nonterm     : Token_ID;
+         Token_Count : Ada.Containers.Count_Type;
+      end case;
+   end record;
+
+   function Strict_Image (Item : in Minimal_Action) return String;
+   --  Strict Ada aggregate syntax, for generated code.
+
+   function Image (Item : in Minimal_Action; Descriptor : in 
WisiToken.Descriptor) return String;
+   --  For debugging
+
+   type Minimal_Action_Array is array (Ada.Containers.Count_Type range <>) of 
Minimal_Action;
+   package Minimal_Action_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Ada.Containers.Count_Type, Minimal_Action, (others => <>));
+
+   function To_Vector (Item : in Minimal_Action_Array) return 
Minimal_Action_Arrays.Vector;
+
+   function Image is new Minimal_Action_Arrays.Gen_Image_Aux (Descriptor, 
Trimmed_Image, Image);
+   function Strict_Image is new Minimal_Action_Arrays.Gen_Image (Strict_Image);
+
+   type Parse_State is record
+      Action_List : Action_Node_Ptr;
+      Goto_List   : Goto_Node_Ptr;
+
+      --  The following are used in error recovery.
+      Kernel : Kernel_Info_Arrays.Vector;
+
+      Minimal_Complete_Actions : Minimal_Action_Arrays.Vector;
+      Minimal_Complete_Actions_Recursive : Boolean := False;
+      --  Parse actions that will most quickly complete a production in this
+      --  state. If more than one, resolved at runtime using Kernels. If
+      --  Minimal_Complete_Actions_Recursive, at least one of the minimal
+      --  actions is recursive; this changes the algorithm.
+   end record;
+
+   type Parse_State_Array is array (State_Index range <>) of Parse_State;
+
+   type Action_List_Iterator is tagged private;
+   --  Iterates over all shift/reduce actions for a state, including
+   --  conflicts.
+
+   function First (State : in Parse_State) return Action_List_Iterator;
+   function Is_Done (Iter : in Action_List_Iterator) return Boolean;
+   procedure Next (Iter : in out Action_List_Iterator);
+
+   function Symbol (Iter : in Action_List_Iterator) return Token_ID;
+   function Action (Iter : in Action_List_Iterator) return Parse_Action_Rec;
+
+   procedure Add_Action
+     (State       : in out Parse_State;
+      Symbol      : in     Token_ID;
+      State_Index : in     WisiToken.State_Index);
+   --  Add a Shift action to tail of State action list.
+
+   procedure Add_Action
+     (State           : in out Parse_State;
+      Symbol          : in     Token_ID;
+      Verb            : in     Parse_Action_Verbs;
+      Production      : in     Production_ID;
+      RHS_Token_Count : in     Ada.Containers.Count_Type;
+      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check);
+   --  Add a Reduce or Accept_It action to tail of State action list.
+
+   procedure Add_Action
+     (State           : in out Parse_State;
+      Symbols         : in     Token_ID_Array;
+      Production      : in     Production_ID;
+      RHS_Token_Count : in     Ada.Containers.Count_Type;
+      Semantic_Action : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check  : in     WisiToken.Semantic_Checks.Semantic_Check);
+   --  Add duplicate Reduce actions, and final Error action, to tail of
+   --  State action list.
+
+   procedure Add_Conflict
+     (State             : in out Parse_State;
+      Symbol            : in     Token_ID;
+      Reduce_Production : in     Production_ID;
+      RHS_Token_Count   : in     Ada.Containers.Count_Type;
+      Semantic_Action   : in     WisiToken.Syntax_Trees.Semantic_Action;
+      Semantic_Check    : in     WisiToken.Semantic_Checks.Semantic_Check);
+   --  Add a Reduce conflict to State.
+
+   procedure Add_Error (State  : in out Parse_State);
+   --  Add an Error action to State, at tail of action list.
+
+   procedure Add_Goto
+     (State    : in out Parse_State;
+      Symbol   : in     Token_ID;
+      To_State : in     State_Index);
+   --  Add a goto item to State goto list; keep goto list sorted in ascending 
order on Symbol.
+
+   type McKenzie_Param_Type
+     (First_Terminal    : Token_ID;
+      Last_Terminal     : Token_ID;
+      First_Nonterminal : Token_ID;
+      Last_Nonterminal  : Token_ID)
+   is record
+      Insert      : Token_ID_Array_Natural (First_Terminal .. Last_Terminal);
+      Delete      : Token_ID_Array_Natural (First_Terminal .. Last_Terminal);
+      Push_Back   : Token_ID_Array_Natural (First_Terminal .. 
Last_Nonterminal);
+      Undo_Reduce : Token_ID_Array_Natural (First_Nonterminal .. 
Last_Nonterminal);
+      --  Cost of operations on config stack, input.
+
+      Minimal_Complete_Cost_Delta : Integer;
+      --  Reduction in cost due to using Minimal_Complete_Action.
+
+      Matching_Begin : Integer;
+      --  Cost of Matching_Begin strategy (applied once, independent of
+      --  token count).
+
+      Fast_Forward : Integer;
+      --  Cost of moving the edit point forward over input tokens.
+
+      Ignore_Check_Fail : Natural;
+      --  Cost of ignoring a semantic check failure. Should be at least the
+      --  cost of a typical fix for such a failure.
+
+      Task_Count : System.Multiprocessors.CPU_Range;
+      --  Number of parallel tasks during recovery. If 0, use
+      --  System.Multiprocessors.Number_Of_CPUs - 1.
+
+      Check_Limit       : Token_Index; -- max tokens to parse ahead when 
checking a configuration.
+      Check_Delta_Limit : Natural;     -- max configs checked, delta over 
successful parser.
+      Enqueue_Limit     : Natural;     -- max configs enqueued.
+   end record;
+
+   Default_McKenzie_Param : constant McKenzie_Param_Type :=
+     (First_Terminal              => Token_ID'Last,
+      Last_Terminal               => Token_ID'First,
+      First_Nonterminal           => Token_ID'Last,
+      Last_Nonterminal            => Token_ID'First,
+      Insert                      => (others => 0),
+      Delete                      => (others => 0),
+      Push_Back                   => (others => 0),
+      Undo_Reduce                 => (others => 0),
+      Minimal_Complete_Cost_Delta => -1,
+      Fast_Forward                => 0,
+      Matching_Begin              => 0,
+      Ignore_Check_Fail           => 0,
+      Task_Count                  => System.Multiprocessors.CPU_Range'Last,
+      Check_Limit                 => 4,
+      Check_Delta_Limit           => Natural'Last,
+      Enqueue_Limit               => Natural'Last);
+
+   type Parse_Table
+     (State_First       : State_Index;
+      State_Last        : State_Index;
+      First_Terminal    : Token_ID;
+      Last_Terminal     : Token_ID;
+      First_Nonterminal : Token_ID;
+      Last_Nonterminal  : Token_ID)
+     is tagged
+   record
+      States         : Parse_State_Array (State_First .. State_Last);
+      McKenzie_Param : McKenzie_Param_Type (First_Terminal, Last_Terminal, 
First_Nonterminal, Last_Nonterminal);
+   end record;
+
+   function Goto_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Unknown_State_Index;
+   function Goto_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Goto_Node_Ptr;
+   --  Return next state after reducing stack by nonterminal ID;
+   --  Unknown_State if none (only possible during error recovery).
+   --  Second form allows retrieving Production.
+
+   function Action_For
+     (Table : in Parse_Table;
+      State : in State_Index;
+      ID    : in Token_ID)
+     return Parse_Action_Node_Ptr;
+   --  Return the action for State, terminal ID.
+
+   function Expecting (Table : in Parse_Table; State : in State_Index) return 
Token_ID_Set;
+
+   type Parse_Table_Ptr is access Parse_Table;
+   procedure Free_Table (Table : in out Parse_Table_Ptr);
+
+   type Semantic_Action is record
+      Action : WisiToken.Syntax_Trees.Semantic_Action := null;
+      Check  : WisiToken.Semantic_Checks.Semantic_Check := null;
+   end record;
+
+   package Semantic_Action_Arrays is new SAL.Gen_Unbounded_Definite_vectors 
(Natural, Semantic_Action, (others => <>));
+   package Semantic_Action_Array_Arrays is new 
SAL.Gen_Unbounded_Definite_Vectors
+     (Token_ID, Semantic_Action_Arrays.Vector, 
Semantic_Action_Arrays.Empty_Vector);
+
+   function Get_Text_Rep
+     (File_Name      : in String;
+      McKenzie_Param : in McKenzie_Param_Type;
+      Actions        : in Semantic_Action_Array_Arrays.Vector)
+     return Parse_Table_Ptr;
+   --  Read machine-readable text format of states (as output by
+   --  WisiToken.Generate.LR.Put_Text_Rep) from file File_Name. Result
+   --  has actions, checks from Productions.
+
+   ----------
+   --  For McKenzie_Recover. Declared here because Parser_Lists needs
+   --  these, Mckenzie_Recover needs Parser_Lists.
+   --
+   --  We don't maintain a syntax tree during recover; it's too slow, and
+   --  not needed for any operations. The parser syntax tree is used for
+   --  Undo_Reduce, which is only done on nonterms reduced by the main
+   --  parser, not virtual nonterms produced by recover.
+
+   package Fast_Token_ID_Arrays is new SAL.Gen_Bounded_Definite_Vectors
+     (SAL.Peek_Type, Token_ID, Capacity => 20);
+
+   No_Insert_Delete : constant SAL.Base_Peek_Type := 0;
+
+   function Image
+     (Index      : in SAL.Peek_Type;
+      Tokens     : in Fast_Token_ID_Arrays.Vector;
+      Descriptor : in WisiToken.Descriptor)
+     return String
+     is (SAL.Peek_Type'Image (Index) & ":" & SAL.Peek_Type'Image 
(Tokens.Last_Index) & ":" &
+           Image (Tokens (Index), Descriptor));
+
+   type Config_Op_Label is (Fast_Forward, Undo_Reduce, Push_Back, Insert, 
Delete);
+   subtype Insert_Delete_Op_Label is Config_Op_Label range Insert .. Delete;
+   --  Fast_Forward is a placeholder to mark a fast_forward parse; that
+   --  resets what operations are allowed to be done on a config.
+   --
+   --  Undo_Reduce is the inverse of Reduce.
+   --
+   --  Push_Back pops the top stack item, and moves the input stream
+   --  pointer back to the first shared_terminal contained by that item.
+   --
+   --  Insert inserts a new token in the token input stream, before the
+   --  given point in Terminals.
+   --
+   --  Delete deletes one item from the token input stream, at the given
+   --  point.
+
+   type Config_Op (Op : Config_Op_Label := Fast_Forward) is record
+      --  We store enough information to perform the operation on the main
+      --  parser stack and input stream when the config is the result
+      --  of a successful recover.
+
+      case Op is
+      when Fast_Forward =>
+         FF_Token_Index : WisiToken.Token_Index;
+         --  Config.Current_Shared_Token after the operation is done; the last
+         --  token shifted.
+
+      when Undo_Reduce =>
+         Nonterm : Token_ID;
+         --  The nonterminal popped off the stack.
+
+         Token_Count : Ada.Containers.Count_Type;
+         --  The number of tokens pushed on the stack.
+
+      when Push_Back =>
+         PB_ID : Token_ID;
+         --  The nonterm ID popped off the stack.
+
+         PB_Token_Index : WisiToken.Base_Token_Index;
+         --  Config.Current_Shared_Token after
+         --  the operation is done. If the token is empty, Token_Index is
+         --  Invalid_Token_Index.
+
+      when Insert =>
+         Ins_ID : Token_ID;
+         --  The token ID inserted.
+
+         Ins_Token_Index : WisiToken.Base_Token_Index;
+         --  Ins_ID is inserted before Token_Index.
+
+         State       : Unknown_State_Index;
+         Stack_Depth : SAL.Base_Peek_Type;
+         --  Used in Minimal_Completion_Actions to detect cycles; only set for
+         --  Insert by Minimal_Completion_Actions.
+
+      when Delete =>
+         Del_ID : Token_ID;
+         --  The token ID deleted.
+
+         Del_Token_Index : WisiToken.Base_Token_Index;
+         --  Token at Token_Index is deleted.
+
+      end case;
+   end record;
+   subtype Insert_Delete_Op is Config_Op with Dynamic_Predicate => 
(Insert_Delete_Op.Op in Insert_Delete_Op_Label);
+   subtype Insert_Op is Config_Op with Dynamic_Predicate => (Insert_Op.Op = 
Insert);
+
+   function Token_Index (Op : in Insert_Delete_Op) return WisiToken.Token_Index
+     is (case Insert_Delete_Op_Label'(Op.Op) is
+         when Insert => Op.Ins_Token_Index,
+         when Delete => Op.Del_Token_Index);
+
+   function ID (Op : in Insert_Delete_Op) return WisiToken.Token_ID
+     is (case Insert_Delete_Op_Label'(Op.Op) is
+         when Insert => Op.Ins_ID,
+         when Delete => Op.Del_ID);
+
+   function Compare (Left, Right : in Insert_Delete_Op) return 
SAL.Compare_Result;
+   --  Compare token_index.
+
+   function Equal (Left : in Config_Op; Right : in Insert_Op) return Boolean;
+   --  Ignore state, stack_depth
+
+   package Config_Op_Queues is new SAL.Gen_Unbounded_Definite_Queues 
(Config_Op);
+
+   package Config_Op_Arrays is new SAL.Gen_Bounded_Definite_Vectors
+     (Positive_Index_Type, Config_Op, Capacity => 80);
+   --  Using a fixed size vector significantly speeds up
+   --  McKenzie_Recover. The capacity is determined by the maximum number
+   --  of repair operations, which is limited by the cost_limit McKenzie
+   --  parameter plus an arbitrary number from the language-specific
+   --  repairs; in practice, a capacity of 80 is enough so far. If a
+   --  config does hit that limit, it is abandoned; some other config is
+   --  likely to be cheaper.
+
+   function Config_Op_Image (Item : in Config_Op; Descriptor : in 
WisiToken.Descriptor) return String
+     is ("(" & Config_Op_Label'Image (Item.Op) & ", " &
+           (case Item.Op is
+            when Fast_Forward => WisiToken.Token_Index'Image 
(Item.FF_Token_Index),
+            when Undo_Reduce => Image (Item.Nonterm, Descriptor) & "," &
+                 Ada.Containers.Count_Type'Image (Item.Token_Count),
+            when Push_Back => Image (Item.PB_ID, Descriptor) & "," &
+                 WisiToken.Token_Index'Image (Item.PB_Token_Index),
+            when Insert => Image (Item.Ins_ID, Descriptor) & "," &
+                 WisiToken.Token_Index'Image (Item.Ins_Token_Index) &
+                (if Item.State = Unknown_State or Trace_McKenzie <= Detail 
then ""
+                 else "," & State_Index'Image (Item.State) &
+                    SAL.Base_Peek_Type'Image (Item.Stack_Depth)),
+            when Delete => Image (Item.Del_ID, Descriptor) & "," &
+                 WisiToken.Token_Index'Image (Item.Del_Token_Index))
+           & ")");
+
+   function Image (Item : in Config_Op; Descriptor : in WisiToken.Descriptor) 
return String
+     renames Config_Op_Image;
+
+   function Image is new Config_Op_Queues.Gen_Image_Aux (WisiToken.Descriptor, 
Image);
+   function Config_Op_Array_Image is new Config_Op_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
+   function Image (Item : in Config_Op_Arrays.Vector; Descriptor : in 
WisiToken.Descriptor) return String
+     renames Config_Op_Array_Image;
+
+   function None (Ops : in Config_Op_Arrays.Vector; Op : in Config_Op_Label) 
return Boolean
+     is (for all O of Ops => O.Op /= Op);
+   --  True if Ops contains no Op.
+
+   function None_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean;
+   --  True if Ops contains no Op after the last Fast_Forward (or ops.first, if
+   --  no Fast_Forward).
+
+   function Only_Since_FF (Ops : in Config_Op_Arrays.Vector; Op : in 
Config_Op_Label) return Boolean;
+   --  True if Ops contains only Op (at least one) after the last Fast_Forward 
(or ops.first, if
+   --  no Fast_Forward).
+
+   function Any (Ops : in Config_Op_Arrays.Vector; Op : in Config_Op_Label) 
return Boolean
+     is (for some O of Ops => O.Op = Op);
+   --  True if Ops contains at least one Op.
+
+   package Insert_Delete_Arrays is new SAL.Gen_Bounded_Definite_Vectors
+     (Positive_Index_Type, Insert_Delete_Op, Capacity => 80);
+
+   package Sorted_Insert_Delete_Arrays is new Insert_Delete_Arrays.Gen_Sorted 
(Compare);
+
+   function Image is new Insert_Delete_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
+
+   type Recover_Stack_Item is record
+      State : Unknown_State_Index;
+
+      Tree_Index : Syntax_Trees.Node_Index;
+      --  Valid if copied at recover initialize, Invalid if pushed during
+      --  recover.
+
+      Token : Recover_Token;
+      --  Virtual is False if token is from input text; True if inserted
+      --  during recover.
+   end record;
+
+   package Recover_Stacks is new SAL.Gen_Unbounded_Definite_Stacks 
(Recover_Stack_Item);
+
+   function Image (Item : in Recover_Stack_Item; Descriptor : in 
WisiToken.Descriptor) return String
+     is ((if Item.State = Unknown_State then " " else Trimmed_Image 
(Item.State)) & " : " &
+           Image (Item.Token, Descriptor));
+
+   function Recover_Stack_Image is new Recover_Stacks.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
+   --  Unique name for calling from debugger
+
+   function Image
+     (Stack      : in Recover_Stacks.Stack;
+      Descriptor : in WisiToken.Descriptor;
+      Depth      : in SAL.Base_Peek_Type := 0)
+     return String
+     renames Recover_Stack_Image;
+
+   function Valid_Tree_Indices (Stack : in Recover_Stacks.Stack; Depth : in 
SAL.Base_Peek_Type) return Boolean;
+   --  Return True if Stack top Depth items have valid Tree_Indices,
+   --  which is true if they were copied from the parser stack, and not
+   --  pushed by recover.
+
+   type Strategies is (Language_Fix, Minimal_Complete, Matching_Begin, 
Explore_Table, String_Quote);
+
+   type Strategy_Counts is array (Strategies) of Natural;
+   function Image is new SAL.Gen_Array_Image (Strategies, Natural, 
Strategy_Counts, Trimmed_Image);
+
+   type Minimal_Complete_State is (None, Active, Done);
+
+   type Configuration is record
+      Stack : Recover_Stacks.Stack;
+      --  Initially built from the parser stack, then the stack after the
+      --  Ops below have been performed.
+
+      Resume_Token_Goal : WisiToken.Token_Index := WisiToken.Token_Index'Last;
+      --  A successful solution shifts this token. Per-config because it
+      --  increases with Delete; we increase Shared_Parser.Resume_Token_Goal
+      --  only from successful configs.
+
+      Current_Shared_Token : Base_Token_Index := WisiToken.Token_Index'Last;
+      --  Index into Shared_Parser.Terminals for current input token, after
+      --  all of Inserted is input. Initially the error token.
+
+      String_Quote_Checked : Line_Number_Type := Invalid_Line_Number;
+      --  Max line checked for missing string quote.
+
+      Insert_Delete : Sorted_Insert_Delete_Arrays.Vector;
+      --  Edits to the input stream that are not yet parsed; contains only
+      --  Insert and Delete ops, in token_index order.
+
+      Current_Insert_Delete : SAL.Base_Peek_Type := No_Insert_Delete;
+      --  Index of the next op in Insert_Delete. If No_Insert_Delete, use
+      --  Current_Shared_Token.
+
+      Error_Token       : Recover_Token;
+      Check_Token_Count : Ada.Containers.Count_Type;
+      Check_Status      : Semantic_Checks.Check_Status;
+      --  If parsing this config ended with a parse error, Error_Token is
+      --  the token that failed to shift, Check_Status.Label is Ok.
+      --
+      --  If parsing this config ended with a semantic check fail,
+      --  Error_Token is the nonterm created by the reduction,
+      --  Check_Token_Count the number of tokens in the right hand side, and
+      --  Check_Status is the error.
+      --
+      --  Error_Token is set to Invalid_Token_ID when Config is parsed
+      --  successfully, or modified so the error is no longer meaningful (ie
+      --  in explore when adding an op, or in language_fixes when adding a
+      --  fix).
+
+      Ops : Config_Op_Arrays.Vector;
+      --  Record of operations applied to this Config, in application order.
+      --  Insert and Delete ops that are not yet parsed are reflected in
+      --  Insert_Delete, in token_index order.
+
+      Cost : Natural := 0;
+
+      Strategy_Counts : LR.Strategy_Counts := (others => 0);
+      --  Count of strategies that produced Ops.
+
+      Minimal_Complete_State : LR.Minimal_Complete_State := None;
+      Matching_Begin_Done    : Boolean                   := False;
+   end record;
+   type Configuration_Access is access all Configuration;
+   for Configuration_Access'Storage_Size use 0;
+
+   function Key (A : in Configuration) return Integer is (A.Cost);
+
+   procedure Set_Key (Item : in out Configuration; Key : in Integer);
+
+   package Config_Heaps is new SAL.Gen_Unbounded_Definite_Min_Heaps_Fibonacci
+     (Element_Type   => Configuration,
+      Element_Access => Configuration_Access,
+      Key_Type       => Integer,
+      Key            => Key,
+      Set_Key        => Set_Key);
+
+   type Check_Status is (Success, Abandon, Continue);
+   subtype Non_Success_Status is Check_Status range Abandon .. Continue;
+
+   type McKenzie_Data is tagged record
+      Config_Heap       : Config_Heaps.Heap_Type;
+      Enqueue_Count     : Integer := 0;
+      Config_Full_Count : Integer := 0;
+      Check_Count       : Integer := 0;
+      Results           : Config_Heaps.Heap_Type;
+      Success           : Boolean := False;
+   end record;
+   type McKenzie_Access is access all McKenzie_Data;
+
+   procedure Accumulate (Data : in McKenzie_Data; Counts : in out 
Strategy_Counts);
+   --  Sum Results.Strategy_Counts.
+
+   type Parse_Error_Label is (Action, Check, Message);
+
+   type Parse_Error
+     (Label          : Parse_Error_Label;
+      First_Terminal : Token_ID;
+      Last_Terminal  : Token_ID)
+   is record
+      Recover : Configuration;
+
+      case Label is
+      when Action =>
+         Error_Token : Syntax_Trees.Valid_Node_Index; -- index into Parser.Tree
+         Expecting   : Token_ID_Set (First_Terminal .. Last_Terminal);
+
+      when Check =>
+         Check_Status : Semantic_Checks.Check_Status;
+
+      when Message =>
+         Msg : Ada.Strings.Unbounded.Unbounded_String;
+      end case;
+   end record;
+
+   package Parse_Error_Lists is new 
Ada.Containers.Indefinite_Doubly_Linked_Lists (Parse_Error);
+
+private
+
+   type Goto_Node is record
+      Symbol     : Token_ID;
+      State      : State_Index;
+      Next       : Goto_Node_Ptr;
+   end record;
+   procedure Free is new Ada.Unchecked_Deallocation (Goto_Node, Goto_Node_Ptr);
+
+   type Action_List_Iterator is tagged record
+      Node : Action_Node_Ptr;
+      Item : Parse_Action_Node_Ptr;
+   end record;
+
+end WisiToken.Parse.LR;
diff --git a/packages/wisi/wisitoken-parse-packrat-procedural.adb 
b/packages/wisi/wisitoken-parse-packrat-procedural.adb
index 5dc4ef1..1f00e48 100644
--- a/packages/wisi/wisitoken-parse-packrat-procedural.adb
+++ b/packages/wisi/wisitoken-parse-packrat-procedural.adb
@@ -1,256 +1,256 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-package body WisiToken.Parse.Packrat.Procedural is
-
-   function Apply_Rule
-     (Parser   : in out Procedural.Parser;
-      R        : in     Token_ID;
-      Last_Pos : in     Base_Token_Index)
-     return Memo_Entry
-   with Post => Apply_Rule'Result.State in Failure .. Success;
-
-   function Eval
-     (Parser   : in out Procedural.Parser;
-      R        : in     Token_ID;
-      Last_Pos : in     Base_Token_Index)
-     return Memo_Entry
-   with Post => Eval'Result.State in Failure .. Success;
-
-   ----------
-   --  bodies
-
-   function Eval
-     (Parser   : in out Procedural.Parser;
-      R        : in     Token_ID;
-      Last_Pos : in     Base_Token_Index)
-     return Memo_Entry
-   is
-      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-
-      subtype Terminal is Token_ID range Descriptor.First_Terminal .. 
Descriptor.Last_Terminal;
-
-      Pos : Base_Token_Index := Last_Pos; --  last token parsed.
-   begin
-      for RHS_Index in Parser.Grammar (R).RHSs.First_Index .. Parser.Grammar 
(R).RHSs.Last_Index loop
-         declare
-            use all type Ada.Containers.Count_Type;
-            RHS  : WisiToken.Productions.Right_Hand_Side renames 
Parser.Grammar (R).RHSs (RHS_Index);
-            Memo : Memo_Entry; --  for temporary or intermediate results
-         begin
-            if RHS.Tokens.Length = 0 then
-               return
-                 (State              => Success,
-                  Result             => Parser.Tree.Add_Nonterm
-                    (Production      => (R, RHS_Index),
-                     Action          => RHS.Action,
-                     Children        => (1 .. 0 => 
Syntax_Trees.Invalid_Node_Index),
-                     Default_Virtual => False),
-                  Last_Pos           => Pos);
-            else
-               declare
-                  Children : Syntax_Trees.Valid_Node_Index_Array
-                    (SAL.Base_Peek_Type (RHS.Tokens.First_Index) .. 
SAL.Base_Peek_Type (RHS.Tokens.Last_Index));
-               begin
-                  for I in RHS.Tokens.First_Index .. RHS.Tokens.Last_Index loop
-                     if RHS.Tokens (I) in Terminal then
-                        if Pos = Parser.Terminals.Last_Index then
-                           goto Fail_RHS;
-
-                        elsif Parser.Terminals (Pos + 1).ID = RHS.Tokens (I) 
then
-                           Pos := Pos + 1;
-                           Children (SAL.Base_Peek_Type (I)) := Tree_Index 
(Pos);
-                        else
-                           goto Fail_RHS;
-                        end if;
-                     else
-                        Memo := Apply_Rule (Parser, RHS.Tokens (I), Pos);
-                        case Memo.State is
-                        when Success =>
-                           Children (SAL.Base_Peek_Type (I)) := Memo.Result;
-                           Pos := Memo.Last_Pos;
-
-                        when Failure =>
-                           goto Fail_RHS;
-                        when No_Result =>
-                           raise SAL.Programmer_Error;
-                        end case;
-                     end if;
-                  end loop;
-
-                  return
-                    (State              => Success,
-                     Result             => Parser.Tree.Add_Nonterm
-                       (Production      => (R, RHS_Index),
-                        Action          => RHS.Action,
-                        Children        => Children,
-                        Default_Virtual => False),
-                     Last_Pos           => Pos);
-
-                  <<Fail_RHS>>
-                  Pos := Last_Pos;
-               end;
-            end if;
-         end;
-      end loop;
-      --  get here when all RHSs fail
-
-      return (State => Failure);
-   end Eval;
-
-   function Apply_Rule
-     (Parser   : in out Procedural.Parser;
-      R        : in     Token_ID;
-      Last_Pos : in     Base_Token_Index)
-     return Memo_Entry
-   is
-      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-
-      Pos       : Base_Token_Index     := Last_Pos;     --  last token parsed.
-      Start_Pos : constant Token_Index := Last_Pos + 1; --  first token in 
current nonterm
-      Memo      : Memo_Entry           := Parser.Derivs (R)(Start_Pos);
-
-      Pos_Recurse_Last : Base_Token_Index := Last_Pos;
-      Result_Recurse   : Memo_Entry;
-   begin
-      case Memo.State is
-      when Success =>
-         return Memo;
-
-      when Failure =>
-         return (State => Failure);
-
-      when No_Result =>
-         if Parser.Direct_Left_Recursive (R) then
-            Parser.Derivs (R).Replace_Element (Start_Pos, (State => Failure));
-         else
-            Memo := Eval (Parser, R, Last_Pos);
-            if Trace_Parse > Detail and then Memo.State = Success then
-               Parser.Trace.Put_Line (Parser.Tree.Image (Memo.Result, 
Descriptor, Include_Children => True));
-            end if;
-            Parser.Derivs (R).Replace_Element (Start_Pos, Memo);
-            return Memo;
-         end if;
-      end case;
-
-      loop
-         Pos := Last_Pos;
-
-         if Pos > Parser.Terminals.Last_Index then --  FIXME: this can't pass 
here; Last_Pos never > last_index
-            --  There might be an empty nonterm after the last token
-            return (State => Failure);
-         end if;
-
-         Result_Recurse := Eval (Parser, R, Pos);
-
-         if Result_Recurse.State = Success then
-            if Result_Recurse.Last_Pos > Pos_Recurse_Last then
-               Parser.Derivs (R).Replace_Element (Start_Pos, Result_Recurse);
-               Pos              := Result_Recurse.Last_Pos;
-               Pos_Recurse_Last := Pos;
-
-               if WisiToken.Trace_Parse > Detail then
-                  Parser.Trace.Put_Line
-                    (Parser.Tree.Image (Result_Recurse.Result, Descriptor, 
Include_Children => True));
-               end if;
-               --  continue looping
-
-            elsif Result_Recurse.Last_Pos = Pos_Recurse_Last then
-               if Parser.Tree.Is_Empty (Result_Recurse.Result) then
-                  Parser.Derivs (R).Replace_Element (Start_Pos, 
Result_Recurse);
-               end if;
-               exit;
-            else
-               --  Result_Recurse.Last_Pos < Pos_Recurse_Last
-               exit;
-            end if;
-         else
-            exit;
-         end if;
-      end loop;
-      return Parser.Derivs (R)(Start_Pos);
-   end Apply_Rule;
-
-   ----------
-   --  Public subprograms
-
-   function Create
-     (Grammar               : in     WisiToken.Productions.Prod_Arrays.Vector;
-      Direct_Left_Recursive : in     Token_ID_Set;
-      Start_ID              : in     Token_ID;
-      Trace                 : access WisiToken.Trace'Class;
-      Lexer                 :        WisiToken.Lexer.Handle;
-      User_Data             :        WisiToken.Syntax_Trees.User_Data_Access)
-     return Procedural.Parser
-   is begin
-      return Parser : Procedural.Parser (Grammar.First_Index, 
Grammar.Last_Index) do
-         Parser.Trace                 := Trace;
-         Parser.Lexer                 := Lexer;
-         Parser.User_Data             := User_Data;
-         Parser.Grammar               := Grammar;
-         Parser.Start_ID              := Start_ID;
-         Parser.Direct_Left_Recursive := Direct_Left_Recursive;
-      end return;
-   end Create;
-
-   overriding procedure Parse (Parser : aliased in out Procedural.Parser)
-   is
-      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
-
-      Junk : WisiToken.Syntax_Trees.Valid_Node_Index;
-      pragma Unreferenced (Junk);
-
-      Result : Memo_Entry;
-   begin
-      Parser.Base_Tree.Clear;
-      Parser.Tree.Initialize (Parser.Base_Tree'Unchecked_Access, Flush => 
True);
-      Parser.Lex_All;
-
-      for Nonterm in Descriptor.First_Nonterminal .. 
Parser.Trace.Descriptor.Last_Nonterminal loop
-         Parser.Derivs (Nonterm).Clear;
-         Parser.Derivs (Nonterm).Set_First (Parser.Terminals.First_Index);
-
-         --  There might be an empty nonterm after the last token
-         Parser.Derivs (Nonterm).Set_Last (Parser.Terminals.Last_Index + 1);
-      end loop;
-
-      for Token_Index in Parser.Terminals.First_Index .. 
Parser.Terminals.Last_Index loop
-         Junk := Parser.Tree.Add_Terminal (Token_Index, Parser.Terminals);
-         --  FIXME: move this into Lex_All, delete Terminals, just use 
Syntax_Tree
-      end loop;
-
-      Result := Apply_Rule (Parser, Parser.Start_ID, 
Parser.Terminals.First_Index - 1);
-
-      if Result.State /= Success then
-         if Trace_Parse > Outline then
-            Parser.Trace.Put_Line ("parse failed");
-         end if;
-
-         raise Syntax_Error with "parse failed"; --  FIXME: need better error 
message!
-      else
-         Parser.Tree.Set_Root (Result.Result);
-      end if;
-   end Parse;
-
-   overriding function Tree (Parser : in Procedural.Parser) return 
Syntax_Trees.Tree
-   is begin
-      return Parser.Tree;
-   end Tree;
-
-end WisiToken.Parse.Packrat.Procedural;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+package body WisiToken.Parse.Packrat.Procedural is
+
+   function Apply_Rule
+     (Parser   : in out Procedural.Parser;
+      R        : in     Token_ID;
+      Last_Pos : in     Base_Token_Index)
+     return Memo_Entry
+   with Post => Apply_Rule'Result.State in Failure .. Success;
+
+   function Eval
+     (Parser   : in out Procedural.Parser;
+      R        : in     Token_ID;
+      Last_Pos : in     Base_Token_Index)
+     return Memo_Entry
+   with Post => Eval'Result.State in Failure .. Success;
+
+   ----------
+   --  bodies
+
+   function Eval
+     (Parser   : in out Procedural.Parser;
+      R        : in     Token_ID;
+      Last_Pos : in     Base_Token_Index)
+     return Memo_Entry
+   is
+      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+
+      subtype Terminal is Token_ID range Descriptor.First_Terminal .. 
Descriptor.Last_Terminal;
+
+      Pos : Base_Token_Index := Last_Pos; --  last token parsed.
+   begin
+      for RHS_Index in Parser.Grammar (R).RHSs.First_Index .. Parser.Grammar 
(R).RHSs.Last_Index loop
+         declare
+            use all type Ada.Containers.Count_Type;
+            RHS  : WisiToken.Productions.Right_Hand_Side renames 
Parser.Grammar (R).RHSs (RHS_Index);
+            Memo : Memo_Entry; --  for temporary or intermediate results
+         begin
+            if RHS.Tokens.Length = 0 then
+               return
+                 (State              => Success,
+                  Result             => Parser.Tree.Add_Nonterm
+                    (Production      => (R, RHS_Index),
+                     Action          => RHS.Action,
+                     Children        => (1 .. 0 => 
Syntax_Trees.Invalid_Node_Index),
+                     Default_Virtual => False),
+                  Last_Pos           => Pos);
+            else
+               declare
+                  Children : Syntax_Trees.Valid_Node_Index_Array
+                    (SAL.Base_Peek_Type (RHS.Tokens.First_Index) .. 
SAL.Base_Peek_Type (RHS.Tokens.Last_Index));
+               begin
+                  for I in RHS.Tokens.First_Index .. RHS.Tokens.Last_Index loop
+                     if RHS.Tokens (I) in Terminal then
+                        if Pos = Parser.Terminals.Last_Index then
+                           goto Fail_RHS;
+
+                        elsif Parser.Terminals (Pos + 1).ID = RHS.Tokens (I) 
then
+                           Pos := Pos + 1;
+                           Children (SAL.Base_Peek_Type (I)) := Tree_Index 
(Pos);
+                        else
+                           goto Fail_RHS;
+                        end if;
+                     else
+                        Memo := Apply_Rule (Parser, RHS.Tokens (I), Pos);
+                        case Memo.State is
+                        when Success =>
+                           Children (SAL.Base_Peek_Type (I)) := Memo.Result;
+                           Pos := Memo.Last_Pos;
+
+                        when Failure =>
+                           goto Fail_RHS;
+                        when No_Result =>
+                           raise SAL.Programmer_Error;
+                        end case;
+                     end if;
+                  end loop;
+
+                  return
+                    (State              => Success,
+                     Result             => Parser.Tree.Add_Nonterm
+                       (Production      => (R, RHS_Index),
+                        Action          => RHS.Action,
+                        Children        => Children,
+                        Default_Virtual => False),
+                     Last_Pos           => Pos);
+
+                  <<Fail_RHS>>
+                  Pos := Last_Pos;
+               end;
+            end if;
+         end;
+      end loop;
+      --  get here when all RHSs fail
+
+      return (State => Failure);
+   end Eval;
+
+   function Apply_Rule
+     (Parser   : in out Procedural.Parser;
+      R        : in     Token_ID;
+      Last_Pos : in     Base_Token_Index)
+     return Memo_Entry
+   is
+      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+
+      Pos       : Base_Token_Index     := Last_Pos;     --  last token parsed.
+      Start_Pos : constant Token_Index := Last_Pos + 1; --  first token in 
current nonterm
+      Memo      : Memo_Entry           := Parser.Derivs (R)(Start_Pos);
+
+      Pos_Recurse_Last : Base_Token_Index := Last_Pos;
+      Result_Recurse   : Memo_Entry;
+   begin
+      case Memo.State is
+      when Success =>
+         return Memo;
+
+      when Failure =>
+         return (State => Failure);
+
+      when No_Result =>
+         if Parser.Direct_Left_Recursive (R) then
+            Parser.Derivs (R).Replace_Element (Start_Pos, (State => Failure));
+         else
+            Memo := Eval (Parser, R, Last_Pos);
+            if Trace_Parse > Detail and then Memo.State = Success then
+               Parser.Trace.Put_Line (Parser.Tree.Image (Memo.Result, 
Descriptor, Include_Children => True));
+            end if;
+            Parser.Derivs (R).Replace_Element (Start_Pos, Memo);
+            return Memo;
+         end if;
+      end case;
+
+      loop
+         Pos := Last_Pos;
+
+         if Pos > Parser.Terminals.Last_Index then --  FIXME: this can't pass 
here; Last_Pos never > last_index
+            --  There might be an empty nonterm after the last token
+            return (State => Failure);
+         end if;
+
+         Result_Recurse := Eval (Parser, R, Pos);
+
+         if Result_Recurse.State = Success then
+            if Result_Recurse.Last_Pos > Pos_Recurse_Last then
+               Parser.Derivs (R).Replace_Element (Start_Pos, Result_Recurse);
+               Pos              := Result_Recurse.Last_Pos;
+               Pos_Recurse_Last := Pos;
+
+               if WisiToken.Trace_Parse > Detail then
+                  Parser.Trace.Put_Line
+                    (Parser.Tree.Image (Result_Recurse.Result, Descriptor, 
Include_Children => True));
+               end if;
+               --  continue looping
+
+            elsif Result_Recurse.Last_Pos = Pos_Recurse_Last then
+               if Parser.Tree.Is_Empty (Result_Recurse.Result) then
+                  Parser.Derivs (R).Replace_Element (Start_Pos, 
Result_Recurse);
+               end if;
+               exit;
+            else
+               --  Result_Recurse.Last_Pos < Pos_Recurse_Last
+               exit;
+            end if;
+         else
+            exit;
+         end if;
+      end loop;
+      return Parser.Derivs (R)(Start_Pos);
+   end Apply_Rule;
+
+   ----------
+   --  Public subprograms
+
+   function Create
+     (Grammar               : in     WisiToken.Productions.Prod_Arrays.Vector;
+      Direct_Left_Recursive : in     Token_ID_Set;
+      Start_ID              : in     Token_ID;
+      Trace                 : access WisiToken.Trace'Class;
+      Lexer                 :        WisiToken.Lexer.Handle;
+      User_Data             :        WisiToken.Syntax_Trees.User_Data_Access)
+     return Procedural.Parser
+   is begin
+      return Parser : Procedural.Parser (Grammar.First_Index, 
Grammar.Last_Index) do
+         Parser.Trace                 := Trace;
+         Parser.Lexer                 := Lexer;
+         Parser.User_Data             := User_Data;
+         Parser.Grammar               := Grammar;
+         Parser.Start_ID              := Start_ID;
+         Parser.Direct_Left_Recursive := Direct_Left_Recursive;
+      end return;
+   end Create;
+
+   overriding procedure Parse (Parser : aliased in out Procedural.Parser)
+   is
+      Descriptor : WisiToken.Descriptor renames Parser.Trace.Descriptor.all;
+
+      Junk : WisiToken.Syntax_Trees.Valid_Node_Index;
+      pragma Unreferenced (Junk);
+
+      Result : Memo_Entry;
+   begin
+      Parser.Base_Tree.Clear;
+      Parser.Tree.Initialize (Parser.Base_Tree'Unchecked_Access, Flush => 
True);
+      Parser.Lex_All;
+
+      for Nonterm in Descriptor.First_Nonterminal .. 
Parser.Trace.Descriptor.Last_Nonterminal loop
+         Parser.Derivs (Nonterm).Clear;
+         Parser.Derivs (Nonterm).Set_First (Parser.Terminals.First_Index);
+
+         --  There might be an empty nonterm after the last token
+         Parser.Derivs (Nonterm).Set_Last (Parser.Terminals.Last_Index + 1);
+      end loop;
+
+      for Token_Index in Parser.Terminals.First_Index .. 
Parser.Terminals.Last_Index loop
+         Junk := Parser.Tree.Add_Terminal (Token_Index, Parser.Terminals);
+         --  FIXME: move this into Lex_All, delete Terminals, just use 
Syntax_Tree
+      end loop;
+
+      Result := Apply_Rule (Parser, Parser.Start_ID, 
Parser.Terminals.First_Index - 1);
+
+      if Result.State /= Success then
+         if Trace_Parse > Outline then
+            Parser.Trace.Put_Line ("parse failed");
+         end if;
+
+         raise Syntax_Error with "parse failed"; --  FIXME: need better error 
message!
+      else
+         Parser.Tree.Set_Root (Result.Result);
+      end if;
+   end Parse;
+
+   overriding function Tree (Parser : in Procedural.Parser) return 
Syntax_Trees.Tree
+   is begin
+      return Parser.Tree;
+   end Tree;
+
+end WisiToken.Parse.Packrat.Procedural;
diff --git a/packages/wisi/wisitoken-parse-packrat-procedural.ads 
b/packages/wisi/wisitoken-parse-packrat-procedural.ads
index 76c1aee..107fead 100644
--- a/packages/wisi/wisitoken-parse-packrat-procedural.ads
+++ b/packages/wisi/wisitoken-parse-packrat-procedural.ads
@@ -1,83 +1,83 @@
---  Abstract :
---
---  Procedural packrat parser, supporting only direct left recursion.
---
---  Coding style, algorithm is the same as generated by
---  wisi-generate_packrat, but in procedural form.
---
---  References:
---
---  See parent.
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Productions;
-package WisiToken.Parse.Packrat.Procedural is
-
-   --  These types duplicate Packrat.Generated. We keep them separate so
-   --  we can experiment with ways of implementing indirect left
-   --  recursion.
-
-   type Memo_State is (No_Result, Failure, Success);
-   subtype Result_States is Memo_State range Failure .. Success;
-
-   type Memo_Entry (State : Memo_State := No_Result) is record
-      case State is
-      when No_Result =>
-         null;
-
-      when Failure =>
-         null;
-
-      when Success =>
-         Result   : WisiToken.Syntax_Trees.Valid_Node_Index;
-         Last_Pos : Base_Token_Index;
-
-      end case;
-   end record;
-
-   package Memos is new SAL.Gen_Unbounded_Definite_Vectors
-     (Token_Index, Memo_Entry, Default_Element => (others => <>));
-   type Derivs is array (Token_ID range <>) of Memos.Vector;
-
-   type Parser (First_Nonterminal, Last_Nonterminal : Token_ID) is new 
Packrat.Parser with
-   record
-      Grammar               : WisiToken.Productions.Prod_Arrays.Vector;
-      Start_ID              : Token_ID;
-      Direct_Left_Recursive : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
-      Derivs                : Procedural.Derivs (First_Nonterminal .. 
Last_Nonterminal);
-   end record;
-
-   function Create
-     (Grammar               : in     WisiToken.Productions.Prod_Arrays.Vector;
-      Direct_Left_Recursive : in     Token_ID_Set;
-      Start_ID              : in     Token_ID;
-      Trace                 : access WisiToken.Trace'Class;
-      Lexer                 :        WisiToken.Lexer.Handle;
-      User_Data             :        WisiToken.Syntax_Trees.User_Data_Access)
-     return Procedural.Parser;
-
-   overriding procedure Parse (Parser : aliased in out Procedural.Parser);
-   overriding function Tree (Parser : in Procedural.Parser) return 
Syntax_Trees.Tree;
-
-   overriding function Any_Errors (Parser : in Procedural.Parser) return 
Boolean
-     is (False);
-   --  All errors are reported by Parse raising Syntax_Error.
-
-   overriding procedure Put_Errors (Parser : in Procedural.Parser)
-   is null;
-
-end WisiToken.Parse.Packrat.Procedural;
+--  Abstract :
+--
+--  Procedural packrat parser, supporting only direct left recursion.
+--
+--  Coding style, algorithm is the same as generated by
+--  wisi-generate_packrat, but in procedural form.
+--
+--  References:
+--
+--  See parent.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with WisiToken.Productions;
+package WisiToken.Parse.Packrat.Procedural is
+
+   --  These types duplicate Packrat.Generated. We keep them separate so
+   --  we can experiment with ways of implementing indirect left
+   --  recursion.
+
+   type Memo_State is (No_Result, Failure, Success);
+   subtype Result_States is Memo_State range Failure .. Success;
+
+   type Memo_Entry (State : Memo_State := No_Result) is record
+      case State is
+      when No_Result =>
+         null;
+
+      when Failure =>
+         null;
+
+      when Success =>
+         Result   : WisiToken.Syntax_Trees.Valid_Node_Index;
+         Last_Pos : Base_Token_Index;
+
+      end case;
+   end record;
+
+   package Memos is new SAL.Gen_Unbounded_Definite_Vectors
+     (Token_Index, Memo_Entry, Default_Element => (others => <>));
+   type Derivs is array (Token_ID range <>) of Memos.Vector;
+
+   type Parser (First_Nonterminal, Last_Nonterminal : Token_ID) is new 
Packrat.Parser with
+   record
+      Grammar               : WisiToken.Productions.Prod_Arrays.Vector;
+      Start_ID              : Token_ID;
+      Direct_Left_Recursive : Token_ID_Set (First_Nonterminal .. 
Last_Nonterminal);
+      Derivs                : Procedural.Derivs (First_Nonterminal .. 
Last_Nonterminal);
+   end record;
+
+   function Create
+     (Grammar               : in     WisiToken.Productions.Prod_Arrays.Vector;
+      Direct_Left_Recursive : in     Token_ID_Set;
+      Start_ID              : in     Token_ID;
+      Trace                 : access WisiToken.Trace'Class;
+      Lexer                 :        WisiToken.Lexer.Handle;
+      User_Data             :        WisiToken.Syntax_Trees.User_Data_Access)
+     return Procedural.Parser;
+
+   overriding procedure Parse (Parser : aliased in out Procedural.Parser);
+   overriding function Tree (Parser : in Procedural.Parser) return 
Syntax_Trees.Tree;
+
+   overriding function Any_Errors (Parser : in Procedural.Parser) return 
Boolean
+     is (False);
+   --  All errors are reported by Parse raising Syntax_Error.
+
+   overriding procedure Put_Errors (Parser : in Procedural.Parser)
+   is null;
+
+end WisiToken.Parse.Packrat.Procedural;
diff --git a/packages/wisi/wisitoken-parse_table-mode.el 
b/packages/wisi/wisitoken-parse_table-mode.el
index 5cce27a..13a727c 100644
--- a/packages/wisi/wisitoken-parse_table-mode.el
+++ b/packages/wisi/wisitoken-parse_table-mode.el
@@ -47,7 +47,8 @@
     (cond
      ((save-excursion
        (end-of-line)
-       (or (looking-back "goto state \\([0-9]+\\),?" (line-beginning-position))
+       ;; "go to" for bison output
+       (or (looking-back "go ?to state \\([0-9]+\\),?" 
(line-beginning-position))
            (looking-back "( \\([0-9]+\\))" (line-beginning-position))))
       (match-string 1))
 
diff --git a/packages/wisi/wisitoken-semantic_checks.adb 
b/packages/wisi/wisitoken-semantic_checks.adb
index 26dcb49..d69ac77 100644
--- a/packages/wisi/wisitoken-semantic_checks.adb
+++ b/packages/wisi/wisitoken-semantic_checks.adb
@@ -1,152 +1,152 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Characters.Handling;
-package body WisiToken.Semantic_Checks is
-
-   function Image (Item : in Check_Status; Descriptor : in 
WisiToken.Descriptor) return String
-   is begin
-      case Item.Label is
-      when Ok =>
-         return Check_Status_Label'Image (Item.Label);
-      when Error =>
-         return '(' & Check_Status_Label'Image (Item.Label) & ", " &
-           Image (Item.Begin_Name, Descriptor) & ',' &
-           Image (Item.End_Name, Descriptor) & ')';
-      end case;
-   end Image;
-
-   function Match_Names
-     (Lexer        : access constant WisiToken.Lexer.Instance'Class;
-      Descriptor   : in     WisiToken.Descriptor;
-      Tokens       : in     Recover_Token_Array;
-      Start_Index  : in     Positive_Index_Type;
-      End_Index    : in     Positive_Index_Type;
-      End_Optional : in     Boolean)
-     return Check_Status
-   is
-      Start_Name_Region : constant Buffer_Region :=
-        (if Tokens (Start_Index).Name = Null_Buffer_Region
-         then Tokens (Start_Index).Byte_Region
-         else Tokens (Start_Index).Name);
-      End_Name_Region : constant Buffer_Region :=
-        (if Tokens (End_Index).Name = Null_Buffer_Region
-         then Tokens (End_Index).Byte_Region
-         else Tokens (End_Index).Name);
-
-      function Equal return Boolean
-      is
-         use Ada.Characters.Handling;
-      begin
-         if Descriptor.Case_Insensitive then
-            return To_Lower (Lexer.Buffer_Text (Start_Name_Region)) =
-              To_Lower (Lexer.Buffer_Text (End_Name_Region));
-         else
-            return Lexer.Buffer_Text (Start_Name_Region) = Lexer.Buffer_Text 
(End_Name_Region);
-         end if;
-      end Equal;
-
-   begin
-      if Tokens (Start_Index).Virtual or Tokens (End_Index).Virtual then
-         return (Label => Ok);
-
-      elsif End_Optional then
-         if End_Name_Region = Null_Buffer_Region then
-            return (Label => Ok);
-         elsif Start_Name_Region = Null_Buffer_Region then
-            return (Extra_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
-         else
-            if Equal then
-               return (Label => Ok);
-            else
-               return (Match_Names_Error, Tokens (Start_Index), Tokens 
(End_Index));
-            end if;
-         end if;
-
-      else
-         if Start_Name_Region = Null_Buffer_Region then
-            if End_Name_Region = Null_Buffer_Region then
-               return (Label => Ok);
-            else
-               return (Extra_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
-            end if;
-
-         elsif End_Name_Region = Null_Buffer_Region then
-            return (Missing_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
-
-         else
-            if Equal then
-               return (Label => Ok);
-            else
-               return (Match_Names_Error, Tokens (Start_Index), Tokens 
(End_Index));
-            end if;
-         end if;
-      end if;
-   end Match_Names;
-
-   function Propagate_Name
-     (Nonterm    : in out Recover_Token;
-      Tokens     : in     Recover_Token_Array;
-      Name_Index : in     Positive_Index_Type)
-     return Check_Status
-   is begin
-      if Tokens (Name_Index).Name = Null_Buffer_Region then
-         Nonterm.Name := Tokens (Name_Index).Byte_Region;
-      else
-         Nonterm.Name := Tokens (Name_Index).Name;
-      end if;
-      return (Label => Ok);
-   end Propagate_Name;
-
-   function Merge_Names
-     (Nonterm     : in out Recover_Token;
-      Tokens      : in     Recover_Token_Array;
-      First_Index : in     Positive_Index_Type;
-      Last_Index  : in     Positive_Index_Type)
-     return Check_Status
-   is
-      First_Name : Buffer_Region renames Tokens (First_Index).Name;
-      Last_Name  : Buffer_Region renames Tokens (Last_Index).Name;
-   begin
-      Nonterm.Name :=
-        First_Name and
-          (if Last_Name = Null_Buffer_Region
-           then Tokens (Last_Index).Byte_Region
-           else Last_Name);
-      return (Label => Ok);
-   end Merge_Names;
-
-   function Terminate_Partial_Parse
-     (Partial_Parse_Active    : in Boolean;
-      Partial_Parse_Byte_Goal : in Buffer_Pos;
-      Recover_Active          : in Boolean;
-      Nonterm                 : in Recover_Token)
-     return Check_Status
-   is begin
-      if Partial_Parse_Active and then
-        (not Recover_Active) and then
-        Nonterm.Byte_Region.Last >= Partial_Parse_Byte_Goal
-      then
-         raise WisiToken.Partial_Parse;
-      else
-         return (Label => Ok);
-      end if;
-   end Terminate_Partial_Parse;
-
-end WisiToken.Semantic_Checks;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Characters.Handling;
+package body WisiToken.Semantic_Checks is
+
+   function Image (Item : in Check_Status; Descriptor : in 
WisiToken.Descriptor) return String
+   is begin
+      case Item.Label is
+      when Ok =>
+         return Check_Status_Label'Image (Item.Label);
+      when Error =>
+         return '(' & Check_Status_Label'Image (Item.Label) & ", " &
+           Image (Item.Begin_Name, Descriptor) & ',' &
+           Image (Item.End_Name, Descriptor) & ')';
+      end case;
+   end Image;
+
+   function Match_Names
+     (Lexer        : access constant WisiToken.Lexer.Instance'Class;
+      Descriptor   : in     WisiToken.Descriptor;
+      Tokens       : in     Recover_Token_Array;
+      Start_Index  : in     Positive_Index_Type;
+      End_Index    : in     Positive_Index_Type;
+      End_Optional : in     Boolean)
+     return Check_Status
+   is
+      Start_Name_Region : constant Buffer_Region :=
+        (if Tokens (Start_Index).Name = Null_Buffer_Region
+         then Tokens (Start_Index).Byte_Region
+         else Tokens (Start_Index).Name);
+      End_Name_Region : constant Buffer_Region :=
+        (if Tokens (End_Index).Name = Null_Buffer_Region
+         then Tokens (End_Index).Byte_Region
+         else Tokens (End_Index).Name);
+
+      function Equal return Boolean
+      is
+         use Ada.Characters.Handling;
+      begin
+         if Descriptor.Case_Insensitive then
+            return To_Lower (Lexer.Buffer_Text (Start_Name_Region)) =
+              To_Lower (Lexer.Buffer_Text (End_Name_Region));
+         else
+            return Lexer.Buffer_Text (Start_Name_Region) = Lexer.Buffer_Text 
(End_Name_Region);
+         end if;
+      end Equal;
+
+   begin
+      if Tokens (Start_Index).Virtual or Tokens (End_Index).Virtual then
+         return (Label => Ok);
+
+      elsif End_Optional then
+         if End_Name_Region = Null_Buffer_Region then
+            return (Label => Ok);
+         elsif Start_Name_Region = Null_Buffer_Region then
+            return (Extra_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
+         else
+            if Equal then
+               return (Label => Ok);
+            else
+               return (Match_Names_Error, Tokens (Start_Index), Tokens 
(End_Index));
+            end if;
+         end if;
+
+      else
+         if Start_Name_Region = Null_Buffer_Region then
+            if End_Name_Region = Null_Buffer_Region then
+               return (Label => Ok);
+            else
+               return (Extra_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
+            end if;
+
+         elsif End_Name_Region = Null_Buffer_Region then
+            return (Missing_Name_Error, Tokens (Start_Index), Tokens 
(End_Index));
+
+         else
+            if Equal then
+               return (Label => Ok);
+            else
+               return (Match_Names_Error, Tokens (Start_Index), Tokens 
(End_Index));
+            end if;
+         end if;
+      end if;
+   end Match_Names;
+
+   function Propagate_Name
+     (Nonterm    : in out Recover_Token;
+      Tokens     : in     Recover_Token_Array;
+      Name_Index : in     Positive_Index_Type)
+     return Check_Status
+   is begin
+      if Tokens (Name_Index).Name = Null_Buffer_Region then
+         Nonterm.Name := Tokens (Name_Index).Byte_Region;
+      else
+         Nonterm.Name := Tokens (Name_Index).Name;
+      end if;
+      return (Label => Ok);
+   end Propagate_Name;
+
+   function Merge_Names
+     (Nonterm     : in out Recover_Token;
+      Tokens      : in     Recover_Token_Array;
+      First_Index : in     Positive_Index_Type;
+      Last_Index  : in     Positive_Index_Type)
+     return Check_Status
+   is
+      First_Name : Buffer_Region renames Tokens (First_Index).Name;
+      Last_Name  : Buffer_Region renames Tokens (Last_Index).Name;
+   begin
+      Nonterm.Name :=
+        First_Name and
+          (if Last_Name = Null_Buffer_Region
+           then Tokens (Last_Index).Byte_Region
+           else Last_Name);
+      return (Label => Ok);
+   end Merge_Names;
+
+   function Terminate_Partial_Parse
+     (Partial_Parse_Active    : in Boolean;
+      Partial_Parse_Byte_Goal : in Buffer_Pos;
+      Recover_Active          : in Boolean;
+      Nonterm                 : in Recover_Token)
+     return Check_Status
+   is begin
+      if Partial_Parse_Active and then
+        (not Recover_Active) and then
+        Nonterm.Byte_Region.Last >= Partial_Parse_Byte_Goal
+      then
+         raise WisiToken.Partial_Parse;
+      else
+         return (Label => Ok);
+      end if;
+   end Terminate_Partial_Parse;
+
+end WisiToken.Semantic_Checks;
diff --git a/packages/wisi/wisitoken-semantic_checks.ads 
b/packages/wisi/wisitoken-semantic_checks.ads
index acb0ce8..09517e1 100644
--- a/packages/wisi/wisitoken-semantic_checks.ads
+++ b/packages/wisi/wisitoken-semantic_checks.ads
@@ -1,99 +1,105 @@
---  Abstract :
---
---  Grammar semantic check routines.
---
---  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with WisiToken.Lexer;
-package WisiToken.Semantic_Checks is
-
-   type Check_Status_Label is
-     (Ok,
-      Missing_Name_Error, -- block start has name, required block end name 
missing
-      Extra_Name_Error,   -- block start has no name, end has one
-      Match_Names_Error); -- both names present, but don't match
-
-   subtype Error is Check_Status_Label range Check_Status_Label'Succ (Ok) .. 
Check_Status_Label'Last;
-
-   type Check_Status (Label : Check_Status_Label := Ok) is record
-      case Label is
-      when Ok =>
-         null;
-
-      when Error =>
-         Begin_Name : Recover_Token;
-         End_Name   : Recover_Token;
-      end case;
-   end record;
-
-   subtype Error_Check_Status is Check_Status
-   with Dynamic_Predicate => Error_Check_Status.Label /= Ok;
-
-   function Image (Item : in Check_Status; Descriptor : WisiToken.Descriptor) 
return String;
-
-   type Semantic_Check is access function
-     (Lexer          : access constant WisiToken.Lexer.Instance'Class;
-      Nonterm        : in out Recover_Token;
-      Tokens         : in     Recover_Token_Array;
-      Recover_Active : in     Boolean)
-     return Check_Status;
-   --  Called during parsing and error recovery to implement higher level
-   --  checks, such as block name matching in Ada.
-
-   Null_Check : constant Semantic_Check := null;
-
-   function Match_Names
-     (Lexer        : access constant WisiToken.Lexer.Instance'Class;
-      Descriptor   : in     WisiToken.Descriptor;
-      Tokens       : in     Recover_Token_Array;
-      Start_Index  : in     Positive_Index_Type;
-      End_Index    : in     Positive_Index_Type;
-      End_Optional : in     Boolean)
-     return Check_Status;
-   --  Check that buffer text at Tokens (Start_Index).Name matches buffer
-   --  text at Tokens (End_Index).Name. Comparison is controlled by
-   --  Descriptor.Case_Insensitive.
-
-   function Propagate_Name
-     (Nonterm    : in out Recover_Token;
-      Tokens     : in     Recover_Token_Array;
-      Name_Index : in     Positive_Index_Type)
-     return Check_Status;
-   --  Set Nonterm.Name to Tokens (Name_Index).Name, or .Byte_Region, if
-   --  .Name is Null_Buffer_Region. Return Ok.
-
-   function Merge_Names
-     (Nonterm     : in out Recover_Token;
-      Tokens      : in     Recover_Token_Array;
-      First_Index : in     Positive_Index_Type;
-      Last_Index  : in     Positive_Index_Type)
-     return Check_Status;
-   --  Then set Nonterm.Name to the merger of Tokens (First_Index ..
-   --  Last_Index).Name, return Ok.
-   --
-   --  If Tokens (Last_Index).Name is Null_Buffer_Region, use Tokens
-   --  (Last_Index).Byte_Region instead.
-
-   function Terminate_Partial_Parse
-     (Partial_Parse_Active    : in Boolean;
-      Partial_Parse_Byte_Goal : in Buffer_Pos;
-      Recover_Active          : in Boolean;
-      Nonterm                 : in Recover_Token)
-     return Check_Status;
-   pragma Inline (Terminate_Partial_Parse);
-   --  If Active, raise Wisitoken.Partial_Parse; otherwise return Ok.
-
-end WisiToken.Semantic_Checks;
+--  Abstract :
+--
+--  Grammar semantic check routines.
+--
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with WisiToken.Lexer;
+package WisiToken.Semantic_Checks is
+
+   type Check_Status_Label is
+     (Ok,
+      Missing_Name_Error, -- block start has name, required block end name 
missing
+      Extra_Name_Error,   -- block start has no name, end has one
+      Match_Names_Error); -- both names present, but don't match
+
+   subtype Error is Check_Status_Label range Check_Status_Label'Succ (Ok) .. 
Check_Status_Label'Last;
+
+   type Check_Status (Label : Check_Status_Label := Ok) is record
+      case Label is
+      when Ok =>
+         null;
+
+      when Error =>
+         Begin_Name : Recover_Token;
+         End_Name   : Recover_Token;
+      end case;
+   end record;
+
+   subtype Error_Check_Status is Check_Status
+   with Dynamic_Predicate => Error_Check_Status.Label /= Ok;
+
+   function Image (Item : in Check_Status; Descriptor : WisiToken.Descriptor) 
return String;
+
+   type Semantic_Check is access function
+     (Lexer          : access constant WisiToken.Lexer.Instance'Class;
+      Nonterm        : in out Recover_Token;
+      Tokens         : in     Recover_Token_Array;
+      Recover_Active : in     Boolean)
+     return Check_Status;
+   --  Called during parsing and error recovery to implement higher level
+   --  checks, such as block name matching in Ada.
+
+   Null_Check : constant Semantic_Check := null;
+
+   function Match_Names
+     (Lexer        : access constant WisiToken.Lexer.Instance'Class;
+      Descriptor   : in     WisiToken.Descriptor;
+      Tokens       : in     Recover_Token_Array;
+      Start_Index  : in     Positive_Index_Type;
+      End_Index    : in     Positive_Index_Type;
+      End_Optional : in     Boolean)
+     return Check_Status;
+   --  Check that buffer text at Tokens (Start_Index).Name matches buffer
+   --  text at Tokens (End_Index).Name. Comparison is controlled by
+   --  Descriptor.Case_Insensitive.
+
+   function Propagate_Name
+     (Nonterm    : in out Recover_Token;
+      Tokens     : in     Recover_Token_Array;
+      Name_Index : in     Positive_Index_Type)
+     return Check_Status;
+   function Merge_Names
+     (Nonterm     : in out Recover_Token;
+      Tokens      : in     Recover_Token_Array;
+      Name_Index  : in     Positive_Index_Type)
+     return Check_Status
+   renames Propagate_Name;
+   --  Set Nonterm.Name to Tokens (Name_Index).Name, or .Byte_Region, if
+   --  .Name is Null_Buffer_Region. Return Ok.
+
+   function Merge_Names
+     (Nonterm     : in out Recover_Token;
+      Tokens      : in     Recover_Token_Array;
+      First_Index : in     Positive_Index_Type;
+      Last_Index  : in     Positive_Index_Type)
+     return Check_Status;
+   --  Then set Nonterm.Name to the merger of Tokens (First_Index ..
+   --  Last_Index).Name, return Ok.
+   --
+   --  If Tokens (Last_Index).Name is Null_Buffer_Region, use Tokens
+   --  (Last_Index).Byte_Region instead.
+
+   function Terminate_Partial_Parse
+     (Partial_Parse_Active    : in Boolean;
+      Partial_Parse_Byte_Goal : in Buffer_Pos;
+      Recover_Active          : in Boolean;
+      Nonterm                 : in Recover_Token)
+     return Check_Status;
+   pragma Inline (Terminate_Partial_Parse);
+   --  If Active, raise Wisitoken.Partial_Parse; otherwise return Ok.
+
+end WisiToken.Semantic_Checks;
diff --git a/packages/wisi/wisitoken-syntax_trees.adb 
b/packages/wisi/wisitoken-syntax_trees.adb
index ac780a3..e8ac152 100644
--- a/packages/wisi/wisitoken-syntax_trees.adb
+++ b/packages/wisi/wisitoken-syntax_trees.adb
@@ -1,1195 +1,1643 @@
---  Abstract :
---
---  See spec.
---
---  Copyright (C) 2018, 2019 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Containers;
-package body WisiToken.Syntax_Trees is
-
-   --  Body specs, alphabetical, as needed
-
-   function Image
-     (Tree             : in Syntax_Trees.Tree;
-      N                : in Syntax_Trees.Node;
-      Descriptor       : in WisiToken.Descriptor;
-      Include_Children : in Boolean)
-     return String;
-
-   function Min (Item : in Valid_Node_Index_Array) return Valid_Node_Index;
-
-   procedure Move_Branch_Point (Tree : in out Syntax_Trees.Tree; Required_Node 
: in Valid_Node_Index);
-
-   type Visit_Parent_Mode is (Before, After);
-
-   function Process_Tree
-     (Tree         : in Syntax_Trees.Tree;
-      Node         : in Valid_Node_Index;
-      Visit_Parent : in Visit_Parent_Mode;
-      Process_Node : access function
-        (Tree : in Syntax_Trees.Tree;
-         Node : in Valid_Node_Index)
-        return Boolean)
-     return Boolean;
-   --  Call Process_Node on nodes in tree rooted at Node. Return when
-   --  Process_Node returns False (Process_Tree returns False), or when
-   --  all nodes have been processed (Process_Tree returns True).
-
-   procedure Set_Children
-     (Nodes    : in out Node_Arrays.Vector;
-      Parent   : in     Valid_Node_Index;
-      Children : in     Valid_Node_Index_Array);
-
-   ----------
-   --  Public and body operations, alphabetical
-
-   function Action
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return Semantic_Action
-   is begin
-      return
-        (if Node <= Tree.Last_Shared_Node
-         then Tree.Shared_Tree.Nodes (Node).Action
-         else Tree.Branched_Nodes (Node).Action);
-   end Action;
-
-   function Add_Nonterm
-     (Tree            : in out Syntax_Trees.Tree;
-      Production      : in     Production_ID;
-      Children        : in     Valid_Node_Index_Array;
-      Action          : in     Semantic_Action;
-      Default_Virtual : in     Boolean)
-     return Valid_Node_Index
-   is
-      Nonterm_Node : Valid_Node_Index;
-   begin
-      if Tree.Flush then
-         Tree.Shared_Tree.Nodes.Append
-           ((Label      => Syntax_Trees.Nonterm,
-             ID         => Production.LHS,
-             Action     => Action,
-             RHS_Index  => Production.RHS,
-             Virtual    => (if Children'Length = 0 then Default_Virtual else 
False),
-             others     => <>));
-         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
-         Nonterm_Node          := Tree.Last_Shared_Node;
-      else
-         Tree.Branched_Nodes.Append
-           ((Label     => Syntax_Trees.Nonterm,
-             ID        => Production.LHS,
-             Action    => Action,
-             RHS_Index => Production.RHS,
-             Virtual   => (if Children'Length = 0 then Default_Virtual else 
False),
-             others    => <>));
-         Nonterm_Node := Tree.Branched_Nodes.Last_Index;
-      end if;
-
-      if Children'Length = 0 then
-         return Nonterm_Node;
-      end if;
-
-      if Tree.Flush then
-         Set_Children (Tree.Shared_Tree.Nodes, Nonterm_Node, Children);
-
-      else
-         declare
-            Min_Child_Node : constant Valid_Node_Index := Min (Children);
-         begin
-            if Min_Child_Node <= Tree.Last_Shared_Node then
-               Move_Branch_Point (Tree, Min_Child_Node);
-            end if;
-         end;
-
-         Set_Children (Tree.Branched_Nodes, Nonterm_Node, Children);
-      end if;
-
-      return Nonterm_Node;
-   end Add_Nonterm;
-
-   function Add_Terminal
-     (Tree      : in out Syntax_Trees.Tree;
-      Terminal  : in     Token_Index;
-      Terminals : in     Base_Token_Arrays.Vector)
-     return Valid_Node_Index
-   is begin
-      if Tree.Flush then
-         Tree.Shared_Tree.Nodes.Append
-           ((Label       => Shared_Terminal,
-             ID          => Terminals (Terminal).ID,
-             Byte_Region => Terminals (Terminal).Byte_Region,
-             Terminal    => Terminal,
-             others      => <>));
-         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
-         return Tree.Last_Shared_Node;
-      else
-         Tree.Branched_Nodes.Append
-           ((Label       => Shared_Terminal,
-             ID          => Terminals (Terminal).ID,
-             Byte_Region => Terminals (Terminal).Byte_Region,
-             Terminal    => Terminal,
-             others      => <>));
-         return Tree.Branched_Nodes.Last_Index;
-      end if;
-   end Add_Terminal;
-
-   function Add_Terminal
-     (Tree     : in out Syntax_Trees.Tree;
-      Terminal : in     Token_ID)
-     return Valid_Node_Index
-   is begin
-      if Tree.Flush then
-         Tree.Shared_Tree.Nodes.Append
-           ((Label  => Virtual_Terminal,
-             ID     => Terminal,
-             others => <>));
-         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
-         return Tree.Last_Shared_Node;
-      else
-         Tree.Branched_Nodes.Append
-           ((Label  => Virtual_Terminal,
-             ID     => Terminal,
-             others => <>));
-         return Tree.Branched_Nodes.Last_Index;
-      end if;
-   end Add_Terminal;
-
-   overriding procedure Adjust (Tree : in out Base_Tree)
-   is begin
-      if Tree.Augmented_Present then
-         --  Augmented is only set after parsing is complete; trees are never 
copied then.
-         raise SAL.Not_Implemented;
-      end if;
-   end Adjust;
-
-   function Augmented
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return Base_Token_Class_Access
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Augmented;
-      else
-         return Tree.Branched_Nodes (Node).Augmented;
-      end if;
-   end Augmented;
-
-   function Byte_Region
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return WisiToken.Buffer_Region
-   is begin
-      return
-        (if Node <= Tree.Last_Shared_Node
-         then Tree.Shared_Tree.Nodes (Node).Byte_Region
-         else Tree.Branched_Nodes (Node).Byte_Region);
-   end Byte_Region;
-
-   function Children (N : in Syntax_Trees.Node) return Valid_Node_Index_Array
-   is
-      use all type Ada.Containers.Count_Type;
-   begin
-      if N.Children.Length = 0 then
-         return (1 .. 0 => <>);
-      else
-         return Result : Valid_Node_Index_Array (N.Children.First_Index .. 
N.Children.Last_Index) do
-            for I in Result'Range loop
-               Result (I) := N.Children (I);
-            end loop;
-         end return;
-      end if;
-   end Children;
-
-   function Children (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Valid_Node_Index_Array
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Children (Tree.Shared_Tree.Nodes (Node));
-      else
-         return Children (Tree.Branched_Nodes (Node));
-      end if;
-   end Children;
-
-   procedure Clear (Tree : in out Syntax_Trees.Base_Tree)
-   is begin
-      Tree.Finalize;
-   end Clear;
-
-   procedure Clear (Tree : in out Syntax_Trees.Tree)
-   is begin
-      if Tree.Shared_Tree.Augmented_Present then
-         for Node of Tree.Branched_Nodes loop
-            if Node.Label = Nonterm then
-               Free (Node.Augmented);
-            end if;
-         end loop;
-      end if;
-      Tree.Shared_Tree.Finalize;
-      Tree.Last_Shared_Node := Invalid_Node_Index;
-      Tree.Branched_Nodes.Clear;
-   end Clear;
-
-   function Count_Terminals
-     (Tree   : in     Syntax_Trees.Tree;
-      Node   : in     Valid_Node_Index)
-     return Natural
-   is
-      function Compute (N : in Syntax_Trees.Node) return Natural
-      is begin
-         case N.Label is
-         when Shared_Terminal | Virtual_Terminal =>
-            return 1;
-
-         when Nonterm =>
-            return Result : Natural := 0 do
-               for I of N.Children loop
-                  Result := Result + Count_Terminals (Tree, I);
-               end loop;
-            end return;
-         end case;
-      end Compute;
-   begin
-      return Compute
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)));
-   end Count_Terminals;
-
-   overriding procedure Finalize (Tree : in out Base_Tree)
-   is begin
-      Tree.Traversing := False;
-      if Tree.Augmented_Present then
-         for Node of Tree.Nodes loop
-            if Node.Label = Nonterm then
-               Free (Node.Augmented);
-            end if;
-         end loop;
-         Tree.Augmented_Present := False;
-      end if;
-      Tree.Nodes.Finalize;
-   end Finalize;
-
-   function Find_Ancestor
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   is
-      N : Node_Index := Node;
-   begin
-      loop
-         N :=
-           (if N <= Tree.Last_Shared_Node
-            then Tree.Shared_Tree.Nodes (N).Parent
-            else Tree.Branched_Nodes (N).Parent);
-
-         exit when N = Invalid_Node_Index;
-         exit when ID =
-           (if N <= Tree.Last_Shared_Node
-            then Tree.Shared_Tree.Nodes (N).ID
-            else Tree.Branched_Nodes (N).ID);
-      end loop;
-      return N;
-   end Find_Ancestor;
-
-   function Find_Child
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   is
-      function Compute (N : in Syntax_Trees.Node) return Node_Index
-      is begin
-         case N.Label is
-         when Shared_Terminal | Virtual_Terminal =>
-            return Invalid_Node_Index;
-         when Nonterm =>
-            for C of N.Children loop
-               if ID =
-                 (if C <= Tree.Last_Shared_Node
-                  then Tree.Shared_Tree.Nodes (C).ID
-                  else Tree.Branched_Nodes (C).ID)
-               then
-                  return C;
-               end if;
-            end loop;
-            return Invalid_Node_Index;
-         end case;
-      end Compute;
-   begin
-      return Compute
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)));
-   end Find_Child;
-
-   function Find_Descendant
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   is
-      Found : Node_Index := Invalid_Node_Index;
-
-      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-      is
-         Node_ID : constant Token_ID :=
-           (if Node <= Tree.Last_Shared_Node
-            then Tree.Shared_Tree.Nodes (Node).ID
-            else Tree.Branched_Nodes (Node).ID);
-      begin
-         if Node_ID = ID then
-            Found := Node;
-            return False;
-         else
-            return True;
-         end if;
-      end Process;
-
-      Junk : constant Boolean := Process_Tree (Tree, Node, After, 
Process'Access);
-      pragma Unreferenced (Junk);
-   begin
-      return Found;
-   end Find_Descendant;
-
-   function Find_Min_Terminal_Index
-     (Tree  : in Syntax_Trees.Tree;
-      Index : in Token_Index)
-     return Node_Index
-   is
-      Found : Node_Index := Invalid_Node_Index;
-
-      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-      is
-         function Compute (N : in Syntax_Trees.Node) return Boolean
-         is begin
-            if N.Label /= Nonterm then
-               return True;
-            elsif Index = N.Min_Terminal_Index then
-               Found := Node;
-               return False;
-            else
-               return True;
-            end if;
-         end Compute;
-      begin
-         return Compute
-           ((if Node <= Tree.Last_Shared_Node
-             then Tree.Shared_Tree.Nodes (Node)
-             else Tree.Branched_Nodes (Node)));
-      end Process;
-
-      Junk : constant Boolean := Process_Tree (Tree, Tree.Root, Before, 
Process'Access);
-      pragma Unreferenced (Junk);
-   begin
-      return Found;
-   end Find_Min_Terminal_Index;
-
-   function Find_Max_Terminal_Index
-     (Tree  : in Syntax_Trees.Tree;
-      Index : in Token_Index)
-     return Node_Index
-   is
-      Found : Node_Index := Invalid_Node_Index;
-
-      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-      is
-         function Compute (N : in Syntax_Trees.Node) return Boolean
-         is begin
-            if N.Label /= Nonterm then
-               return True;
-            elsif Index = N.Max_Terminal_Index then
-               Found := Node;
-               return False;
-            else
-               return True;
-            end if;
-         end Compute;
-      begin
-         return Compute
-           ((if Node <= Tree.Last_Shared_Node
-             then Tree.Shared_Tree.Nodes (Node)
-             else Tree.Branched_Nodes (Node)));
-      end Process;
-
-      Junk : constant Boolean := Process_Tree (Tree, Tree.Root, Before, 
Process'Access);
-      pragma Unreferenced (Junk);
-   begin
-      return Found;
-   end Find_Max_Terminal_Index;
-
-   function Find_Sibling
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   is
-      function Compute_2 (N : in Syntax_Trees.Node) return Node_Index
-      is begin
-         case N.Label is
-         when Shared_Terminal | Virtual_Terminal =>
-            return Invalid_Node_Index;
-
-         when Nonterm =>
-            for C of N.Children loop
-               if ID =
-                 (if C <= Tree.Last_Shared_Node
-                  then Tree.Shared_Tree.Nodes (C).ID
-                  else Tree.Branched_Nodes (C).ID)
-               then
-                  return C;
-               end if;
-            end loop;
-            return Invalid_Node_Index;
-         end case;
-      end Compute_2;
-
-      function Compute_1 (Parent : in Node_Index) return Node_Index
-      is begin
-         if Parent = Invalid_Node_Index then
-            return Invalid_Node_Index;
-
-         else
-            return Compute_2
-              ((if Parent <= Tree.Last_Shared_Node
-                then Tree.Shared_Tree.Nodes (Parent)
-                else Tree.Branched_Nodes (Parent)));
-         end if;
-      end Compute_1;
-   begin
-      return Compute_1
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node).Parent
-          else Tree.Branched_Nodes (Node).Parent));
-   end Find_Sibling;
-
-   procedure Flush (Tree : in out Syntax_Trees.Tree)
-   is begin
-      --  This is the opposite of Move_Branch_Point
-      Tree.Shared_Tree.Nodes.Merge (Tree.Branched_Nodes);
-      Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
-      Tree.Flush            := True;
-   end Flush;
-
-   procedure Get_Terminals
-     (Tree   : in     Syntax_Trees.Tree;
-      Node   : in     Valid_Node_Index;
-      Result : in out Valid_Node_Index_Array;
-      Last   : in out SAL.Base_Peek_Type)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      procedure Compute (N : in Syntax_Trees.Node)
-      is begin
-         case N.Label is
-         when Shared_Terminal | Virtual_Terminal =>
-            Last := Last + 1;
-            Result (Last) := Node;
-
-         when Nonterm =>
-            for I of N.Children loop
-               Get_Terminals (Tree, I, Result, Last);
-            end loop;
-         end case;
-      end Compute;
-   begin
-      Compute
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)));
-   end Get_Terminals;
-
-   procedure Get_Terminal_IDs
-     (Tree   : in     Syntax_Trees.Tree;
-      Node   : in     Valid_Node_Index;
-      Result : in out Token_ID_Array;
-      Last   : in out Natural)
-   is
-      procedure Compute (N : in Syntax_Trees.Node)
-      is begin
-         case N.Label is
-         when Shared_Terminal | Virtual_Terminal =>
-            Last := Last + 1;
-            Result (Last) := N.ID;
-
-         when Nonterm =>
-            for I of N.Children loop
-               Get_Terminal_IDs (Tree, I, Result, Last);
-            end loop;
-         end case;
-      end Compute;
-   begin
-      Compute
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)));
-   end Get_Terminal_IDs;
-
-   function Get_Terminals (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Valid_Node_Index_Array
-   is
-      Last : SAL.Base_Peek_Type := 0;
-   begin
-      Tree.Shared_Tree.Traversing := True;
-      return Result : Valid_Node_Index_Array (1 .. SAL.Base_Peek_Type 
(Count_Terminals (Tree, Node)))  do
-         Get_Terminals (Tree, Node, Result, Last);
-         Tree.Shared_Tree.Traversing := False;
-      end return;
-   end Get_Terminals;
-
-   function Get_Terminal_IDs (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID_Array
-   is
-      Last : Natural := 0;
-   begin
-      Tree.Shared_Tree.Traversing := True;
-      return Result : Token_ID_Array (1 .. Count_Terminals (Tree, Node))  do
-         Get_Terminal_IDs (Tree, Node, Result, Last);
-         Tree.Shared_Tree.Traversing := False;
-      end return;
-   end Get_Terminal_IDs;
-
-   function Has_Branched_Nodes (Tree : in Syntax_Trees.Tree) return Boolean
-   is
-      use all type Ada.Containers.Count_Type;
-   begin
-      return Tree.Branched_Nodes.Length > 0;
-   end Has_Branched_Nodes;
-
-   function Has_Children (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-   is
-      use all type Ada.Containers.Count_Type;
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Children.Length > 0;
-      else
-         return Tree.Branched_Nodes (Node).Children.Length > 0;
-      end if;
-   end Has_Children;
-
-   function Has_Parent (Tree : in Syntax_Trees.Tree; Child : in 
Valid_Node_Index) return Boolean
-   is begin
-      return
-        (if Child <= Tree.Last_Shared_Node
-         then Tree.Shared_Tree.Nodes (Child).Parent /= Invalid_Node_Index
-         else Tree.Branched_Nodes (Child).Parent /= Invalid_Node_Index);
-   end Has_Parent;
-
-   function Has_Parent (Tree : in Syntax_Trees.Tree; Children : in 
Valid_Node_Index_Array) return Boolean
-   is begin
-      return
-        (for some Child of Children =>
-           (if Child <= Tree.Last_Shared_Node
-            then Tree.Shared_Tree.Nodes (Child).Parent /= Invalid_Node_Index
-            else Tree.Branched_Nodes (Child).Parent /= Invalid_Node_Index));
-   end Has_Parent;
-
-   function ID
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return Token_ID
-   is begin
-      return
-        (if Node <= Tree.Last_Shared_Node
-         then Tree.Shared_Tree.Nodes (Node).ID
-         else Tree.Branched_Nodes (Node).ID);
-   end ID;
-
-   function Image
-     (Tree       : in Syntax_Trees.Tree;
-      Children   : in Valid_Node_Index_Arrays.Vector;
-      Descriptor : in WisiToken.Descriptor)
-     return String
-   is
-      use Ada.Strings.Unbounded;
-      Result     : Unbounded_String := +"(";
-      Need_Comma : Boolean := False;
-   begin
-      for I of Children loop
-         Result := Result & (if Need_Comma then ", " else "") &
-           Tree.Image (I, Descriptor, Include_Children => False);
-         Need_Comma := True;
-      end loop;
-      Result := Result & ")";
-      return -Result;
-   end Image;
-
-   function Image
-     (Tree             : in Syntax_Trees.Tree;
-      N                : in Syntax_Trees.Node;
-      Descriptor       : in WisiToken.Descriptor;
-      Include_Children : in Boolean)
-     return String
-   is
-      use Ada.Strings.Unbounded;
-      Result : Unbounded_String;
-   begin
-      if Include_Children and N.Label = Nonterm then
-         Result := +Image (N.ID, Descriptor) & '_' & Trimmed_Image 
(N.RHS_Index) & ": ";
-      end if;
-
-      if N.Label = Shared_Terminal then
-         Result := Result & (+Token_Index'Image (N.Terminal)) & ":";
-      end if;
-
-      Result := Result & "(" & Image (N.ID, Descriptor) &
-        (if N.Byte_Region = Null_Buffer_Region then "" else ", " & Image 
(N.Byte_Region)) & ")";
-
-      if Include_Children and N.Label = Nonterm then
-         Result := Result & " <= " & Image (Tree, N.Children, Descriptor);
-      end if;
-
-      return -Result;
-   end Image;
-
-   function Image
-     (Tree             : in Syntax_Trees.Tree;
-      Node             : in Valid_Node_Index;
-      Descriptor       : in WisiToken.Descriptor;
-      Include_Children : in Boolean := False)
-     return String
-   is begin
-      return Tree.Image
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)),
-         Descriptor, Include_Children);
-   end Image;
-
-   function Image
-     (Tree       : in Syntax_Trees.Tree;
-      Nodes      : in Valid_Node_Index_Array;
-      Descriptor : in WisiToken.Descriptor)
-     return String
-   is
-      use Ada.Strings.Unbounded;
-      Result     : Unbounded_String := +"(";
-      Need_Comma : Boolean := False;
-   begin
-      for I in Nodes'Range loop
-         Result := Result & (if Need_Comma then ", " else "") &
-           Tree.Image (Nodes (I), Descriptor, Include_Children => False);
-         Need_Comma := True;
-      end loop;
-      Result := Result & ")";
-      return -Result;
-   end Image;
-
-   procedure Initialize
-     (Branched_Tree : in out Syntax_Trees.Tree;
-      Shared_Tree   : in     Base_Tree_Access;
-      Flush         : in     Boolean)
-   is begin
-      Branched_Tree :=
-        (Shared_Tree      => Shared_Tree,
-         Last_Shared_Node => Shared_Tree.Nodes.Last_Index,
-         Branched_Nodes   => <>,
-         Flush            => Flush,
-         Root             => <>);
-   end Initialize;
-
-   function Is_Empty (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Boolean
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Byte_Region = Null_Buffer_Region;
-      else
-         return Tree.Branched_Nodes (Node).Byte_Region = Null_Buffer_Region;
-      end if;
-   end Is_Empty;
-
-   function Is_Nonterm (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Label = Nonterm;
-      else
-         return Tree.Branched_Nodes (Node).Label = Nonterm;
-      end if;
-   end Is_Nonterm;
-
-   function Is_Terminal (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Label = Shared_Terminal;
-      else
-         return Tree.Branched_Nodes (Node).Label = Shared_Terminal;
-      end if;
-   end Is_Terminal;
-
-   function Is_Virtual (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
-   is
-      function Compute (N : in Syntax_Trees.Node) return Boolean
-      is begin
-         return N.Label = Virtual_Terminal or (N.Label = Nonterm and then 
N.Virtual);
-      end Compute;
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         return Compute (Tree.Shared_Tree.Nodes (Node));
-      else
-         return Compute (Tree.Branched_Nodes (Node));
-      end if;
-   end Is_Virtual;
-
-   function Label (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Label
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Label;
-      else
-         return Tree.Branched_Nodes (Node).Label;
-      end if;
-   end Label;
-
-   function Min (Item : in Valid_Node_Index_Array) return Valid_Node_Index
-   is
-      Result : Node_Index := Item (Item'First);
-   begin
-      for I in Item'Range loop
-         if Item (I) < Result then
-            Result := Item (I);
-         end if;
-      end loop;
-      return Result;
-   end Min;
-
-   function Min_Descendant (Nodes : in Node_Arrays.Vector; Node : in 
Valid_Node_Index) return Valid_Node_Index
-   is
-      N : Syntax_Trees.Node renames Nodes (Node);
-   begin
-      case N.Label is
-      when Shared_Terminal | Virtual_Terminal =>
-         return Node;
-
-      when Nonterm =>
-         declare
-            Min : Node_Index := Node;
-         begin
-            for C of N.Children loop
-               Min := Node_Index'Min (Min, Min_Descendant (Nodes, C));
-            end loop;
-            return Min;
-         end;
-      end case;
-   end Min_Descendant;
-
-   function Min_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index
-   is
-      function Compute (N : in Syntax_Trees.Node) return Base_Token_Index
-      is begin
-         return
-           (case N.Label is
-            when Shared_Terminal  => N.Terminal,
-            when Virtual_Terminal => Invalid_Token_Index,
-            when Nonterm          => N.Min_Terminal_Index);
-      end Compute;
-
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         return Compute (Tree.Shared_Tree.Nodes (Node));
-      else
-         return Compute (Tree.Branched_Nodes (Node));
-      end if;
-   end Min_Terminal_Index;
-
-   function Max_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index
-   is
-      function Compute (N : in Syntax_Trees.Node) return Base_Token_Index
-      is begin
-         return
-           (case N.Label is
-            when Shared_Terminal  => N.Terminal,
-            when Virtual_Terminal => Invalid_Token_Index,
-            when Nonterm          => N.Max_Terminal_Index);
-      end Compute;
-
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         return Compute (Tree.Shared_Tree.Nodes (Node));
-      else
-         return Compute (Tree.Branched_Nodes (Node));
-      end if;
-   end Max_Terminal_Index;
-
-   procedure Move_Branch_Point (Tree : in out Syntax_Trees.Tree; Required_Node 
: in Valid_Node_Index)
-   is begin
-      --  Note that this preserves all stored indices in Branched_Nodes.
-      Tree.Branched_Nodes.Prepend (Tree.Shared_Tree.Nodes, Required_Node, 
Tree.Last_Shared_Node);
-      Tree.Last_Shared_Node := Required_Node - 1;
-   end Move_Branch_Point;
-
-   function Parent (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Index
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Parent;
-      else
-         return Tree.Branched_Nodes (Node).Parent;
-      end if;
-   end Parent;
-
-   procedure Print_Tree (Tree : in Syntax_Trees.Tree; Descriptor : in 
WisiToken.Descriptor)
-   is
-      use Ada.Text_IO;
-      procedure Print_Node (Node : in Valid_Node_Index; Level : in Integer)
-      is
-         N : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Node);
-      begin
-         for I in 1 .. Level loop
-            Put ("| ");
-         end loop;
-         Put_Line (Image (Tree, N, Descriptor, Include_Children => False));
-
-         if N.Label = Nonterm then
-            for Child of N.Children loop
-               Print_Node (Child, Level + 1);
-            end loop;
-         end if;
-      end Print_Node;
-
-   begin
-      Print_Node (Tree.Root, 0);
-   end Print_Tree;
-
-   function Process_Tree
-     (Tree         : in Syntax_Trees.Tree;
-      Node         : in Valid_Node_Index;
-      Visit_Parent : in Visit_Parent_Mode;
-      Process_Node : access function
-        (Tree : in Syntax_Trees.Tree;
-         Node : in Valid_Node_Index)
-        return Boolean)
-     return Boolean
-   is
-      function Compute (N : in Syntax_Trees.Node) return Boolean
-      is begin
-         if Visit_Parent = Before then
-            if not Process_Node (Tree, Node) then
-               return False;
-            end if;
-         end if;
-
-         if N.Label = Nonterm then
-            for Child of N.Children loop
-               if not Process_Tree (Tree, Child, Visit_Parent, Process_Node) 
then
-                  return False;
-               end if;
-            end loop;
-         end if;
-
-         if Visit_Parent = After then
-            return Process_Node (Tree, Node);
-         else
-            return True;
-         end if;
-      end Compute;
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         return Compute (Tree.Shared_Tree.Nodes (Node));
-      else
-         return Compute (Tree.Branched_Nodes (Node));
-      end if;
-   end Process_Tree;
-
-   procedure Process_Tree
-     (Tree         : in out Syntax_Trees.Tree;
-      Node         : in     Valid_Node_Index;
-      Process_Node : access procedure
-        (Tree : in out Syntax_Trees.Tree;
-         Node : in     Valid_Node_Index))
-   is
-      procedure Compute (N : in Syntax_Trees.Node)
-      is begin
-         if N.Label = Nonterm then
-            for Child of N.Children loop
-               Process_Tree (Tree, Child, Process_Node);
-            end loop;
-         end if;
-
-         Process_Node (Tree, Node);
-      end Compute;
-   begin
-      if Node <= Tree.Last_Shared_Node then
-         Compute (Tree.Shared_Tree.Nodes (Node));
-      else
-         Compute (Tree.Branched_Nodes (Node));
-      end if;
-   end Process_Tree;
-
-   procedure Process_Tree
-     (Tree         : in out Syntax_Trees.Tree;
-      Process_Node : access procedure
-        (Tree : in out Syntax_Trees.Tree;
-         Node : in     Valid_Node_Index))
-   is begin
-      if Tree.Root = Invalid_Node_Index then
-         raise SAL.Programmer_Error with "Tree.Root not set";
-      end if;
-      Tree.Shared_Tree.Traversing := True;
-      if Tree.Flush then
-         Process_Tree (Tree, Tree.Root, Process_Node);
-      else
-         Process_Tree (Tree, Tree.Root, Process_Node);
-      end if;
-      Tree.Shared_Tree.Traversing := False;
-   exception
-   when others =>
-      Tree.Shared_Tree.Traversing := False;
-      raise;
-   end Process_Tree;
-
-   procedure Set_Root (Tree : in out Syntax_Trees.Tree; Root : in 
Valid_Node_Index)
-   is begin
-      Tree.Root := Root;
-   end Set_Root;
-
-   function Root (Tree : in Syntax_Trees.Tree) return Node_Index
-   is begin
-      if Tree.Root /= Invalid_Node_Index then
-         return Tree.Root;
-      else
-         if Tree.Flush then
-            return Tree.Shared_Tree.Nodes.Last_Index;
-         else
-            return Tree.Branched_Nodes.Last_Index;
-         end if;
-      end if;
-   end Root;
-
-   function Same_Token
-     (Tree_1  : in Syntax_Trees.Tree'Class;
-      Index_1 : in Valid_Node_Index;
-      Tree_2  : in Syntax_Trees.Tree'Class;
-      Index_2 : in Valid_Node_Index)
-     return Boolean
-   is
-      function Compute (N_1, N_2 : in Syntax_Trees.Node) return Boolean
-      is begin
-         return N_1.Label = N_2.Label and
-           N_1.ID = N_2.ID and
-           N_1.Byte_Region = N_2.Byte_Region;
-      end Compute;
-   begin
-      return Compute
-        ((if Index_1 <= Tree_1.Last_Shared_Node
-          then Tree_1.Shared_Tree.Nodes (Index_1)
-          else Tree_1.Branched_Nodes (Index_1)),
-         (if Index_2 <= Tree_2.Last_Shared_Node
-          then Tree_2.Shared_Tree.Nodes (Index_2)
-          else Tree_2.Branched_Nodes (Index_2)));
-   end Same_Token;
-
-   procedure Set_Augmented
-     (Tree  : in out Syntax_Trees.Tree;
-      Node  : in     Valid_Node_Index;
-      Value : in     Base_Token_Class_Access)
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         Tree.Shared_Tree.Nodes (Node).Augmented := Value;
-      else
-         Tree.Branched_Nodes (Node).Augmented := Value;
-      end if;
-      Tree.Shared_Tree.Augmented_Present := True;
-   end Set_Augmented;
-
-   procedure Set_Children
-     (Nodes    : in out Node_Arrays.Vector;
-      Parent   : in     Valid_Node_Index;
-      Children : in     Valid_Node_Index_Array)
-   is
-      use all type SAL.Base_Peek_Type;
-
-      N : Nonterm_Node renames Nodes (Parent);
-      J : Positive_Index_Type := Positive_Index_Type'First;
-
-      Min_Terminal_Index_Set : Boolean := False;
-   begin
-      N.Children.Set_Length (Children'Length);
-      for I in Children'Range loop
-         N.Children (J) := Children (I);
-         declare
-            K : Syntax_Trees.Node renames Nodes (Children (I));
-         begin
-            K.Parent := Parent;
-
-            N.Virtual := N.Virtual or
-              (case K.Label is
-               when Shared_Terminal  => False,
-               when Virtual_Terminal => True,
-               when Nonterm          => K.Virtual);
-
-            if N.Byte_Region.First > K.Byte_Region.First then
-               N.Byte_Region.First := K.Byte_Region.First;
-            end if;
-
-            if N.Byte_Region.Last < K.Byte_Region.Last then
-               N.Byte_Region.Last := K.Byte_Region.Last;
-            end if;
-
-            if not Min_Terminal_Index_Set then
-               case K.Label is
-               when Shared_Terminal =>
-                  Min_Terminal_Index_Set := True;
-                  N.Min_Terminal_Index   := K.Terminal;
-
-               when Virtual_Terminal =>
-                  null;
-
-               when Nonterm =>
-                  if K.Min_Terminal_Index /= Invalid_Token_Index then
-                     --  not an empty nonterm
-                     Min_Terminal_Index_Set := True;
-                     N.Min_Terminal_Index   := K.Min_Terminal_Index;
-                  end if;
-               end case;
-            end if;
-
-            case K.Label is
-            when Shared_Terminal =>
-               if N.Max_Terminal_Index < K.Terminal then
-                  N.Max_Terminal_Index := K.Terminal;
-               end if;
-
-            when Virtual_Terminal =>
-               null;
-
-            when Nonterm =>
-               if K.Max_Terminal_Index /= Invalid_Token_Index and then
-                 --  not an empty nonterm
-                 N.Max_Terminal_Index < K.Max_Terminal_Index
-               then
-                  N.Max_Terminal_Index := K.Max_Terminal_Index;
-               end if;
-            end case;
-         end;
-
-         J := J + 1;
-      end loop;
-   end Set_Children;
-
-   procedure Set_State
-     (Tree  : in out Syntax_Trees.Tree;
-      Node  : in     Valid_Node_Index;
-      State : in     State_Index)
-   is begin
-      if Tree.Flush then
-         Tree.Shared_Tree.Nodes (Node).State := State;
-      else
-         if Node <= Tree.Last_Shared_Node then
-            Tree.Shared_Tree.Nodes (Node).State := State;
-         else
-            Tree.Branched_Nodes (Node).State := State;
-         end if;
-      end if;
-   end Set_State;
-
-   procedure Set_Flush_False (Tree : in out Syntax_Trees.Tree)
-   is begin
-      Tree.Flush := False;
-      Tree.Branched_Nodes.Set_First (Tree.Last_Shared_Node + 1);
-   end Set_Flush_False;
-
-   function Flushed (Tree : in Syntax_Trees.Tree) return Boolean
-   is begin
-      return Tree.Flush;
-   end Flushed;
-
-   procedure Set_Name_Region
-     (Tree   : in out Syntax_Trees.Tree;
-      Node   : in     Valid_Node_Index;
-      Region : in     Buffer_Region)
-   is begin
-      if Tree.Flush then
-         Tree.Shared_Tree.Nodes (Node).Name := Region;
-
-      else
-         if Node <= Tree.Last_Shared_Node then
-            Move_Branch_Point (Tree, Node);
-         end if;
-
-         Tree.Branched_Nodes (Node).Name := Region;
-      end if;
-   end Set_Name_Region;
-
-   function Terminal (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Base_Token_Index
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).Terminal;
-      else
-         return Tree.Branched_Nodes (Node).Terminal;
-      end if;
-   end Terminal;
-
-   function Traversing (Tree : in Syntax_Trees.Tree) return Boolean
-   is begin
-      return Tree.Shared_Tree.Traversing;
-   end Traversing;
-
-   function Recover_Token
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return WisiToken.Recover_Token
-   is
-      function Compute (N : Syntax_Trees.Node) return WisiToken.Recover_Token
-      is begin
-         case N.Label is
-         when Shared_Terminal =>
-            return
-              (ID                 => N.ID,
-               Byte_Region        => N.Byte_Region,
-               Min_Terminal_Index => N.Terminal,
-               Name               => Null_Buffer_Region,
-               Virtual            => False);
-
-         when Virtual_Terminal =>
-            return
-              (ID                 => N.ID,
-               Byte_Region        => Null_Buffer_Region,
-               Min_Terminal_Index => Invalid_Token_Index,
-               Name               => Null_Buffer_Region,
-               Virtual            => True);
-
-         when Nonterm =>
-            return
-              (ID                 => N.ID,
-               Byte_Region        => N.Byte_Region,
-               Min_Terminal_Index => N.Min_Terminal_Index,
-               Name               => N.Name,
-               Virtual            => N.Virtual);
-         end case;
-      end Compute;
-   begin
-      return Compute
-        ((if Node <= Tree.Last_Shared_Node
-          then Tree.Shared_Tree.Nodes (Node)
-          else Tree.Branched_Nodes (Node)));
-   end Recover_Token;
-
-   function Recover_Token_Array
-     (Tree  : in Syntax_Trees.Tree;
-      Nodes : in Valid_Node_Index_Array)
-     return WisiToken.Recover_Token_Array
-   is begin
-      return Result : WisiToken.Recover_Token_Array (Nodes'First .. 
Nodes'Last) do
-         for I in Result'Range loop
-            Result (I) := Tree.Recover_Token (Nodes (I));
-         end loop;
-      end return;
-   end Recover_Token_Array;
-
-   function State (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Unknown_State_Index
-   is begin
-      if Node <= Tree.Last_Shared_Node then
-         return Tree.Shared_Tree.Nodes (Node).State;
-      else
-         return Tree.Branched_Nodes (Node).State;
-      end if;
-   end State;
-
-end WisiToken.Syntax_Trees;
+--  Abstract :
+--
+--  See spec.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Containers;
+with Ada.Text_IO;
+with SAL.Generic_Decimal_Image;
+package body WisiToken.Syntax_Trees is
+
+   --  Body specs, alphabetical, as needed
+
+   function Image
+     (Tree              : in Syntax_Trees.Tree;
+      N                 : in Syntax_Trees.Node;
+      Descriptor        : in WisiToken.Descriptor;
+      Include_Children  : in Boolean;
+      Include_RHS_Index : in Boolean := False)
+     return String;
+
+   function Min (Item : in Valid_Node_Index_Array) return Valid_Node_Index;
+
+   procedure Move_Branch_Point (Tree : in out Syntax_Trees.Tree; Required_Node 
: in Valid_Node_Index);
+
+   type Visit_Parent_Mode is (Before, After);
+
+   function Process_Tree
+     (Tree         : in Syntax_Trees.Tree;
+      Node         : in Valid_Node_Index;
+      Visit_Parent : in Visit_Parent_Mode;
+      Process_Node : access function
+        (Tree : in Syntax_Trees.Tree;
+         Node : in Valid_Node_Index)
+        return Boolean)
+     return Boolean;
+   --  Call Process_Node on nodes in tree rooted at Node. Return when
+   --  Process_Node returns False (Process_Tree returns False), or when
+   --  all nodes have been processed (Process_Tree returns True).
+
+   procedure Set_Children
+     (Nodes    : in out Node_Arrays.Vector;
+      Parent   : in     Valid_Node_Index;
+      Children : in     Valid_Node_Index_Array);
+
+   ----------
+   --  Public and body operations, alphabetical
+
+   function Action
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Semantic_Action
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).Action
+         else Tree.Branched_Nodes (Node).Action);
+   end Action;
+
+   procedure Add_Child
+     (Tree   : in out Syntax_Trees.Tree;
+      Parent : in     Valid_Node_Index;
+      Child  : in     Valid_Node_Index)
+   is
+      Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Parent);
+   begin
+      Node.Children.Append (Child);
+      --  We don't update Min/Max_terminal_index; they are no longer needed.
+   end Add_Child;
+
+   function Add_Identifier
+     (Tree        : in out Syntax_Trees.Tree;
+      ID          : in     Token_ID;
+      Identifier  : in     Identifier_Index;
+      Byte_Region : in     WisiToken.Buffer_Region)
+     return Valid_Node_Index
+   is begin
+      Tree.Shared_Tree.Nodes.Append
+        ((Label       => Virtual_Identifier,
+          Byte_Region => Byte_Region,
+          ID          => ID,
+          Identifier  => Identifier,
+          others      => <>));
+      Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+      return Tree.Last_Shared_Node;
+   end Add_Identifier;
+
+   function Add_Nonterm
+     (Tree            : in out Syntax_Trees.Tree;
+      Production      : in     WisiToken.Production_ID;
+      Children        : in     Valid_Node_Index_Array;
+      Action          : in     Semantic_Action := null;
+      Default_Virtual : in     Boolean         := False)
+     return Valid_Node_Index
+   is
+      Nonterm_Node : Valid_Node_Index;
+   begin
+      if Tree.Flush then
+         Tree.Shared_Tree.Nodes.Append
+           ((Label      => Syntax_Trees.Nonterm,
+             ID         => Production.LHS,
+             Action     => Action,
+             RHS_Index  => Production.RHS,
+             Virtual    => (if Children'Length = 0 then Default_Virtual else 
False),
+             others     => <>));
+         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+         Nonterm_Node          := Tree.Last_Shared_Node;
+      else
+         Tree.Branched_Nodes.Append
+           ((Label     => Syntax_Trees.Nonterm,
+             ID        => Production.LHS,
+             Action    => Action,
+             RHS_Index => Production.RHS,
+             Virtual   => (if Children'Length = 0 then Default_Virtual else 
False),
+             others    => <>));
+         Nonterm_Node := Tree.Branched_Nodes.Last_Index;
+      end if;
+
+      if Children'Length = 0 then
+         return Nonterm_Node;
+      end if;
+
+      if Tree.Flush then
+         Set_Children (Tree.Shared_Tree.Nodes, Nonterm_Node, Children);
+
+      else
+         declare
+            Min_Child_Node : constant Valid_Node_Index := Min (Children);
+         begin
+            if Min_Child_Node <= Tree.Last_Shared_Node then
+               Move_Branch_Point (Tree, Min_Child_Node);
+            end if;
+         end;
+
+         Set_Children (Tree.Branched_Nodes, Nonterm_Node, Children);
+      end if;
+
+      return Nonterm_Node;
+   end Add_Nonterm;
+
+   function Add_Terminal
+     (Tree      : in out Syntax_Trees.Tree;
+      Terminal  : in     Token_Index;
+      Terminals : in     Base_Token_Arrays.Vector)
+     return Valid_Node_Index
+   is begin
+      if Tree.Flush then
+         Tree.Shared_Tree.Nodes.Append
+           ((Label       => Shared_Terminal,
+             ID          => Terminals (Terminal).ID,
+             Byte_Region => Terminals (Terminal).Byte_Region,
+             Terminal    => Terminal,
+             others      => <>));
+         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+         return Tree.Last_Shared_Node;
+      else
+         Tree.Branched_Nodes.Append
+           ((Label       => Shared_Terminal,
+             ID          => Terminals (Terminal).ID,
+             Byte_Region => Terminals (Terminal).Byte_Region,
+             Terminal    => Terminal,
+             others      => <>));
+         return Tree.Branched_Nodes.Last_Index;
+      end if;
+   end Add_Terminal;
+
+   function Add_Terminal
+     (Tree     : in out Syntax_Trees.Tree;
+      Terminal : in     Token_ID)
+     return Valid_Node_Index
+   is begin
+      if Tree.Flush then
+         Tree.Shared_Tree.Nodes.Append
+           ((Label  => Virtual_Terminal,
+             ID     => Terminal,
+             others => <>));
+         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+         return Tree.Last_Shared_Node;
+      else
+         Tree.Branched_Nodes.Append
+           ((Label  => Virtual_Terminal,
+             ID     => Terminal,
+             others => <>));
+         return Tree.Branched_Nodes.Last_Index;
+      end if;
+   end Add_Terminal;
+
+   function Augmented
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Base_Token_Class_Access
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Augmented;
+      else
+         return Tree.Branched_Nodes (Node).Augmented;
+      end if;
+   end Augmented;
+
+   function Byte_Region
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Buffer_Region
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).Byte_Region
+         else Tree.Branched_Nodes (Node).Byte_Region);
+   end Byte_Region;
+
+   function Child
+     (Tree        : in Syntax_Trees.Tree;
+      Node        : in Valid_Node_Index;
+      Child_Index : in Positive_Index_Type)
+     return Node_Index
+   is
+      function Compute (N : in Syntax_Trees.Node) return Node_Index
+      is begin
+         if Child_Index in N.Children.First_Index .. N.Children.Last_Index then
+            return N.Children (Child_Index);
+         else
+            return Invalid_Node_Index;
+         end if;
+      end Compute;
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Child;
+
+   function Children (N : in Syntax_Trees.Node) return Valid_Node_Index_Array
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      if N.Children.Length = 0 then
+         return (1 .. 0 => <>);
+      else
+         return Result : Valid_Node_Index_Array (N.Children.First_Index .. 
N.Children.Last_Index) do
+            for I in Result'Range loop
+               Result (I) := N.Children (I);
+            end loop;
+         end return;
+      end if;
+   end Children;
+
+   function Children (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Valid_Node_Index_Array
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Children (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Children (Tree.Branched_Nodes (Node));
+      end if;
+   end Children;
+
+   procedure Clear (Tree : in out Syntax_Trees.Base_Tree)
+   is begin
+      Tree.Finalize;
+   end Clear;
+
+   procedure Clear (Tree : in out Syntax_Trees.Tree)
+   is begin
+      if Tree.Shared_Tree.Augmented_Present then
+         for Node of Tree.Branched_Nodes loop
+            if Node.Label = Nonterm then
+               Free (Node.Augmented);
+            end if;
+         end loop;
+      end if;
+      Tree.Shared_Tree.Finalize;
+      Tree.Last_Shared_Node := Invalid_Node_Index;
+      Tree.Branched_Nodes.Clear;
+   end Clear;
+
+   function Copy_Subtree
+     (Tree : in out Syntax_Trees.Tree;
+      Root : in     Valid_Node_Index;
+      Last : in     Valid_Node_Index)
+     return Valid_Node_Index
+   is
+      function Copy_Node
+        (Tree   : in out Syntax_Trees.Tree;
+         Index  : in     Valid_Node_Index;
+         Parent : in     Node_Index)
+        return Valid_Node_Index
+      is begin
+         case Tree.Shared_Tree.Nodes (Index).Label is
+         when Shared_Terminal =>
+            declare
+               Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Index);
+            begin
+               Tree.Shared_Tree.Nodes.Append
+                 ((Label         => Shared_Terminal,
+                   ID            => Node.ID,
+                   Byte_Region   => Node.Byte_Region,
+                   Parent        => Parent,
+                   State         => Unknown_State,
+                   Terminal      => Node.Terminal));
+            end;
+
+         when Virtual_Terminal =>
+            declare
+               Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Index);
+            begin
+               Tree.Shared_Tree.Nodes.Append
+                 ((Label          => Virtual_Terminal,
+                   ID             => Node.ID,
+                   Byte_Region    => Node.Byte_Region,
+                   Parent         => Parent,
+                   State          => Unknown_State));
+            end;
+
+         when Virtual_Identifier =>
+            declare
+               Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Index);
+            begin
+               Tree.Shared_Tree.Nodes.Append
+                 ((Label            => Virtual_Identifier,
+                   ID               => Node.ID,
+                   Byte_Region      => Node.Byte_Region,
+                   Parent           => Parent,
+                   State            => Unknown_State,
+                   Identifier       => Node.Identifier));
+            end;
+
+         when Nonterm =>
+            declare
+               Children     : constant Valid_Node_Index_Array := Tree.Children 
(Index);
+               Parent       : Node_Index                      := 
Invalid_Node_Index;
+               New_Children : Valid_Node_Index_Arrays.Vector;
+            begin
+               if Children'Length > 0 then
+                  declare
+                     use all type SAL.Base_Peek_Type;
+                     Last_Index   : SAL.Base_Peek_Type  := 
SAL.Base_Peek_Type'Last;
+                  begin
+                     for I in Children'Range loop
+                        if Children (I) = Last then
+                           Last_Index := I;
+                        end if;
+                     end loop;
+
+                     if Last_Index = SAL.Base_Peek_Type'Last then
+                        New_Children.Set_Length (Children'Length);
+                        for I in Children'Range loop
+                           New_Children (I) := Copy_Node (Tree, Children (I), 
Parent);
+                        end loop;
+                     else
+                        for I in Last_Index .. Children'Last loop
+                           New_Children.Append (Copy_Node (Tree, Children (I), 
Parent));
+                        end loop;
+                     end if;
+                  end;
+               end if;
+
+               declare
+                  Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes 
(Index);
+               begin
+                  Tree.Shared_Tree.Nodes.Append
+                    ((Label              => Nonterm,
+                      ID                 => Node.ID,
+                      Byte_Region        => Node.Byte_Region,
+                      Parent             => Parent,
+                      State              => Unknown_State,
+                      Virtual            => Node.Virtual,
+                      RHS_Index          => Node.RHS_Index,
+                      Action             => Node.Action,
+                      Name               => Node.Name,
+                      Children           => New_Children,
+                      Min_Terminal_Index => Node.Min_Terminal_Index,
+                      Max_Terminal_Index => Node.Max_Terminal_Index,
+                      Augmented          => Node.Augmented));
+               end;
+
+               Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+               Parent := Tree.Last_Shared_Node;
+               for I in New_Children.First_Index .. New_Children.Last_Index 
loop
+                  Tree.Shared_Tree.Nodes (New_Children (I)).Parent := Parent;
+               end loop;
+
+               return Parent;
+            end;
+         end case;
+         Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+         return Tree.Last_Shared_Node;
+      end Copy_Node;
+
+   begin
+      return Copy_Node (Tree, Root, Invalid_Node_Index);
+   end Copy_Subtree;
+
+   function Count_IDs
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return SAL.Base_Peek_Type
+   is
+      function Compute (N : in Syntax_Trees.Node) return SAL.Base_Peek_Type
+      is
+         use all type SAL.Base_Peek_Type;
+      begin
+         return Result : SAL.Base_Peek_Type := 0 do
+            if N.ID = ID then
+               Result := 1;
+            end if;
+            case N.Label is
+            when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+               null;
+            when Nonterm =>
+               for I of N.Children loop
+                  Result := Result + Count_IDs (Tree, I, ID);
+               end loop;
+            end case;
+         end return;
+      end Compute;
+   begin
+      return Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Count_IDs;
+
+   function Count_Terminals
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Integer
+     --  Count_Terminals must return Integer for Get_Terminals,
+     --  Positive_Index_Type for Get_Terminal_IDs.
+   is
+      function Compute (N : in Syntax_Trees.Node) return Integer
+      is begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            return 1;
+
+         when Nonterm =>
+            return Result : Integer := 0 do
+               for I of N.Children loop
+                  Result := Result + Count_Terminals (Tree, I);
+               end loop;
+            end return;
+         end case;
+      end Compute;
+   begin
+      return Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Count_Terminals;
+
+   overriding procedure Finalize (Tree : in out Base_Tree)
+   is begin
+      Tree.Traversing := False;
+      if Tree.Augmented_Present then
+         for Node of Tree.Nodes loop
+            if Node.Label = Nonterm then
+               Free (Node.Augmented);
+            end if;
+         end loop;
+         Tree.Augmented_Present := False;
+      end if;
+      Tree.Nodes.Finalize;
+   end Finalize;
+
+   overriding procedure Finalize (Tree : in out Syntax_Trees.Tree)
+   is begin
+      if Tree.Last_Shared_Node /= Invalid_Node_Index then
+         if Tree.Shared_Tree.Augmented_Present then
+            for Node of Tree.Branched_Nodes loop
+               Free (Node.Augmented);
+            end loop;
+            --  We don't clear Tree.Shared_Tree.Augmented_Present here; other
+            --  branched trees may need to be finalized.
+         end if;
+         Tree.Branched_Nodes.Finalize;
+         Tree.Last_Shared_Node := Invalid_Node_Index;
+      end if;
+   end Finalize;
+
+   function Find_Ancestor
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   is
+      N : Node_Index := Node;
+   begin
+      loop
+         N :=
+           (if N <= Tree.Last_Shared_Node
+            then Tree.Shared_Tree.Nodes (N).Parent
+            else Tree.Branched_Nodes (N).Parent);
+
+         exit when N = Invalid_Node_Index;
+         exit when ID =
+           (if N <= Tree.Last_Shared_Node
+            then Tree.Shared_Tree.Nodes (N).ID
+            else Tree.Branched_Nodes (N).ID);
+      end loop;
+      return N;
+   end Find_Ancestor;
+
+   function Find_Ancestor
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      IDs  : in Token_ID_Array)
+     return Node_Index
+   is
+      N : Node_Index := Node;
+   begin
+      loop
+         N :=
+           (if N <= Tree.Last_Shared_Node
+            then Tree.Shared_Tree.Nodes (N).Parent
+            else Tree.Branched_Nodes (N).Parent);
+
+         exit when N = Invalid_Node_Index;
+         exit when
+           (for some ID of IDs => ID =
+              (if N <= Tree.Last_Shared_Node
+               then Tree.Shared_Tree.Nodes (N).ID
+               else Tree.Branched_Nodes (N).ID));
+      end loop;
+      return N;
+   end Find_Ancestor;
+
+   function Find_Child
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   is
+      function Compute (N : in Syntax_Trees.Node) return Node_Index
+      is begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            return Invalid_Node_Index;
+         when Nonterm =>
+            for C of N.Children loop
+               if ID =
+                 (if C <= Tree.Last_Shared_Node
+                  then Tree.Shared_Tree.Nodes (C).ID
+                  else Tree.Branched_Nodes (C).ID)
+               then
+                  return C;
+               end if;
+            end loop;
+            return Invalid_Node_Index;
+         end case;
+      end Compute;
+   begin
+      return Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Find_Child;
+
+   function Find_Descendant
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   is
+      Found : Node_Index := Invalid_Node_Index;
+
+      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+      is
+         Node_ID : constant Token_ID :=
+           (if Node <= Tree.Last_Shared_Node
+            then Tree.Shared_Tree.Nodes (Node).ID
+            else Tree.Branched_Nodes (Node).ID);
+      begin
+         if Node_ID = ID then
+            Found := Node;
+            return False;
+         else
+            return True;
+         end if;
+      end Process;
+
+      Junk : constant Boolean := Process_Tree (Tree, Node, After, 
Process'Access);
+      pragma Unreferenced (Junk);
+   begin
+      return Found;
+   end Find_Descendant;
+
+   function Find_Min_Terminal_Index
+     (Tree  : in Syntax_Trees.Tree;
+      Index : in Token_Index)
+     return Node_Index
+   is
+      Found : Node_Index := Invalid_Node_Index;
+
+      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+      is
+         function Compute (N : in Syntax_Trees.Node) return Boolean
+         is begin
+            if N.Label /= Nonterm then
+               return True;
+            elsif Index = N.Min_Terminal_Index then
+               Found := Node;
+               return False;
+            else
+               return True;
+            end if;
+         end Compute;
+      begin
+         return Compute
+           ((if Node <= Tree.Last_Shared_Node
+             then Tree.Shared_Tree.Nodes (Node)
+             else Tree.Branched_Nodes (Node)));
+      end Process;
+
+      Junk : constant Boolean := Process_Tree (Tree, Tree.Root, Before, 
Process'Access);
+      pragma Unreferenced (Junk);
+   begin
+      return Found;
+   end Find_Min_Terminal_Index;
+
+   function Find_Max_Terminal_Index
+     (Tree  : in Syntax_Trees.Tree;
+      Index : in Token_Index)
+     return Node_Index
+   is
+      Found : Node_Index := Invalid_Node_Index;
+
+      function Process (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+      is
+         function Compute (N : in Syntax_Trees.Node) return Boolean
+         is begin
+            if N.Label /= Nonterm then
+               return True;
+            elsif Index = N.Max_Terminal_Index then
+               Found := Node;
+               return False;
+            else
+               return True;
+            end if;
+         end Compute;
+      begin
+         return Compute
+           ((if Node <= Tree.Last_Shared_Node
+             then Tree.Shared_Tree.Nodes (Node)
+             else Tree.Branched_Nodes (Node)));
+      end Process;
+
+      Junk : constant Boolean := Process_Tree (Tree, Tree.Root, Before, 
Process'Access);
+      pragma Unreferenced (Junk);
+   begin
+      return Found;
+   end Find_Max_Terminal_Index;
+
+   function Find_Sibling
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   is
+      function Compute_2 (N : in Syntax_Trees.Node) return Node_Index
+      is begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            return Invalid_Node_Index;
+
+         when Nonterm =>
+            for C of N.Children loop
+               if ID =
+                 (if C <= Tree.Last_Shared_Node
+                  then Tree.Shared_Tree.Nodes (C).ID
+                  else Tree.Branched_Nodes (C).ID)
+               then
+                  return C;
+               end if;
+            end loop;
+            return Invalid_Node_Index;
+         end case;
+      end Compute_2;
+
+      function Compute_1 (Parent : in Node_Index) return Node_Index
+      is begin
+         if Parent = Invalid_Node_Index then
+            return Invalid_Node_Index;
+
+         else
+            return Compute_2
+              ((if Parent <= Tree.Last_Shared_Node
+                then Tree.Shared_Tree.Nodes (Parent)
+                else Tree.Branched_Nodes (Parent)));
+         end if;
+      end Compute_1;
+   begin
+      return Compute_1
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node).Parent
+          else Tree.Branched_Nodes (Node).Parent));
+   end Find_Sibling;
+
+   function First_Index (Tree : in Syntax_Trees.Tree) return Node_Index
+   is begin
+      return Tree.Shared_Tree.Nodes.First_Index;
+   end First_Index;
+
+   procedure Flush (Tree : in out Syntax_Trees.Tree)
+   is begin
+      --  This is the opposite of Move_Branch_Point
+      Tree.Shared_Tree.Nodes.Merge (Tree.Branched_Nodes);
+      Tree.Last_Shared_Node := Tree.Shared_Tree.Nodes.Last_Index;
+      Tree.Flush            := True;
+   end Flush;
+
+   function Flushed (Tree : in Syntax_Trees.Tree) return Boolean
+   is begin
+      return Tree.Flush;
+   end Flushed;
+
+   procedure Get_IDs
+     (Tree   : in     Syntax_Trees.Tree;
+      Node   : in     Valid_Node_Index;
+      ID     : in     Token_ID;
+      Result : in out Valid_Node_Index_Array;
+      Last   : in out SAL.Base_Peek_Type)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      procedure Compute (N : in Syntax_Trees.Node)
+      is begin
+         if N.ID = ID then
+            Last := Last + 1;
+            Result (Last) := Node;
+         end if;
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            null;
+         when Nonterm =>
+            for I of N.Children loop
+               Get_IDs (Tree, I, ID, Result, Last);
+            end loop;
+         end case;
+      end Compute;
+   begin
+      Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Get_IDs;
+
+   function Get_IDs
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Valid_Node_Index_Array
+   is
+      Last : SAL.Base_Peek_Type := 0;
+   begin
+      Tree.Shared_Tree.Traversing := True;
+      return Result : Valid_Node_Index_Array (1 .. Count_IDs (Tree, Node, ID)) 
do
+         Get_IDs (Tree, Node, ID, Result, Last);
+         Tree.Shared_Tree.Traversing := False;
+      end return;
+   end Get_IDs;
+
+   procedure Get_Terminals
+     (Tree   : in     Syntax_Trees.Tree;
+      Node   : in     Valid_Node_Index;
+      Result : in out Valid_Node_Index_Array;
+      Last   : in out SAL.Base_Peek_Type)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      procedure Compute (N : in Syntax_Trees.Node)
+      is begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            Last := Last + 1;
+            Result (Last) := Node;
+
+         when Nonterm =>
+            for I of N.Children loop
+               Get_Terminals (Tree, I, Result, Last);
+            end loop;
+         end case;
+      end Compute;
+   begin
+      Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Get_Terminals;
+
+   function Get_Terminals (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Valid_Node_Index_Array
+   is
+      Last : SAL.Base_Peek_Type := 0;
+   begin
+      Tree.Shared_Tree.Traversing := True;
+      return Result : Valid_Node_Index_Array (1 .. SAL.Base_Peek_Type 
(Count_Terminals (Tree, Node))) do
+         Get_Terminals (Tree, Node, Result, Last);
+         Tree.Shared_Tree.Traversing := False;
+      end return;
+   end Get_Terminals;
+
+   procedure Get_Terminal_IDs
+     (Tree   : in     Syntax_Trees.Tree;
+      Node   : in     Valid_Node_Index;
+      Result : in out Token_ID_Array;
+      Last   : in out SAL.Base_Peek_Type)
+   is
+      procedure Compute (N : in Syntax_Trees.Node)
+      is
+         use all type SAL.Base_Peek_Type;
+      begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            Last := Last + 1;
+            Result (Integer (Last)) := N.ID;
+
+         when Nonterm =>
+            for I of N.Children loop
+               Get_Terminal_IDs (Tree, I, Result, Last);
+            end loop;
+         end case;
+      end Compute;
+   begin
+      Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Get_Terminal_IDs;
+
+   function Get_Terminal_IDs (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID_Array
+   is
+      Last : SAL.Base_Peek_Type := 0;
+   begin
+      Tree.Shared_Tree.Traversing := True;
+      return Result : Token_ID_Array (1 .. Count_Terminals (Tree, Node))  do
+         Get_Terminal_IDs (Tree, Node, Result, Last);
+         Tree.Shared_Tree.Traversing := False;
+      end return;
+   end Get_Terminal_IDs;
+
+   function First_Terminal_ID (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID
+   is
+      function Compute (N : in Syntax_Trees.Node) return Token_ID
+      is begin
+         case N.Label is
+         when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+            return N.ID;
+
+         when Nonterm =>
+            return First_Terminal_ID (Tree, N.Children (1));
+         end case;
+      end Compute;
+   begin
+      return Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end First_Terminal_ID;
+
+   function Has_Branched_Nodes (Tree : in Syntax_Trees.Tree) return Boolean
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      return Tree.Branched_Nodes.Length > 0;
+   end Has_Branched_Nodes;
+
+   function Has_Children (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+   is
+      use all type Ada.Containers.Count_Type;
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Children.Length > 0;
+      else
+         return Tree.Branched_Nodes (Node).Children.Length > 0;
+      end if;
+   end Has_Children;
+
+   function Has_Parent (Tree : in Syntax_Trees.Tree; Child : in 
Valid_Node_Index) return Boolean
+   is begin
+      return
+        (if Child <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Child).Parent /= Invalid_Node_Index
+         else Tree.Branched_Nodes (Child).Parent /= Invalid_Node_Index);
+   end Has_Parent;
+
+   function Has_Parent (Tree : in Syntax_Trees.Tree; Children : in 
Valid_Node_Index_Array) return Boolean
+   is begin
+      return
+        (for some Child of Children =>
+           (if Child <= Tree.Last_Shared_Node
+            then Tree.Shared_Tree.Nodes (Child).Parent /= Invalid_Node_Index
+            else Tree.Branched_Nodes (Child).Parent /= Invalid_Node_Index));
+   end Has_Parent;
+
+   function ID
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Token_ID
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).ID
+         else Tree.Branched_Nodes (Node).ID);
+   end ID;
+
+   function Identifier (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Identifier_Index
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).Identifier
+         else Tree.Branched_Nodes (Node).Identifier);
+   end Identifier;
+
+   function Image
+     (Tree       : in Syntax_Trees.Tree;
+      Children   : in Valid_Node_Index_Arrays.Vector;
+      Descriptor : in WisiToken.Descriptor)
+     return String
+   is
+      use Ada.Strings.Unbounded;
+      Result     : Unbounded_String := +"(";
+      Need_Comma : Boolean := False;
+   begin
+      for I of Children loop
+         Result := Result & (if Need_Comma then ", " else "") &
+           Tree.Image (I, Descriptor, Include_Children => False);
+         Need_Comma := True;
+      end loop;
+      Result := Result & ")";
+      return -Result;
+   end Image;
+
+   function Image
+     (Tree              : in Syntax_Trees.Tree;
+      N                 : in Syntax_Trees.Node;
+      Descriptor        : in WisiToken.Descriptor;
+      Include_Children  : in Boolean;
+      Include_RHS_Index : in Boolean := False)
+     return String
+   is
+      use Ada.Strings.Unbounded;
+      Result : Unbounded_String;
+   begin
+      if Include_Children and N.Label = Nonterm then
+         Result := +Image (N.ID, Descriptor) & '_' & Trimmed_Image 
(N.RHS_Index) & ": ";
+      end if;
+
+      case N.Label is
+      when Shared_Terminal =>
+         Result := Result & (+Token_Index'Image (N.Terminal)) & ":";
+
+      when Virtual_Identifier =>
+         Result := Result & (+Identifier_Index'Image (N.Identifier)) & ";";
+
+      when others =>
+         null;
+      end case;
+
+      Result := Result & "(" & Image (N.ID, Descriptor) &
+        (if Include_RHS_Index and N.Label = Nonterm then "_" & Trimmed_Image 
(N.RHS_Index) else "") &
+        (if N.Byte_Region = Null_Buffer_Region then "" else ", " & Image 
(N.Byte_Region)) & ")";
+
+      if Include_Children and N.Label = Nonterm then
+         Result := Result & " <= " & Image (Tree, N.Children, Descriptor);
+      end if;
+
+      return -Result;
+   end Image;
+
+   function Image
+     (Tree             : in Syntax_Trees.Tree;
+      Node             : in Valid_Node_Index;
+      Descriptor       : in WisiToken.Descriptor;
+      Include_Children : in Boolean := False)
+     return String
+   is begin
+      return Tree.Image
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)),
+         Descriptor, Include_Children);
+   end Image;
+
+   function Image
+     (Tree       : in Syntax_Trees.Tree;
+      Nodes      : in Valid_Node_Index_Array;
+      Descriptor : in WisiToken.Descriptor)
+     return String
+   is
+      use Ada.Strings.Unbounded;
+      Result     : Unbounded_String := +"(";
+      Need_Comma : Boolean := False;
+   begin
+      for I in Nodes'Range loop
+         Result := Result & (if Need_Comma then ", " else "") &
+           Tree.Image (Nodes (I), Descriptor, Include_Children => False);
+         Need_Comma := True;
+      end loop;
+      Result := Result & ")";
+      return -Result;
+   end Image;
+
+   function Image
+     (Item     : in Node_Sets.Vector;
+      Inverted : in Boolean := False)
+     return String
+   is
+      use Ada.Strings.Unbounded;
+      Result : Unbounded_String;
+   begin
+      for I in Item.First_Index .. Item.Last_Index loop
+         if (if Inverted then not Item (I) else Item (I)) then
+            Result := Result & Node_Index'Image (I);
+         end if;
+      end loop;
+      return -Result;
+   end Image;
+
+   procedure Initialize
+     (Branched_Tree : in out Syntax_Trees.Tree;
+      Shared_Tree   : in     Base_Tree_Access;
+      Flush         : in     Boolean)
+   is begin
+      Branched_Tree :=
+        (Ada.Finalization.Controlled with
+         Shared_Tree      => Shared_Tree,
+         Last_Shared_Node => Shared_Tree.Nodes.Last_Index,
+         Branched_Nodes   => <>,
+         Flush            => Flush,
+         Root             => <>);
+   end Initialize;
+
+   function Is_Empty (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Boolean
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Byte_Region = Null_Buffer_Region;
+      else
+         return Tree.Branched_Nodes (Node).Byte_Region = Null_Buffer_Region;
+      end if;
+   end Is_Empty;
+
+   function Is_Nonterm (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Label = Nonterm;
+      else
+         return Tree.Branched_Nodes (Node).Label = Nonterm;
+      end if;
+   end Is_Nonterm;
+
+   function Is_Terminal (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Label = Shared_Terminal;
+      else
+         return Tree.Branched_Nodes (Node).Label = Shared_Terminal;
+      end if;
+   end Is_Terminal;
+
+   function Is_Virtual (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+   is
+      function Compute (N : in Syntax_Trees.Node) return Boolean
+      is begin
+         return N.Label = Virtual_Terminal or (N.Label = Nonterm and then 
N.Virtual);
+      end Compute;
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Is_Virtual;
+
+   function Is_Virtual_Identifier (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).Label = Virtual_Identifier
+         else Tree.Branched_Nodes (Node).Label = Virtual_Identifier);
+   end Is_Virtual_Identifier;
+
+   function Label (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Label
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Label;
+      else
+         return Tree.Branched_Nodes (Node).Label;
+      end if;
+   end Label;
+
+   function Last_Index (Tree : in Syntax_Trees.Tree) return Node_Index
+   is begin
+      return
+        (if Tree.Flush
+         then Tree.Shared_Tree.Nodes.Last_Index
+         else Tree.Branched_Nodes.Last_Index);
+   end Last_Index;
+
+   function Min (Item : in Valid_Node_Index_Array) return Valid_Node_Index
+   is
+      Result : Node_Index := Item (Item'First);
+   begin
+      for I in Item'Range loop
+         if Item (I) < Result then
+            Result := Item (I);
+         end if;
+      end loop;
+      return Result;
+   end Min;
+
+   function Min_Descendant (Nodes : in Node_Arrays.Vector; Node : in 
Valid_Node_Index) return Valid_Node_Index
+   is
+      N : Syntax_Trees.Node renames Nodes (Node);
+   begin
+      case N.Label is
+      when Shared_Terminal | Virtual_Terminal | Virtual_Identifier =>
+         return Node;
+
+      when Nonterm =>
+         declare
+            Min : Node_Index := Node;
+         begin
+            for C of N.Children loop
+               Min := Node_Index'Min (Min, Min_Descendant (Nodes, C));
+            end loop;
+            return Min;
+         end;
+      end case;
+   end Min_Descendant;
+
+   function Min_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index
+   is
+      function Compute (N : in Syntax_Trees.Node) return Base_Token_Index
+      is begin
+         return
+           (case N.Label is
+            when Shared_Terminal                       => N.Terminal,
+            when Virtual_Terminal | Virtual_Identifier => Invalid_Token_Index,
+            when Nonterm                               => 
N.Min_Terminal_Index);
+      end Compute;
+
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Min_Terminal_Index;
+
+   function Max_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index
+   is
+      function Compute (N : in Syntax_Trees.Node) return Base_Token_Index
+      is begin
+         return
+           (case N.Label is
+            when Shared_Terminal                       => N.Terminal,
+            when Virtual_Terminal | Virtual_Identifier => Invalid_Token_Index,
+            when Nonterm                               => 
N.Max_Terminal_Index);
+      end Compute;
+
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Max_Terminal_Index;
+
+   procedure Move_Branch_Point (Tree : in out Syntax_Trees.Tree; Required_Node 
: in Valid_Node_Index)
+   is begin
+      --  Note that this preserves all stored indices in Branched_Nodes.
+      Tree.Branched_Nodes.Prepend (Tree.Shared_Tree.Nodes, Required_Node, 
Tree.Last_Shared_Node);
+      Tree.Last_Shared_Node := Required_Node - 1;
+   end Move_Branch_Point;
+
+   function Parent
+     (Tree  : in Syntax_Trees.Tree;
+      Node  : in Valid_Node_Index;
+      Count : in Positive := 1)
+     return Node_Index
+   is
+      Result : Node_Index := Node;
+      N      : Natural    := 0;
+   begin
+      loop
+         if Result <= Tree.Last_Shared_Node then
+            Result := Tree.Shared_Tree.Nodes (Result).Parent;
+         else
+            Result := Tree.Branched_Nodes (Result).Parent;
+         end if;
+         N := N + 1;
+         exit when N = Count or Result = Invalid_Node_Index;
+      end loop;
+      return Result;
+   end Parent;
+
+   procedure Print_Tree
+     (Tree       : in Syntax_Trees.Tree;
+      Descriptor : in WisiToken.Descriptor;
+      Root       : in Node_Index := Invalid_Node_Index)
+   is
+      use Ada.Text_IO;
+
+      Node_Printed : Node_Sets.Vector;
+
+      procedure Print_Node (Node : in Valid_Node_Index; Level : in Integer)
+      is
+         function Image is new SAL.Generic_Decimal_Image (Node_Index);
+
+         N : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Node);
+      begin
+         if Node_Printed (Node) then
+            --  This does not catch all possible tree edit errors, but it does
+            --  catch circles.
+            raise SAL.Programmer_Error with "Print_Tree: invalid tree" & 
Node_Index'Image (Node);
+         else
+            Node_Printed (Node) := True;
+         end if;
+
+         Put (Image (Node, Width => 4) & ": ");
+         for I in 1 .. Level loop
+            Put ("| ");
+         end loop;
+         Put_Line (Image (Tree, N, Descriptor, Include_Children => False, 
Include_RHS_Index => True));
+
+         if N.Label = Nonterm then
+            for Child of N.Children loop
+               Print_Node (Child, Level + 1);
+            end loop;
+         end if;
+      end Print_Node;
+
+   begin
+      Node_Printed.Set_First_Last (Tree.First_Index, Tree.Last_Index);
+      Print_Node ((if Root = Invalid_Node_Index then Tree.Root else Root), 0);
+   end Print_Tree;
+
+   function Process_Tree
+     (Tree         : in Syntax_Trees.Tree;
+      Node         : in Valid_Node_Index;
+      Visit_Parent : in Visit_Parent_Mode;
+      Process_Node : access function
+        (Tree : in Syntax_Trees.Tree;
+         Node : in Valid_Node_Index)
+        return Boolean)
+     return Boolean
+   is
+      function Compute (N : in Syntax_Trees.Node) return Boolean
+      is begin
+         if Visit_Parent = Before then
+            if not Process_Node (Tree, Node) then
+               return False;
+            end if;
+         end if;
+
+         if N.Label = Nonterm then
+            for Child of N.Children loop
+               if not Process_Tree (Tree, Child, Visit_Parent, Process_Node) 
then
+                  return False;
+               end if;
+            end loop;
+         end if;
+
+         if Visit_Parent = After then
+            return Process_Node (Tree, Node);
+         else
+            return True;
+         end if;
+      end Compute;
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         return Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         return Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Process_Tree;
+
+   procedure Process_Tree
+     (Tree         : in out Syntax_Trees.Tree;
+      Node         : in     Valid_Node_Index;
+      Process_Node : access procedure
+        (Tree : in out Syntax_Trees.Tree;
+         Node : in     Valid_Node_Index))
+   is
+      procedure Compute (N : in Syntax_Trees.Node)
+      is begin
+         if N.Label = Nonterm then
+            for Child of N.Children loop
+               Process_Tree (Tree, Child, Process_Node);
+            end loop;
+         end if;
+
+         Process_Node (Tree, Node);
+      end Compute;
+   begin
+      if Node <= Tree.Last_Shared_Node then
+         Compute (Tree.Shared_Tree.Nodes (Node));
+      else
+         Compute (Tree.Branched_Nodes (Node));
+      end if;
+   end Process_Tree;
+
+   procedure Process_Tree
+     (Tree         : in out Syntax_Trees.Tree;
+      Process_Node : access procedure
+        (Tree : in out Syntax_Trees.Tree;
+         Node : in     Valid_Node_Index);
+      Root         : in     Node_Index := Invalid_Node_Index)
+   is begin
+      if Root = Invalid_Node_Index and Tree.Root = Invalid_Node_Index then
+         raise SAL.Programmer_Error with "Tree.Root not set";
+      end if;
+      Tree.Shared_Tree.Traversing := True;
+      Process_Tree (Tree, (if Root = Invalid_Node_Index then Tree.Root else 
Root), Process_Node);
+      Tree.Shared_Tree.Traversing := False;
+   exception
+   when others =>
+      Tree.Shared_Tree.Traversing := False;
+      raise;
+   end Process_Tree;
+
+   function Production_ID
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Production_ID
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then (Tree.Shared_Tree.Nodes (Node).ID, Tree.Shared_Tree.Nodes 
(Node).RHS_Index)
+         else (Tree.Branched_Nodes (Node).ID, Tree.Branched_Nodes 
(Node).RHS_Index));
+   end Production_ID;
+
+   function RHS_Index
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Natural
+   is begin
+      return
+        (if Node <= Tree.Last_Shared_Node
+         then Tree.Shared_Tree.Nodes (Node).RHS_Index
+         else Tree.Branched_Nodes (Node).RHS_Index);
+   end RHS_Index;
+
+   procedure Set_Node_Identifier
+     (Tree       : in Syntax_Trees.Tree;
+      Node       : in Valid_Node_Index;
+      ID         : in Token_ID;
+      Identifier : in Identifier_Index)
+   is
+      Current : constant Syntax_Trees.Node := Tree.Shared_Tree.Nodes (Node);
+   begin
+      Tree.Shared_Tree.Nodes.Replace_Element
+        (Node,
+         (Label       => Virtual_Identifier,
+          ID          => ID,
+          Identifier  => Identifier,
+          Byte_Region => Current.Byte_Region,
+          Parent      => Current.Parent,
+          State       => Unknown_State));
+   end Set_Node_Identifier;
+
+   procedure Set_Root (Tree : in out Syntax_Trees.Tree; Root : in 
Valid_Node_Index)
+   is begin
+      Tree.Root := Root;
+   end Set_Root;
+
+   function Root (Tree : in Syntax_Trees.Tree) return Node_Index
+   is begin
+      if Tree.Root /= Invalid_Node_Index then
+         return Tree.Root;
+      else
+         if Tree.Flush then
+            return Tree.Shared_Tree.Nodes.Last_Index;
+         else
+            return Tree.Branched_Nodes.Last_Index;
+         end if;
+      end if;
+   end Root;
+
+   function Same_Token
+     (Tree_1  : in Syntax_Trees.Tree'Class;
+      Index_1 : in Valid_Node_Index;
+      Tree_2  : in Syntax_Trees.Tree'Class;
+      Index_2 : in Valid_Node_Index)
+     return Boolean
+   is
+      function Compute (N_1, N_2 : in Syntax_Trees.Node) return Boolean
+      is begin
+         return N_1.Label = N_2.Label and
+           N_1.ID = N_2.ID and
+           N_1.Byte_Region = N_2.Byte_Region;
+      end Compute;
+   begin
+      return Compute
+        ((if Index_1 <= Tree_1.Last_Shared_Node
+          then Tree_1.Shared_Tree.Nodes (Index_1)
+          else Tree_1.Branched_Nodes (Index_1)),
+         (if Index_2 <= Tree_2.Last_Shared_Node
+          then Tree_2.Shared_Tree.Nodes (Index_2)
+          else Tree_2.Branched_Nodes (Index_2)));
+   end Same_Token;
+
+   procedure Set_Augmented
+     (Tree  : in out Syntax_Trees.Tree;
+      Node  : in     Valid_Node_Index;
+      Value : in     Base_Token_Class_Access)
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         Tree.Shared_Tree.Nodes (Node).Augmented := Value;
+      else
+         Tree.Branched_Nodes (Node).Augmented := Value;
+      end if;
+      Tree.Shared_Tree.Augmented_Present := True;
+   end Set_Augmented;
+
+   procedure Set_Children
+     (Nodes    : in out Node_Arrays.Vector;
+      Parent   : in     Valid_Node_Index;
+      Children : in     Valid_Node_Index_Array)
+   is
+      use all type SAL.Base_Peek_Type;
+
+      N : Nonterm_Node renames Nodes (Parent);
+      J : Positive_Index_Type := Positive_Index_Type'First;
+
+      Min_Terminal_Index_Set : Boolean := False;
+   begin
+      N.Children.Set_Length (Children'Length);
+      for I in Children'Range loop
+         N.Children (J) := Children (I);
+         declare
+            K : Node renames Nodes (Children (I));
+         begin
+            K.Parent := Parent;
+
+            N.Virtual := N.Virtual or
+              (case K.Label is
+               when Shared_Terminal                       => False,
+               when Virtual_Terminal | Virtual_Identifier => True,
+               when Nonterm                               => K.Virtual);
+
+            if N.Byte_Region.First > K.Byte_Region.First then
+               N.Byte_Region.First := K.Byte_Region.First;
+            end if;
+
+            if N.Byte_Region.Last < K.Byte_Region.Last then
+               N.Byte_Region.Last := K.Byte_Region.Last;
+            end if;
+
+            if not Min_Terminal_Index_Set then
+               case K.Label is
+               when Shared_Terminal =>
+                  Min_Terminal_Index_Set := True;
+                  N.Min_Terminal_Index   := K.Terminal;
+
+               when Virtual_Terminal | Virtual_Identifier =>
+                  null;
+
+               when Nonterm =>
+                  if K.Min_Terminal_Index /= Invalid_Token_Index then
+                     --  not an empty nonterm
+                     Min_Terminal_Index_Set := True;
+                     N.Min_Terminal_Index   := K.Min_Terminal_Index;
+                  end if;
+               end case;
+            end if;
+
+            case K.Label is
+            when Shared_Terminal =>
+               if N.Max_Terminal_Index < K.Terminal then
+                  N.Max_Terminal_Index := K.Terminal;
+               end if;
+
+            when Virtual_Terminal | Virtual_Identifier =>
+               null;
+
+            when Nonterm =>
+               if K.Max_Terminal_Index /= Invalid_Token_Index and then
+                 --  not an empty nonterm
+                 N.Max_Terminal_Index < K.Max_Terminal_Index
+               then
+                  N.Max_Terminal_Index := K.Max_Terminal_Index;
+               end if;
+            end case;
+         end;
+
+         J := J + 1;
+      end loop;
+   end Set_Children;
+
+   procedure Set_Children
+     (Tree     : in out Syntax_Trees.Tree;
+      Node     : in     Valid_Node_Index;
+      New_ID   : in     WisiToken.Production_ID;
+      Children : in     Valid_Node_Index_Array)
+   is
+      use all type SAL.Base_Peek_Type;
+      Parent_Node : Syntax_Trees.Node renames Tree.Shared_Tree.Nodes (Node);
+
+      J : Positive_Index_Type := Positive_Index_Type'First;
+   begin
+      Parent_Node.ID        := New_ID.LHS;
+      Parent_Node.RHS_Index := New_ID.RHS;
+      Parent_Node.Action    := null;
+
+      Parent_Node.Children.Set_Length (Children'Length);
+      for I in Children'Range loop
+         --  We don't update Min/Max_terminal_index; we assume Set_Children is
+         --  only called after parsing is done, so they are no longer needed.
+         Parent_Node.Children (J) := Children (I);
+         Tree.Shared_Tree.Nodes (Children (I)).Parent := Node;
+         J := J + 1;
+      end loop;
+   end Set_Children;
+
+   procedure Set_State
+     (Tree  : in out Syntax_Trees.Tree;
+      Node  : in     Valid_Node_Index;
+      State : in     State_Index)
+   is begin
+      if Tree.Flush then
+         Tree.Shared_Tree.Nodes (Node).State := State;
+      else
+         if Node <= Tree.Last_Shared_Node then
+            Tree.Shared_Tree.Nodes (Node).State := State;
+         else
+            Tree.Branched_Nodes (Node).State := State;
+         end if;
+      end if;
+   end Set_State;
+
+   procedure Set_Flush_False (Tree : in out Syntax_Trees.Tree)
+   is begin
+      Tree.Flush := False;
+      Tree.Branched_Nodes.Set_First (Tree.Last_Shared_Node + 1);
+   end Set_Flush_False;
+
+   procedure Set_Name_Region
+     (Tree   : in out Syntax_Trees.Tree;
+      Node   : in     Valid_Node_Index;
+      Region : in     Buffer_Region)
+   is begin
+      if Tree.Flush then
+         Tree.Shared_Tree.Nodes (Node).Name := Region;
+
+      else
+         if Node <= Tree.Last_Shared_Node then
+            Move_Branch_Point (Tree, Node);
+         end if;
+
+         Tree.Branched_Nodes (Node).Name := Region;
+      end if;
+   end Set_Name_Region;
+
+   function Terminal (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Base_Token_Index
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).Terminal;
+      else
+         return Tree.Branched_Nodes (Node).Terminal;
+      end if;
+   end Terminal;
+
+   function Traversing (Tree : in Syntax_Trees.Tree) return Boolean
+   is begin
+      return Tree.Shared_Tree.Traversing;
+   end Traversing;
+
+   function Recover_Token
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Recover_Token
+   is
+      function Compute (N : Syntax_Trees.Node) return WisiToken.Recover_Token
+      is begin
+         case N.Label is
+         when Shared_Terminal =>
+            return
+              (ID                 => N.ID,
+               Byte_Region        => N.Byte_Region,
+               Min_Terminal_Index => N.Terminal,
+               Name               => Null_Buffer_Region,
+               Virtual            => False);
+
+         when Virtual_Terminal | Virtual_Identifier =>
+            return
+              (ID                 => N.ID,
+               Byte_Region        => Null_Buffer_Region,
+               Min_Terminal_Index => Invalid_Token_Index,
+               Name               => Null_Buffer_Region,
+               Virtual            => True);
+
+         when Nonterm =>
+            return
+              (ID                 => N.ID,
+               Byte_Region        => N.Byte_Region,
+               Min_Terminal_Index => N.Min_Terminal_Index,
+               Name               => N.Name,
+               Virtual            => N.Virtual);
+         end case;
+      end Compute;
+   begin
+      return Compute
+        ((if Node <= Tree.Last_Shared_Node
+          then Tree.Shared_Tree.Nodes (Node)
+          else Tree.Branched_Nodes (Node)));
+   end Recover_Token;
+
+   function Recover_Token_Array
+     (Tree  : in Syntax_Trees.Tree;
+      Nodes : in Valid_Node_Index_Array)
+     return WisiToken.Recover_Token_Array
+   is begin
+      return Result : WisiToken.Recover_Token_Array (Nodes'First .. 
Nodes'Last) do
+         for I in Result'Range loop
+            Result (I) := Tree.Recover_Token (Nodes (I));
+         end loop;
+      end return;
+   end Recover_Token_Array;
+
+   function State (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Unknown_State_Index
+   is begin
+      if Node <= Tree.Last_Shared_Node then
+         return Tree.Shared_Tree.Nodes (Node).State;
+      else
+         return Tree.Branched_Nodes (Node).State;
+      end if;
+   end State;
+
+end WisiToken.Syntax_Trees;
diff --git a/packages/wisi/wisitoken-syntax_trees.ads 
b/packages/wisi/wisitoken-syntax_trees.ads
index d5cbec1..dcca9b4 100644
--- a/packages/wisi/wisitoken-syntax_trees.ads
+++ b/packages/wisi/wisitoken-syntax_trees.ads
@@ -1,431 +1,567 @@
---  Abstract :
---
---  Syntax tree type and operations.
---
---  Rationale :
---
---  We provide Base_Tree and Tree in one package, because only Tree
---  needs an API; the only way Base_Tree is accessed is via Tree.
---
---  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
-
---  There is one syntax tree for each parser. There is one shared
---  Terminals array, matching the actual input text.
---
---  Copyright (C) 2018 Free Software Foundation, Inc.
---
---  This library is free software;  you can redistribute it and/or modify it
---  under terms of the  GNU General Public License  as published by the Free
---  Software  Foundation;  either version 3,  or (at your  option) any later
---  version. This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
---  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
-
-pragma License (Modified_GPL);
-
-with Ada.Finalization;
-with SAL.Gen_Unbounded_Definite_Vectors;
-with WisiToken.Lexer;
-package WisiToken.Syntax_Trees is
-
-   type Base_Tree is new Ada.Finalization.Controlled with private;
-
-   type Base_Tree_Access is access all Base_Tree;
-
-   overriding procedure Finalize (Tree : in out Base_Tree);
-   --  Free any allocated storage.
-
-   overriding procedure Adjust (Tree : in out Base_Tree);
-   --  Copy any allocated storage.
-
-   type Tree is tagged private;
-
-   procedure Initialize
-     (Branched_Tree : in out Tree;
-      Shared_Tree   : in     Base_Tree_Access;
-      Flush         : in     Boolean);
-   --  Set Branched_Tree to refer to Shared_Tree.
-
-   type Node_Index is range 0 .. Integer'Last;
-   subtype Valid_Node_Index is Node_Index range 1 .. Node_Index'Last;
-
-   Invalid_Node_Index : constant Node_Index := Node_Index'First;
-
-   type Valid_Node_Index_Array is array (Positive_Index_Type range <>) of 
Valid_Node_Index;
-   --  Index matches Base_Token_Array, Augmented_Token_Array
-
-   package Valid_Node_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Positive_Index_Type, Valid_Node_Index, Default_Element => 
Valid_Node_Index'First);
-   --  Index matches Valid_Node_Index_Array.
-
-   type Node_Label is (Shared_Terminal, Virtual_Terminal, Nonterm);
-
-   type User_Data_Type is tagged limited null record;
-   --  Many test languages don't need this, so we default the procedures
-   --  to null.
-
-   type User_Data_Access is access all User_Data_Type'Class;
-
-   procedure Set_Lexer_Terminals
-     (User_Data : in out User_Data_Type;
-      Lexer     : in     WisiToken.Lexer.Handle;
-      Terminals : in     Base_Token_Array_Access)
-   is null;
-
-   procedure Reset (User_Data : in out User_Data_Type) is null;
-   --  Reset to start a new parse.
-
-   procedure Lexer_To_Augmented
-     (User_Data  : in out          User_Data_Type;
-      Token      : in              Base_Token;
-      Lexer      : not null access WisiToken.Lexer.Instance'Class)
-     is null;
-   --  Read auxiliary data from Lexer, create an Augmented_Token, store
-   --  it in User_Data. Called before parsing, once for each token in the
-   --  input stream.
-
-   procedure Delete_Token
-     (User_Data   : in out User_Data_Type;
-      Token_Index : in     WisiToken.Token_Index)
-   is null;
-   --  Token at Token_Index was deleted in error recovery; update
-   --  remaining tokens and Tree as needed. Called from Execute_Actions
-   --  for each deleted token, before processing the syntax tree.
-
-   procedure Reduce
-     (User_Data : in out User_Data_Type;
-      Tree      : in out Syntax_Trees.Tree'Class;
-      Nonterm   : in     Valid_Node_Index;
-      Tokens    : in     Valid_Node_Index_Array)
-   is null;
-   --  Reduce Tokens to Nonterm. Nonterm.Byte_Region is computed by
-   --  caller.
-
-   type Semantic_Action is access procedure
-     (User_Data : in out User_Data_Type'Class;
-      Tree      : in out Syntax_Trees.Tree;
-      Nonterm   : in     Valid_Node_Index;
-      Tokens    : in     Valid_Node_Index_Array);
-   --  Routines of this type are called by
-   --  WisiToken.LR.Parser.Execute_Actions when it processes a Nonterm
-   --  node in the syntax tree. Tokens are the children of Nonterm.
-
-   Null_Action : constant Semantic_Action := null;
-
-   procedure Clear (Tree : in out Syntax_Trees.Base_Tree);
-   procedure Clear (Tree : in out Syntax_Trees.Tree);
-   --  Delete all Elements and free associated memory; keep results of
-   --  Initialize.
-
-   procedure Flush (Tree : in out Syntax_Trees.Tree);
-   --  Move all nodes in branched part to shared tree, set Flush mode
-   --  True.
-
-   procedure Set_Flush_False (Tree : in out Syntax_Trees.Tree);
-   --  Set Flush mode False; use Flush to set True.
-
-   function Flushed (Tree : in Syntax_Trees.Tree) return Boolean;
-
-   function Add_Nonterm
-     (Tree            : in out Syntax_Trees.Tree;
-      Production      : in     Production_ID;
-      Children        : in     Valid_Node_Index_Array;
-      Action          : in     Semantic_Action;
-      Default_Virtual : in     Boolean)
-     return Valid_Node_Index
-   with
-     Pre  => not Tree.Traversing,
-     Post => Tree.Is_Empty (Add_Nonterm'Result) or
-             Tree.Min_Terminal_Index (Add_Nonterm'Result) /= 
Invalid_Token_Index;
-   --  Add a new Nonterm node, which can be empty. Result points to the
-   --  added node. If Children'Length = 0, set Nonterm.Virtual :=
-   --  Default_Virtual.
-
-   function Add_Terminal
-     (Tree      : in out Syntax_Trees.Tree;
-      Terminal  : in     Token_Index;
-      Terminals : in     Base_Token_Arrays.Vector)
-     return Valid_Node_Index
-   with Pre => not Tree.Traversing;
-   --  Add a new Terminal node. Terminal must be an index into Terminals.
-   --  Result points to the added node.
-
-   function Add_Terminal
-     (Tree     : in out Syntax_Trees.Tree;
-      Terminal : in     Token_ID)
-     return Valid_Node_Index
-   with Pre => not Tree.Traversing;
-   --  Add a new virtual terminal node with no parent. Result points to
-   --  the added node.
-
-   procedure Set_State
-     (Tree  : in out Syntax_Trees.Tree;
-      Node  : in     Valid_Node_Index;
-      State : in     State_Index);
-
-   function State (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Unknown_State_Index;
-
-   function Label (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Label;
-
-   function Children (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Valid_Node_Index_Array
-   with Pre => Tree.Is_Nonterm (Node);
-
-   function Has_Branched_Nodes (Tree : in Syntax_Trees.Tree) return Boolean;
-   function Has_Children (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
-   function Has_Parent (Tree : in Syntax_Trees.Tree; Child : in 
Valid_Node_Index) return Boolean;
-   function Has_Parent (Tree : in Syntax_Trees.Tree; Children : in 
Valid_Node_Index_Array) return Boolean;
-   function Is_Empty (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Boolean;
-   function Is_Nonterm (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
-   function Is_Terminal (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
-   function Is_Virtual (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
-   function Traversing (Tree : in Syntax_Trees.Tree) return Boolean;
-
-   function Parent (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Index;
-
-   procedure Set_Name_Region
-     (Tree   : in out Syntax_Trees.Tree;
-      Node   : in     Valid_Node_Index;
-      Region : in     Buffer_Region)
-   with Pre => Tree.Is_Nonterm (Node);
-
-   function ID
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return WisiToken.Token_ID;
-
-   function Byte_Region
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return WisiToken.Buffer_Region;
-
-   function Same_Token
-     (Tree_1  : in Syntax_Trees.Tree'Class;
-      Index_1 : in Valid_Node_Index;
-      Tree_2  : in Syntax_Trees.Tree'Class;
-      Index_2 : in Valid_Node_Index)
-     return Boolean;
-   --  True if the two tokens have the same ID and Byte_Region.
-
-   function Recover_Token
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return WisiToken.Recover_Token;
-
-   function Recover_Token_Array
-     (Tree  : in Syntax_Trees.Tree;
-      Nodes : in Valid_Node_Index_Array)
-     return WisiToken.Recover_Token_Array;
-   --  For non-virtual terminals, copied from Tree.Terminals. For others,
-   --  constructed from Tree data.
-
-   procedure Set_Augmented
-     (Tree  : in out Syntax_Trees.Tree;
-      Node  : in     Valid_Node_Index;
-      Value : in     Base_Token_Class_Access)
-   with Pre => Tree.Is_Nonterm (Node);
-   --  Value will be deallocated when Tree is finalized.
-
-   function Augmented
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return Base_Token_Class_Access
-   with Pre => Tree.Is_Nonterm (Node);
-   --  Returns result of Set_Augmented.
-
-   function Action
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index)
-     return Semantic_Action
-   with Pre => Tree.Is_Nonterm (Node);
-
-   function Find_Ancestor
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index;
-   --  Return the ancestor of Node that contains ID, or Invalid_Node_Index if
-   --  none match.
-
-   function Find_Sibling
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   with Pre => Tree.Has_Parent (Node);
-   --  Return the sibling of Node that contains ID, or Invalid_Node_Index if
-   --  none match.
-
-   function Find_Child
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index
-   with Pre => Tree.Is_Nonterm (Node);
-   --  Return the child of Node whose ID is ID, or Invalid_Node_Index if
-   --  none match.
-
-   function Find_Descendant
-     (Tree : in Syntax_Trees.Tree;
-      Node : in Valid_Node_Index;
-      ID   : in Token_ID)
-     return Node_Index;
-   --  Return the descendant of Node (may be Node) whose ID is ID, or
-   --  Invalid_Node_Index if none match.
-
-   function Find_Min_Terminal_Index
-     (Tree  : in Syntax_Trees.Tree;
-      Index : in Token_Index)
-     return Node_Index
-   with Post => Find_Min_Terminal_Index'Result = Invalid_Node_Index or else
-                Tree.Is_Nonterm (Find_Min_Terminal_Index'Result);
-   --  Return the first node whose Min_Terminal_Index is Index, or
-   --  Invalid_Node_Index if none match.
-
-   function Find_Max_Terminal_Index
-     (Tree  : in Syntax_Trees.Tree;
-      Index : in Token_Index)
-     return Node_Index
-   with Post => Find_Max_Terminal_Index'Result = Invalid_Node_Index or else
-                Tree.Is_Nonterm (Find_Max_Terminal_Index'Result);
-   --  Return the first node whose Max_Terminal_Index is Index, or
-   --  Invalid_Node_Index if none match.
-
-   procedure Set_Root (Tree : in out Syntax_Trees.Tree; Root : in 
Valid_Node_Index);
-
-   function Root (Tree : in Syntax_Trees.Tree) return Node_Index;
-   --  Return value set by Set_Root; defaults to the last node added.
-   --  returns Invalid_Node_Index if Tree is empty.
-
-   procedure Process_Tree
-     (Tree         : in out Syntax_Trees.Tree;
-      Process_Node : access procedure
-        (Tree : in out Syntax_Trees.Tree;
-         Node : in     Valid_Node_Index));
-   --  Traverse Tree in depth-first order, calling Process_Node on each
-   --  node, starting at Tree.Root.
-
-   function Terminal (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Base_Token_Index
-   with Pre => Tree.Is_Terminal (Node);
-
-   function Min_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index;
-   function Max_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index;
-   --  Returns lowest/highest index of shared terminal in subtree under
-   --  Node. If result is Invalid_Token_Index, all terminals are virtual,
-   --  or a nonterm is empty.
-
-   function Get_Terminals (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Valid_Node_Index_Array;
-
-   function Get_Terminal_IDs (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID_Array;
-
-   function Image
-     (Tree             : in Syntax_Trees.Tree;
-      Node             : in Valid_Node_Index;
-      Descriptor       : in WisiToken.Descriptor;
-      Include_Children : in Boolean := False)
-     return String;
-   function Image
-     (Tree       : in Syntax_Trees.Tree;
-      Nodes      : in Valid_Node_Index_Array;
-      Descriptor : in WisiToken.Descriptor)
-     return String;
-   --  For debug and error messages.
-
-   procedure Print_Tree (Tree : in Syntax_Trees.Tree; Descriptor : in 
WisiToken.Descriptor)
-   with Pre => Tree.Flushed;
-   --  To Text_IO.Current_Output, for debugging.
-
-private
-
-   type Node (Label : Node_Label := Virtual_Terminal) is
-   --  Label has a default to allow use with Ada.Containers.Vectors; all
-   --  entries are the same size.
-   record
-      ID : WisiToken.Token_ID := Invalid_Token_ID;
-
-      Byte_Region : Buffer_Region := Null_Buffer_Region;
-      --  Computed by Set_Children, used in Semantic_Check actions and debug
-      --  messages.
-
-      Parent : Node_Index := Invalid_Node_Index;
-
-      State : Unknown_State_Index := Unknown_State;
-      --  Parse state that was on stack with this token, to allow undoing a
-      --  reduce.
-
-      case Label is
-      when Shared_Terminal =>
-         Terminal : Token_Index;
-
-      when Virtual_Terminal =>
-         null;
-
-      when Nonterm =>
-         Virtual : Boolean := False;
-         --  True if any child node is Virtual_Terminal or Nonterm with Virtual
-         --  set. Used by Semantic_Check actions.
-
-         RHS_Index : Natural;
-         --  With ID, index into Productions.
-         --  Used for debug output, keep for future use.
-
-         Action : Semantic_Action := null;
-
-         Name : Buffer_Region := Null_Buffer_Region;
-         --  Name is set and checked by Semantic_Check actions.
-
-         Children : Valid_Node_Index_Arrays.Vector;
-
-         Min_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
-         --  Cached for push_back of nonterminals during recovery
-
-         Max_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
-         --  Cached for building a WisiToken tree from a libadalang tree.
-
-         Augmented : Base_Token_Class_Access := null;
-      end case;
-   end record;
-
-   subtype Nonterm_Node is Node (Nonterm);
-
-   package Node_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Valid_Node_Index, Node, Default_Element => (others => <>));
-
-   type Base_Tree is new Ada.Finalization.Controlled with record
-      Nodes : Node_Arrays.Vector;
-      --  During normal parsing, tokens are added to Nodes by "parallel"
-      --  LALR parsers, but they are all run from one Ada task, so there's
-      --  no need for Nodes to be Protected. Packrat parsing also has a
-      --  single Ada task.
-      --
-      --  During McKenzie_Recover, the syntax tree is not modified.
-
-      Augmented_Present : Boolean := False;
-      --  True if Set_Augmented has been called on any node.
-      --  Declared in Base_Tree because used by Base_Tree.Adjust.
-
-      Traversing : Boolean := False;
-      --  True while traversing tree in Process_Tree.
-      --  Declared in Base_Tree so it is cleared by Finalize.
-
-   end record;
-
-   type Tree is tagged record
-      Shared_Tree : Base_Tree_Access;
-      --  If we need to set anything (ie parent) in Shared_Tree, we move the
-      --  branch point instead, unless Flush = True.
-
-      Last_Shared_Node : Node_Index := Invalid_Node_Index;
-      Branched_Nodes   : Node_Arrays.Vector;
-      Flush            : Boolean    := False;
-      --  We maintain Last_Shared_Node when Flush is True, so subprograms
-      --  that have no reason to check Flush can rely on Last_Shared_Node.
-
-      Root : Node_Index := Invalid_Node_Index;
-   end record with
-     Type_Invariant => (if Tree.Flush then not Tree.Has_Branched_Nodes);
-
-end WisiToken.Syntax_Trees;
+--  Abstract :
+--
+--  Syntax tree type and operations.
+--
+--  Rationale :
+--
+--  We provide Base_Tree and Tree in one package, because only Tree
+--  needs an API; the only way Base_Tree is accessed is via Tree.
+--
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
+
+--  There is one syntax tree for each parser. There is one shared
+--  Terminals array, matching the actual input text.
+--
+--  Copyright (C) 2018 Free Software Foundation, Inc.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+
+pragma License (Modified_GPL);
+
+with Ada.Finalization;
+with SAL.Gen_Unbounded_Definite_Vectors;
+with WisiToken.Lexer;
+package WisiToken.Syntax_Trees is
+
+   type Base_Tree is new Ada.Finalization.Controlled with private;
+
+   type Base_Tree_Access is access all Base_Tree;
+
+   overriding procedure Finalize (Tree : in out Base_Tree);
+   --  Free any allocated storage.
+
+   type Tree is new Ada.Finalization.Controlled with private;
+
+   procedure Initialize
+     (Branched_Tree : in out Tree;
+      Shared_Tree   : in     Base_Tree_Access;
+      Flush         : in     Boolean);
+   --  Set Branched_Tree to refer to Shared_Tree.
+
+   overriding procedure Finalize (Tree : in out Syntax_Trees.Tree);
+   --  Free any allocated storage.
+
+   type Node_Index is range 0 .. Integer'Last;
+   subtype Valid_Node_Index is Node_Index range 1 .. Node_Index'Last;
+
+   Invalid_Node_Index : constant Node_Index := Node_Index'First;
+
+   type Valid_Node_Index_Array is array (Positive_Index_Type range <>) of 
Valid_Node_Index;
+   --  Index matches Base_Token_Array, Augmented_Token_Array
+
+   package Valid_Node_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Positive_Index_Type, Valid_Node_Index, Default_Element => 
Valid_Node_Index'First);
+   --  Index matches Valid_Node_Index_Array.
+
+   type Node_Label is
+     (Shared_Terminal,    -- text is user input, accessed via Parser.Terminals
+      Virtual_Terminal,   -- no text; inserted during error recovery
+      Virtual_Identifier, -- text in user data, created during tree rewrite
+      Nonterm             -- contains terminals/nonterminals/identifiers
+     );
+
+   type User_Data_Type is tagged limited null record;
+   --  Many test languages don't need this, so we default the procedures
+   --  to null.
+
+   type User_Data_Access is access all User_Data_Type'Class;
+
+   procedure Set_Lexer_Terminals
+     (User_Data : in out User_Data_Type;
+      Lexer     : in     WisiToken.Lexer.Handle;
+      Terminals : in     Base_Token_Array_Access)
+   is null;
+
+   procedure Reset (User_Data : in out User_Data_Type) is null;
+   --  Reset to start a new parse.
+
+   procedure Initialize_Actions
+     (User_Data : in out User_Data_Type;
+      Tree      : in     Syntax_Trees.Tree'Class)
+     is null;
+   --  Called by Execute_Actions, before processing the tree.
+
+   procedure Lexer_To_Augmented
+     (User_Data : in out          User_Data_Type;
+      Token     : in              Base_Token;
+      Lexer     : not null access WisiToken.Lexer.Instance'Class)
+     is null;
+   --  Read auxiliary data from Lexer, do something useful with it.
+   --  Called before parsing, once for each token in the input stream.
+
+   procedure Delete_Token
+     (User_Data   : in out User_Data_Type;
+      Token_Index : in     WisiToken.Token_Index)
+   is null;
+   --  Token at Token_Index was deleted in error recovery; update
+   --  remaining tokens and Tree as needed. Called from Execute_Actions
+   --  for each deleted token, before processing the syntax tree.
+
+   procedure Reduce
+     (User_Data : in out User_Data_Type;
+      Tree      : in out Syntax_Trees.Tree'Class;
+      Nonterm   : in     Valid_Node_Index;
+      Tokens    : in     Valid_Node_Index_Array)
+   is null;
+   --  Reduce Tokens to Nonterm. Nonterm.Byte_Region is computed by
+   --  caller.
+
+   type Semantic_Action is access procedure
+     (User_Data : in out User_Data_Type'Class;
+      Tree      : in out Syntax_Trees.Tree;
+      Nonterm   : in     Valid_Node_Index;
+      Tokens    : in     Valid_Node_Index_Array);
+   --  Routines of this type are called by
+   --  WisiToken.LR.Parser.Execute_Actions when it processes a Nonterm
+   --  node in the syntax tree. Tokens are the children of Nonterm.
+
+   Null_Action : constant Semantic_Action := null;
+
+   procedure Clear (Tree : in out Syntax_Trees.Base_Tree);
+   procedure Clear (Tree : in out Syntax_Trees.Tree);
+   --  Delete all Elements and free associated memory; keep results of
+   --  Initialize.
+
+   procedure Flush (Tree : in out Syntax_Trees.Tree);
+   --  Move all nodes in branched part to shared tree, set Flush mode
+   --  True.
+
+   procedure Set_Flush_False (Tree : in out Syntax_Trees.Tree);
+   --  Set Flush mode False; use Flush to set True.
+
+   function Flushed (Tree : in Syntax_Trees.Tree) return Boolean;
+
+   function Copy_Subtree
+     (Tree : in out Syntax_Trees.Tree;
+      Root : in     Valid_Node_Index;
+      Last : in     Valid_Node_Index)
+     return Valid_Node_Index
+   with Pre => Tree.Flushed;
+   --  Deep copy (into Tree) subtree of Tree rooted at Root. Stop copying
+   --  after children of Last are copied. Return root of new subtree.
+   --
+   --  Node index order is preserved. References to objects external to
+   --  tree are shallow copied.
+
+   function Add_Nonterm
+     (Tree            : in out Syntax_Trees.Tree;
+      Production      : in     Production_ID;
+      Children        : in     Valid_Node_Index_Array;
+      Action          : in     Semantic_Action := null;
+      Default_Virtual : in     Boolean         := False)
+     return Valid_Node_Index
+   with Pre  => not Tree.Traversing;
+   --  Add a new Nonterm node, which can be empty. Result points to the
+   --  added node. If Children'Length = 0, set Nonterm.Virtual :=
+   --  Default_Virtual.
+
+   function Add_Terminal
+     (Tree      : in out Syntax_Trees.Tree;
+      Terminal  : in     Token_Index;
+      Terminals : in     Base_Token_Arrays.Vector)
+     return Valid_Node_Index
+   with Pre => not Tree.Traversing;
+   --  Add a new Terminal node. Terminal must be an index into Terminals.
+   --  Result points to the added node.
+
+   function Add_Terminal
+     (Tree     : in out Syntax_Trees.Tree;
+      Terminal : in     Token_ID)
+     return Valid_Node_Index
+   with Pre => not Tree.Traversing;
+   --  Add a new Virtual_Terminal node with no parent. Result points to
+   --  the added node.
+
+   function Add_Identifier
+     (Tree        : in out Syntax_Trees.Tree;
+      ID          : in     Token_ID;
+      Identifier  : in     Identifier_Index;
+      Byte_Region : in     WisiToken.Buffer_Region)
+     return Valid_Node_Index
+   with Pre => Tree.Flushed and (not Tree.Traversing);
+   --  Add a new Virtual_Identifier node with no parent. Byte_Region
+   --  should point to an area in the source buffer related to the new
+   --  identifier, to aid debugging. Result points to the added node.
+
+   procedure Add_Child
+     (Tree   : in out Syntax_Trees.Tree;
+      Parent : in     Valid_Node_Index;
+      Child  : in     Valid_Node_Index)
+   with
+     Pre => Tree.Flushed and
+            (not Tree.Traversing) and
+            Tree.Is_Nonterm (Parent);
+   --  Child.Parent must already be set.
+
+   procedure Set_Children
+     (Tree     : in out Syntax_Trees.Tree;
+      Node     : in     Valid_Node_Index;
+      New_ID : in WisiToken.Production_ID;
+      Children : in     Valid_Node_Index_Array)
+   with
+     Pre => Tree.Flushed and
+            (not Tree.Traversing) and
+            Tree.Is_Nonterm (Node);
+   --  Set ID of Node to New_ID, and children to Children; set parent of
+   --  Children to Node. Remove any Action.
+   --
+   --  New_ID is required, and Action removed, because this is most
+   --  likely a different production.
+
+   procedure Set_Node_Identifier
+     (Tree       : in Syntax_Trees.Tree;
+      Node       : in Valid_Node_Index;
+      ID         : in Token_ID;
+      Identifier : in Identifier_Index)
+   with Pre => Tree.Flushed and
+               Tree.Is_Nonterm (Node);
+   --  Change Node to a Virtual_Identifier.
+
+   procedure Set_State
+     (Tree  : in out Syntax_Trees.Tree;
+      Node  : in     Valid_Node_Index;
+      State : in     State_Index);
+
+   function State (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Unknown_State_Index;
+
+   function Label (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Node_Label;
+
+   function Children (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Valid_Node_Index_Array
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function Child
+     (Tree        : in Syntax_Trees.Tree;
+      Node        : in Valid_Node_Index;
+      Child_Index : in Positive_Index_Type)
+     return Node_Index
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function Has_Branched_Nodes (Tree : in Syntax_Trees.Tree) return Boolean;
+   function Has_Children (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
+   function Has_Parent (Tree : in Syntax_Trees.Tree; Child : in 
Valid_Node_Index) return Boolean;
+   function Has_Parent (Tree : in Syntax_Trees.Tree; Children : in 
Valid_Node_Index_Array) return Boolean;
+   function Is_Empty (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Boolean;
+   function Is_Nonterm (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
+   function Is_Terminal (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
+   function Is_Virtual (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
+   function Is_Virtual_Identifier (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Boolean;
+   function Traversing (Tree : in Syntax_Trees.Tree) return Boolean;
+
+   function Parent
+     (Tree  : in Syntax_Trees.Tree;
+      Node  : in Valid_Node_Index;
+      Count : in Positive := 1)
+     return Node_Index;
+   --  Return Count parent of Node.
+
+   procedure Set_Name_Region
+     (Tree   : in out Syntax_Trees.Tree;
+      Node   : in     Valid_Node_Index;
+      Region : in     Buffer_Region)
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function ID
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Token_ID;
+
+   function Production_ID
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Production_ID
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function Byte_Region
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Buffer_Region;
+
+   function RHS_Index
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Natural
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function Same_Token
+     (Tree_1  : in Syntax_Trees.Tree'Class;
+      Index_1 : in Valid_Node_Index;
+      Tree_2  : in Syntax_Trees.Tree'Class;
+      Index_2 : in Valid_Node_Index)
+     return Boolean;
+   --  True if the two tokens have the same ID and Byte_Region.
+
+   function Recover_Token
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return WisiToken.Recover_Token;
+
+   function Recover_Token_Array
+     (Tree  : in Syntax_Trees.Tree;
+      Nodes : in Valid_Node_Index_Array)
+     return WisiToken.Recover_Token_Array;
+   --  For non-virtual terminals, copied from Tree.Terminals. For others,
+   --  constructed from Tree data.
+
+   procedure Set_Augmented
+     (Tree  : in out Syntax_Trees.Tree;
+      Node  : in     Valid_Node_Index;
+      Value : in     Base_Token_Class_Access)
+   with Pre => Tree.Is_Nonterm (Node);
+   --  Value will be deallocated when Tree is finalized.
+
+   function Augmented
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Base_Token_Class_Access
+   with Pre => Tree.Is_Nonterm (Node);
+   --  Returns result of Set_Augmented.
+
+   function Action
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index)
+     return Semantic_Action
+   with Pre => Tree.Is_Nonterm (Node);
+
+   function Find_Ancestor
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index;
+   function Find_Ancestor
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      IDs  : in Token_ID_Array)
+     return Node_Index;
+   --  Return the ancestor of Node that contains ID, or Invalid_Node_Index if
+   --  none match.
+
+   function Find_Sibling
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   with Pre => Tree.Has_Parent (Node);
+   --  Return the sibling of Node that contains ID, or Invalid_Node_Index if
+   --  none match.
+
+   function Find_Child
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index
+   with Pre => Tree.Is_Nonterm (Node);
+   --  Return the child of Node whose ID is ID, or Invalid_Node_Index if
+   --  none match.
+
+   function Find_Descendant
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Node_Index;
+   --  Return the descendant of Node (may be Node) whose ID is ID, or
+   --  Invalid_Node_Index if none match.
+
+   function Find_Min_Terminal_Index
+     (Tree  : in Syntax_Trees.Tree;
+      Index : in Token_Index)
+     return Node_Index
+   with Post => Find_Min_Terminal_Index'Result = Invalid_Node_Index or else
+                Tree.Is_Nonterm (Find_Min_Terminal_Index'Result);
+   --  Return the first node whose Min_Terminal_Index is Index, or
+   --  Invalid_Node_Index if none match.
+
+   function Find_Max_Terminal_Index
+     (Tree  : in Syntax_Trees.Tree;
+      Index : in Token_Index)
+     return Node_Index
+   with Post => Find_Max_Terminal_Index'Result = Invalid_Node_Index or else
+                Tree.Is_Nonterm (Find_Max_Terminal_Index'Result);
+   --  Return the first node whose Max_Terminal_Index is Index, or
+   --  Invalid_Node_Index if none match.
+
+   procedure Set_Root (Tree : in out Syntax_Trees.Tree; Root : in 
Valid_Node_Index);
+
+   function Root (Tree : in Syntax_Trees.Tree) return Node_Index;
+   --  Return value set by Set_Root; defaults to the last node added.
+   --  returns Invalid_Node_Index if Tree is empty.
+
+   procedure Process_Tree
+     (Tree         : in out Syntax_Trees.Tree;
+      Process_Node : access procedure
+        (Tree : in out Syntax_Trees.Tree;
+         Node : in     Valid_Node_Index);
+      Root         : in     Node_Index := Invalid_Node_Index);
+   --  Traverse subtree of Tree rooted at Root (default Tree.Root) in
+   --  depth-first order, calling Process_Node on each node.
+
+   function Identifier (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Identifier_Index
+   with Pre => Tree.Is_Virtual_Identifier (Node);
+
+   function Terminal (Tree : in Syntax_Trees.Tree; Node : in Valid_Node_Index) 
return Base_Token_Index
+   with Pre => Tree.Is_Terminal (Node);
+
+   function Min_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index;
+   function Max_Terminal_Index (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Base_Token_Index;
+   --  Returns lowest/highest index of shared terminal in subtree under
+   --  Node. If result is Invalid_Token_Index, all terminals are virtual,
+   --  or a nonterm is empty.
+
+   function Get_Terminals (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Valid_Node_Index_Array;
+   --  Return sequence of terminals in Node.
+   --
+   --  "Terminals" can be Shared_Terminal, Virtual_Terminal,
+   --  Virtual_Identifier.
+
+   function Get_Terminal_IDs (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID_Array;
+   --  Same as Get_Terminals, but return the IDs.
+
+   function First_Terminal_ID (Tree : in Syntax_Trees.Tree; Node : in 
Valid_Node_Index) return Token_ID;
+   --  First of Get_Terminal_IDs
+
+   function Get_IDs
+     (Tree : in Syntax_Trees.Tree;
+      Node : in Valid_Node_Index;
+      ID   : in Token_ID)
+     return Valid_Node_Index_Array;
+   --  Return all descendants of Node matching ID.
+
+   function Image
+     (Tree             : in Syntax_Trees.Tree;
+      Node             : in Valid_Node_Index;
+      Descriptor       : in WisiToken.Descriptor;
+      Include_Children : in Boolean := False)
+     return String;
+   function Image
+     (Tree       : in Syntax_Trees.Tree;
+      Nodes      : in Valid_Node_Index_Array;
+      Descriptor : in WisiToken.Descriptor)
+     return String;
+   --  For debug and error messages.
+
+   function First_Index (Tree : in Syntax_Trees.Tree) return Node_Index;
+   function Last_Index (Tree : in Syntax_Trees.Tree) return Node_Index;
+
+   package Node_Sets is new SAL.Gen_Unbounded_Definite_Vectors 
(Valid_Node_Index, Boolean, Default_Element => False);
+
+   function Image
+     (Item     : in Node_Sets.Vector;
+      Inverted : in Boolean := False)
+     return String;
+   --  Simple list of numbers, for debugging
+
+   procedure Print_Tree
+     (Tree       : in Syntax_Trees.Tree;
+      Descriptor : in WisiToken.Descriptor;
+      Root       : in Node_Index := Invalid_Node_Index)
+   with Pre => Tree.Flushed;
+   --  Print tree rooted at Root (default Tree.Root) to
+   --  Text_IO.Current_Output, for debugging.
+
+private
+
+   type Node (Label : Node_Label := Virtual_Terminal) is
+   --  Label has a default to allow changing the label during tree editing.
+   record
+      ID : WisiToken.Token_ID := Invalid_Token_ID;
+
+      Byte_Region : Buffer_Region := Null_Buffer_Region;
+      --  Computed by Set_Children, used in Semantic_Check actions and debug
+      --  messages.
+
+      Parent : Node_Index := Invalid_Node_Index;
+
+      State : Unknown_State_Index := Unknown_State;
+      --  Parse state that was on stack with this token, to allow undoing a
+      --  reduce.
+
+      case Label is
+      when Shared_Terminal =>
+         Terminal : Token_Index; -- into Parser.Terminals
+
+      when Virtual_Terminal =>
+         null;
+
+      when Virtual_Identifier =>
+         Identifier : Identifier_Index; -- into user data
+
+      when Nonterm =>
+         Virtual : Boolean := False;
+         --  True if any child node is Virtual_Terminal or Nonterm with Virtual
+         --  set. Used by Semantic_Check actions.
+
+         RHS_Index : Natural;
+         --  With ID, index into Productions.
+         --  Used for debug output, keep for future use.
+
+         Action : Semantic_Action := null;
+
+         Name : Buffer_Region := Null_Buffer_Region;
+         --  Name is set and checked by Semantic_Check actions.
+
+         Children : Valid_Node_Index_Arrays.Vector;
+
+         Min_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
+         --  Cached for push_back of nonterminals during recovery
+
+         Max_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
+         --  Cached for building a WisiToken tree from a libadalang tree.
+
+         Augmented : Base_Token_Class_Access := null;
+      end case;
+   end record;
+
+   subtype Nonterm_Node is Node (Nonterm);
+
+   package Node_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Valid_Node_Index, Node, Default_Element => (others => <>));
+
+   type Base_Tree is new Ada.Finalization.Controlled with record
+      Nodes : Node_Arrays.Vector;
+      --  During normal parsing, tokens are added to Nodes by "parallel"
+      --  LALR parsers, but they are all run from one Ada task, so there's
+      --  no need for Nodes to be Protected. Packrat parsing also has a
+      --  single Ada task.
+      --
+      --  During McKenzie_Recover, which has multiple Ada tasks, the syntax
+      --  tree is read but not modified.
+
+      Augmented_Present : Boolean := False;
+      --  True if Set_Augmented has been called on any node. Declared in
+      --  Base_Tree so it can be checked by Finalize (Base_Tree) and
+      --  Finalize (Tree).
+
+      Traversing : Boolean := False;
+      --  True while traversing tree in Process_Tree.
+      --  Declared in Base_Tree so it is cleared by Finalize.
+
+   end record;
+
+   type Tree is new Ada.Finalization.Controlled with record
+      Shared_Tree : Base_Tree_Access;
+      --  If we need to set anything (ie parent) in Shared_Tree, we move the
+      --  branch point instead, unless Flush = True.
+
+      Last_Shared_Node : Node_Index := Invalid_Node_Index;
+      Branched_Nodes   : Node_Arrays.Vector;
+      Flush            : Boolean    := False;
+      --  If Flush is True, all nodes are in Shared_Tree. Otherwise, all
+      --  greater than Last_Shared_Node are in Branched_Nodes.
+      --
+      --  We maintain Last_Shared_Node when Flush is True or False, so
+      --  subprograms that have no reason to check Flush can rely on
+      --  Last_Shared_Node.
+
+      Root : Node_Index := Invalid_Node_Index;
+   end record with
+     Type_Invariant => (if Tree.Flush then not Tree.Has_Branched_Nodes);
+
+end WisiToken.Syntax_Trees;
diff --git a/packages/wisi/wisitoken.adb b/packages/wisi/wisitoken.adb
index 698c18e..16d9249 100644
--- a/packages/wisi/wisitoken.adb
+++ b/packages/wisi/wisitoken.adb
@@ -72,6 +72,16 @@ package body WisiToken is
       end loop;
    end To_Vector;
 
+   function To_Vector (Item : in Token_ID_Array) return Token_ID_Arrays.Vector
+   is begin
+      return Result : Token_ID_Arrays.Vector do
+         Result.Set_First_Last (Item'First, Item'Last);
+         for I in Item'Range loop
+            Result (I) := Item (I);
+         end loop;
+      end return;
+   end To_Vector;
+
    function Shared_Prefix (A, B : in Token_ID_Arrays.Vector) return Natural
    is
       use all type Ada.Containers.Count_Type;
@@ -214,6 +224,26 @@ package body WisiToken is
       end return;
    end To_Vector;
 
+   function Net_Recursion (A, B : in Recursion) return Recursion
+   is begin
+      return
+        (case A is
+         when None => B,
+         when Single =>
+           (case B is
+            when None => Single,
+            when others => B),
+         when Right =>
+           (case B is
+            when None | Single => Right,
+            when others => B),
+         when Left =>
+           (case B is
+            when None | Single | Left => Left,
+            when others => B),
+         when Middle => Middle);
+   end Net_Recursion;
+
    function Slice (Item : in Token_Array_Token_Set; I : in Token_ID) return 
Token_ID_Set
    is
       Result : Token_ID_Set := (Item'First (2) .. Item'Last (2) => False);
diff --git a/packages/wisi/wisitoken.ads b/packages/wisi/wisitoken.ads
index 4e9d88b..d4652b8 100644
--- a/packages/wisi/wisitoken.ads
+++ b/packages/wisi/wisitoken.ads
@@ -1,450 +1,472 @@
---  Abstract:
---
---  Root of WisiToken lexer/parser generator and exector.
---
---  The token type is an integer subtype, not an enumeration type, to
---  avoid making this package generic, which would make all other
---  packages generic.
---
---  Additional information about a token can be stored in the
---  'augmented' field of the syntax tree; see
---  wisitoken-syntax_trees.ads.
---
---  References:
---
---  [dragon] "Compilers Principles, Techniques, and Tools" by Aho,
---  Sethi, and Ullman (aka: "The [Red] Dragon Book" due to the dragon
---  on the cover).
---
---  Copyright (C) 2009, 2010, 2013 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
---
---  This file is part of the WisiToken package.
---
---  The WisiToken package is free software; you can redistribute it
---  and/or modify it under terms of the GNU General Public License as
---  published by the Free Software Foundation; either version 3, or
---  (at your option) any later version. This library is distributed in
---  the hope that it will be useful, but WITHOUT ANY WARRANTY; without
---  even the implied warranty of MERCHANTABILITY or FITNESS FOR A
---  PARTICULAR PURPOSE.
---
---  As a special exception under Section 7 of GPL version 3, you are granted
---  additional permissions described in the GCC Runtime Library Exception,
---  version 3.1, as published by the Free Software Foundation.
---
---  This software was originally developed with the name OpenToken by
---  the following company, and was released as open-source software as
---  a service to the community:
---
---           FlightSafety International Simulation Systems Division
---                    Broken Arrow, OK  USA  918-259-4000
-
-pragma License (Modified_GPL);
-
-with Ada.Containers;
-with Ada.Strings.Unbounded;
-with Ada.Text_IO;
-with Ada.Unchecked_Deallocation;
-with SAL.Gen_Trimmed_Image;
-with SAL.Gen_Unbounded_Definite_Queues;
-with SAL.Gen_Unbounded_Definite_Vectors.Gen_Image;
-with SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux;
-package WisiToken is
-
-   Partial_Parse : exception; -- a partial parse terminated.
-
-   Syntax_Error : exception; -- no recovery for a syntax error was found
-
-   Parse_Error : exception; -- a non-recoverable non-fatal error was 
encountered; editing the input can fix the error.
-
-   Fatal_Error : exception; -- Error in code or grammar; editing input cannot 
fix error.
-
-   Grammar_Error : exception;
-   --  Grammar file has bad syntax, or grammar is not consistent (ie
-   --  unused tokens, missing productions, invalid actions)
-
-   User_Error : exception; -- other user error (ie command line parameter)
-
-   --  SAL.Programmer_Error : exception; -- a programming convention has been 
violated
-
-   subtype Positive_Index_Type is SAL.Peek_Type;
-   function Trimmed_Image is new SAL.Gen_Trimmed_Image (SAL.Base_Peek_Type);
-
-   type Unknown_State_Index is new Integer range -1 .. Integer'Last;
-   subtype State_Index is Unknown_State_Index range 0 .. 
Unknown_State_Index'Last;
-   Unknown_State : constant Unknown_State_Index := -1;
-
-   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Unknown_State_Index);
-
-   package State_Index_Queues is new SAL.Gen_Unbounded_Definite_Queues 
(State_Index);
-   package State_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Positive, State_Index, Default_Element => State_Index'Last);
-   function Image is new State_Index_Arrays.Gen_Image (Trimmed_Image);
-
-   ----------
-   --  Token IDs
-
-   type Token_ID is range 0 .. Integer'Last; -- 0 origin to match elisp array
-
-   Invalid_Token_ID : constant Token_ID := Token_ID'Last;
-
-   type Token_ID_Array_String is array (Token_ID range <>) of access constant 
String;
-   type Token_ID_Array_Natural is array (Token_ID range <>) of Natural;
-
-   type Descriptor
-     (First_Terminal    : Token_ID;
-      Last_Terminal     : Token_ID;
-      First_Nonterminal : Token_ID;
-      Last_Nonterminal  : Token_ID;
-      EOI_ID            : Token_ID;
-      Accept_ID         : Token_ID)
-   is record
-      --  Tokens in the range Token_ID'First .. First_Terminal - 1 are
-      --  non-reporting (comments, whitespace), and thus are not used in
-      --  generating parse tables.
-      --
-      --  Tokens in the range Last_Terminal + 1 .. Last_Nonterminal are
-      --  the nonterminals of a grammar.
-      --
-      --  Components are discriminants if they can be specified statically.
-
-      Case_Insensitive : Boolean; -- keywords and names
-      New_Line_ID      : Token_ID;
-      Comment_ID       : Token_ID;
-      Left_Paren_ID    : Token_ID;
-      Right_Paren_ID   : Token_ID;
-      --  If the language does not define these tokens, set them to
-      --  Invalid_Token_ID.
-
-      String_1_ID  : Token_ID; -- delimited by ', error if New_Line_ID
-      String_2_ID  : Token_ID; -- delimited by ", error if New_Line_ID
-      --
-      --  Support for missing quote error recovery. If the language does not
-      --  have two kinds of string literals, set one or both of these to
-      --  Invalid_Token_ID.
-
-      Embedded_Quote_Escape_Doubled : Boolean;
-      --  True if quote characters embedded in strings are escaped by
-      --  doubling (as in Ada); false if by preceding with backslash (as in
-      --  C).
-
-      Image : Token_ID_Array_String (Token_ID'First .. Last_Nonterminal);
-      --  User names for tokens.
-
-      Terminal_Image_Width : Integer;
-      Image_Width          : Integer; --  max width of Image
-
-      --  LALR generate needs a 'Propagate_ID' lookahead that is distinct
-      --  from all terminals. Since lookaheads are Token_ID_Set, we need to
-      --  allocate First_Terminal .. Last_Terminal for LR1 generate, and
-      --  First_Terminal .. Propagate_ID for LALR generate, so we define
-      --  Last_Lookahead. After the LR table is generated, Last_Lookahead is
-      --  no longer used.
-      Last_Lookahead : Token_ID;
-   end record;
-
-   function Padded_Image (Item : in Token_ID; Desc : in Descriptor) return 
String;
-   --  Return Desc.Image (Item), padded to Terminal_Image_Width (if Item
-   --  is a terminal) or to Image_Width.
-
-   function Image (Item : in Token_ID; Desc : in Descriptor) return String;
-   --  Return Desc.Image (Item), or empty string for Invalid_Token_ID.
-
-   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Token_ID);
-
-   procedure Put_Tokens (Descriptor : in WisiToken.Descriptor);
-   --  Put user readable token list (token_id'first ..
-   --  descriptor.last_nonterminal) to Ada.Text_IO.Current_Output
-
-   function Find_ID (Descriptor : in WisiToken.Descriptor; Name : in String) 
return Token_ID;
-   --  Return index of Name in Descriptor.Image. If not found, raise 
Programmer_Error.
-
-   type Token_ID_Array is array (Positive range <>) of Token_ID;
-
-   package Token_ID_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Positive, Token_ID, Default_Element => Invalid_Token_ID);
-
-   function Image is new Token_ID_Arrays.Gen_Image_Aux (Descriptor, Image);
-   function Trimmed_Image is new Token_ID_Arrays.Gen_Image (Trimmed_Image);
-
-   procedure To_Vector (Item : in Token_ID_Array; Vector : in out 
Token_ID_Arrays.Vector);
-
-   function Shared_Prefix (A, B : in Token_ID_Arrays.Vector) return Natural;
-   --  Return last index in A of a prefix shared between A, B; 0 if none.
-
-   type Token_ID_Set is array (Token_ID range <>) of Boolean;
-
-   function "&" (Left : in Token_ID_Set; Right : in Token_ID) return 
Token_ID_Set;
-   --  Include Left and Right in result.
-
-   function To_Token_ID_Set (First, Last : in Token_ID; Item : in 
Token_ID_Array) return Token_ID_Set;
-   --  First, Last determine size of result.
-   --  For each element in Item, set result (element) True.
-
-   procedure To_Set (Item : in Token_ID_Arrays.Vector; Set : out Token_ID_Set);
-   --  For each element of Item, set Set (element) True.
-
-   function To_Array (Item : in Token_ID_Set) return Token_ID_Arrays.Vector;
-
-   function Any (Item : in Token_ID_Set) return Boolean;
-
-   function Count (Item : in Token_ID_Set) return Integer;
-   --  Count of True elements.
-
-   function Image
-     (Item      : in Token_ID_Set;
-      Desc      : in Descriptor;
-      Max_Count : in Integer := Integer'Last;
-      Inverted  : in Boolean := False)
-     return String;
-   --  For diagnostics; not Ada syntax.
-
-   type Token_Array_Token_Set is array (Token_ID range <>, Token_ID range <>) 
of Boolean;
-
-   function Slice (Item : in Token_Array_Token_Set; I : in Token_ID) return 
Token_ID_Set;
-   function Any (Item : in Token_Array_Token_Set; I : in Token_ID) return 
Boolean;
-   function Any (Item : in Token_Array_Token_Set) return Boolean;
-   procedure Or_Slice (Item : in out Token_Array_Token_Set; I : in Token_ID; 
Value : in Token_ID_Set);
-
-   procedure Put (Descriptor : in WisiToken.Descriptor; Item : in 
Token_Array_Token_Set);
-   --  Put Item to Ada.Text_IO.Current_Output, using valid Ada aggregate
-   --  syntax.
-
-   type Token_Array_Token_ID is array (Token_ID range <>) of Token_ID;
-
-   package Token_Sequence_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Token_ID, Token_ID_Arrays.Vector, Default_Element => 
Token_ID_Arrays.Empty_Vector);
-
-   ----------
-   --  Production IDs; see wisitoken-productions.ads for more
-
-   type Production_ID is record
-      LHS : Token_ID := Invalid_Token_ID;
-      RHS : Natural  := 0;
-      --  Index into the production table.
-   end record;
-
-   Invalid_Production_ID : constant Production_ID := (others => <>);
-
-   function Image (Item : in Production_ID) return String;
-   --  Ada positional aggregate syntax, for code generation.
-
-   function Trimmed_Image (Item : in Production_ID) return String;
-   --  Nonterm.rhs_index, both integers, no leading or trailing space;
-   --  for parse table output and diagnostics.
-
-   Prod_ID_Image_Width : constant Integer := 7;
-   --  Max width of Trimmed_Image
-
-   function Padded_Image (Item : in Production_ID; Width : in Integer) return 
String;
-   --  Trimmed_Image padded with leading spaces to Width
-
-   package Production_ID_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Positive, Production_ID, Default_Element => Invalid_Production_ID);
-   function Image is new Production_ID_Arrays.Gen_Image (Image);
-   function Trimmed_Image is new Production_ID_Arrays.Gen_Image 
(Trimmed_Image);
-
-   type Production_ID_Array is array (Natural range <>) of Production_ID;
-
-   function To_Vector (Item : in Production_ID_Array) return 
Production_ID_Arrays.Vector;
-   function "+" (Item : in Production_ID_Array) return 
Production_ID_Arrays.Vector renames To_Vector;
-   function "+" (Item : in Production_ID) return Production_ID_Arrays.Vector 
is (To_Vector ((1 => Item)));
-
-   ----------
-   --  Tokens
-
-   type Base_Buffer_Pos is range 0 .. Integer'Last;
-   subtype Buffer_Pos is Base_Buffer_Pos range 1 .. Base_Buffer_Pos'Last; -- 
match Emacs buffer origin.
-   type Buffer_Region is record
-      First : Buffer_Pos;
-      Last  : Base_Buffer_Pos; --  allow representing null range.
-   end record;
-
-   Invalid_Buffer_Pos : constant Buffer_Pos    := Buffer_Pos'Last;
-   Null_Buffer_Region : constant Buffer_Region := (Buffer_Pos'Last, 
Buffer_Pos'First);
-
-   function Length (Region : in Buffer_Region) return Natural is (Natural 
(Region.Last - Region.First + 1));
-
-   function Inside (Pos : in Buffer_Pos; Region : in Buffer_Region) return 
Boolean
-     is (Region.First <= Pos and Pos <= Region.Last);
-
-   function Image (Item : in Buffer_Region) return String;
-
-   function "and" (Left, Right : in Buffer_Region) return Buffer_Region;
-   --  Return region enclosing both Left and Right.
-
-   type Line_Number_Type is range 1 .. Natural'Last; -- Match Emacs buffer 
line numbers.
-
-   Invalid_Line_Number : constant Line_Number_Type := Line_Number_Type'Last;
-
-   type Base_Token is tagged record
-      --  Base_Token is used in the core parser. The parser only needs ID;
-      --  semantic checks need Byte_Region to compare names. Line, Col, and
-      --  Char_Region are included for error messages.
-      ID : Token_ID := Invalid_Token_ID;
-
-      Byte_Region : Buffer_Region := Null_Buffer_Region;
-      --  Index into the Lexer buffer for the token text.
-
-      Line   : Line_Number_Type  := Invalid_Line_Number;
-      Column : Ada.Text_IO.Count := 0;
-      --  At start of token.
-
-      Char_Region : Buffer_Region := Null_Buffer_Region;
-      --  Character position, useful for finding the token location in Emacs
-      --  buffers.
-   end record;
-
-   type Base_Token_Class_Access is access all Base_Token'Class;
-   type Base_Token_Class_Access_Array is array (Positive_Index_Type range <>) 
of Base_Token_Class_Access;
-
-   function Image
-     (Item       : in Base_Token;
-      Descriptor : in WisiToken.Descriptor)
-     return String;
-   --  For debug/test messages.
-
-   procedure Free is new Ada.Unchecked_Deallocation (Base_Token'Class, 
Base_Token_Class_Access);
-
-   Invalid_Token : constant Base_Token := (others => <>);
-
-   type Base_Token_Index is range 0 .. Integer'Last;
-   subtype Token_Index is Base_Token_Index range 1 .. Base_Token_Index'Last;
-
-   Invalid_Token_Index : constant Base_Token_Index := Base_Token_Index'First;
-
-   type Token_Index_Array is array (Natural range <>) of Token_Index;
-
-   package Recover_Token_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Natural, Base_Token_Index, Default_Element => Invalid_Token_Index);
-
-   type Base_Token_Array is array (Positive_Index_Type range <>) of Base_Token;
-
-   package Base_Token_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Token_Index, Base_Token, Default_Element => (others => <>));
-   type Base_Token_Array_Access is access all Base_Token_Arrays.Vector;
-
-   package Line_Begin_Token_Vectors is new SAL.Gen_Unbounded_Definite_Vectors
-     (Line_Number_Type, Base_Token_Index, Default_Element => 
Invalid_Token_Index);
-
-   function Image is new Base_Token_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
-
-   function Image
-     (Token      : in Base_Token_Index;
-      Terminals  : in Base_Token_Arrays.Vector;
-      Descriptor : in WisiToken.Descriptor)
-     return String;
-
-   type Recover_Token is record
-      --  Maintaining a syntax tree during recover is too slow, so we store
-      --  enough information in the recover stack to perform semantic_checks
-      --  and to apply the solution to the main parser state. We make
-      --  thousands of copies of the parse stack during recover, so
-      --  minimizing size is critical.
-      ID : Token_ID := Invalid_Token_ID;
-
-      Byte_Region : Buffer_Region := Null_Buffer_Region;
-      --  Byte_Region is used to detect empty tokens, for cost and other 
issues.
-
-      Min_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
-      --  For terminals, index of this token in Shared_Parser.Terminals. For
-      --  nonterminals, minimum of contained tokens. For virtuals,
-      --  Invalid_Token_Index. Used for push_back of nonterminals.
-
-      Name : Buffer_Region := Null_Buffer_Region;
-      --  Set and used by semantic_checks.
-
-      Virtual : Boolean := False;
-      --  For terminals, True if inserted by recover. For nonterminals, True
-      --  if any contained token has Virtual = True. Used by Semantic_Checks
-      --  and push_back.
-   end record;
-
-   function Image
-     (Item       : in Recover_Token;
-      Descriptor : in WisiToken.Descriptor)
-     return String;
-
-   type Recover_Token_Array is array (Positive_Index_Type range <>) of 
Recover_Token;
-
-   package Recover_Token_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
-     (Token_Index, Recover_Token, Default_Element => (others => <>));
-
-   function Image is new Recover_Token_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Image);
-
-   ----------
-   --  Trace, debug
-
-   Trace_Parse : Integer  := 0;
-   --  If Trace_Parse > 0, Parse prints messages helpful for debugging
-   --  the grammar and/or the parser; higher value prints more.
-   --
-   --  Trace_Parse levels; output info if Trace_Parse > than:
-   --
-   Outline     : constant := 0; -- spawn/terminate parallel parsers, error 
recovery enter/exit
-   Detail      : constant := 1; -- add each parser cycle
-   Extra       : constant := 2; -- add pending semantic state operations
-   Lexer_Debug : constant := 3; -- add lexer debug
-
-   Trace_McKenzie : Integer  := 0;
-   --  If Trace_McKenzie > 0, Parse prints messages helpful for debugging 
error recovery.
-   --
-   --  Outline - error recovery enter/exit
-   --  Detail  - add each error recovery configuration
-   --  Extra   - add error recovery parse actions
-
-   Trace_Action : Integer := 0;
-   --  Output during Execute_Action, and unit tests.
-
-   Trace_Generate : Integer := 0;
-   --  Output during grammar generation.
-
-   Debug_Mode : Boolean := False;
-   --  If True, Output stack traces, propagate exceptions to top level.
-   --  Otherwise, be robust to errors, so user does not notice them.
-
-   type Trace (Descriptor : not null access constant WisiToken.Descriptor) is 
abstract tagged limited null record;
-   --  Output for tests/debugging. Descriptor included here because many
-   --  uses of Trace will use Image (Item, Descriptor);
-
-   procedure Set_Prefix (Trace : in out WisiToken.Trace; Prefix : in String) 
is abstract;
-   --  Prepend Prefix to all subsequent messages. Usefull for adding
-   --  comment syntax.
-
-   procedure Put (Trace : in out WisiToken.Trace; Item : in String; Prefix : 
in Boolean := True) is abstract;
-   --  Put Item to the Trace display. If Prefix is True, prepend the stored 
prefix.
-
-   procedure Put_Line (Trace : in out WisiToken.Trace; Item : in String) is 
abstract;
-   --  Put Item to the Trace display, followed by a newline.
-
-   procedure New_Line (Trace : in out WisiToken.Trace) is abstract;
-   --  Put a newline to the Trace display.
-
-   procedure Put_Clock (Trace : in out WisiToken.Trace; Label : in String) is 
abstract;
-   --  Put Ada.Calendar.Clock to Trace.
-
-   ----------
-   --  Misc
-
-   function "+" (Item : in String) return 
Ada.Strings.Unbounded.Unbounded_String
-     renames Ada.Strings.Unbounded.To_Unbounded_String;
-
-   function "-" (Item : in Ada.Strings.Unbounded.Unbounded_String) return 
String
-     renames Ada.Strings.Unbounded.To_String;
-
-   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Integer);
-   function Trimmed_Image is new SAL.Gen_Trimmed_Image 
(Ada.Containers.Count_Type);
-
-   function Error_Message
-     (File_Name : in String;
-      Line      : in Line_Number_Type;
-      Column    : in Ada.Text_IO.Count;
-      Message   : in String)
-     return String;
-   --  Return Gnu-formatted error message.
-
-   type Names_Array is array (Integer range <>) of access constant String;
-   type Names_Array_Access is access Names_Array;
-   type Names_Array_Array is array (WisiToken.Token_ID range <>) of 
Names_Array_Access;
-
-end WisiToken;
+--  Abstract:
+--
+--  Root of WisiToken lexer/parser generator and exector.
+--
+--  The token type is an integer subtype, not an enumeration type, to
+--  avoid making this package generic, which would make all other
+--  packages generic.
+--
+--  Additional information about a token can be stored in the
+--  'augmented' field of the syntax tree; see
+--  wisitoken-syntax_trees.ads.
+--
+--  References:
+--
+--  [dragon] "Compilers Principles, Techniques, and Tools" by Aho,
+--  Sethi, and Ullman (aka: "The [Red] Dragon Book" due to the dragon
+--  on the cover).
+--
+--  Copyright (C) 2009, 2010, 2013 - 2015, 2017 - 2019 Free Software 
Foundation, Inc.
+--
+--  This file is part of the WisiToken package.
+--
+--  This library is free software;  you can redistribute it and/or modify it
+--  under terms of the  GNU General Public License  as published by the Free
+--  Software  Foundation;  either version 3,  or (at your  option) any later
+--  version. This library is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN-
+--  TABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+--
+--  As a special exception under Section 7 of GPL version 3, you are granted
+--  additional permissions described in the GCC Runtime Library Exception,
+--  version 3.1, as published by the Free Software Foundation.
+--
+--  This software was originally developed with the name OpenToken by
+--  the following company, and was released as open-source software as
+--  a service to the community:
+--
+--           FlightSafety International Simulation Systems Division
+--                    Broken Arrow, OK  USA  918-259-4000
+
+pragma License (Modified_GPL);
+
+with Ada.Containers;
+with Ada.Strings.Unbounded;
+with Ada.Text_IO;
+with Ada.Unchecked_Deallocation;
+with SAL.Gen_Trimmed_Image;
+with SAL.Gen_Unbounded_Definite_Queues;
+with SAL.Gen_Unbounded_Definite_Vectors.Gen_Image;
+with SAL.Gen_Unbounded_Definite_Vectors.Gen_Image_Aux;
+package WisiToken is
+
+   Partial_Parse : exception; -- a partial parse terminated.
+
+   Syntax_Error : exception; -- no recovery for a syntax error was found
+
+   Parse_Error : exception; -- a non-recoverable non-fatal error was 
encountered; editing the input can fix the error.
+
+   Fatal_Error : exception; -- Error in code or grammar; editing input cannot 
fix error.
+
+   Grammar_Error : exception;
+   --  Grammar file has bad syntax, or grammar is not consistent (ie
+   --  unused tokens, missing productions, invalid actions)
+
+   User_Error : exception; -- other user error (ie command line parameter)
+
+   --  SAL.Programmer_Error : exception; -- a programming convention has been 
violated
+
+   subtype Positive_Index_Type is SAL.Peek_Type;
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (SAL.Base_Peek_Type);
+
+   type Unknown_State_Index is new Integer range -1 .. Integer'Last;
+   subtype State_Index is Unknown_State_Index range 0 .. 
Unknown_State_Index'Last;
+   Unknown_State : constant Unknown_State_Index := -1;
+
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Unknown_State_Index);
+
+   package State_Index_Queues is new SAL.Gen_Unbounded_Definite_Queues 
(State_Index);
+   package State_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Positive, State_Index, Default_Element => State_Index'Last);
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Integer);
+   function Image is new State_Index_Arrays.Gen_Image (Trimmed_Image);
+
+   ----------
+   --  Token IDs
+
+   type Token_ID is range 0 .. Integer'Last; -- 0 origin to match elisp array
+
+   Invalid_Token_ID : constant Token_ID := Token_ID'Last;
+
+   type String_Access_Constant is access constant String;
+   type Token_ID_Array_String is array (Token_ID range <>) of 
String_Access_Constant;
+   type Token_ID_Array_Natural is array (Token_ID range <>) of Natural;
+
+   type Descriptor
+     (First_Terminal    : Token_ID;
+      Last_Terminal     : Token_ID;
+      First_Nonterminal : Token_ID;
+      Last_Nonterminal  : Token_ID;
+      EOI_ID            : Token_ID;
+      Accept_ID         : Token_ID)
+   is record
+      --  Tokens in the range Token_ID'First .. First_Terminal - 1 are
+      --  non-reporting (comments, whitespace), and thus are not used in
+      --  generating parse tables.
+      --
+      --  Tokens in the range Last_Terminal + 1 .. Last_Nonterminal are
+      --  the nonterminals of a grammar.
+      --
+      --  Components are discriminants if they can be specified statically.
+
+      Case_Insensitive : Boolean;  -- keywords and names
+      New_Line_ID      : Token_ID;
+
+      String_1_ID : Token_ID;
+      String_2_ID : Token_ID;
+      --  String_1 delimited by '; String_2 by ".
+      --
+      --  Used by missing quote error recovery. If the language does not
+      --  have two kinds of string literals, set one or both of these to
+      --  Invalid_Token_ID.
+
+      Image : Token_ID_Array_String (Token_ID'First .. Last_Nonterminal);
+      --  User names for tokens.
+
+      Terminal_Image_Width : Integer;
+      Image_Width          : Integer; --  max width of Image
+
+      Last_Lookahead : Token_ID;
+      --  LALR generate needs a 'Propagate_ID' lookahead that is distinct
+      --  from all terminals. Since lookaheads are Token_ID_Set, we need to
+      --  allocate First_Terminal .. Last_Terminal for LR1 generate, and
+      --  First_Terminal .. Propagate_ID for LALR generate, so we define
+      --  Last_Lookahead. After the LR table is generated, Last_Lookahead is
+      --  no longer used.
+   end record;
+   type Descriptor_Access is access Descriptor;
+   type Descriptor_Access_Constant is access constant Descriptor;
+
+   function Padded_Image (Item : in Token_ID; Desc : in Descriptor) return 
String;
+   --  Return Desc.Image (Item), padded to Terminal_Image_Width (if Item
+   --  is a terminal) or to Image_Width.
+
+   function Image (Item : in Token_ID; Desc : in Descriptor) return String;
+   --  Return Desc.Image (Item), or empty string for Invalid_Token_ID.
+
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Token_ID);
+
+   procedure Put_Tokens (Descriptor : in WisiToken.Descriptor);
+   --  Put user readable token list (token_id'first ..
+   --  descriptor.last_nonterminal) to Ada.Text_IO.Current_Output
+
+   function Find_ID (Descriptor : in WisiToken.Descriptor; Name : in String) 
return Token_ID;
+   --  Return index of Name in Descriptor.Image. If not found, raise 
Programmer_Error.
+
+   type Token_ID_Array is array (Positive range <>) of Token_ID;
+   --  Index is not Positive_Index_Type, mostly for historical reasons.
+
+   package Token_ID_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Positive, Token_ID, Default_Element => Invalid_Token_ID);
+
+   function Image is new Token_ID_Arrays.Gen_Image_Aux (Descriptor, 
Trimmed_Image, Image);
+   function Trimmed_Image is new Token_ID_Arrays.Gen_Image (Trimmed_Image);
+
+   procedure To_Vector (Item : in Token_ID_Array; Vector : in out 
Token_ID_Arrays.Vector);
+   function To_Vector (Item : in Token_ID_Array) return Token_ID_Arrays.Vector;
+
+   function Shared_Prefix (A, B : in Token_ID_Arrays.Vector) return Natural;
+   --  Return last index in A of a prefix shared between A, B; 0 if none.
+
+   type Token_ID_Set is array (Token_ID range <>) of Boolean;
+   type Token_ID_Set_Access is access Token_ID_Set;
+
+   function "&" (Left : in Token_ID_Set; Right : in Token_ID) return 
Token_ID_Set;
+   --  Include Left and Right in result.
+
+   function To_Token_ID_Set (First, Last : in Token_ID; Item : in 
Token_ID_Array) return Token_ID_Set;
+   --  First, Last determine size of result.
+   --  For each element in Item, set result (element) True.
+
+   procedure To_Set (Item : in Token_ID_Arrays.Vector; Set : out Token_ID_Set);
+   --  For each element of Item, set Set (element) True.
+
+   function To_Array (Item : in Token_ID_Set) return Token_ID_Arrays.Vector;
+
+   function Any (Item : in Token_ID_Set) return Boolean;
+
+   function Count (Item : in Token_ID_Set) return Integer;
+   --  Count of True elements.
+
+   function Image
+     (Item      : in Token_ID_Set;
+      Desc      : in Descriptor;
+      Max_Count : in Integer := Integer'Last;
+      Inverted  : in Boolean := False)
+     return String;
+   --  For diagnostics; not Ada syntax.
+
+   type Token_Array_Token_Set is array (Token_ID range <>, Token_ID range <>) 
of Boolean;
+
+   function Slice (Item : in Token_Array_Token_Set; I : in Token_ID) return 
Token_ID_Set;
+   function Any (Item : in Token_Array_Token_Set; I : in Token_ID) return 
Boolean;
+   function Any (Item : in Token_Array_Token_Set) return Boolean;
+   procedure Or_Slice (Item : in out Token_Array_Token_Set; I : in Token_ID; 
Value : in Token_ID_Set);
+
+   procedure Put (Descriptor : in WisiToken.Descriptor; Item : in 
Token_Array_Token_Set);
+   --  Put Item to Ada.Text_IO.Current_Output, using valid Ada aggregate
+   --  syntax.
+
+   type Token_Array_Token_ID is array (Token_ID range <>) of Token_ID;
+
+   package Token_Sequence_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Token_ID, Token_ID_Arrays.Vector, Default_Element => 
Token_ID_Arrays.Empty_Vector);
+
+   ----------
+   --  Production IDs; see wisitoken-productions.ads for more
+
+   type Production_ID is record
+      LHS : Token_ID := Invalid_Token_ID;
+      RHS : Natural  := 0;
+      --  Index into the production table.
+   end record;
+
+   Invalid_Production_ID : constant Production_ID := (others => <>);
+
+   function Image (Item : in Production_ID) return String;
+   --  Ada positional aggregate syntax, for code generation.
+
+   function Trimmed_Image (Item : in Production_ID) return String;
+   --  Nonterm.rhs_index, both integers, no leading or trailing space;
+   --  for parse table output and diagnostics.
+
+   Prod_ID_Image_Width : constant Integer := 7;
+   --  Max width of Trimmed_Image
+
+   function Padded_Image (Item : in Production_ID; Width : in Integer) return 
String;
+   --  Trimmed_Image padded with leading spaces to Width
+
+   package Production_ID_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Positive, Production_ID, Default_Element => Invalid_Production_ID);
+   function Image is new Production_ID_Arrays.Gen_Image (Image);
+   function Trimmed_Image is new Production_ID_Arrays.Gen_Image 
(Trimmed_Image);
+
+   type Production_ID_Array is array (Natural range <>) of Production_ID;
+
+   function To_Vector (Item : in Production_ID_Array) return 
Production_ID_Arrays.Vector;
+   function "+" (Item : in Production_ID_Array) return 
Production_ID_Arrays.Vector renames To_Vector;
+   function "+" (Item : in Production_ID) return Production_ID_Arrays.Vector 
is (To_Vector ((1 => Item)));
+
+   type Recursion is
+     (None,
+      Single, --  Single token in right hand side is recursive.
+      Middle, --  Multiple tokens in right hand side, recursive token not at 
either end.
+      Right,  --  Multiple tokens in right hand side, recursive token not at 
right end.
+      Left    --  Multiple tokens in right hand side, recursive token not at 
left end.
+     );
+   --  In worst-case order; Left recursion causes the most
+   --  problems in LR error recovery, and in Packrat.
+
+   function Worst_Recursion (A, B : in Recursion) return Recursion
+   is (Recursion'Max (A, B));
+
+   function Net_Recursion (A, B : in Recursion) return Recursion;
+   --  For finding the net recursion of a chain; Middle dominates.
+
+   ----------
+   --  Tokens
+
+   type Base_Buffer_Pos is range 0 .. Integer'Last;
+   subtype Buffer_Pos is Base_Buffer_Pos range 1 .. Base_Buffer_Pos'Last; -- 
match Emacs buffer origin.
+   type Buffer_Region is record
+      First : Buffer_Pos;
+      Last  : Base_Buffer_Pos; --  allow representing null range.
+   end record;
+
+   Invalid_Buffer_Pos : constant Buffer_Pos    := Buffer_Pos'Last;
+   Null_Buffer_Region : constant Buffer_Region := (Buffer_Pos'Last, 
Buffer_Pos'First);
+
+   function Length (Region : in Buffer_Region) return Natural is (Natural 
(Region.Last - Region.First + 1));
+
+   function Inside (Pos : in Buffer_Pos; Region : in Buffer_Region) return 
Boolean
+     is (Region.First <= Pos and Pos <= Region.Last);
+
+   function Image (Item : in Buffer_Region) return String;
+
+   function "and" (Left, Right : in Buffer_Region) return Buffer_Region;
+   --  Return region enclosing both Left and Right.
+
+   type Line_Number_Type is range 1 .. Natural'Last; -- Match Emacs buffer 
line numbers.
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Line_Number_Type);
+
+   Invalid_Line_Number : constant Line_Number_Type := Line_Number_Type'Last;
+
+   type Base_Token is tagged record
+      --  Base_Token is used in the core parser. The parser only needs ID;
+      --  semantic checks need Byte_Region to compare names. Line, Col, and
+      --  Char_Region are included for error messages.
+      ID : Token_ID := Invalid_Token_ID;
+
+      Byte_Region : Buffer_Region := Null_Buffer_Region;
+      --  Index into the Lexer buffer for the token text.
+
+      Line   : Line_Number_Type  := Invalid_Line_Number;
+      Column : Ada.Text_IO.Count := 0;
+      --  At start of token.
+
+      Char_Region : Buffer_Region := Null_Buffer_Region;
+      --  Character position, useful for finding the token location in Emacs
+      --  buffers.
+   end record;
+
+   type Base_Token_Class_Access is access all Base_Token'Class;
+
+   function Image
+     (Item       : in Base_Token;
+      Descriptor : in WisiToken.Descriptor)
+     return String;
+   --  For debug/test messages.
+
+   procedure Free is new Ada.Unchecked_Deallocation (Base_Token'Class, 
Base_Token_Class_Access);
+
+   Invalid_Token : constant Base_Token := (others => <>);
+
+   type Base_Token_Index is range 0 .. Integer'Last;
+   subtype Token_Index is Base_Token_Index range 1 .. Base_Token_Index'Last;
+
+   Invalid_Token_Index : constant Base_Token_Index := Base_Token_Index'First;
+
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image (Base_Token_Index);
+
+   type Token_Index_Array is array (Natural range <>) of Token_Index;
+
+   package Recover_Token_Index_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Natural, Base_Token_Index, Default_Element => Invalid_Token_Index);
+
+   type Base_Token_Array is array (Positive_Index_Type range <>) of Base_Token;
+
+   package Base_Token_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Token_Index, Base_Token, Default_Element => (others => <>));
+   type Base_Token_Array_Access is access all Base_Token_Arrays.Vector;
+
+   function Image is new Base_Token_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Trimmed_Image, Image);
+
+   function Image
+     (Token      : in Base_Token_Index;
+      Terminals  : in Base_Token_Arrays.Vector;
+      Descriptor : in WisiToken.Descriptor)
+     return String;
+
+   package Line_Begin_Token_Vectors is new SAL.Gen_Unbounded_Definite_Vectors
+     (Line_Number_Type, Base_Token_Index, Default_Element => 
Invalid_Token_Index);
+
+   type Recover_Token is record
+      --  Maintaining a syntax tree during recover is too slow, so we store
+      --  enough information in the recover stack to perform semantic_checks
+      --  and to apply the solution to the main parser state. We make
+      --  thousands of copies of the parse stack during recover, so
+      --  minimizing size is critical.
+      ID : Token_ID := Invalid_Token_ID;
+
+      Byte_Region : Buffer_Region := Null_Buffer_Region;
+      --  Byte_Region is used to detect empty tokens, for cost and other 
issues.
+
+      Min_Terminal_Index : Base_Token_Index := Invalid_Token_Index;
+      --  For terminals, index of this token in Shared_Parser.Terminals. For
+      --  nonterminals, minimum of contained tokens (Invalid_Token_Index if
+      --  empty). For virtuals, Invalid_Token_Index. Used for push_back of
+      --  nonterminals.
+
+      Name : Buffer_Region := Null_Buffer_Region;
+      --  Set and used by semantic_checks.
+
+      Virtual : Boolean := True;
+      --  For terminals, True if inserted by recover. For nonterminals, True
+      --  if any contained token has Virtual = True. Used by Semantic_Checks
+      --  and push_back.
+   end record;
+
+   function Image
+     (Item       : in Recover_Token;
+      Descriptor : in WisiToken.Descriptor)
+     return String;
+
+   type Recover_Token_Array is array (Positive_Index_Type range <>) of 
Recover_Token;
+
+   package Recover_Token_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (Token_Index, Recover_Token, Default_Element => (others => <>));
+
+   function Image is new Recover_Token_Arrays.Gen_Image_Aux 
(WisiToken.Descriptor, Trimmed_Image, Image);
+
+   type Base_Identifier_Index is range 0 .. Integer'Last;
+   subtype Identifier_Index is Base_Identifier_Index range 1 .. 
Base_Identifier_Index'Last;
+   --  For virtual identifiers created during syntax tree rewrite.
+
+   Invalid_Identifier_Index : constant Base_Identifier_Index := 
Base_Identifier_Index'First;
+
+   ----------
+   --  Trace, debug
+
+   Trace_Parse : Integer  := 0;
+   --  If Trace_Parse > 0, Parse prints messages helpful for debugging
+   --  the grammar and/or the parser; higher value prints more.
+   --
+   --  Trace_Parse levels; output info if Trace_Parse > than:
+   --
+   Outline     : constant := 0; -- spawn/terminate parallel parsers, error 
recovery enter/exit
+   Detail      : constant := 1; -- add each parser cycle
+   Extra       : constant := 2; -- add pending semantic state operations
+   Lexer_Debug : constant := 3; -- add lexer debug
+
+   Trace_McKenzie : Integer  := 0;
+   --  If Trace_McKenzie > 0, Parse prints messages helpful for debugging 
error recovery.
+   --
+   --  Outline - error recovery enter/exit
+   --  Detail  - add each error recovery configuration
+   --  Extra   - add error recovery parse actions
+
+   Trace_Action : Integer := 0;
+   --  Output during Execute_Action, and unit tests.
+
+   Trace_Generate : Integer := 0;
+   --  Output during grammar generation.
+
+   Debug_Mode : Boolean := False;
+   --  If True, Output stack traces, propagate exceptions to top level.
+   --  Otherwise, be robust to errors, so user does not notice them.
+
+   type Trace (Descriptor : not null access constant WisiToken.Descriptor) is 
abstract tagged limited null record;
+   --  Output for tests/debugging. Descriptor included here because many
+   --  uses of Trace will use Image (Item, Descriptor);
+
+   procedure Set_Prefix (Trace : in out WisiToken.Trace; Prefix : in String) 
is abstract;
+   --  Prepend Prefix to all subsequent messages. Usefull for adding
+   --  comment syntax.
+
+   procedure Put (Trace : in out WisiToken.Trace; Item : in String; Prefix : 
in Boolean := True) is abstract;
+   --  Put Item to the Trace display. If Prefix is True, prepend the stored 
prefix.
+
+   procedure Put_Line (Trace : in out WisiToken.Trace; Item : in String) is 
abstract;
+   --  Put Item to the Trace display, followed by a newline.
+
+   procedure New_Line (Trace : in out WisiToken.Trace) is abstract;
+   --  Put a newline to the Trace display.
+
+   procedure Put_Clock (Trace : in out WisiToken.Trace; Label : in String) is 
abstract;
+   --  Put Ada.Calendar.Clock to Trace.
+
+   ----------
+   --  Misc
+
+   function "+" (Item : in String) return 
Ada.Strings.Unbounded.Unbounded_String
+     renames Ada.Strings.Unbounded.To_Unbounded_String;
+
+   function "-" (Item : in Ada.Strings.Unbounded.Unbounded_String) return 
String
+     renames Ada.Strings.Unbounded.To_String;
+
+   function Trimmed_Image is new SAL.Gen_Trimmed_Image 
(Ada.Containers.Count_Type);
+
+   function Error_Message
+     (File_Name : in String;
+      Line      : in Line_Number_Type;
+      Column    : in Ada.Text_IO.Count;
+      Message   : in String)
+     return String;
+   --  Return Gnu-formatted error message.
+
+   type Names_Array is array (Integer range <>) of String_Access_Constant;
+   type Names_Array_Access is access Names_Array;
+   type Names_Array_Array is array (WisiToken.Token_ID range <>) of 
Names_Array_Access;
+   type Names_Array_Array_Access is access Names_Array_Array;
+
+end WisiToken;
diff --git a/packages/wisi/wisitoken_grammar_actions.adb 
b/packages/wisi/wisitoken_grammar_actions.adb
index c9970d9..8f4faf7 100644
--- a/packages/wisi/wisitoken_grammar_actions.adb
+++ b/packages/wisi/wisitoken_grammar_actions.adb
@@ -2,7 +2,7 @@
 --  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c 
wisitoken_grammar.wy
 --
 
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  Author: Stephen Leake <address@hidden>
 --
@@ -102,4 +102,81 @@ package body Wisitoken_Grammar_Actions is
       Add_Nonterminal (User_Data, Tree, Tokens);
    end nonterminal_0;
 
+   procedure nonterminal_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Add_Nonterminal (User_Data, Tree, Tokens);
+   end nonterminal_1;
+
+   procedure rhs_item_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_item_1;
+
+   procedure rhs_item_2
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_item_2;
+
+   procedure rhs_item_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_item_3;
+
+   procedure rhs_item_4
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_item_4;
+
+   procedure rhs_item_5
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_item_5;
+
+   procedure rhs_optional_item_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
+   is
+      pragma Unreferenced (Nonterm);
+   begin
+      Check_EBNF (User_Data, Tree, Tokens, 1);
+   end rhs_optional_item_3;
+
 end Wisitoken_Grammar_Actions;
diff --git a/packages/wisi/wisitoken_grammar_actions.ads 
b/packages/wisi/wisitoken_grammar_actions.ads
index 359a73d..5e346e8 100644
--- a/packages/wisi/wisitoken_grammar_actions.ads
+++ b/packages/wisi/wisitoken_grammar_actions.ads
@@ -2,7 +2,7 @@
 --  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c PROCESS 
wisitoken_grammar.wy
 --
 
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  Author: Stephen Leake <address@hidden>
 --
@@ -25,21 +25,17 @@ with WisiToken.Syntax_Trees;
 package Wisitoken_Grammar_Actions is
 
    Descriptor : aliased WisiToken.Descriptor :=
-     (First_Terminal                => 3,
-      Last_Terminal                 => 25,
-      First_Nonterminal             => 26,
-      Last_Nonterminal              => 37,
-      EOI_ID                        => 25,
-      Accept_ID                     => 26,
-      Case_Insensitive              => False,
-      New_Line_ID                   => 1,
-      Comment_ID                    => 2,
-      Left_Paren_ID                 => 2147483647,
-      Right_Paren_ID                => 2147483647,
-      String_1_ID                   => 24,
-      String_2_ID                   => 23,
-      Embedded_Quote_Escape_Doubled => False,
-      Image                         =>
+     (First_Terminal    => 3,
+      Last_Terminal     => 36,
+      First_Nonterminal => 37,
+      Last_Nonterminal  => 56,
+      EOI_ID            => 36,
+      Accept_ID         => 37,
+      Case_Insensitive  => False,
+      New_Line_ID       => 1,
+      String_1_ID       => 35,
+      String_2_ID       => 34,
+      Image             =>
         (new String'("WHITESPACE"),
          new String'("NEW_LINE"),
          new String'("COMMENT"),
@@ -54,17 +50,28 @@ package Wisitoken_Grammar_Actions is
          new String'("ACTION"),
          new String'("BAR"),
          new String'("COLON"),
+         new String'("COLON_COLON_EQUAL"),
          new String'("COMMA"),
          new String'("EQUAL"),
          new String'("GREATER"),
+         new String'("LEFT_BRACE"),
+         new String'("LEFT_BRACKET"),
+         new String'("LEFT_PAREN"),
          new String'("LESS"),
+         new String'("MINUS"),
          new String'("PERCENT"),
+         new String'("PLUS"),
+         new String'("QUESTION"),
+         new String'("RIGHT_BRACE"),
+         new String'("RIGHT_BRACKET"),
+         new String'("RIGHT_PAREN"),
          new String'("SEMICOLON"),
          new String'("SLASH"),
+         new String'("STAR"),
          new String'("NUMERIC_LITERAL"),
          new String'("IDENTIFIER"),
-         new String'("STRING_LITERAL"),
-         new String'("STRING_LITERAL_CASE_INS"),
+         new String'("STRING_LITERAL_1"),
+         new String'("STRING_LITERAL_2"),
          new String'("Wisi_EOI"),
          new String'("wisitoken_accept"),
          new String'("declaration"),
@@ -73,14 +80,22 @@ package Wisitoken_Grammar_Actions is
          new String'("declaration_item_list"),
          new String'("declaration_item"),
          new String'("nonterminal"),
+         new String'("semicolon_opt"),
          new String'("rhs_list"),
          new String'("rhs"),
-         new String'("token_list"),
+         new String'("rhs_attribute"),
+         new String'("rhs_element"),
+         new String'("rhs_item_list"),
+         new String'("rhs_item"),
+         new String'("rhs_group_item"),
+         new String'("rhs_optional_item"),
+         new String'("rhs_multiple_item"),
+         new String'("rhs_alternative_list"),
          new String'("compilation_unit"),
          new String'("compilation_unit_list")),
-      Terminal_Image_Width => 23,
+      Terminal_Image_Width => 17,
       Image_Width          => 25,
-      Last_Lookahead       => 26);
+      Last_Lookahead       => 37);
 
    type Token_Enum_ID is
      (WHITESPACE_ID,
@@ -97,17 +112,28 @@ package Wisitoken_Grammar_Actions is
       ACTION_ID,
       BAR_ID,
       COLON_ID,
+      COLON_COLON_EQUAL_ID,
       COMMA_ID,
       EQUAL_ID,
       GREATER_ID,
+      LEFT_BRACE_ID,
+      LEFT_BRACKET_ID,
+      LEFT_PAREN_ID,
       LESS_ID,
+      MINUS_ID,
       PERCENT_ID,
+      PLUS_ID,
+      QUESTION_ID,
+      RIGHT_BRACE_ID,
+      RIGHT_BRACKET_ID,
+      RIGHT_PAREN_ID,
       SEMICOLON_ID,
       SLASH_ID,
+      STAR_ID,
       NUMERIC_LITERAL_ID,
       IDENTIFIER_ID,
-      STRING_LITERAL_ID,
-      STRING_LITERAL_CASE_INS_ID,
+      STRING_LITERAL_1_ID,
+      STRING_LITERAL_2_ID,
       Wisi_EOI_ID,
       wisitoken_accept_ID,
       declaration_ID,
@@ -116,9 +142,17 @@ package Wisitoken_Grammar_Actions is
       declaration_item_list_ID,
       declaration_item_ID,
       nonterminal_ID,
+      semicolon_opt_ID,
       rhs_list_ID,
       rhs_ID,
-      token_list_ID,
+      rhs_attribute_ID,
+      rhs_element_ID,
+      rhs_item_list_ID,
+      rhs_item_ID,
+      rhs_group_item_ID,
+      rhs_optional_item_ID,
+      rhs_multiple_item_ID,
+      rhs_alternative_list_ID,
       compilation_unit_ID,
       compilation_unit_list_ID);
 
@@ -165,4 +199,39 @@ package Wisitoken_Grammar_Actions is
      Tree      : in out WisiToken.Syntax_Trees.Tree;
      Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
      Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure nonterminal_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_item_1
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_item_2
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_item_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_item_4
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_item_5
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
+   procedure rhs_optional_item_3
+    (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+     Tree      : in out WisiToken.Syntax_Trees.Tree;
+     Nonterm   : in     WisiToken.Syntax_Trees.Valid_Node_Index;
+     Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
 end Wisitoken_Grammar_Actions;
diff --git a/packages/wisi/wisitoken_grammar_main.adb 
b/packages/wisi/wisitoken_grammar_main.adb
index b8cb1c5..7a2bb22 100644
--- a/packages/wisi/wisitoken_grammar_main.adb
+++ b/packages/wisi/wisitoken_grammar_main.adb
@@ -2,7 +2,7 @@
 --  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c 
wisitoken_grammar.wy
 --
 
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  Author: Stephen Leake <address@hidden>
 --
@@ -33,199 +33,545 @@ package body Wisitoken_Grammar_Main is
       wisitoken_grammar_re2c_c.Next_Token);
 
    procedure Create_Parser
-     (Parser                       :    out 
WisiToken.Parse.LR.Parser_No_Recover.Parser;
+     (Parser                         :    out 
WisiToken.Parse.LR.Parser_No_Recover.Parser;
       Trace                        : not null access WisiToken.Trace'Class;
       User_Data                    : in     
WisiToken.Syntax_Trees.User_Data_Access)
    is
       use WisiToken.Parse.LR;
       Table : constant Parse_Table_Ptr := new Parse_Table
         (State_First       => 0,
-         State_Last        => 61,
+         State_Last        => 102,
          First_Terminal    => 3,
-         Last_Terminal     => 25,
-         First_Nonterminal => 26,
-         Last_Nonterminal  => 37);
+         Last_Terminal     => 36,
+         First_Nonterminal => 37,
+         Last_Nonterminal  => 56);
    begin
       declare
          procedure Subr_1
          is begin
-            Add_Action (Table.States (0), 18, 1);
-            Add_Action (Table.States (0), 22, 2);
+            Add_Action (Table.States (0), 23, 1);
+            Add_Action (Table.States (0), 33, 2);
             Add_Error (Table.States (0));
-            Add_Goto (Table.States (0), 27, 3);
-            Add_Goto (Table.States (0), 32, 4);
-            Add_Goto (Table.States (0), 36, 5);
-            Add_Goto (Table.States (0), 37, 6);
+            Add_Goto (Table.States (0), 38, 3);
+            Add_Goto (Table.States (0), 43, 4);
+            Add_Goto (Table.States (0), 55, 5);
+            Add_Goto (Table.States (0), 56, 6);
             Add_Action (Table.States (1), 3, 7);
             Add_Action (Table.States (1), 4, 8);
             Add_Action (Table.States (1), 5, 9);
             Add_Action (Table.States (1), 6, 10);
             Add_Action (Table.States (1), 7, 11);
             Add_Action (Table.States (1), 8, 12);
-            Add_Action (Table.States (1), 22, 13);
+            Add_Action (Table.States (1), 33, 13);
             Add_Error (Table.States (1));
-            Add_Goto (Table.States (1), 28, 14);
+            Add_Goto (Table.States (1), 39, 14);
             Add_Action (Table.States (2), 13, 15);
+            Add_Action (Table.States (2), 14, 16);
             Add_Error (Table.States (2));
-            Add_Action (Table.States (3), (18, 22, 25), (36, 0), 1, null, 
null);
-            Add_Action (Table.States (4), (18, 22, 25), (36, 1), 1, null, 
null);
-            Add_Action (Table.States (5), (18, 22, 25), (37, 0), 1, null, 
null);
-            Add_Action (Table.States (6), 18, 1);
-            Add_Action (Table.States (6), 22, 2);
-            Add_Action (Table.States (6), 25, Accept_It, (26, 0), 1, null, 
null);
+            Add_Action (Table.States (3), (23, 33, 36), (55, 0), 1, null, 
null);
+            Add_Action (Table.States (4), (23, 33, 36), (55, 1), 1, null, 
null);
+            Add_Action (Table.States (5), (23, 33, 36), (56, 0), 1, null, 
null);
+            Add_Action (Table.States (6), 23, 1);
+            Add_Action (Table.States (6), 33, 2);
+            Add_Action (Table.States (6), 36, Accept_It, (37, 0), 1, null, 
null);
             Add_Error (Table.States (6));
-            Add_Goto (Table.States (6), 27, 3);
-            Add_Goto (Table.States (6), 32, 4);
-            Add_Goto (Table.States (6), 36, 16);
-            Add_Action (Table.States (7), 22, 17);
+            Add_Goto (Table.States (6), 38, 3);
+            Add_Goto (Table.States (6), 43, 4);
+            Add_Goto (Table.States (6), 55, 17);
+            Add_Action (Table.States (7), 33, 18);
             Add_Error (Table.States (7));
-            Add_Goto (Table.States (7), 29, 18);
-            Add_Action (Table.States (8), 5, 19);
+            Add_Goto (Table.States (7), 40, 19);
+            Add_Action (Table.States (8), 5, 20);
             Add_Error (Table.States (8));
-            Add_Action (Table.States (9), 22, 20);
+            Add_Action (Table.States (9), 33, 21);
             Add_Error (Table.States (9));
-            Add_Action (Table.States (10), (1 =>  22), (28, 0), 1, null, null);
-            Add_Action (Table.States (11), 17, 21);
+            Add_Action (Table.States (10), (1 =>  33), (39, 0), 1, null, null);
+            Add_Action (Table.States (11), 21, 22);
             Add_Error (Table.States (11));
-            Add_Action (Table.States (12), 17, 22);
+            Add_Action (Table.States (12), 21, 23);
             Add_Error (Table.States (12));
-            Add_Action (Table.States (13), 8, 23);
-            Add_Action (Table.States (13), 10, 24);
-            Add_Action (Table.States (13), 14, 25);
+            Add_Action (Table.States (13), 8, 24);
+            Add_Action (Table.States (13), 10, 25);
             Add_Action (Table.States (13), 15, 26);
-            Add_Action (Table.States (13), 18, Reduce, (27, 3), 2, 
declaration_3'Access, null);
-            Add_Action (Table.States (13), 20, 27);
-            Add_Action (Table.States (13), 21, 28);
-            Add_Action (Table.States (13), 22, 29, (27, 3), 2, 
declaration_3'Access, null);
-            Add_Action (Table.States (13), 23, 30);
-            Add_Action (Table.States (13), 24, 31);
-            Add_Action (Table.States (13), 25, Reduce, (27, 3), 2, 
declaration_3'Access, null);
+            Add_Action (Table.States (13), 16, 27);
+            Add_Action (Table.States (13), 20, 28);
+            Add_Action (Table.States (13), 23, Reduce, (38, 3), 2, 
declaration_3'Access, null);
+            Add_Action (Table.States (13), 28, 29);
+            Add_Action (Table.States (13), 30, 30);
+            Add_Action (Table.States (13), 32, 31);
+            Add_Action (Table.States (13), 33, 32);
+            Add_Conflict (Table.States (13), 33, (38, 3), 2, 
declaration_3'Access, null);
+            Add_Action (Table.States (13), 34, 33);
+            Add_Action (Table.States (13), 35, 34);
+            Add_Action (Table.States (13), 36, Reduce, (38, 3), 2, 
declaration_3'Access, null);
             Add_Error (Table.States (13));
-            Add_Goto (Table.States (13), 30, 32);
-            Add_Goto (Table.States (13), 31, 33);
-            Add_Action (Table.States (14), 22, 34);
+            Add_Goto (Table.States (13), 41, 35);
+            Add_Goto (Table.States (13), 42, 36);
+            Add_Action (Table.States (14), 33, 37);
             Add_Error (Table.States (14));
-            Add_Action (Table.States (15), 12, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (15), 18, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (15), 19, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (15), 22, 35);
+            Add_Action (Table.States (15), 12, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (15), 18, 38);
+            Add_Action (Table.States (15), 19, 39);
+            Add_Action (Table.States (15), 20, 40);
+            Add_Action (Table.States (15), 21, 41);
+            Add_Action (Table.States (15), 23, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (15), 29, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (15), 33, 42);
+            Add_Conflict (Table.States (15), 33, (46, 0), 0, null, null);
+            Add_Action (Table.States (15), 35, 43);
+            Add_Action (Table.States (15), 36, Reduce, (46, 0), 0, null, null);
             Add_Error (Table.States (15));
-            Add_Goto (Table.States (15), 33, 36);
-            Add_Goto (Table.States (15), 34, 37);
-            Add_Goto (Table.States (15), 35, 38);
-            Add_Action (Table.States (16), (18, 22, 25), (37, 1), 2, null, 
null);
-            Add_Action (Table.States (17), (9, 22), (29, 0), 1, null, null);
-            Add_Action (Table.States (18), 9, 39);
-            Add_Action (Table.States (18), 22, 40);
-            Add_Error (Table.States (18));
-            Add_Action (Table.States (19), (18, 22, 25), (27, 5), 3, 
declaration_5'Access, null);
-            Add_Action (Table.States (20), 15, 41);
-            Add_Error (Table.States (20));
-            Add_Action (Table.States (21), 22, 42);
+            Add_Goto (Table.States (15), 45, 44);
+            Add_Goto (Table.States (15), 46, 45);
+            Add_Goto (Table.States (15), 47, 46);
+            Add_Goto (Table.States (15), 48, 47);
+            Add_Goto (Table.States (15), 49, 48);
+            Add_Goto (Table.States (15), 50, 49);
+            Add_Goto (Table.States (15), 51, 50);
+            Add_Goto (Table.States (15), 52, 51);
+            Add_Goto (Table.States (15), 53, 52);
+            Add_Action (Table.States (16), 12, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (16), 18, 38);
+            Add_Action (Table.States (16), 19, 39);
+            Add_Action (Table.States (16), 20, 40);
+            Add_Action (Table.States (16), 21, 41);
+            Add_Action (Table.States (16), 23, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (16), 29, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (16), 33, 42);
+            Add_Conflict (Table.States (16), 33, (46, 0), 0, null, null);
+            Add_Action (Table.States (16), 35, 43);
+            Add_Action (Table.States (16), 36, Reduce, (46, 0), 0, null, null);
+            Add_Error (Table.States (16));
+            Add_Goto (Table.States (16), 45, 53);
+            Add_Goto (Table.States (16), 46, 45);
+            Add_Goto (Table.States (16), 47, 46);
+            Add_Goto (Table.States (16), 48, 47);
+            Add_Goto (Table.States (16), 49, 48);
+            Add_Goto (Table.States (16), 50, 49);
+            Add_Goto (Table.States (16), 51, 50);
+            Add_Goto (Table.States (16), 52, 51);
+            Add_Goto (Table.States (16), 53, 52);
+            Add_Action (Table.States (17), (23, 33, 36), (56, 1), 2, null, 
null);
+            Add_Action (Table.States (18), (9, 33), (40, 0), 1, null, null);
+            Add_Action (Table.States (19), 9, 54);
+            Add_Action (Table.States (19), 33, 55);
+            Add_Error (Table.States (19));
+            Add_Action (Table.States (20), (23, 33, 36), (38, 5), 3, 
declaration_5'Access, null);
+            Add_Action (Table.States (21), 16, 56);
             Add_Error (Table.States (21));
-            Add_Action (Table.States (22), 22, 43);
+            Add_Action (Table.States (22), 33, 57);
             Add_Error (Table.States (22));
-            Add_Action (Table.States (23), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 8), 1, null, null);
-            Add_Action (Table.States (24), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 4), 1, null, null);
-            Add_Action (Table.States (25), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 0), 1, null, null);
-            Add_Action (Table.States (26), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 2), 1, null, null);
-            Add_Action (Table.States (27), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 5), 1, null, null);
-            Add_Action (Table.States (28), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 3), 1, null, null);
-            Add_Action (Table.States (29), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 1), 1, null, null);
-            Add_Action (Table.States (30), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 6), 1, null, null);
-            Add_Action (Table.States (31), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (31, 7), 1, null, null);
-            Add_Action (Table.States (32), 8, 23);
-            Add_Action (Table.States (32), 10, 24);
-            Add_Action (Table.States (32), 14, 25);
-            Add_Action (Table.States (32), 15, 26);
-            Add_Action (Table.States (32), 18, Reduce, (27, 2), 3, 
declaration_2'Access, null);
-            Add_Action (Table.States (32), 20, 27);
-            Add_Action (Table.States (32), 21, 28);
-            Add_Action (Table.States (32), 22, 29, (27, 2), 3, 
declaration_2'Access, null);
-            Add_Action (Table.States (32), 23, 30);
-            Add_Action (Table.States (32), 24, 31);
-            Add_Action (Table.States (32), 25, Reduce, (27, 2), 3, 
declaration_2'Access, null);
-            Add_Error (Table.States (32));
-            Add_Goto (Table.States (32), 31, 44);
-            Add_Action (Table.States (33), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (30, 0), 1, null, null);
-            Add_Action (Table.States (34), 8, 23);
-            Add_Action (Table.States (34), 10, 24);
-            Add_Action (Table.States (34), 14, 25);
-            Add_Action (Table.States (34), 15, 26);
-            Add_Action (Table.States (34), 20, 27);
-            Add_Action (Table.States (34), 21, 28);
-            Add_Action (Table.States (34), 22, 29);
-            Add_Action (Table.States (34), 23, 30);
-            Add_Action (Table.States (34), 24, 31);
-            Add_Error (Table.States (34));
-            Add_Goto (Table.States (34), 30, 45);
-            Add_Goto (Table.States (34), 31, 33);
-            Add_Action (Table.States (35), (11, 12, 18, 19, 22), (35, 0), 1, 
null, null);
-            Add_Action (Table.States (36), 12, 46);
-            Add_Action (Table.States (36), 18, 47);
-            Add_Action (Table.States (36), 19, 48);
-            Add_Error (Table.States (36));
-            Add_Action (Table.States (37), (12, 18, 19), (33, 0), 1, null, 
null);
-            Add_Action (Table.States (38), 11, 49);
-            Add_Action (Table.States (38), 12, Reduce, (34, 1), 1, null, null);
-            Add_Action (Table.States (38), 18, Reduce, (34, 1), 1, null, null);
-            Add_Action (Table.States (38), 19, Reduce, (34, 1), 1, null, null);
-            Add_Action (Table.States (38), 22, 50);
+            Add_Action (Table.States (23), 33, 58);
+            Add_Error (Table.States (23));
+            Add_Action (Table.States (24), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 10), 1, null,
+            null);
+            Add_Action (Table.States (25), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 5), 1, null,
+            null);
+            Add_Action (Table.States (26), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 0), 1, null,
+            null);
+            Add_Action (Table.States (27), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 2), 1, null,
+            null);
+            Add_Action (Table.States (28), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 3), 1, null,
+            null);
+            Add_Action (Table.States (29), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 6), 1, null,
+            null);
+            Add_Action (Table.States (30), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 7), 1, null,
+            null);
+            Add_Action (Table.States (31), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 4), 1, null,
+            null);
+            Add_Action (Table.States (32), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 1), 1, null,
+            null);
+            Add_Action (Table.States (33), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 8), 1, null,
+            null);
+            Add_Action (Table.States (34), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (42, 9), 1, null,
+            null);
+            Add_Action (Table.States (35), 8, 24);
+            Add_Action (Table.States (35), 10, 25);
+            Add_Action (Table.States (35), 15, 26);
+            Add_Action (Table.States (35), 16, 27);
+            Add_Action (Table.States (35), 20, 28);
+            Add_Action (Table.States (35), 23, Reduce, (38, 2), 3, 
declaration_2'Access, null);
+            Add_Action (Table.States (35), 28, 29);
+            Add_Action (Table.States (35), 30, 30);
+            Add_Action (Table.States (35), 32, 31);
+            Add_Action (Table.States (35), 33, 32);
+            Add_Conflict (Table.States (35), 33, (38, 2), 3, 
declaration_2'Access, null);
+            Add_Action (Table.States (35), 34, 33);
+            Add_Action (Table.States (35), 35, 34);
+            Add_Action (Table.States (35), 36, Reduce, (38, 2), 3, 
declaration_2'Access, null);
+            Add_Error (Table.States (35));
+            Add_Goto (Table.States (35), 42, 59);
+            Add_Action (Table.States (36), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (41, 0), 1, null,
+            null);
+            Add_Action (Table.States (37), 8, 24);
+            Add_Action (Table.States (37), 10, 25);
+            Add_Action (Table.States (37), 15, 26);
+            Add_Action (Table.States (37), 16, 27);
+            Add_Action (Table.States (37), 20, 28);
+            Add_Action (Table.States (37), 28, 29);
+            Add_Action (Table.States (37), 30, 30);
+            Add_Action (Table.States (37), 32, 31);
+            Add_Action (Table.States (37), 33, 32);
+            Add_Action (Table.States (37), 34, 33);
+            Add_Action (Table.States (37), 35, 34);
+            Add_Error (Table.States (37));
+            Add_Goto (Table.States (37), 41, 60);
+            Add_Goto (Table.States (37), 42, 36);
+            Add_Action (Table.States (38), 18, 38);
+            Add_Action (Table.States (38), 19, 39);
+            Add_Action (Table.States (38), 20, 40);
+            Add_Action (Table.States (38), 21, 41);
+            Add_Action (Table.States (38), 33, 42);
+            Add_Action (Table.States (38), 35, 43);
             Add_Error (Table.States (38));
-            Add_Action (Table.States (39), (18, 22, 25), (27, 1), 4, 
declaration_1'Access, null);
-            Add_Action (Table.States (40), (9, 22), (29, 1), 2, null, null);
-            Add_Action (Table.States (41), 22, 51);
+            Add_Goto (Table.States (38), 47, 46);
+            Add_Goto (Table.States (38), 48, 47);
+            Add_Goto (Table.States (38), 49, 61);
+            Add_Goto (Table.States (38), 50, 49);
+            Add_Goto (Table.States (38), 51, 50);
+            Add_Goto (Table.States (38), 52, 51);
+            Add_Goto (Table.States (38), 53, 52);
+            Add_Goto (Table.States (38), 54, 62);
+            Add_Action (Table.States (39), 18, 38);
+            Add_Action (Table.States (39), 19, 39);
+            Add_Action (Table.States (39), 20, 40);
+            Add_Action (Table.States (39), 21, 41);
+            Add_Action (Table.States (39), 33, 42);
+            Add_Action (Table.States (39), 35, 43);
+            Add_Error (Table.States (39));
+            Add_Goto (Table.States (39), 47, 46);
+            Add_Goto (Table.States (39), 48, 47);
+            Add_Goto (Table.States (39), 49, 61);
+            Add_Goto (Table.States (39), 50, 49);
+            Add_Goto (Table.States (39), 51, 50);
+            Add_Goto (Table.States (39), 52, 51);
+            Add_Goto (Table.States (39), 53, 52);
+            Add_Goto (Table.States (39), 54, 63);
+            Add_Action (Table.States (40), 18, 38);
+            Add_Action (Table.States (40), 19, 39);
+            Add_Action (Table.States (40), 20, 40);
+            Add_Action (Table.States (40), 21, 41);
+            Add_Action (Table.States (40), 33, 42);
+            Add_Action (Table.States (40), 35, 43);
+            Add_Error (Table.States (40));
+            Add_Goto (Table.States (40), 47, 46);
+            Add_Goto (Table.States (40), 48, 47);
+            Add_Goto (Table.States (40), 49, 61);
+            Add_Goto (Table.States (40), 50, 49);
+            Add_Goto (Table.States (40), 51, 50);
+            Add_Goto (Table.States (40), 52, 51);
+            Add_Goto (Table.States (40), 53, 52);
+            Add_Goto (Table.States (40), 54, 64);
+            Add_Action (Table.States (41), 33, 65);
             Add_Error (Table.States (41));
-            Add_Action (Table.States (42), 16, 52);
+            Add_Action (Table.States (42), 11, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 12, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 16, 66);
+            Add_Action (Table.States (42), 18, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 19, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 20, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 21, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 23, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 24, 67);
+            Add_Action (Table.States (42), 25, 68);
+            Add_Action (Table.States (42), 26, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 27, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 28, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 29, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 31, 69);
+            Add_Action (Table.States (42), 33, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 35, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (42), 36, Reduce, (50, 0), 1, null, null);
             Add_Error (Table.States (42));
-            Add_Action (Table.States (43), 16, 53);
+            Add_Action (Table.States (43), 11, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 12, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 18, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 19, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 20, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 21, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 23, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 25, 70);
+            Add_Action (Table.States (43), 26, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 27, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 28, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 29, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 33, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 35, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
+            Add_Action (Table.States (43), 36, Reduce, (50, 1), 1, 
rhs_item_1'Access, null);
             Add_Error (Table.States (43));
-            Add_Action (Table.States (44), (8, 10, 14, 15, 18, 20, 21, 22, 23, 
24, 25), (30, 1), 2, null, null);
-            Add_Action (Table.States (45), 8, 23);
-            Add_Action (Table.States (45), 10, 24);
-            Add_Action (Table.States (45), 14, 25);
-            Add_Action (Table.States (45), 15, 26);
-            Add_Action (Table.States (45), 18, Reduce, (27, 0), 4, 
declaration_0'Access, null);
-            Add_Action (Table.States (45), 20, 27);
-            Add_Action (Table.States (45), 21, 28);
-            Add_Action (Table.States (45), 22, 29, (27, 0), 4, 
declaration_0'Access, null);
-            Add_Action (Table.States (45), 23, 30);
-            Add_Action (Table.States (45), 24, 31);
-            Add_Action (Table.States (45), 25, Reduce, (27, 0), 4, 
declaration_0'Access, null);
-            Add_Error (Table.States (45));
-            Add_Goto (Table.States (45), 31, 44);
-            Add_Action (Table.States (46), 12, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (46), 18, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (46), 19, Reduce, (34, 0), 0, null, null);
-            Add_Action (Table.States (46), 22, 35);
-            Add_Error (Table.States (46));
-            Add_Goto (Table.States (46), 34, 54);
-            Add_Goto (Table.States (46), 35, 38);
-            Add_Action (Table.States (47), 4, 55);
-            Add_Action (Table.States (47), 5, 56);
-            Add_Error (Table.States (47));
-            Add_Action (Table.States (48), (18, 22, 25), (32, 0), 4, 
nonterminal_0'Access, null);
-            Add_Action (Table.States (49), 11, 57);
-            Add_Action (Table.States (49), 12, Reduce, (34, 2), 2, null, null);
-            Add_Action (Table.States (49), 18, Reduce, (34, 2), 2, null, null);
-            Add_Action (Table.States (49), 19, Reduce, (34, 2), 2, null, null);
-            Add_Error (Table.States (49));
-            Add_Action (Table.States (50), (11, 12, 18, 19, 22), (35, 1), 2, 
null, null);
-            Add_Action (Table.States (51), (18, 22, 25), (27, 4), 5, 
declaration_4'Access, null);
-            Add_Action (Table.States (52), (1 =>  22), (28, 1), 4, null, null);
-            Add_Action (Table.States (53), (1 =>  22), (28, 2), 4, null, null);
-            Add_Action (Table.States (54), (12, 18, 19), (33, 1), 3, null, 
null);
-            Add_Action (Table.States (55), 5, 58);
-            Add_Error (Table.States (55));
-            Add_Action (Table.States (56), 22, 59);
+            Add_Action (Table.States (44), 12, 71);
+            Add_Action (Table.States (44), 23, 72);
+            Add_Conflict (Table.States (44), 23, (44, 1), 0, null, null);
+            Add_Action (Table.States (44), 29, 73);
+            Add_Action (Table.States (44), 33, Reduce, (44, 1), 0, null, null);
+            Add_Action (Table.States (44), 36, Reduce, (44, 1), 0, null, null);
+            Add_Error (Table.States (44));
+            Add_Goto (Table.States (44), 44, 74);
+            Add_Action (Table.States (45), (12, 23, 29, 33, 36), (45, 0), 1, 
null, null);
+            Add_Action (Table.States (46), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (50, 2), 1,
+            rhs_item_2'Access, null);
+            Add_Action (Table.States (47), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (49, 0), 1, null,
+            null);
+            Add_Action (Table.States (48), 11, 75);
+            Add_Action (Table.States (48), 12, Reduce, (46, 1), 1, null, null);
+            Add_Action (Table.States (48), 18, 38);
+            Add_Action (Table.States (48), 19, 39);
+            Add_Action (Table.States (48), 20, 40);
+            Add_Action (Table.States (48), 21, 41);
+            Add_Action (Table.States (48), 23, Reduce, (46, 1), 1, null, null);
+            Add_Action (Table.States (48), 29, Reduce, (46, 1), 1, null, null);
+            Add_Action (Table.States (48), 33, 42);
+            Add_Conflict (Table.States (48), 33, (46, 1), 1, null, null);
+            Add_Action (Table.States (48), 35, 43);
+            Add_Action (Table.States (48), 36, Reduce, (46, 1), 1, null, null);
+            Add_Error (Table.States (48));
+            Add_Goto (Table.States (48), 47, 46);
+            Add_Goto (Table.States (48), 48, 76);
+            Add_Goto (Table.States (48), 50, 49);
+            Add_Goto (Table.States (48), 51, 50);
+            Add_Goto (Table.States (48), 52, 51);
+            Add_Goto (Table.States (48), 53, 52);
+            Add_Action (Table.States (49), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (48, 0), 1, null,
+            null);
+            Add_Action (Table.States (50), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (50, 5), 1,
+            rhs_item_5'Access, null);
+            Add_Action (Table.States (51), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (50, 3), 1,
+            rhs_item_3'Access, null);
+            Add_Action (Table.States (52), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (50, 4), 1,
+            rhs_item_4'Access, null);
+            Add_Action (Table.States (53), 12, 71);
+            Add_Action (Table.States (53), 23, 72);
+            Add_Conflict (Table.States (53), 23, (44, 1), 0, null, null);
+            Add_Action (Table.States (53), 29, 73);
+            Add_Action (Table.States (53), 33, Reduce, (44, 1), 0, null, null);
+            Add_Action (Table.States (53), 36, Reduce, (44, 1), 0, null, null);
+            Add_Error (Table.States (53));
+            Add_Goto (Table.States (53), 44, 77);
+            Add_Action (Table.States (54), (23, 33, 36), (38, 1), 4, 
declaration_1'Access, null);
+            Add_Action (Table.States (55), (9, 33), (40, 1), 2, null, null);
+            Add_Action (Table.States (56), 33, 78);
             Add_Error (Table.States (56));
-            Add_Action (Table.States (57), (12, 18, 19), (34, 3), 3, null, 
null);
-            Add_Action (Table.States (58), (12, 18, 19), (33, 3), 4, null, 
null);
-            Add_Action (Table.States (59), 15, 60);
-            Add_Error (Table.States (59));
-            Add_Action (Table.States (60), 22, 61);
+            Add_Action (Table.States (57), 17, 79);
+            Add_Error (Table.States (57));
+            Add_Action (Table.States (58), 17, 80);
+            Add_Error (Table.States (58));
+            Add_Action (Table.States (59), (8, 10, 15, 16, 20, 23, 28, 30, 32, 
33, 34, 35, 36), (41, 1), 2, null,
+            null);
+            Add_Action (Table.States (60), 8, 24);
+            Add_Action (Table.States (60), 10, 25);
+            Add_Action (Table.States (60), 15, 26);
+            Add_Action (Table.States (60), 16, 27);
+            Add_Action (Table.States (60), 20, 28);
+            Add_Action (Table.States (60), 23, Reduce, (38, 0), 4, 
declaration_0'Access, null);
+            Add_Action (Table.States (60), 28, 29);
+            Add_Action (Table.States (60), 30, 30);
+            Add_Action (Table.States (60), 32, 31);
+            Add_Action (Table.States (60), 33, 32);
+            Add_Conflict (Table.States (60), 33, (38, 0), 4, 
declaration_0'Access, null);
+            Add_Action (Table.States (60), 34, 33);
+            Add_Action (Table.States (60), 35, 34);
+            Add_Action (Table.States (60), 36, Reduce, (38, 0), 4, 
declaration_0'Access, null);
             Add_Error (Table.States (60));
-            Add_Action (Table.States (61), (12, 18, 19), (33, 2), 6, null, 
null);
+            Add_Goto (Table.States (60), 42, 59);
+            Add_Action (Table.States (61), 12, Reduce, (54, 0), 1, null, null);
+            Add_Action (Table.States (61), 18, 38);
+            Add_Action (Table.States (61), 19, 39);
+            Add_Action (Table.States (61), 20, 40);
+            Add_Action (Table.States (61), 21, 41);
+            Add_Action (Table.States (61), 26, Reduce, (54, 0), 1, null, null);
+            Add_Action (Table.States (61), 27, Reduce, (54, 0), 1, null, null);
+            Add_Action (Table.States (61), 28, Reduce, (54, 0), 1, null, null);
+            Add_Action (Table.States (61), 33, 42);
+            Add_Action (Table.States (61), 35, 43);
+            Add_Error (Table.States (61));
+            Add_Goto (Table.States (61), 47, 46);
+            Add_Goto (Table.States (61), 48, 76);
+            Add_Goto (Table.States (61), 50, 49);
+            Add_Goto (Table.States (61), 51, 50);
+            Add_Goto (Table.States (61), 52, 51);
+            Add_Goto (Table.States (61), 53, 52);
+            Add_Action (Table.States (62), 12, 81);
+            Add_Action (Table.States (62), 26, 82);
+            Add_Error (Table.States (62));
+            Add_Action (Table.States (63), 12, 81);
+            Add_Action (Table.States (63), 27, 83);
+            Add_Error (Table.States (63));
+            Add_Action (Table.States (64), 12, 81);
+            Add_Action (Table.States (64), 28, 84);
+            Add_Error (Table.States (64));
+            Add_Action (Table.States (65), 16, 85);
+            Add_Error (Table.States (65));
+            Add_Action (Table.States (66), 18, 38);
+            Add_Action (Table.States (66), 19, 39);
+            Add_Action (Table.States (66), 20, 40);
+            Add_Action (Table.States (66), 21, 41);
+            Add_Action (Table.States (66), 33, 86);
+            Add_Action (Table.States (66), 35, 43);
+            Add_Error (Table.States (66));
+            Add_Goto (Table.States (66), 47, 46);
+            Add_Goto (Table.States (66), 50, 87);
+            Add_Goto (Table.States (66), 51, 50);
+            Add_Goto (Table.States (66), 52, 51);
+            Add_Goto (Table.States (66), 53, 52);
+            Add_Action (Table.States (67), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (53, 4), 2, null,
+            null);
+            Add_Action (Table.States (68), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (52, 2), 2, null,
+            null);
+            Add_Action (Table.States (69), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (53, 5), 2, null,
+            null);
+            Add_Action (Table.States (70), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (52, 3), 2,
+            rhs_optional_item_3'Access, null);
+            Add_Action (Table.States (71), 12, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (71), 18, 38);
+            Add_Action (Table.States (71), 19, 39);
+            Add_Action (Table.States (71), 20, 40);
+            Add_Action (Table.States (71), 21, 41);
+            Add_Action (Table.States (71), 23, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (71), 29, Reduce, (46, 0), 0, null, null);
+            Add_Action (Table.States (71), 33, 42);
+            Add_Conflict (Table.States (71), 33, (46, 0), 0, null, null);
+            Add_Action (Table.States (71), 35, 43);
+            Add_Action (Table.States (71), 36, Reduce, (46, 0), 0, null, null);
+            Add_Error (Table.States (71));
+            Add_Goto (Table.States (71), 46, 88);
+            Add_Goto (Table.States (71), 47, 46);
+            Add_Goto (Table.States (71), 48, 47);
+            Add_Goto (Table.States (71), 49, 48);
+            Add_Goto (Table.States (71), 50, 49);
+            Add_Goto (Table.States (71), 51, 50);
+            Add_Goto (Table.States (71), 52, 51);
+            Add_Goto (Table.States (71), 53, 52);
+            Add_Action (Table.States (72), 4, 89);
+            Add_Action (Table.States (72), 5, 90);
+            Add_Error (Table.States (72));
+            Add_Action (Table.States (73), (23, 33, 36), (44, 0), 1, null, 
null);
+            Add_Action (Table.States (74), (23, 33, 36), (43, 0), 4, 
nonterminal_0'Access, null);
+            Add_Action (Table.States (75), 11, 91);
+            Add_Action (Table.States (75), 12, Reduce, (46, 2), 2, null, null);
+            Add_Action (Table.States (75), 23, Reduce, (46, 2), 2, null, null);
+            Add_Action (Table.States (75), 29, Reduce, (46, 2), 2, null, null);
+            Add_Action (Table.States (75), 33, Reduce, (46, 2), 2, null, null);
+            Add_Action (Table.States (75), 36, Reduce, (46, 2), 2, null, null);
+            Add_Error (Table.States (75));
+            Add_Action (Table.States (76), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (49, 1), 2, null,
+            null);
+            Add_Action (Table.States (77), (23, 33, 36), (43, 1), 4, 
nonterminal_1'Access, null);
+            Add_Action (Table.States (78), (23, 33, 36), (38, 4), 5, 
declaration_4'Access, null);
+            Add_Action (Table.States (79), (1 =>  33), (39, 1), 4, null, null);
+            Add_Action (Table.States (80), (1 =>  33), (39, 2), 4, null, null);
+            Add_Action (Table.States (81), 18, 38);
+            Add_Action (Table.States (81), 19, 39);
+            Add_Action (Table.States (81), 20, 40);
+            Add_Action (Table.States (81), 21, 41);
+            Add_Action (Table.States (81), 33, 42);
+            Add_Action (Table.States (81), 35, 43);
+            Add_Error (Table.States (81));
+            Add_Goto (Table.States (81), 47, 46);
+            Add_Goto (Table.States (81), 48, 47);
+            Add_Goto (Table.States (81), 49, 92);
+            Add_Goto (Table.States (81), 50, 49);
+            Add_Goto (Table.States (81), 51, 50);
+            Add_Goto (Table.States (81), 52, 51);
+            Add_Goto (Table.States (81), 53, 52);
+            Add_Action (Table.States (82), 11, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 12, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 18, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 19, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 20, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 21, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 22, 93);
+            Add_Action (Table.States (82), 23, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 26, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 27, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 28, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 29, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 33, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 35, Reduce, (53, 0), 3, null, null);
+            Add_Action (Table.States (82), 36, Reduce, (53, 0), 3, null, null);
+            Add_Error (Table.States (82));
+            Add_Action (Table.States (83), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (52, 0), 3, null,
+            null);
+            Add_Action (Table.States (84), 11, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 12, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 18, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 19, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 20, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 21, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 23, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 24, 94);
+            Add_Action (Table.States (84), 25, 95);
+            Add_Action (Table.States (84), 26, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 27, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 28, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 29, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 31, 96);
+            Add_Action (Table.States (84), 33, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 35, Reduce, (51, 0), 3, null, null);
+            Add_Action (Table.States (84), 36, Reduce, (51, 0), 3, null, null);
+            Add_Error (Table.States (84));
+            Add_Action (Table.States (85), 33, 97);
+            Add_Error (Table.States (85));
+            Add_Action (Table.States (86), 11, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 12, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 18, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 19, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 20, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 21, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 23, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 24, 67);
+            Add_Action (Table.States (86), 25, 68);
+            Add_Action (Table.States (86), 26, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 27, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 28, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 29, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 31, 69);
+            Add_Action (Table.States (86), 33, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 35, Reduce, (50, 0), 1, null, null);
+            Add_Action (Table.States (86), 36, Reduce, (50, 0), 1, null, null);
+            Add_Error (Table.States (86));
+            Add_Action (Table.States (87), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (48, 1), 3, null,
+            null);
+            Add_Action (Table.States (88), (12, 23, 29, 33, 36), (45, 1), 3, 
null, null);
+            Add_Action (Table.States (89), 5, 98);
+            Add_Error (Table.States (89));
+            Add_Action (Table.States (90), 33, 99);
+            Add_Error (Table.States (90));
+            Add_Action (Table.States (91), (12, 23, 29, 33, 36), (46, 3), 3, 
null, null);
+            Add_Action (Table.States (92), 12, Reduce, (54, 1), 3, null, null);
+            Add_Action (Table.States (92), 18, 38);
+            Add_Action (Table.States (92), 19, 39);
+            Add_Action (Table.States (92), 20, 40);
+            Add_Action (Table.States (92), 21, 41);
+            Add_Action (Table.States (92), 26, Reduce, (54, 1), 3, null, null);
+            Add_Action (Table.States (92), 27, Reduce, (54, 1), 3, null, null);
+            Add_Action (Table.States (92), 28, Reduce, (54, 1), 3, null, null);
+            Add_Action (Table.States (92), 33, 42);
+            Add_Action (Table.States (92), 35, 43);
+            Add_Error (Table.States (92));
+            Add_Goto (Table.States (92), 47, 46);
+            Add_Goto (Table.States (92), 48, 76);
+            Add_Goto (Table.States (92), 50, 49);
+            Add_Goto (Table.States (92), 51, 50);
+            Add_Goto (Table.States (92), 52, 51);
+            Add_Goto (Table.States (92), 53, 52);
+            Add_Action (Table.States (93), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (53, 1), 4, null,
+            null);
+            Add_Action (Table.States (94), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (53, 2), 4, null,
+            null);
+            Add_Action (Table.States (95), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (52, 1), 4, null,
+            null);
+            Add_Action (Table.States (96), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (53, 3), 4, null,
+            null);
+            Add_Action (Table.States (97), 17, 100);
+            Add_Error (Table.States (97));
+            Add_Action (Table.States (98), (12, 23, 29, 33, 36), (45, 3), 4, 
null, null);
+            Add_Action (Table.States (99), 16, 101);
+            Add_Error (Table.States (99));
+            Add_Action (Table.States (100), (11, 12, 18, 19, 20, 21, 23, 26, 
27, 28, 29, 33, 35, 36), (47, 0), 5, null,
+            null);
+            Add_Action (Table.States (101), 33, 102);
+            Add_Error (Table.States (101));
+            Add_Action (Table.States (102), (12, 23, 29, 33, 36), (45, 2), 6, 
null, null);
          end Subr_1;
       begin
          Subr_1;
diff --git a/packages/wisi/wisitoken_grammar_main.ads 
b/packages/wisi/wisitoken_grammar_main.ads
index 7f28437..e07ed68 100644
--- a/packages/wisi/wisitoken_grammar_main.ads
+++ b/packages/wisi/wisitoken_grammar_main.ads
@@ -2,7 +2,7 @@
 --  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c PROCESS 
wisitoken_grammar.wy
 --
 
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  Author: Stephen Leake <address@hidden>
 --
diff --git a/packages/wisi/wisitoken_grammar_re2c.c 
b/packages/wisi/wisitoken_grammar_re2c.c
index 6ad6b86..f4185ee 100644
--- a/packages/wisi/wisitoken_grammar_re2c.c
+++ b/packages/wisi/wisitoken_grammar_re2c.c
@@ -4,7 +4,7 @@
 //  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c 
wisitoken_grammar.wy
 //
 
-//  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+//  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 //
 //  Author: Stephen Leake <address@hidden>
 //
@@ -154,7 +154,7 @@ int wisitoken_grammar_next_token
    *id = -1;
    if (lexer->cursor > lexer->buffer_last)
    {
-      *id            = 25;
+      *id            = 36;
       *byte_position = lexer->buffer_last - lexer->buffer + 1;
       *byte_length   = 0;
       *char_position = lexer->char_token_start;
@@ -188,8 +188,13 @@ int wisitoken_grammar_next_token
        case '"':       goto yy11;
        case '%':       goto yy12;
        case '\'':      goto yy14;
-       case ',':       goto yy15;
-       case '/':       goto yy17;
+       case '(':       goto yy15;
+       case ')':       goto yy17;
+       case '*':       goto yy19;
+       case '+':       goto yy21;
+       case ',':       goto yy23;
+       case '-':       goto yy25;
+       case '/':       goto yy27;
        case '0':
        case '1':
        case '2':
@@ -199,12 +204,13 @@ int wisitoken_grammar_next_token
        case '6':
        case '7':
        case '8':
-       case '9':       goto yy19;
-       case ':':       goto yy22;
-       case ';':       goto yy24;
-       case '<':       goto yy26;
-       case '=':       goto yy28;
-       case '>':       goto yy30;
+       case '9':       goto yy29;
+       case ':':       goto yy32;
+       case ';':       goto yy34;
+       case '<':       goto yy36;
+       case '=':       goto yy38;
+       case '>':       goto yy40;
+       case '?':       goto yy42;
        case 'A':
        case 'B':
        case 'C':
@@ -250,14 +256,69 @@ int wisitoken_grammar_next_token
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       case 'c':       goto yy35;
-       case 'e':       goto yy36;
-       case 'i':       goto yy37;
-       case 'k':       goto yy38;
-       case 'n':       goto yy39;
-       case 't':       goto yy40;
-       case '|':       goto yy41;
+       case 'z':       goto yy44;
+       case '[':       goto yy47;
+       case ']':       goto yy49;
+       case 'c':       goto yy51;
+       case 'e':       goto yy52;
+       case 'i':       goto yy53;
+       case 'k':       goto yy54;
+       case 'n':       goto yy55;
+       case 't':       goto yy56;
+       case '{':       goto yy57;
+       case '|':       goto yy59;
+       case '}':       goto yy61;
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:      goto yy63;
+       case 0xE0:      goto yy64;
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:      goto yy65;
+       case 0xF0:      goto yy66;
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:      goto yy67;
+       case 0xF4:      goto yy68;
        default:        goto yy2;
        }
 yy2:
@@ -265,21 +326,21 @@ yy2:
        YYSKIP ();
 yy3:
        YYDEBUG(3, YYPEEK ());
-#line 233 "../wisitoken_grammar.re2c"
+#line 255 "../wisitoken_grammar.re2c"
        {status = ERROR_unrecognized_character; continue;}
-#line 271 "../wisitoken_grammar_re2c.c"
+#line 332 "../wisitoken_grammar_re2c.c"
 yy4:
        YYDEBUG(4, YYPEEK ());
        YYSKIP ();
        YYDEBUG(5, YYPEEK ());
-#line 231 "../wisitoken_grammar.re2c"
-       {*id =  25; continue;}
-#line 278 "../wisitoken_grammar_re2c.c"
+#line 253 "../wisitoken_grammar.re2c"
+       {*id =  36; continue;}
+#line 339 "../wisitoken_grammar_re2c.c"
 yy6:
        YYDEBUG(6, YYPEEK ());
        YYSKIP ();
        YYDEBUG(7, YYPEEK ());
-#line 200 "../wisitoken_grammar.re2c"
+#line 211 "../wisitoken_grammar.re2c"
        { lexer->byte_token_start = lexer->cursor;
           lexer->char_token_start = lexer->char_pos;
           if (*lexer->cursor == 0x0A)
@@ -287,14 +348,14 @@ yy6:
           else
              lexer->line_token_start = lexer->line;
           continue; }
-#line 291 "../wisitoken_grammar_re2c.c"
+#line 352 "../wisitoken_grammar_re2c.c"
 yy8:
        YYDEBUG(8, YYPEEK ());
        YYSKIP ();
        YYDEBUG(9, YYPEEK ());
-#line 207 "../wisitoken_grammar.re2c"
+#line 218 "../wisitoken_grammar.re2c"
        {*id =  1; continue;}
-#line 298 "../wisitoken_grammar_re2c.c"
+#line 359 "../wisitoken_grammar_re2c.c"
 yy10:
        YYDEBUG(10, YYPEEK ());
        YYSKIP ();
@@ -456,7 +517,7 @@ yy11:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy44;
+       case 0xF4:      goto yy70;
        default:        goto yy3;
        }
 yy12:
@@ -464,16 +525,16 @@ yy12:
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '(':       goto yy54;
-       case '[':       goto yy56;
-       case '{':       goto yy58;
+       case '(':       goto yy80;
+       case '[':       goto yy82;
+       case '{':       goto yy84;
        default:        goto yy13;
        }
 yy13:
        YYDEBUG(13, YYPEEK ());
-#line 224 "../wisitoken_grammar.re2c"
-       {*id =  18; continue;}
-#line 477 "../wisitoken_grammar_re2c.c"
+#line 240 "../wisitoken_grammar.re2c"
+       {*id =  23; continue;}
+#line 538 "../wisitoken_grammar_re2c.c"
 yy14:
        YYDEBUG(14, YYPEEK ());
        yyaccept = 0;
@@ -627,28 +688,48 @@ yy14:
        case 0xF1:
        case 0xF2:
        case 0xF3:
-       case 0xF4:      goto yy61;
+       case 0xF4:      goto yy87;
        default:        goto yy3;
        }
 yy15:
        YYDEBUG(15, YYPEEK ());
        YYSKIP ();
        YYDEBUG(16, YYPEEK ());
-#line 220 "../wisitoken_grammar.re2c"
-       {*id =  14; continue;}
-#line 640 "../wisitoken_grammar_re2c.c"
+#line 237 "../wisitoken_grammar.re2c"
+       {*id =  20; continue;}
+#line 701 "../wisitoken_grammar_re2c.c"
 yy17:
        YYDEBUG(17, YYPEEK ());
        YYSKIP ();
        YYDEBUG(18, YYPEEK ());
-#line 226 "../wisitoken_grammar.re2c"
-       {*id =  20; continue;}
-#line 647 "../wisitoken_grammar_re2c.c"
+#line 245 "../wisitoken_grammar.re2c"
+       {*id =  28; continue;}
+#line 708 "../wisitoken_grammar_re2c.c"
 yy19:
        YYDEBUG(19, YYPEEK ());
        YYSKIP ();
-       yych = YYPEEK ();
        YYDEBUG(20, YYPEEK ());
+#line 248 "../wisitoken_grammar.re2c"
+       {*id =  31; continue;}
+#line 715 "../wisitoken_grammar_re2c.c"
+yy21:
+       YYDEBUG(21, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(22, YYPEEK ());
+#line 241 "../wisitoken_grammar.re2c"
+       {*id =  24; continue;}
+#line 722 "../wisitoken_grammar_re2c.c"
+yy23:
+       YYDEBUG(23, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(24, YYPEEK ());
+#line 232 "../wisitoken_grammar.re2c"
+       {*id =  15; continue;}
+#line 729 "../wisitoken_grammar_re2c.c"
+yy25:
+       YYDEBUG(25, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
        switch (yych) {
        case '0':
        case '1':
@@ -660,63 +741,27 @@ yy19:
        case '7':
        case '8':
        case '9':
-       case '_':       goto yy19;
-       default:        goto yy21;
-       }
-yy21:
-       YYDEBUG(21, YYPEEK ());
-#line 227 "../wisitoken_grammar.re2c"
-       {*id =  21; continue;}
-#line 671 "../wisitoken_grammar_re2c.c"
-yy22:
-       YYDEBUG(22, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(23, YYPEEK ());
-#line 219 "../wisitoken_grammar.re2c"
-       {*id =  13; continue;}
-#line 678 "../wisitoken_grammar_re2c.c"
-yy24:
-       YYDEBUG(24, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case ';':       goto yy70;
-       default:        goto yy25;
+       case '_':       goto yy29;
+       default:        goto yy26;
        }
-yy25:
-       YYDEBUG(25, YYPEEK ());
-#line 225 "../wisitoken_grammar.re2c"
-       {*id =  19; continue;}
-#line 691 "../wisitoken_grammar_re2c.c"
 yy26:
        YYDEBUG(26, YYPEEK ());
-       YYSKIP ();
+#line 239 "../wisitoken_grammar.re2c"
+       {*id =  22; continue;}
+#line 752 "../wisitoken_grammar_re2c.c"
+yy27:
        YYDEBUG(27, YYPEEK ());
-#line 223 "../wisitoken_grammar.re2c"
-       {*id =  17; continue;}
-#line 698 "../wisitoken_grammar_re2c.c"
-yy28:
-       YYDEBUG(28, YYPEEK ());
        YYSKIP ();
+       YYDEBUG(28, YYPEEK ());
+#line 247 "../wisitoken_grammar.re2c"
+       {*id =  30; continue;}
+#line 759 "../wisitoken_grammar_re2c.c"
+yy29:
        YYDEBUG(29, YYPEEK ());
-#line 221 "../wisitoken_grammar.re2c"
-       {*id =  15; continue;}
-#line 705 "../wisitoken_grammar_re2c.c"
-yy30:
-       YYDEBUG(30, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(31, YYPEEK ());
-#line 222 "../wisitoken_grammar.re2c"
-       {*id =  16; continue;}
-#line 712 "../wisitoken_grammar_re2c.c"
-yy32:
-       YYDEBUG(32, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
-yy33:
-       YYDEBUG(33, YYPEEK ());
+       YYDEBUG(30, YYPEEK ());
        switch (yych) {
-       case '-':
        case '0':
        case '1':
        case '2':
@@ -727,143 +772,80 @@ yy33:
        case '7':
        case '8':
        case '9':
-       case 'A':
-       case 'B':
-       case 'C':
-       case 'D':
-       case 'E':
-       case 'F':
-       case 'G':
-       case 'H':
-       case 'I':
-       case 'J':
-       case 'K':
-       case 'L':
-       case 'M':
-       case 'N':
-       case 'O':
-       case 'P':
-       case 'Q':
-       case 'R':
-       case 'S':
-       case 'T':
-       case 'U':
-       case 'V':
-       case 'W':
-       case 'X':
-       case 'Y':
-       case 'Z':
-       case '_':
-       case 'a':
-       case 'b':
-       case 'c':
-       case 'd':
-       case 'e':
-       case 'f':
-       case 'g':
-       case 'h':
-       case 'i':
-       case 'j':
-       case 'k':
-       case 'l':
-       case 'm':
-       case 'n':
-       case 'o':
-       case 'p':
-       case 'q':
-       case 'r':
-       case 's':
-       case 't':
-       case 'u':
-       case 'v':
-       case 'w':
-       case 'x':
-       case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy34;
+       case '_':       goto yy29;
+       default:        goto yy31;
        }
-yy34:
-       YYDEBUG(34, YYPEEK ());
-#line 228 "../wisitoken_grammar.re2c"
-       {*id =  22; continue;}
-#line 790 "../wisitoken_grammar_re2c.c"
-yy35:
-       YYDEBUG(35, YYPEEK ());
+yy31:
+       YYDEBUG(31, YYPEEK ());
+#line 249 "../wisitoken_grammar.re2c"
+       {*id =  32; continue;}
+#line 783 "../wisitoken_grammar_re2c.c"
+yy32:
+       YYDEBUG(32, YYPEEK ());
+       yyaccept = 1;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'o':       goto yy73;
+       case ':':       goto yy96;
        default:        goto yy33;
        }
-yy36:
-       YYDEBUG(36, YYPEEK ());
+yy33:
+       YYDEBUG(33, YYPEEK ());
+#line 230 "../wisitoken_grammar.re2c"
+       {*id =  13; continue;}
+#line 798 "../wisitoken_grammar_re2c.c"
+yy34:
+       YYDEBUG(34, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'n':       goto yy74;
-       default:        goto yy33;
+       case ';':       goto yy97;
+       default:        goto yy35;
        }
-yy37:
-       YYDEBUG(37, YYPEEK ());
+yy35:
+       YYDEBUG(35, YYPEEK ());
+#line 246 "../wisitoken_grammar.re2c"
+       {*id =  29; continue;}
+#line 811 "../wisitoken_grammar_re2c.c"
+yy36:
+       YYDEBUG(36, YYPEEK ());
        YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'f':       goto yy75;
-       default:        goto yy33;
-       }
+       YYDEBUG(37, YYPEEK ());
+#line 238 "../wisitoken_grammar.re2c"
+       {*id =  21; continue;}
+#line 818 "../wisitoken_grammar_re2c.c"
 yy38:
        YYDEBUG(38, YYPEEK ());
        YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'e':       goto yy77;
-       default:        goto yy33;
-       }
-yy39:
        YYDEBUG(39, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'o':       goto yy78;
-       default:        goto yy33;
-       }
+#line 233 "../wisitoken_grammar.re2c"
+       {*id =  16; continue;}
+#line 825 "../wisitoken_grammar_re2c.c"
 yy40:
        YYDEBUG(40, YYPEEK ());
        YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'o':       goto yy79;
-       default:        goto yy33;
-       }
-yy41:
        YYDEBUG(41, YYPEEK ());
-       YYSKIP ();
+#line 234 "../wisitoken_grammar.re2c"
+       {*id =  17; continue;}
+#line 832 "../wisitoken_grammar_re2c.c"
+yy42:
        YYDEBUG(42, YYPEEK ());
-#line 218 "../wisitoken_grammar.re2c"
-       {*id =  12; continue;}
-#line 845 "../wisitoken_grammar_re2c.c"
-yy43:
-       YYDEBUG(43, YYPEEK ());
        YYSKIP ();
-       yych = YYPEEK ();
+       YYDEBUG(43, YYPEEK ());
+#line 242 "../wisitoken_grammar.re2c"
+       {*id =  25; continue;}
+#line 839 "../wisitoken_grammar_re2c.c"
 yy44:
        YYDEBUG(44, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+yy45:
+       YYDEBUG(45, YYPEEK ());
        switch (yych) {
-       case ' ':
-       case '!':
-       case '#':
-       case '$':
-       case '%':
-       case '&':
-       case '\'':
-       case '(':
-       case ')':
-       case '*':
-       case '+':
-       case ',':
        case '-':
-       case '.':
-       case '/':
        case '0':
        case '1':
        case '2':
@@ -874,13 +856,6 @@ yy44:
        case '7':
        case '8':
        case '9':
-       case ':':
-       case ';':
-       case '<':
-       case '=':
-       case '>':
-       case '?':
-       case '@':
        case 'A':
        case 'B':
        case 'C':
@@ -907,12 +882,7 @@ yy44:
        case 'X':
        case 'Y':
        case 'Z':
-       case '[':
-       case '\\':
-       case ']':
-       case '^':
        case '_':
-       case '`':
        case 'a':
        case 'b':
        case 'c':
@@ -938,13 +908,7 @@ yy44:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':
-       case '{':
-       case '|':
-       case '}':
-       case '~':
-       case 0x7F:      goto yy43;
-       case '"':       goto yy46;
+       case 'z':       goto yy44;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -974,8 +938,8 @@ yy44:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy48;
-       case 0xE0:      goto yy49;
+       case 0xDF:      goto yy100;
+       case 0xE0:      goto yy101;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -990,40 +954,116 @@ yy44:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy50;
-       case 0xF0:      goto yy51;
+       case 0xEF:      goto yy102;
+       case 0xF0:      goto yy103;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy52;
-       case 0xF4:      goto yy53;
-       default:        goto yy45;
-       }
-yy45:
-       YYDEBUG(45, YYPEEK ());
-       YYRESTORE ();
-       switch (yyaccept) {
-       case 0:         goto yy3;
-       case 1:         goto yy47;
-       case 2:         goto yy63;
-       default:        goto yy72;
+       case 0xF3:      goto yy104;
+       case 0xF4:      goto yy105;
+       default:        goto yy46;
        }
 yy46:
        YYDEBUG(46, YYPEEK ());
-       yyaccept = 1;
+#line 250 "../wisitoken_grammar.re2c"
+       {*id =  33; continue;}
+#line 970 "../wisitoken_grammar_re2c.c"
+yy47:
+       YYDEBUG(47, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(48, YYPEEK ());
+#line 236 "../wisitoken_grammar.re2c"
+       {*id =  19; continue;}
+#line 977 "../wisitoken_grammar_re2c.c"
+yy49:
+       YYDEBUG(49, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(50, YYPEEK ());
+#line 244 "../wisitoken_grammar.re2c"
+       {*id =  27; continue;}
+#line 984 "../wisitoken_grammar_re2c.c"
+yy51:
+       YYDEBUG(51, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '"':       goto yy43;
-       default:        goto yy47;
+       case 'o':       goto yy106;
+       default:        goto yy45;
        }
-yy47:
-       YYDEBUG(47, YYPEEK ());
+yy52:
+       YYDEBUG(52, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'n':       goto yy107;
+       default:        goto yy45;
+       }
+yy53:
+       YYDEBUG(53, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'f':       goto yy108;
+       default:        goto yy45;
+       }
+yy54:
+       YYDEBUG(54, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'e':       goto yy110;
+       default:        goto yy45;
+       }
+yy55:
+       YYDEBUG(55, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'o':       goto yy111;
+       default:        goto yy45;
+       }
+yy56:
+       YYDEBUG(56, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'o':       goto yy112;
+       default:        goto yy45;
+       }
+yy57:
+       YYDEBUG(57, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(58, YYPEEK ());
+#line 235 "../wisitoken_grammar.re2c"
+       {*id =  18; continue;}
+#line 1051 "../wisitoken_grammar_re2c.c"
+yy59:
+       YYDEBUG(59, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(60, YYPEEK ());
 #line 229 "../wisitoken_grammar.re2c"
-       {*id =  23; continue;}
-#line 1025 "../wisitoken_grammar_re2c.c"
-yy48:
-       YYDEBUG(48, YYPEEK ());
+       {*id =  12; continue;}
+#line 1058 "../wisitoken_grammar_re2c.c"
+yy61:
+       YYDEBUG(61, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(62, YYPEEK ());
+#line 243 "../wisitoken_grammar.re2c"
+       {*id =  26; continue;}
+#line 1065 "../wisitoken_grammar_re2c.c"
+yy63:
+       YYDEBUG(63, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1090,12 +1130,14 @@ yy48:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy43;
-       default:        goto yy45;
+       case 0xBF:      goto yy44;
+       default:        goto yy3;
        }
-yy49:
-       YYDEBUG(49, YYPEEK ());
+yy64:
+       YYDEBUG(64, YYPEEK ());
+       yyaccept = 0;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 0xA0:
@@ -1129,12 +1171,14 @@ yy49:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy48;
-       default:        goto yy45;
+       case 0xBF:      goto yy100;
+       default:        goto yy3;
        }
-yy50:
-       YYDEBUG(50, YYPEEK ());
+yy65:
+       YYDEBUG(65, YYPEEK ());
+       yyaccept = 0;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 0x80:
@@ -1200,12 +1244,14 @@ yy50:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy48;
-       default:        goto yy45;
+       case 0xBF:      goto yy100;
+       default:        goto yy3;
        }
-yy51:
-       YYDEBUG(51, YYPEEK ());
+yy66:
+       YYDEBUG(66, YYPEEK ());
+       yyaccept = 0;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 0x90:
@@ -1255,12 +1301,14 @@ yy51:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy50;
-       default:        goto yy45;
+       case 0xBF:      goto yy102;
+       default:        goto yy3;
        }
-yy52:
-       YYDEBUG(52, YYPEEK ());
+yy67:
+       YYDEBUG(67, YYPEEK ());
+       yyaccept = 0;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 0x80:
@@ -1326,12 +1374,14 @@ yy52:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy50;
-       default:        goto yy45;
+       case 0xBF:      goto yy102;
+       default:        goto yy3;
        }
-yy53:
-       YYDEBUG(53, YYPEEK ());
+yy68:
+       YYDEBUG(68, YYPEEK ());
+       yyaccept = 0;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case 0x80:
@@ -1349,44 +1399,23 @@ yy53:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy50;
-       default:        goto yy45;
+       case 0x8F:      goto yy102;
+       default:        goto yy3;
        }
-yy54:
-       YYDEBUG(54, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(55, YYPEEK ());
-#line 217 "../wisitoken_grammar.re2c"
-       {*id =  11; skip_to(lexer, ")%"); continue;}
-#line 1362 "../wisitoken_grammar_re2c.c"
-yy56:
-       YYDEBUG(56, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(57, YYPEEK ());
-#line 216 "../wisitoken_grammar.re2c"
-       {*id =  10; skip_to(lexer, "]%"); continue;}
-#line 1369 "../wisitoken_grammar_re2c.c"
-yy58:
-       YYDEBUG(58, YYPEEK ());
-       YYSKIP ();
-       YYDEBUG(59, YYPEEK ());
-#line 215 "../wisitoken_grammar.re2c"
-       {*id =  9; skip_to(lexer, "}%"); continue;}
-#line 1376 "../wisitoken_grammar_re2c.c"
-yy60:
-       YYDEBUG(60, YYPEEK ());
+yy69:
+       YYDEBUG(69, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
-yy61:
-       YYDEBUG(61, YYPEEK ());
+yy70:
+       YYDEBUG(70, YYPEEK ());
        switch (yych) {
        case ' ':
        case '!':
-       case '"':
        case '#':
        case '$':
        case '%':
        case '&':
+       case '\'':
        case '(':
        case ')':
        case '*':
@@ -1474,8 +1503,8 @@ yy61:
        case '|':
        case '}':
        case '~':
-       case 0x7F:      goto yy60;
-       case '\'':      goto yy62;
+       case 0x7F:      goto yy69;
+       case '"':       goto yy72;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -1505,8 +1534,8 @@ yy61:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy64;
-       case 0xE0:      goto yy65;
+       case 0xDF:      goto yy74;
+       case 0xE0:      goto yy75;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -1521,31 +1550,48 @@ yy61:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy66;
-       case 0xF0:      goto yy67;
+       case 0xEF:      goto yy76;
+       case 0xF0:      goto yy77;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy68;
-       case 0xF4:      goto yy69;
-       default:        goto yy45;
+       case 0xF3:      goto yy78;
+       case 0xF4:      goto yy79;
+       default:        goto yy71;
        }
-yy62:
-       YYDEBUG(62, YYPEEK ());
-       yyaccept = 2;
+yy71:
+       YYDEBUG(71, YYPEEK ());
+       YYRESTORE ();
+       switch (yyaccept) {
+       case 0:         goto yy3;
+       case 1:         goto yy33;
+       case 2:         goto yy46;
+       case 3:         goto yy73;
+       case 4:         goto yy89;
+       case 5:         goto yy99;
+       case 6:         goto yy109;
+       case 7:         goto yy123;
+       case 8:         goto yy128;
+       case 9:         goto yy135;
+       case 10:        goto yy139;
+       default:        goto yy145;
+       }
+yy72:
+       YYDEBUG(72, YYPEEK ());
+       yyaccept = 3;
        YYSKIP ();
        YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '\'':      goto yy60;
-       default:        goto yy63;
+       case '"':       goto yy69;
+       default:        goto yy73;
        }
-yy63:
-       YYDEBUG(63, YYPEEK ());
-#line 230 "../wisitoken_grammar.re2c"
-       {*id =  24; continue;}
-#line 1547 "../wisitoken_grammar_re2c.c"
-yy64:
-       YYDEBUG(64, YYPEEK ());
+yy73:
+       YYDEBUG(73, YYPEEK ());
+#line 251 "../wisitoken_grammar.re2c"
+       {*id =  34; continue;}
+#line 1593 "../wisitoken_grammar_re2c.c"
+yy74:
+       YYDEBUG(74, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1612,11 +1658,11 @@ yy64:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy60;
-       default:        goto yy45;
+       case 0xBF:      goto yy69;
+       default:        goto yy71;
        }
-yy65:
-       YYDEBUG(65, YYPEEK ());
+yy75:
+       YYDEBUG(75, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1651,11 +1697,11 @@ yy65:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy64;
-       default:        goto yy45;
+       case 0xBF:      goto yy74;
+       default:        goto yy71;
        }
-yy66:
-       YYDEBUG(66, YYPEEK ());
+yy76:
+       YYDEBUG(76, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1722,11 +1768,11 @@ yy66:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy64;
-       default:        goto yy45;
+       case 0xBF:      goto yy74;
+       default:        goto yy71;
        }
-yy67:
-       YYDEBUG(67, YYPEEK ());
+yy77:
+       YYDEBUG(77, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1777,11 +1823,11 @@ yy67:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy66;
-       default:        goto yy45;
+       case 0xBF:      goto yy76;
+       default:        goto yy71;
        }
-yy68:
-       YYDEBUG(68, YYPEEK ());
+yy78:
+       YYDEBUG(78, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1848,11 +1894,11 @@ yy68:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy66;
-       default:        goto yy45;
+       case 0xBF:      goto yy76;
+       default:        goto yy71;
        }
-yy69:
-       YYDEBUG(69, YYPEEK ());
+yy79:
+       YYDEBUG(79, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -1871,47 +1917,37 @@ yy69:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy66;
-       default:        goto yy45;
+       case 0x8F:      goto yy76;
+       default:        goto yy71;
        }
-yy70:
-       YYDEBUG(70, YYPEEK ());
-       yyaccept = 3;
+yy80:
+       YYDEBUG(80, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(81, YYPEEK ());
+#line 228 "../wisitoken_grammar.re2c"
+       {*id =  11; skip_to(lexer, ")%"); continue;}
+#line 1930 "../wisitoken_grammar_re2c.c"
+yy82:
+       YYDEBUG(82, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(83, YYPEEK ());
+#line 227 "../wisitoken_grammar.re2c"
+       {*id =  10; skip_to(lexer, "]%"); continue;}
+#line 1937 "../wisitoken_grammar_re2c.c"
+yy84:
+       YYDEBUG(84, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(85, YYPEEK ());
+#line 226 "../wisitoken_grammar.re2c"
+       {*id =  9; skip_to(lexer, "}%"); continue;}
+#line 1944 "../wisitoken_grammar_re2c.c"
+yy86:
+       YYDEBUG(86, YYPEEK ());
        YYSKIP ();
-       YYBACKUP ();
        yych = YYPEEK ();
-       YYDEBUG(71, YYPEEK ());
+yy87:
+       YYDEBUG(87, YYPEEK ());
        switch (yych) {
-       case 0x00:
-       case 0x01:
-       case 0x02:
-       case 0x03:
-       case 0x05:
-       case 0x06:
-       case 0x07:
-       case 0x08:
-       case '\t':
-       case '\v':
-       case '\f':
-       case '\r':
-       case 0x0E:
-       case 0x0F:
-       case 0x10:
-       case 0x11:
-       case 0x12:
-       case 0x13:
-       case 0x14:
-       case 0x15:
-       case 0x16:
-       case 0x17:
-       case 0x18:
-       case 0x19:
-       case 0x1A:
-       case 0x1B:
-       case 0x1C:
-       case 0x1D:
-       case 0x1E:
-       case 0x1F:
        case ' ':
        case '!':
        case '"':
@@ -1919,7 +1955,6 @@ yy70:
        case '$':
        case '%':
        case '&':
-       case '\'':
        case '(':
        case ')':
        case '*':
@@ -2007,7 +2042,8 @@ yy70:
        case '|':
        case '}':
        case '~':
-       case 0x7F:      goto yy70;
+       case 0x7F:      goto yy86;
+       case '\'':      goto yy88;
        case 0xC2:
        case 0xC3:
        case 0xC4:
@@ -2037,8 +2073,8 @@ yy70:
        case 0xDC:
        case 0xDD:
        case 0xDE:
-       case 0xDF:      goto yy80;
-       case 0xE0:      goto yy81;
+       case 0xDF:      goto yy90;
+       case 0xE0:      goto yy91;
        case 0xE1:
        case 0xE2:
        case 0xE3:
@@ -2053,137 +2089,31 @@ yy70:
        case 0xEC:
        case 0xED:
        case 0xEE:
-       case 0xEF:      goto yy82;
-       case 0xF0:      goto yy83;
+       case 0xEF:      goto yy92;
+       case 0xF0:      goto yy93;
        case 0xF1:
        case 0xF2:
-       case 0xF3:      goto yy84;
-       case 0xF4:      goto yy85;
-       default:        goto yy72;
+       case 0xF3:      goto yy94;
+       case 0xF4:      goto yy95;
+       default:        goto yy71;
        }
-yy72:
-       YYDEBUG(72, YYPEEK ());
-#line 208 "../wisitoken_grammar.re2c"
-       {*id =  2; continue;}
-#line 2069 "../wisitoken_grammar_re2c.c"
-yy73:
-       YYDEBUG(73, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'd':       goto yy86;
-       default:        goto yy33;
-       }
-yy74:
-       YYDEBUG(74, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'd':       goto yy87;
-       default:        goto yy33;
-       }
-yy75:
-       YYDEBUG(75, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case '-':
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':
-       case 'A':
-       case 'B':
-       case 'C':
-       case 'D':
-       case 'E':
-       case 'F':
-       case 'G':
-       case 'H':
-       case 'I':
-       case 'J':
-       case 'K':
-       case 'L':
-       case 'M':
-       case 'N':
-       case 'O':
-       case 'P':
-       case 'Q':
-       case 'R':
-       case 'S':
-       case 'T':
-       case 'U':
-       case 'V':
-       case 'W':
-       case 'X':
-       case 'Y':
-       case 'Z':
-       case '_':
-       case 'a':
-       case 'b':
-       case 'c':
-       case 'd':
-       case 'e':
-       case 'f':
-       case 'g':
-       case 'h':
-       case 'i':
-       case 'j':
-       case 'k':
-       case 'l':
-       case 'm':
-       case 'n':
-       case 'o':
-       case 'p':
-       case 'q':
-       case 'r':
-       case 's':
-       case 't':
-       case 'u':
-       case 'v':
-       case 'w':
-       case 'x':
-       case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy76;
-       }
-yy76:
-       YYDEBUG(76, YYPEEK ());
-#line 211 "../wisitoken_grammar.re2c"
-       {*id =  5; continue;}
-#line 2161 "../wisitoken_grammar_re2c.c"
-yy77:
-       YYDEBUG(77, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'y':       goto yy89;
-       default:        goto yy33;
-       }
-yy78:
-       YYDEBUG(78, YYPEEK ());
-       YYSKIP ();
-       yych = YYPEEK ();
-       switch (yych) {
-       case 'n':       goto yy90;
-       default:        goto yy33;
-       }
-yy79:
-       YYDEBUG(79, YYPEEK ());
+yy88:
+       YYDEBUG(88, YYPEEK ());
+       yyaccept = 4;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'k':       goto yy91;
-       default:        goto yy33;
+       case '\'':      goto yy86;
+       default:        goto yy89;
        }
-yy80:
-       YYDEBUG(80, YYPEEK ());
+yy89:
+       YYDEBUG(89, YYPEEK ());
+#line 252 "../wisitoken_grammar.re2c"
+       {*id =  35; continue;}
+#line 2115 "../wisitoken_grammar_re2c.c"
+yy90:
+       YYDEBUG(90, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2250,11 +2180,11 @@ yy80:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy70;
-       default:        goto yy45;
+       case 0xBF:      goto yy86;
+       default:        goto yy71;
        }
-yy81:
-       YYDEBUG(81, YYPEEK ());
+yy91:
+       YYDEBUG(91, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2289,11 +2219,11 @@ yy81:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy80;
-       default:        goto yy45;
+       case 0xBF:      goto yy90;
+       default:        goto yy71;
        }
-yy82:
-       YYDEBUG(82, YYPEEK ());
+yy92:
+       YYDEBUG(92, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2360,11 +2290,11 @@ yy82:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy80;
-       default:        goto yy45;
+       case 0xBF:      goto yy90;
+       default:        goto yy71;
        }
-yy83:
-       YYDEBUG(83, YYPEEK ());
+yy93:
+       YYDEBUG(93, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2415,11 +2345,11 @@ yy83:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy82;
-       default:        goto yy45;
+       case 0xBF:      goto yy92;
+       default:        goto yy71;
        }
-yy84:
-       YYDEBUG(84, YYPEEK ());
+yy94:
+       YYDEBUG(94, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2486,11 +2416,11 @@ yy84:
        case 0xBC:
        case 0xBD:
        case 0xBE:
-       case 0xBF:      goto yy82;
-       default:        goto yy45;
+       case 0xBF:      goto yy92;
+       default:        goto yy71;
        }
-yy85:
-       YYDEBUG(85, YYPEEK ());
+yy95:
+       YYDEBUG(95, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
@@ -2509,23 +2439,71 @@ yy85:
        case 0x8C:
        case 0x8D:
        case 0x8E:
-       case 0x8F:      goto yy82;
-       default:        goto yy45;
+       case 0x8F:      goto yy92;
+       default:        goto yy71;
        }
-yy86:
-       YYDEBUG(86, YYPEEK ());
+yy96:
+       YYDEBUG(96, YYPEEK ());
        YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'e':       goto yy92;
-       default:        goto yy33;
+       case '=':       goto yy113;
+       default:        goto yy71;
        }
-yy87:
-       YYDEBUG(87, YYPEEK ());
+yy97:
+       YYDEBUG(97, YYPEEK ());
+       yyaccept = 5;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
+       YYDEBUG(98, YYPEEK ());
        switch (yych) {
+       case 0x00:
+       case 0x01:
+       case 0x02:
+       case 0x03:
+       case 0x05:
+       case 0x06:
+       case 0x07:
+       case 0x08:
+       case '\t':
+       case '\v':
+       case '\f':
+       case '\r':
+       case 0x0E:
+       case 0x0F:
+       case 0x10:
+       case 0x11:
+       case 0x12:
+       case 0x13:
+       case 0x14:
+       case 0x15:
+       case 0x16:
+       case 0x17:
+       case 0x18:
+       case 0x19:
+       case 0x1A:
+       case 0x1B:
+       case 0x1C:
+       case 0x1D:
+       case 0x1E:
+       case 0x1F:
+       case ' ':
+       case '!':
+       case '"':
+       case '#':
+       case '$':
+       case '%':
+       case '&':
+       case '\'':
+       case '(':
+       case ')':
+       case '*':
+       case '+':
+       case ',':
        case '-':
+       case '.':
+       case '/':
        case '0':
        case '1':
        case '2':
@@ -2536,6 +2514,13 @@ yy87:
        case '7':
        case '8':
        case '9':
+       case ':':
+       case ';':
+       case '<':
+       case '=':
+       case '>':
+       case '?':
+       case '@':
        case 'A':
        case 'B':
        case 'C':
@@ -2562,7 +2547,12 @@ yy87:
        case 'X':
        case 'Y':
        case 'Z':
+       case '[':
+       case '\\':
+       case ']':
+       case '^':
        case '_':
+       case '`':
        case 'a':
        case 'b':
        case 'c':
@@ -2588,41 +2578,1090 @@ yy87:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy88;
+       case 'z':
+       case '{':
+       case '|':
+       case '}':
+       case '~':
+       case 0x7F:      goto yy97;
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:      goto yy115;
+       case 0xE0:      goto yy116;
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:      goto yy117;
+       case 0xF0:      goto yy118;
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:      goto yy119;
+       case 0xF4:      goto yy120;
+       default:        goto yy99;
        }
-yy88:
-       YYDEBUG(88, YYPEEK ());
-#line 210 "../wisitoken_grammar.re2c"
-       {*id =  4; continue;}
-#line 2599 "../wisitoken_grammar_re2c.c"
-yy89:
-       YYDEBUG(89, YYPEEK ());
-       YYSKIP ();
+yy99:
+       YYDEBUG(99, YYPEEK ());
+#line 219 "../wisitoken_grammar.re2c"
+       {*id =  2; continue;}
+#line 2645 "../wisitoken_grammar_re2c.c"
+yy100:
+       YYDEBUG(100, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy44;
+       default:        goto yy71;
+       }
+yy101:
+       YYDEBUG(101, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy100;
+       default:        goto yy71;
+       }
+yy102:
+       YYDEBUG(102, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy100;
+       default:        goto yy71;
+       }
+yy103:
+       YYDEBUG(103, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy102;
+       default:        goto yy71;
+       }
+yy104:
+       YYDEBUG(104, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy102;
+       default:        goto yy71;
+       }
+yy105:
+       YYDEBUG(105, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:      goto yy102;
+       default:        goto yy71;
+       }
+yy106:
+       YYDEBUG(106, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'd':       goto yy121;
+       default:        goto yy45;
+       }
+yy107:
+       YYDEBUG(107, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'd':       goto yy122;
+       default:        goto yy45;
+       }
+yy108:
+       YYDEBUG(108, YYPEEK ());
+       yyaccept = 6;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case '-':
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy109;
+       }
+yy109:
+       YYDEBUG(109, YYPEEK ());
+#line 222 "../wisitoken_grammar.re2c"
+       {*id =  5; continue;}
+#line 3124 "../wisitoken_grammar_re2c.c"
+yy110:
+       YYDEBUG(110, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'y':       goto yy124;
+       default:        goto yy45;
+       }
+yy111:
+       YYDEBUG(111, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'n':       goto yy125;
+       default:        goto yy45;
+       }
+yy112:
+       YYDEBUG(112, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'k':       goto yy126;
+       default:        goto yy45;
+       }
+yy113:
+       YYDEBUG(113, YYPEEK ());
+       YYSKIP ();
+       YYDEBUG(114, YYPEEK ());
+#line 231 "../wisitoken_grammar.re2c"
+       {*id =  14; continue;}
+#line 3161 "../wisitoken_grammar_re2c.c"
+yy115:
+       YYDEBUG(115, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy97;
+       default:        goto yy71;
+       }
+yy116:
+       YYDEBUG(116, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy115;
+       default:        goto yy71;
+       }
+yy117:
+       YYDEBUG(117, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy115;
+       default:        goto yy71;
+       }
+yy118:
+       YYDEBUG(118, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy117;
+       default:        goto yy71;
+       }
+yy119:
+       YYDEBUG(119, YYPEEK ());
+       YYSKIP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy117;
+       default:        goto yy71;
+       }
+yy120:
+       YYDEBUG(120, YYPEEK ());
+       YYSKIP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'w':       goto yy94;
-       default:        goto yy33;
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:      goto yy117;
+       default:        goto yy71;
        }
-yy90:
-       YYDEBUG(90, YYPEEK ());
+yy121:
+       YYDEBUG(121, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case '_':       goto yy95;
-       default:        goto yy33;
+       case 'e':       goto yy127;
+       default:        goto yy45;
        }
-yy91:
-       YYDEBUG(91, YYPEEK ());
+yy122:
+       YYDEBUG(122, YYPEEK ());
+       yyaccept = 7;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'e':       goto yy96;
-       default:        goto yy33;
+       case '-':
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy123;
        }
-yy92:
-       YYDEBUG(92, YYPEEK ());
+yy123:
+       YYDEBUG(123, YYPEEK ());
+#line 221 "../wisitoken_grammar.re2c"
+       {*id =  4; continue;}
+#line 3630 "../wisitoken_grammar_re2c.c"
+yy124:
+       YYDEBUG(124, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'w':       goto yy129;
+       default:        goto yy45;
+       }
+yy125:
+       YYDEBUG(125, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case '_':       goto yy130;
+       default:        goto yy45;
+       }
+yy126:
+       YYDEBUG(126, YYPEEK ());
+       yyaccept = 2;
+       YYSKIP ();
+       YYBACKUP ();
+       yych = YYPEEK ();
+       switch (yych) {
+       case 'e':       goto yy131;
+       default:        goto yy45;
+       }
+yy127:
+       YYDEBUG(127, YYPEEK ());
+       yyaccept = 8;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case '-':
@@ -2688,57 +3727,120 @@ yy92:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy93;
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy128;
        }
-yy93:
-       YYDEBUG(93, YYPEEK ());
-#line 209 "../wisitoken_grammar.re2c"
+yy128:
+       YYDEBUG(128, YYPEEK ());
+#line 220 "../wisitoken_grammar.re2c"
        {*id =  3; continue;}
-#line 2699 "../wisitoken_grammar_re2c.c"
-yy94:
-       YYDEBUG(94, YYPEEK ());
+#line 3789 "../wisitoken_grammar_re2c.c"
+yy129:
+       YYDEBUG(129, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'o':       goto yy97;
-       default:        goto yy33;
+       case 'o':       goto yy132;
+       default:        goto yy45;
        }
-yy95:
-       YYDEBUG(95, YYPEEK ());
+yy130:
+       YYDEBUG(130, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'g':       goto yy98;
-       default:        goto yy33;
+       case 'g':       goto yy133;
+       default:        goto yy45;
        }
-yy96:
-       YYDEBUG(96, YYPEEK ());
+yy131:
+       YYDEBUG(131, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'n':       goto yy99;
-       default:        goto yy33;
+       case 'n':       goto yy134;
+       default:        goto yy45;
        }
-yy97:
-       YYDEBUG(97, YYPEEK ());
+yy132:
+       YYDEBUG(132, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'r':       goto yy101;
-       default:        goto yy33;
+       case 'r':       goto yy136;
+       default:        goto yy45;
        }
-yy98:
-       YYDEBUG(98, YYPEEK ());
+yy133:
+       YYDEBUG(133, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'r':       goto yy102;
-       default:        goto yy33;
+       case 'r':       goto yy137;
+       default:        goto yy45;
        }
-yy99:
-       YYDEBUG(99, YYPEEK ());
+yy134:
+       YYDEBUG(134, YYPEEK ());
+       yyaccept = 9;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case '-':
@@ -2804,33 +3906,90 @@ yy99:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy100;
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy135;
        }
-yy100:
-       YYDEBUG(100, YYPEEK ());
-#line 214 "../wisitoken_grammar.re2c"
+yy135:
+       YYDEBUG(135, YYPEEK ());
+#line 225 "../wisitoken_grammar.re2c"
        {*id =  8; continue;}
-#line 2815 "../wisitoken_grammar_re2c.c"
-yy101:
-       YYDEBUG(101, YYPEEK ());
+#line 3968 "../wisitoken_grammar_re2c.c"
+yy136:
+       YYDEBUG(136, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'd':       goto yy103;
-       default:        goto yy33;
+       case 'd':       goto yy138;
+       default:        goto yy45;
        }
-yy102:
-       YYDEBUG(102, YYPEEK ());
+yy137:
+       YYDEBUG(137, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'a':       goto yy105;
-       default:        goto yy33;
+       case 'a':       goto yy140;
+       default:        goto yy45;
        }
-yy103:
-       YYDEBUG(103, YYPEEK ());
+yy138:
+       YYDEBUG(138, YYPEEK ());
+       yyaccept = 10;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case '-':
@@ -2896,49 +4055,110 @@ yy103:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy104;
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy139;
        }
-yy104:
-       YYDEBUG(104, YYPEEK ());
-#line 212 "../wisitoken_grammar.re2c"
+yy139:
+       YYDEBUG(139, YYPEEK ());
+#line 223 "../wisitoken_grammar.re2c"
        {*id =  6; continue;}
-#line 2907 "../wisitoken_grammar_re2c.c"
-yy105:
-       YYDEBUG(105, YYPEEK ());
+#line 4117 "../wisitoken_grammar_re2c.c"
+yy140:
+       YYDEBUG(140, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'm':       goto yy106;
-       default:        goto yy33;
+       case 'm':       goto yy141;
+       default:        goto yy45;
        }
-yy106:
-       YYDEBUG(106, YYPEEK ());
+yy141:
+       YYDEBUG(141, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'm':       goto yy107;
-       default:        goto yy33;
+       case 'm':       goto yy142;
+       default:        goto yy45;
        }
-yy107:
-       YYDEBUG(107, YYPEEK ());
+yy142:
+       YYDEBUG(142, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'a':       goto yy108;
-       default:        goto yy33;
+       case 'a':       goto yy143;
+       default:        goto yy45;
        }
-yy108:
-       YYDEBUG(108, YYPEEK ());
+yy143:
+       YYDEBUG(143, YYPEEK ());
+       yyaccept = 2;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
-       case 'r':       goto yy109;
-       default:        goto yy33;
+       case 'r':       goto yy144;
+       default:        goto yy45;
        }
-yy109:
-       YYDEBUG(109, YYPEEK ());
+yy144:
+       YYDEBUG(144, YYPEEK ());
+       yyaccept = 11;
        YYSKIP ();
+       YYBACKUP ();
        yych = YYPEEK ();
        switch (yych) {
        case '-':
@@ -3004,16 +4224,67 @@ yy109:
        case 'w':
        case 'x':
        case 'y':
-       case 'z':       goto yy32;
-       default:        goto yy110;
+       case 'z':
+       case 0xC2:
+       case 0xC3:
+       case 0xC4:
+       case 0xC5:
+       case 0xC6:
+       case 0xC7:
+       case 0xC8:
+       case 0xC9:
+       case 0xCA:
+       case 0xCB:
+       case 0xCC:
+       case 0xCD:
+       case 0xCE:
+       case 0xCF:
+       case 0xD0:
+       case 0xD1:
+       case 0xD2:
+       case 0xD3:
+       case 0xD4:
+       case 0xD5:
+       case 0xD6:
+       case 0xD7:
+       case 0xD8:
+       case 0xD9:
+       case 0xDA:
+       case 0xDB:
+       case 0xDC:
+       case 0xDD:
+       case 0xDE:
+       case 0xDF:
+       case 0xE0:
+       case 0xE1:
+       case 0xE2:
+       case 0xE3:
+       case 0xE4:
+       case 0xE5:
+       case 0xE6:
+       case 0xE7:
+       case 0xE8:
+       case 0xE9:
+       case 0xEA:
+       case 0xEB:
+       case 0xEC:
+       case 0xED:
+       case 0xEE:
+       case 0xEF:
+       case 0xF0:
+       case 0xF1:
+       case 0xF2:
+       case 0xF3:
+       case 0xF4:      goto yy45;
+       default:        goto yy145;
        }
-yy110:
-       YYDEBUG(110, YYPEEK ());
-#line 213 "../wisitoken_grammar.re2c"
+yy145:
+       YYDEBUG(145, YYPEEK ());
+#line 224 "../wisitoken_grammar.re2c"
        {*id =  7; continue;}
-#line 3015 "../wisitoken_grammar_re2c.c"
+#line 4286 "../wisitoken_grammar_re2c.c"
 }
-#line 234 "../wisitoken_grammar.re2c"
+#line 256 "../wisitoken_grammar.re2c"
 
       }
    *byte_position = lexer->byte_token_start - lexer->buffer + 1;
diff --git a/packages/wisi/wisitoken_grammar_re2c_c.ads 
b/packages/wisi/wisitoken_grammar_re2c_c.ads
index 0f96b59..d494b3f 100644
--- a/packages/wisi/wisitoken_grammar_re2c_c.ads
+++ b/packages/wisi/wisitoken_grammar_re2c_c.ads
@@ -2,7 +2,7 @@
 --  command line: wisitoken-bnf-generate.exe  --generate LALR Ada re2c 
wisitoken_grammar.wy
 --
 
---  Copyright (C) 2017, 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2017 - 2019 Free Software Foundation, Inc.
 --
 --  Author: Stephen Leake <address@hidden>
 --
diff --git a/packages/wisi/wisitoken_grammar_runtime.adb 
b/packages/wisi/wisitoken_grammar_runtime.adb
index 3795b1a..4841ada 100644
--- a/packages/wisi/wisitoken_grammar_runtime.adb
+++ b/packages/wisi/wisitoken_grammar_runtime.adb
@@ -17,14 +17,61 @@
 
 pragma License (Modified_GPL);
 
+with Ada.Characters.Handling;
+with Ada.Exceptions;
 with Ada.Strings.Unbounded;
-with SAL;
+with Ada.Text_IO;
+with GNAT.Regexp;
+with SAL.Generic_Decimal_Image;
+with System.Assertions;
 with WisiToken.Generate;   use WisiToken.Generate;
 with Wisitoken_Grammar_Actions; use Wisitoken_Grammar_Actions;
 package body WisiToken_Grammar_Runtime is
 
    use WisiToken;
 
+   ----------
+   --  Body subprograms, misc order
+
+   procedure Raise_Programmer_Error
+     (Label : in String;
+      Tree  : in WisiToken.Syntax_Trees.Tree;
+      Node  : in WisiToken.Syntax_Trees.Node_Index);
+   pragma No_Return (Raise_Programmer_Error);
+
+   procedure Raise_Programmer_Error
+     (Label : in String;
+      Tree  : in WisiToken.Syntax_Trees.Tree;
+      Node  : in WisiToken.Syntax_Trees.Node_Index)
+   is begin
+      raise SAL.Programmer_Error with Label & 
WisiToken.Syntax_Trees.Node_Index'Image (Node) &
+        ":" & Tree.Image (Node, Wisitoken_Grammar_Actions.Descriptor, 
Include_Children => True);
+   end Raise_Programmer_Error;
+
+   function Get_Line
+     (Data : in User_Data_Type;
+      Tree : in Syntax_Trees.Tree;
+      Node : in WisiToken.Syntax_Trees.Valid_Node_Index)
+     return WisiToken.Line_Number_Type
+   is
+      --  Find a source line for Node.
+
+      use WisiToken.Syntax_Trees;
+
+      Temp : Node_Index := Node;
+   begin
+      loop
+         if Tree.Min_Terminal_Index (Temp) = Invalid_Token_Index then
+            --  Node is empty or all virtual_identifiers; try parents.
+            Temp := Tree.Parent (Temp);
+            exit when Temp = Invalid_Node_Index;
+         else
+            return Data.Terminals.all (Tree.Min_Terminal_Index (Temp)).Line;
+         end if;
+      end loop;
+      return Invalid_Line_Number;
+   end Get_Line;
+
    function Get_Text
      (Data         : in User_Data_Type;
       Tree         : in Syntax_Trees.Tree;
@@ -42,7 +89,7 @@ package body WisiToken_Grammar_Runtime is
             --  Strip delimiters. We don't strip leading/trailing spaces to 
preserve indent.
             return Data.Grammar_Lexer.Buffer_Text ((Region.First + 2, 
Region.Last - 2));
 
-         elsif -Tree.ID (Tree_Index) in STRING_LITERAL_ID | 
STRING_LITERAL_CASE_INS_ID and Strip_Quotes then
+         elsif -Tree.ID (Tree_Index) in STRING_LITERAL_1_ID | 
STRING_LITERAL_2_ID and Strip_Quotes then
             return Data.Grammar_Lexer.Buffer_Text ((Region.First + 1, 
Region.Last - 1));
          else
             return Data.Grammar_Lexer.Buffer_Text (Region);
@@ -55,7 +102,20 @@ package body WisiToken_Grammar_Runtime is
          return Strip_Delimiters (Tree_Index);
 
       when Virtual_Terminal =>
-         raise SAL.Programmer_Error;
+         --  Terminal keyword inserted during tree edit. We could check for
+         --  Identifier, but that will be caught later.
+         return Image (Tree.ID (Tree_Index), 
Wisitoken_Grammar_Actions.Descriptor);
+
+      when Virtual_Identifier =>
+         if Strip_Quotes then
+            declare
+               Quoted : constant String := -Data.Tokens.Virtual_Identifiers 
(Tree.Identifier (Tree_Index));
+            begin
+               return Quoted (Quoted'First + 1 .. Quoted'Last - 1);
+            end;
+         else
+            return -Data.Tokens.Virtual_Identifiers (Tree.Identifier 
(Tree_Index));
+         end if;
 
       when Nonterm =>
          declare
@@ -65,7 +125,8 @@ package body WisiToken_Grammar_Runtime is
             Need_Space   : Boolean                                      := 
False;
          begin
             for Tree_Index of Tree_Indices loop
-               Result := Result & (if Need_Space then " " else "") & 
Strip_Delimiters (Tree_Index);
+               Result := Result & (if Need_Space then " " else "") &
+                 Get_Text (Data, Tree, Tree_Index, Strip_Quotes);
                Need_Space := True;
             end loop;
             return -Result;
@@ -113,32 +174,52 @@ package body WisiToken_Grammar_Runtime is
    end Start_If_1;
 
    function Get_RHS
-     (Data  : in out User_Data_Type;
-      Tree  : in     Syntax_Trees.Tree;
-      Token : in     Syntax_Trees.Valid_Node_Index)
+     (Data   : in out User_Data_Type;
+      Tree   : in     Syntax_Trees.Tree;
+      Labels : in out WisiToken.BNF.String_Arrays.Vector;
+      Token  : in     Syntax_Trees.Valid_Node_Index)
      return WisiToken.BNF.RHS_Type
    is
+      use all type WisiToken.Syntax_Trees.Node_Index;
       use all type SAL.Base_Peek_Type;
-      Tokens : constant Syntax_Trees.Valid_Node_Index_Array := Tree.Children 
(Token);
+      Children : constant Syntax_Trees.Valid_Node_Index_Array := Tree.Children 
(Token);
    begin
       pragma Assert (-Tree.ID (Token) = rhs_ID);
 
       return RHS : WisiToken.BNF.RHS_Type do
-         if Tokens'Length = 0 then
-            --  Token is an empty rhs; parent is a possibly empty rhs_list; 
grandparent is
-            --  a non-empty rhs_list or nonterminal.
-            RHS.Source_Line := Data.Terminals.all (Tree.Min_Terminal_Index 
(Tree.Parent (Tree.Parent (Token)))).Line;
+         RHS.Source_Line := Get_Line (Data, Tree, Token);
+
+         if Children'Length > 0 then
+            for I of Tree.Get_IDs (Children (1), +rhs_element_ID) loop
+               case Tree.RHS_Index (I) is
+               when 0 =>
+                  --  rhs_item
+                  RHS.Tokens.Append
+                    ((Label      => +"",
+                      Identifier => +Get_Text (Data, Tree, Tree.Child (I, 
1))));
+
+               when 1 =>
+                  --  IDENTIFIER = rhs_item
+                  declare
+                     Label : constant String := Get_Text (Data, Tree, 
Tree.Child (I, 1));
+                  begin
+                     RHS.Tokens.Append
+                       ((Label      => +Label,
+                         Identifier => +Get_Text (Data, Tree, Tree.Child (I, 
3))));
 
-         else
-            RHS.Source_Line := Data.Terminals.all (Tree.Min_Terminal_Index 
(Token)).Line;
+                     if (for all L of Labels => -L /= Label) then
+                        Labels.Append (+Label);
+                     end if;
+                  end;
 
-            for I of Tree.Get_Terminals (Tokens (1)) loop
-               RHS.Tokens.Append (Get_Text (Data, Tree, I));
+               when others =>
+                  Raise_Programmer_Error ("Get_RHS; unimplimented token", 
Tree, I);
+               end case;
             end loop;
 
-            if Tokens'Last >= 2 then
+            if Children'Last >= 2 then
                declare
-                  Text : constant String := Get_Text (Data, Tree, Tokens (2));
+                  Text : constant String := Get_Text (Data, Tree, Children 
(2));
                begin
                   if Text'Length > 0 and (for some C of Text => C /= ' ') then
                      RHS.Action := +Text;
@@ -147,53 +228,62 @@ package body WisiToken_Grammar_Runtime is
                end;
             end if;
 
-            if Tokens'Last >= 3 then
-               RHS.Check := +Get_Text (Data, Tree, Tokens (3));
+            if Children'Last >= 3 then
+               RHS.Check := +Get_Text (Data, Tree, Children (3));
                Data.Check_Count := Data.Check_Count + 1;
             end if;
          end if;
       end return;
+   exception
+   when SAL.Programmer_Error =>
+      raise;
+   when E : others =>
+      declare
+         use Ada.Exceptions;
+      begin
+         Raise_Programmer_Error ("Get_RHS: " & Exception_Name (E) & ": " & 
Exception_Message (E), Tree, Token);
+      end;
    end Get_RHS;
 
    procedure Get_Right_Hand_Sides
      (Data             : in out User_Data_Type;
       Tree             : in     WisiToken.Syntax_Trees.Tree;
       Right_Hand_Sides : in out WisiToken.BNF.RHS_Lists.List;
+      Labels           : in out WisiToken.BNF.String_Arrays.Vector;
       Token            : in     WisiToken.Syntax_Trees.Valid_Node_Index)
    is
-      use all type SAL.Base_Peek_Type;
-
       Tokens : constant Syntax_Trees.Valid_Node_Index_Array := Tree.Children 
(Token);
    begin
       pragma Assert (-Tree.ID (Token) = rhs_list_ID);
 
-      if Tokens'Last = 1 then
+      case Tree.RHS_Index (Token) is
+      when 0 =>
          --  | rhs
          if not Data.Ignore_Lines then
-            Right_Hand_Sides.Append (Get_RHS (Data, Tree, Tokens (1)));
+            Right_Hand_Sides.Append (Get_RHS (Data, Tree, Labels, Tokens (1)));
          end if;
-      else
+
+      when 1 =>
          --  | rhs_list BAR rhs
-         --  | rhs_list PERCENT IF IDENTIFIER EQUAL IDENTIFIER
-         --  | rhs_list PERCENT END IF
-         Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Tokens (1));
+         Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Labels, Tokens 
(1));
 
-         case Token_Enum_ID'(-Tree.ID (Tokens (3))) is
-         when rhs_ID =>
-            if not Data.Ignore_Lines then
-               Right_Hand_Sides.Append (Get_RHS (Data, Tree, Tokens (3)));
-            end if;
+         if not Data.Ignore_Lines then
+            Right_Hand_Sides.Append (Get_RHS (Data, Tree, Labels, Tokens (3)));
+         end if;
 
-         when IF_ID =>
-            Start_If_1 (Data, Tree, Tokens (4), Tokens (6));
+      when 2 =>
+         --  | rhs_list PERCENT IF IDENTIFIER EQUAL IDENTIFIER
+         Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Labels, Tokens 
(1));
+         Start_If_1 (Data, Tree, Tokens (4), Tokens (6));
 
-         when END_ID =>
-            Data.Ignore_Lines := False;
+      when 3 =>
+         --  | rhs_list PERCENT END IF
+         Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Labels, Tokens 
(1));
+         Data.Ignore_Lines := False;
 
-         when others =>
-            raise SAL.Programmer_Error;
-         end case;
-      end if;
+      when others =>
+         Raise_Programmer_Error ("Get_Right_Hand_Sides", Tree, Token);
+      end case;
    end Get_Right_Hand_Sides;
 
    ----------
@@ -211,30 +301,74 @@ package body WisiToken_Grammar_Runtime is
 
    overriding procedure Reset (Data : in out User_Data_Type)
    is begin
+      --  Preserve data set in Phase Meta, or by Set_Lexer_Terminals, or by
+      --  wisitoken-bnf-generate.
+
       --  Preserve Grammar_Lexer
       --  Preserve User_Lexer
       --  Preserve User_Parser
       --  Perserve Generate_Set
+      --  Preserve Meta_Syntax
+      --  Preserve Phase
       --  Preserve Terminals
+      --  Preserve Non_Grammar
+      --  EBNF_Nodes handled in Initialize_Actions
       Data.Raw_Code          := (others => <>);
-      Data.Language_Params   := (others => <>);
-      WisiToken.BNF.Free (Data.Generate_Set);
-      Data.Tokens            := (others => <>);
+      Data.Language_Params   :=
+        (Case_Insensitive => Data.Language_Params.Case_Insensitive,
+         others => <>);
+      Data.Tokens            :=
+        (Virtual_Identifiers => Data.Tokens.Virtual_Identifiers,
+         others => <>);
       Data.Conflicts.Clear;
       Data.McKenzie_Recover  := (others => <>);
       Data.Rule_Count        := 0;
       Data.Action_Count      := 0;
       Data.Check_Count       := 0;
+      Data.Label_Count       := 0;
       Data.If_Lexer_Present  := False;
       Data.If_Parser_Present := False;
       Data.Ignore_Lines      := False;
    end Reset;
 
+   overriding procedure Initialize_Actions
+     (Data : in out User_Data_Type;
+      Tree : in     WisiToken.Syntax_Trees.Tree'Class)
+   is begin
+      Data.EBNF_Nodes.Clear;
+      Data.EBNF_Nodes.Set_First_Last (Tree.First_Index, Tree.Last_Index);
+   end Initialize_Actions;
+
+   overriding
+   procedure Lexer_To_Augmented
+     (Data  : in out          User_Data_Type;
+      Token : in              WisiToken.Base_Token;
+      Lexer : not null access WisiToken.Lexer.Instance'Class)
+   is
+      pragma Unreferenced (Lexer);
+      use all type Ada.Containers.Count_Type;
+   begin
+      if Token.ID < Wisitoken_Grammar_Actions.Descriptor.First_Terminal then
+         --  Non-grammar token
+         if Data.Non_Grammar.Length = 0 then
+            Data.Non_Grammar.Set_First_Last (0, 0);
+         end if;
+
+         if Data.Terminals.Length = 0 then
+            Data.Non_Grammar (0).Append (Token);
+         else
+            Data.Non_Grammar.Set_Last (Data.Terminals.Last_Index);
+            Data.Non_Grammar (Data.Terminals.Last_Index).Append (Token);
+         end if;
+      end if;
+   end Lexer_To_Augmented;
+
    procedure Start_If
      (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
       Tree      : in     WisiToken.Syntax_Trees.Tree;
       Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
    is begin
+      --  all phases
       Start_If_1 (User_Data_Type (User_Data), Tree, Tokens (3), Tokens (5));
    end Start_If;
 
@@ -242,6 +376,7 @@ package body WisiToken_Grammar_Runtime is
    is
       Data : User_Data_Type renames User_Data_Type (User_Data);
    begin
+      --  all phases
       Data.Ignore_Lines := False;
    end End_If;
 
@@ -250,28 +385,105 @@ package body WisiToken_Grammar_Runtime is
       Tree      : in     WisiToken.Syntax_Trees.Tree;
       Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
    is
+      use all type WisiToken.Syntax_Trees.Node_Label;
       use all type Ada.Strings.Unbounded.Unbounded_String;
 
       Data : User_Data_Type renames User_Data_Type (User_Data);
 
       function Token (Index : in SAL.Peek_Type) return Base_Token
       is
-         use all type WisiToken.Syntax_Trees.Node_Label;
          use all type SAL.Base_Peek_Type;
       begin
          if Tokens'Last < Index then
             raise SAL.Programmer_Error;
          elsif Tree.Label (Tokens (Index)) /= 
WisiToken.Syntax_Trees.Shared_Terminal then
-            raise SAL.Programmer_Error;
+            raise SAL.Programmer_Error with "token at " & Image 
(Tree.Byte_Region (Tokens (Index))) &
+              " is a " & WisiToken.Syntax_Trees.Node_Label'Image (Tree.Label 
(Tokens (Index))) &
+              ", expecting Shared_Terminal";
          else
             return Data.Terminals.all (Tree.Terminal (Tokens (Index)));
          end if;
       end Token;
 
       function Enum_ID (Index : in SAL.Peek_Type) return Token_Enum_ID
-        is (Token_Enum_ID'(-Token (Index).ID));
+        is (To_Token_Enum (Token (Index).ID));
 
    begin
+      if Data.Phase = Meta then
+         if Tree.Label (Tokens (2)) = WisiToken.Syntax_Trees.Shared_Terminal 
then
+            case Enum_ID (2) is
+            when IDENTIFIER_ID =>
+               declare
+                  Kind : constant String := Data.Grammar_Lexer.Buffer_Text 
(Token (2).Byte_Region);
+               begin
+                  if Kind = "case_insensitive" then
+                     Data.Language_Params.Case_Insensitive := True;
+
+                  elsif Kind = "generate" then
+                     declare
+                        use all type SAL.Base_Peek_Type;
+                        Children : constant 
Syntax_Trees.Valid_Node_Index_Array := Tree.Get_Terminals (Tokens (3));
+                        Tuple    : WisiToken.BNF.Generate_Tuple;
+                     begin
+                        Tuple.Gen_Alg  := WisiToken.BNF.To_Generate_Algorithm 
(Get_Text (Data, Tree, Children (1)));
+                        if Children'Last >= 2 then
+                           Tuple.Out_Lang := WisiToken.BNF.To_Output_Language 
(Get_Text (Data, Tree, Children (2)));
+                        end if;
+                        for I in 3 .. SAL.Base_Peek_Type (Children'Length) loop
+                           declare
+                              Text : constant String := Get_Text (Data, Tree, 
Children (I));
+                           begin
+                              if Text = "text_rep" then
+                                 Tuple.Text_Rep := True;
+
+                              elsif (for some I of WisiToken.BNF.Lexer_Image 
=> Text = I.all) then
+                                 Tuple.Lexer := WisiToken.BNF.To_Lexer (Text);
+
+                              elsif (for some I in 
WisiToken.BNF.Valid_Interface =>
+                                       WisiToken.BNF.To_Lower (Text) = 
WisiToken.BNF.To_Lower
+                                         (WisiToken.BNF.Valid_Interface'Image 
(I)))
+                              then
+                                 Tuple.Interface_Kind := 
WisiToken.BNF.Valid_Interface'Value (Text);
+                              else
+                                 declare
+                                    Token : Base_Token renames 
Data.Terminals.all (Tree.Terminal (Children (I)));
+                                 begin
+                                    raise Grammar_Error with Error_Message
+                                      (Data.Grammar_Lexer.File_Name, 
Token.Line, Token.Column,
+                                       "invalid generate param '" & Text & 
"'");
+                                 end;
+                              end if;
+                           end;
+                        end loop;
+                        WisiToken.BNF.Add (Data.Generate_Set, Tuple);
+                     end;
+
+                  elsif Kind = "meta_syntax" then
+                     if Data.Meta_Syntax = Unknown then
+                        --  Don't overwrite; somebody set it for a reason.
+                        declare
+                           Value_Str : constant String := 
WisiToken.BNF.To_Lower (Get_Text (Data, Tree, Tokens (3)));
+                        begin
+                           if Value_Str = "bnf" then
+                              Data.Meta_Syntax := BNF_Syntax;
+                           elsif Value_Str = "ebnf" then
+                              Data.Meta_Syntax := EBNF_Syntax;
+                              Data.EBNF_Nodes (Tree.Find_Ancestor (Tokens (2), 
+declaration_ID)) := True;
+
+                           else
+                              Put_Error ("invalid value for %meta_syntax; must 
be BNF | EBNF.");
+                           end if;
+                        end;
+                     end if;
+                  end if;
+               end;
+            when others =>
+               null;
+            end case;
+         end if;
+         return;
+      end if;
+
       --  Add declaration to User_Data.Generate_Set, Language_Params,
       --  Tokens, Conflicts, or McKenzie_Recover.
 
@@ -283,10 +495,10 @@ package body WisiToken_Grammar_Runtime is
       when Syntax_Trees.Nonterm =>
          --  must be token_keyword_non_grammar
          declare
-            Children : Syntax_Trees.Valid_Node_Index_Array renames 
Tree.Children (Tokens (2));
-            Child_1  : Base_Token renames Data.Terminals.all (Tree.Terminal 
(Children (1)));
+            Children   : Syntax_Trees.Valid_Node_Index_Array renames 
Tree.Children (Tokens (2));
+            Child_1_ID : constant Token_Enum_ID := To_Token_Enum (Tree.ID 
(Children (1)));
          begin
-            case Token_Enum_ID'(-Child_1.ID) is
+            case Child_1_ID is
             when Wisitoken_Grammar_Actions.TOKEN_ID =>
 
                WisiToken.BNF.Add_Token
@@ -412,8 +624,11 @@ package body WisiToken_Grammar_Runtime is
             declare
                Kind : constant String := Data.Grammar_Lexer.Buffer_Text (Token 
(2).Byte_Region);
             begin
+               --  Alphabetical by Kind
+
                if Kind = "case_insensitive" then
-                  Data.Language_Params.Case_Insensitive := True;
+                  --  Not in phase Other
+                  null;
 
                elsif Kind = "conflict" then
                   declare
@@ -443,47 +658,23 @@ package body WisiToken_Grammar_Runtime is
                     ((Name  => +Get_Child_Text (Data, Tree, Tokens (3), 1, 
Strip_Quotes => True),
                       Value => +Get_Child_Text (Data, Tree, Tokens (3), 2)));
 
-               elsif Kind = "embedded_quote_escape_doubled" then
-                  Data.Language_Params.Embedded_Quote_Escape_Doubled := True;
+               elsif Kind = "elisp_action" then
+                  Data.Tokens.Actions.Insert
+                    (Key             => +Get_Child_Text (Data, Tree, Tokens 
(3), 2),
+                     New_Item        =>
+                       (Action_Label => +Get_Child_Text (Data, Tree, Tokens 
(3), 1),
+                        Ada_Name     => +Get_Child_Text (Data, Tree, Tokens 
(3), 3)));
 
                elsif Kind = "end_names_optional_option" then
                   Data.Language_Params.End_Names_Optional_Option := +Get_Text 
(Data, Tree, Tokens (3));
 
                elsif Kind = "generate" then
-                  declare
-                     Children : constant Syntax_Trees.Valid_Node_Index_Array 
:= Tree.Get_Terminals (Tokens (3));
-                     Tuple     : WisiToken.BNF.Generate_Tuple;
-                  begin
-                     Tuple.Gen_Alg  := WisiToken.BNF.Generate_Algorithm'Value 
(Get_Text (Data, Tree, Children (1)));
-                     Tuple.Out_Lang := WisiToken.BNF.To_Output_Language 
(Get_Text (Data, Tree, Children (2)));
-                     for I in 3 .. SAL.Base_Peek_Type (Children'Length) loop
-                        declare
-                           Text : constant String := Get_Text (Data, Tree, 
Children (I));
-                        begin
-                           if Text = "text_rep" then
-                              Tuple.Text_Rep := True;
-
-                           elsif (for some I of WisiToken.BNF.Lexer_Image => 
Text = I.all) then
-                              Tuple.Lexer := WisiToken.BNF.To_Lexer (Text);
+                  --  Not in Other phase
+                  null;
 
-                           elsif (for some I in WisiToken.BNF.Valid_Interface 
=>
-                                    WisiToken.BNF.To_Lower (Text) = 
WisiToken.BNF.To_Lower
-                                      (WisiToken.BNF.Valid_Interface'Image 
(I)))
-                           then
-                              Tuple.Interface_Kind := 
WisiToken.BNF.Valid_Interface'Value (Text);
-                           else
-                              declare
-                                 Token : Base_Token renames Data.Terminals.all 
(Tree.Terminal (Children (I)));
-                              begin
-                                 raise Grammar_Error with Error_Message
-                                   (Data.Grammar_Lexer.File_Name, Token.Line, 
Token.Column,
-                                    "invalid generate param '" & Text & "'");
-                              end;
-                           end if;
-                        end;
-                     end loop;
-                     WisiToken.BNF.Add (Data.Generate_Set, Tuple);
-                  end;
+               elsif Kind = "language_runtime" then
+                  Data.Language_Params.Language_Runtime_Name :=
+                    +Get_Text (Data, Tree, Tokens (3), Strip_Quotes => True);
 
                elsif Kind = "mckenzie_check_limit" then
                   Data.Language_Params.Error_Recover := True;
@@ -520,15 +711,21 @@ package body WisiToken_Grammar_Runtime is
                     ((+Get_Child_Text (Data, Tree, Tokens (3), 1),
                       +Get_Child_Text (Data, Tree, Tokens (3), 2)));
 
+               elsif Kind = "mckenzie_cost_fast_forward" then
+                  Data.Language_Params.Error_Recover := True;
+                  Data.McKenzie_Recover.Fast_Forward :=
+                    Integer'Value (Get_Text (Data, Tree, Tokens (3)));
+
                elsif Kind = "mckenzie_cost_insert" then
                   Data.Language_Params.Error_Recover := True;
                   Data.McKenzie_Recover.Insert.Append
                     ((+Get_Child_Text (Data, Tree, Tokens (3), 1),
                       +Get_Child_Text (Data, Tree, Tokens (3), 2)));
 
-               elsif Kind = "mckenzie_cost_limit" then
+               elsif Kind = "mckenzie_cost_matching_begin" then
                   Data.Language_Params.Error_Recover := True;
-                  Data.McKenzie_Recover.Cost_Limit := Natural'Value (Get_Text 
(Data, Tree, Tokens (3)));
+                  Data.McKenzie_Recover.Matching_Begin :=
+                    Integer'Value (Get_Text (Data, Tree, Tokens (3)));
 
                elsif Kind = "mckenzie_cost_push_back" then
                   Data.Language_Params.Error_Recover := True;
@@ -536,16 +733,34 @@ package body WisiToken_Grammar_Runtime is
                     ((+Get_Child_Text (Data, Tree, Tokens (3), 1),
                       +Get_Child_Text (Data, Tree, Tokens (3), 2)));
 
+               elsif Kind = "mckenzie_cost_undo_reduce" then
+                  Data.Language_Params.Error_Recover := True;
+                  Data.McKenzie_Recover.Undo_Reduce.Append
+                    ((+Get_Child_Text (Data, Tree, Tokens (3), 1),
+                      +Get_Child_Text (Data, Tree, Tokens (3), 2)));
+
                elsif Kind = "mckenzie_enqueue_limit" then
                   Data.Language_Params.Error_Recover := True;
                   Data.McKenzie_Recover.Enqueue_Limit := Natural'Value 
(Get_Text (Data, Tree, Tokens (3)));
 
-               elsif Kind = "no_language_runtime" then
-                  Data.Language_Params.Language_Runtime := False;
+               elsif Kind = "mckenzie_minimal_complete_cost_delta" then
+                  Data.Language_Params.Error_Recover := True;
+                  Data.McKenzie_Recover.Minimal_Complete_Cost_Delta :=
+                    Integer'Value (Get_Text (Data, Tree, Tokens (3)));
+
+               elsif Kind = "meta_syntax" then
+                  --  not in Other phase
+                  null;
 
                elsif Kind = "no_enum" then
                   Data.Language_Params.Declare_Enums := False;
 
+               elsif Kind = "no_language_runtime" then
+                  Data.Language_Params.Use_Language_Runtime := False;
+
+               elsif Kind = "partial_recursion" then
+                  Data.Language_Params.Partial_Recursion := True;
+
                elsif Kind = "start" then
                   Data.Language_Params.Start_Token := +Get_Text (Data, Tree, 
Tokens (3));
 
@@ -566,7 +781,7 @@ package body WisiToken_Grammar_Runtime is
               (Data.Grammar_Lexer.File_Name, Token (2).Line, Token (2).Column, 
"unexpected syntax");
          end case;
 
-      when Syntax_Trees.Virtual_Terminal =>
+      when Syntax_Trees.Virtual_Terminal | Syntax_Trees.Virtual_Identifier =>
          raise SAL.Programmer_Error;
       end case;
    end Add_Declaration;
@@ -576,28 +791,2045 @@ package body WisiToken_Grammar_Runtime is
       Tree      : in     WisiToken.Syntax_Trees.Tree;
       Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array)
    is
+      use all type Ada.Containers.Count_Type;
+      use WisiToken.Syntax_Trees;
+
       Data : User_Data_Type renames User_Data_Type (User_Data);
 
-      LHS : constant String := Get_Text (Data, Tree, Tokens (1));
+      LHS_Node   : constant Valid_Node_Index := Tokens (1);
+      LHS_String : constant String           := Get_Text (Data, Tree, 
LHS_Node);
 
       Right_Hand_Sides : WisiToken.BNF.RHS_Lists.List;
+      Labels           : WisiToken.BNF.String_Arrays.Vector;
    begin
+      if Data.Phase = Meta or Data.Ignore_Lines then
+         return;
+      end if;
+
       Data.Rule_Count := Data.Rule_Count + 1;
 
-      Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Tokens (3));
+      Get_Right_Hand_Sides (Data, Tree, Right_Hand_Sides, Labels, Tokens (3));
 
-      if WisiToken.BNF.Is_Present (Data.Tokens.Rules, LHS) then
-         declare
-            LHS_Token : Base_Token renames Data.Terminals.all (Tree.Terminal 
(Tokens (1)));
-         begin
+      if WisiToken.BNF.Is_Present (Data.Tokens.Rules, LHS_String) then
+         case Tree.Label (LHS_Node) is
+         when Shared_Terminal =>
+            declare
+               LHS_Token : Base_Token renames Data.Terminals.all 
(Tree.Terminal (LHS_Node));
+            begin
+               raise Grammar_Error with Error_Message
+                 (Data.Grammar_Lexer.File_Name, LHS_Token.Line, 
LHS_Token.Column, "duplicate nonterm");
+            end;
+
+         when Virtual_Identifier =>
             raise Grammar_Error with Error_Message
-              (Data.Grammar_Lexer.File_Name, LHS_Token.Line, LHS_Token.Column, 
"duplicate nonterm");
-         end;
+              (Data.Grammar_Lexer.File_Name, 1, 1, "duplicate virtual nonterm 
'" & LHS_String & "'");
+
+         when others =>
+            Raise_Programmer_Error ("Add_Nonterminal", Tree, LHS_Node);
+         end case;
       else
+         Data.Label_Count := Data.Label_Count + Labels.Length;
+
          Data.Tokens.Rules.Append
-           ((+LHS, Right_Hand_Sides,
-             Source_Line => Data.Terminals.all (Tree.Min_Terminal_Index 
(Tokens (1))).Line));
+           ((+LHS_String, Right_Hand_Sides, Labels,
+             Source_Line =>
+               (case Tree.Label (LHS_Node) is
+                when Shared_Terminal    => Data.Terminals.all 
(Tree.Min_Terminal_Index (LHS_Node)).Line,
+                when Virtual_Identifier => Invalid_Line_Number, -- IMPROVEME: 
get line from Right_Hand_Sides
+                when others             => raise SAL.Programmer_Error)));
       end if;
    end Add_Nonterminal;
 
+   procedure Check_EBNF
+     (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+      Tree      : in     WisiToken.Syntax_Trees.Tree;
+      Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array;
+      Token     : in     WisiToken.Positive_Index_Type)
+   is
+      Data : User_Data_Type renames User_Data_Type (User_Data);
+   begin
+      case Data.Phase is
+      when Meta =>
+         Data.EBNF_Nodes (Tokens (Token)) := True;
+
+         if Data.Meta_Syntax /= EBNF_Syntax then
+            declare
+               Tok  : Base_Token renames Data.Terminals.all 
(Tree.Min_Terminal_Index (Tokens (Token)));
+            begin
+               raise Grammar_Error with Error_Message
+                 (Data.Grammar_Lexer.File_Name, Tok.Line, Tok.Column,
+                  "EBNF syntax used, but BNF specified; set '%meta_syntax 
EBNF'");
+            end;
+         end if;
+      when Other =>
+         Raise_Programmer_Error ("untranslated EBNF node", Tree, Tree.Parent 
(Tokens (Token)));
+      end case;
+   end Check_EBNF;
+
+   procedure Translate_EBNF_To_BNF
+     (Tree : in out WisiToken.Syntax_Trees.Tree;
+      Data : in out User_Data_Type)
+   is
+      use WisiToken.Syntax_Trees;
+
+      Copied_EBNF_Nodes : 
WisiToken.Syntax_Trees.Valid_Node_Index_Arrays.Vector;
+
+      Symbol_Regexp : constant GNAT.Regexp.Regexp := GNAT.Regexp.Compile
+        ((if Data.Language_Params.Case_Insensitive
+          then "[A-Z0-9_]+"
+          else "[a-zA-Z0-9_]+"),
+         Case_Sensitive => not Data.Language_Params.Case_Insensitive);
+
+      procedure Clear_EBNF_Node (Node : in Valid_Node_Index)
+      is begin
+         if Node in Data.EBNF_Nodes.First_Index .. Data.EBNF_Nodes.Last_Index 
then
+            Data.EBNF_Nodes (Node) := False;
+            --  else in Copied_EBNF_Nodes; don't need to delete from there.
+         end if;
+      end Clear_EBNF_Node;
+
+      function New_Identifier (Text : in String) return Identifier_Index
+      is
+         ID : constant Identifier_Index := Base_Identifier_Index 
(Data.Tokens.Virtual_Identifiers.Length) + 1;
+      begin
+         Data.Tokens.Virtual_Identifiers.Append (+Text);
+         return ID;
+      end New_Identifier;
+
+      Keyword_Ident : constant Identifier_Index := New_Identifier ("keyword");
+      Percent_Ident : constant Identifier_Index := New_Identifier ("percent");
+
+      function Next_Nonterm_Name (Suffix : in String := "") return 
Identifier_Index
+      is
+         function Image is new SAL.Generic_Decimal_Image (Identifier_Index);
+         ID : constant Identifier_Index := Identifier_Index 
(Data.Tokens.Virtual_Identifiers.Length) + 1;
+      begin
+
+         if ID > 999 then
+            --  We assume 3 digits below
+            raise SAL.Programmer_Error with "more than 3 digits needed for 
virtual identifiers in EBNF translate";
+         end if;
+
+         Data.Tokens.Virtual_Identifiers.Append (+("nonterminal_" & Image (ID, 
Width => 3) & Suffix));
+
+         return ID;
+      end Next_Nonterm_Name;
+
+      function Tree_Add_Nonterminal
+        (Child_1 : in Valid_Node_Index;
+         Child_2 : in Valid_Node_Index;
+         Child_3 : in Valid_Node_Index;
+         Child_4 : in Valid_Node_Index)
+        return Valid_Node_Index
+      is begin
+         --  Work around GNAT error about arbitrary evaluation order in
+         --  aggregates (no error about the arbitrary order in subprogram
+         --  parameter_assocation_lists!).
+         return Tree.Add_Nonterm
+           (Production => (+nonterminal_ID, 0),
+            Children   => (Child_1, Child_2, Child_3, Child_4),
+            Action     => Wisitoken_Grammar_Actions.nonterminal_0'Access);
+      end Tree_Add_Nonterminal;
+
+      function List_Root (Item : in Valid_Node_Index) return Valid_Node_Index
+      is
+         List_ID : constant WisiToken.Token_ID := Tree.ID (Item);
+         Node : Valid_Node_Index := Item;
+      begin
+         loop
+            exit when Tree.ID (Tree.Parent (Node)) /= List_ID;
+            Node := Tree.Parent (Node);
+         end loop;
+         return Node;
+      end List_Root;
+
+      function List_Singleton (Root : in Valid_Node_Index) return Boolean
+      is begin
+         return Tree.RHS_Index (Root) = 0;
+      end List_Singleton;
+
+      function First_List_Element (Root : in Valid_Node_Index; Element_ID : in 
WisiToken.Token_ID) return Node_Index
+      is
+         List_ID : constant WisiToken.Token_ID := Tree.ID (Root);
+
+         --  Return the first child with Element_ID in list of List_IDs. This
+         --  is not the same as Find_Descendant, because we check the children
+         --  first, and only the first child.
+         Node : Node_Index := Root;
+      begin
+         loop
+            declare
+               Children : constant Valid_Node_Index_Array := Tree.Children 
(Node);
+            begin
+               if Tree.ID (Children (1)) = List_ID then
+                  Node := Children (1);
+               elsif Tree.ID (Children (1)) = Element_ID then
+                  Node := Children (1);
+                  exit;
+               else
+                  Raise_Programmer_Error ("first_list_element", Tree, Node);
+               end if;
+            end;
+         end loop;
+         return Node;
+      end First_List_Element;
+
+      function Last_List_Element (Root : in Valid_Node_Index) return Node_Index
+      is
+         --  Tree is one of:
+         --
+         --  case a: single element list
+         --  element_list : root
+         --  | element: Last
+         --
+         --  case c: no next
+         --  element_list: root
+         --  | element_list
+         --  | | element:
+         --  | element: Last
+         Children : constant Valid_Node_Index_Array := Tree.Children (Root);
+      begin
+         return Children (Children'Last);
+      end Last_List_Element;
+
+      function Next_List_Element
+        (Element : in Valid_Node_Index;
+         List_ID : in WisiToken.Token_ID)
+        return Node_Index
+      with Pre => Tree.Parent (Element, 2) /= Invalid_Node_Index and then
+                  Tree.ID (Tree.Parent (Element)) = List_ID
+      is
+         use all type SAL.Base_Peek_Type;
+         --  Tree is one of:
+         --
+         --  case a: first element, no next
+         --  rhs
+         --  | rhs_item_list
+         --  | | rhs_item: Element
+         --  | action
+         --
+         --  case b: first element, next
+         --  rhs_item_list
+         --  | rhs_item_list
+         --  | | rhs_item: Element
+         --  | rhs_item: next element
+         --
+         --  case c: non-first element, no next
+         --  rhs
+         --  | rhs_item_list
+         --  | | rhs_item_list
+         --  | | | rhs_item:
+         --  | | rhs_item: Element
+         --  | action
+         --
+         --  case d: non-first element, next
+         --  rhs_item_list
+         --  | rhs_item_list
+         --  | | rhs_item_list
+         --  | | | rhs_item:
+         --  | | rhs_item: Element
+         --  | rhs_item: next element
+
+         Element_ID      : constant WisiToken.Token_ID     := Tree.ID 
(Element);
+         Grand_Parent    : constant Valid_Node_Index       := Tree.Parent 
(Element, 2);
+         Aunts           : constant Valid_Node_Index_Array := Tree.Children 
(Grand_Parent);
+         Last_List_Child : SAL.Base_Peek_Type              := Aunts'First - 1;
+      begin
+         if Tree.ID (Grand_Parent) /= List_ID then
+            --  No next
+            return Invalid_Node_Index;
+         end if;
+
+         --  Children may be non-list items; ACTION in an rhs_list, for 
example.
+         for I in Aunts'Range loop
+            if Tree.ID (Aunts (I)) in List_ID | Element_ID then
+               Last_List_Child := I;
+            end if;
+         end loop;
+
+         if Last_List_Child = 1 then
+            --  No next
+            return Invalid_Node_Index;
+         else
+            return Aunts (2);
+         end if;
+      end Next_List_Element;
+
+      function Prev_List_Element
+        (Element : in Valid_Node_Index;
+         List_ID : in WisiToken.Token_ID)
+        return Node_Index
+      with Pre => Tree.Parent (Element) /= Invalid_Node_Index and then
+                  Tree.ID (Tree.Parent (Element)) = List_ID
+      is
+         --  Tree is one of:
+         --
+         --  case a: first element, no prev
+         --  ?
+         --  | rhs_item_list
+         --  | | rhs_item: Element
+         --
+         --  case b: second element
+         --  ?
+         --  | rhs_item_list
+         --  | | rhs_item: prev item
+         --  | rhs_item: Element
+         --
+         --  case c: nth element
+         --  ?
+         --  | rhs_item_list
+         --  | | rhs_item_list
+         --  | | | rhs_item:
+         --  | | rhs_item: prev element
+         --  | rhs_item: Element
+
+         Parent : constant Valid_Node_Index := Tree.Parent (Element);
+      begin
+         if Element = Tree.Child (Parent, 1) then
+            --  No prev
+            return Invalid_Node_Index;
+
+         else
+            declare
+               Prev_Children : constant Valid_Node_Index_Array := 
Tree.Children (Tree.Child (Parent, 1));
+            begin
+               return Prev_Children (Prev_Children'Last);
+            end;
+         end if;
+      end Prev_List_Element;
+
+      procedure Append_Element
+        (Tail_List    : in Valid_Node_Index;
+         New_Element  : in Valid_Node_Index;
+         Separator_ID : in WisiToken.Token_ID := Invalid_Token_ID)
+      is
+         --  Tail_List is preserved.
+
+         --  Current tree is one of:
+         --
+         --  case a:
+         --  rhs_list: Tail_List
+         --  | rhs: Orig_Element_1
+         --
+         --  case b:
+         --  rhs_list: Tail_List
+         --  | rhs_list: Orig_List_1
+         --  | | rhs: Orig_Element_1
+         --  | BAR
+         --  | rhs: Orig_Element_2
+
+         --  New tree:
+         --
+         --  case a:
+         --  rhs_list: keep Tail_List
+         --  | rhs_list: new
+         --  | | rhs: keep; Orig_Element_1
+         --  | BAR
+         --  | rhs: New_Element
+         --
+         --  case b:
+         --  rhs_list: keep Tail_List
+         --  | rhs_list: new;
+         --  | | rhs_list: keep Orig_List_1
+         --  | | | rhs: keep Orig_Element_1
+         --  | | BAR: keep
+         --  | | rhs: keep Orig_Element_2
+         --  | BAR: new
+         --  | rhs: New_Element
+
+         List_ID       : constant WisiToken.Token_ID     := Tree.ID 
(Tail_List);
+         Children      : constant Valid_Node_Index_Array := Tree.Children 
(Tail_List);
+         New_List_Item : constant Valid_Node_Index       := Tree.Add_Nonterm
+           ((List_ID, (if Children'Length = 1 then 0 else 1)), Children);
+      begin
+         if Separator_ID = Invalid_Token_ID then
+            Tree.Set_Children (Tail_List, (List_ID, 1), (New_List_Item, 
New_Element));
+         else
+            Tree.Set_Children
+              (Tail_List, (List_ID, 1), (New_List_Item, Tree.Add_Terminal 
(Separator_ID), New_Element));
+         end if;
+      end Append_Element;
+
+      procedure Insert_Optional_RHS (B : in Valid_Node_Index)
+      is
+         --  B is an optional item in an rhs_item_list :
+         --  | a b? c
+         --
+         --  Insert a second rhs_item_list without B
+         --
+         --  The containing elment may be rhs or rhs_alternative_list
+
+         Container                 : constant Valid_Node_Index := 
Tree.Find_Ancestor
+           (B, (+rhs_ID, +rhs_alternative_list_ID));
+         Orig_RHS_Element_C_Head   : constant Node_Index       := 
Next_List_Element
+           (Tree.Parent (B, 2), +rhs_item_list_ID);
+         Orig_RHS_Item_List_C_Root : constant Valid_Node_Index := List_Root 
(Tree.Parent (B, 3));
+         Orig_RHS_Item_List_A_Root : constant Valid_Node_Index := Tree.Child 
(Tree.Parent (B, 3), 1);
+         Orig_RHS_Element_A_Head   : constant Node_Index       :=
+           (if Orig_RHS_Item_List_A_Root = Tree.Parent (B, 2)
+            then Invalid_Node_Index -- a is empty
+            else First_List_Element (Orig_RHS_Item_List_A_Root, 
+rhs_element_ID));
+         Container_List            : constant Valid_Node_Index :=
+           (if Tree.ID (Container) = +rhs_ID then Tree.Parent (Container) else 
Container);
+         New_RHS_Item_List_A       : Node_Index                := 
Invalid_Node_Index;
+         New_RHS_Item_List_C       : Node_Index                := 
Invalid_Node_Index;
+         New_RHS_AC                : Valid_Node_Index;
+
+         function Add_Actions (RHS_Item_List : Valid_Node_Index) return 
Valid_Node_Index
+         with Pre => Tree.ID (Container) = +rhs_ID
+         is
+            Orig_RHS_Children : constant Valid_Node_Index_Array := 
Tree.Children (Container);
+         begin
+            case Tree.RHS_Index (Container) is
+            when 1 =>
+               return Tree.Add_Nonterm ((+rhs_ID, 1), (1 => RHS_Item_List));
+
+            when 2   =>
+               return Tree.Add_Nonterm
+                 ((+rhs_ID, 2),
+                  (1 => RHS_Item_List,
+                   2 => Tree.Add_Terminal
+                     (Tree.Min_Terminal_Index (Orig_RHS_Children (2)),
+                      Data.Terminals.all)));
+
+            when 3   =>
+               return Tree.Add_Nonterm
+                 ((+rhs_ID, 3),
+                  (1 => RHS_Item_List,
+                   2 => Tree.Add_Terminal
+                     (Tree.Min_Terminal_Index (Orig_RHS_Children (2)),
+                      Data.Terminals.all),
+                   3 => Tree.Add_Terminal
+                     (Tree.Min_Terminal_Index (Orig_RHS_Children (3)),
+                      Data.Terminals.all)));
+
+            when others =>
+               Raise_Programmer_Error
+                 ("translate_ebnf_to_bnf insert_optional_rhs unimplemented 
RHS", Tree, Container);
+            end case;
+         end Add_Actions;
+      begin
+         if Orig_RHS_Element_A_Head /= Invalid_Node_Index then
+            --  a is not empty
+            New_RHS_Item_List_A := Tree.Copy_Subtree
+              (Last => Orig_RHS_Element_A_Head,
+               Root => Orig_RHS_Item_List_A_Root);
+
+            if Trace_Generate > Extra then
+               Ada.Text_IO.New_Line;
+               Ada.Text_IO.Put_Line ("new a:");
+               Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, 
New_RHS_Item_List_A);
+            end if;
+         end if;
+
+         if Orig_RHS_Element_C_Head /= Invalid_Node_Index then
+            --  c is not empty
+            New_RHS_Item_List_C := Tree.Copy_Subtree
+              (Last => Orig_RHS_Element_C_Head,
+               Root => Orig_RHS_Item_List_C_Root);
+
+            if Trace_Generate > Extra then
+               Ada.Text_IO.New_Line;
+               Ada.Text_IO.Put_Line ("new c:");
+               Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, 
New_RHS_Item_List_C);
+            end if;
+         end if;
+
+         if New_RHS_Item_List_C = Invalid_Node_Index then
+            if New_RHS_Item_List_A = Invalid_Node_Index then
+               --  a c is empty; there cannot be any actions.
+               New_RHS_AC :=
+                 (if Tree.ID (Container) = +rhs_ID
+                  then Tree.Add_Nonterm ((+rhs_ID, 0), (1 .. 0 => 
Invalid_Node_Index))
+                  else Tree.Add_Nonterm ((+rhs_item_list_ID, 0), (1 .. 0 => 
Invalid_Node_Index)));
+            else
+               --  c is empty
+               New_RHS_AC :=
+                 (if Tree.ID (Container) = +rhs_ID
+                  then Add_Actions (New_RHS_Item_List_A)
+                  else New_RHS_Item_List_A);
+            end if;
+         else
+            --  c is not empty
+            if New_RHS_Item_List_A = Invalid_Node_Index then
+               --  a is empty
+               New_RHS_AC :=
+                 (if Tree.ID (Container) = +rhs_ID
+                  then Add_Actions (New_RHS_Item_List_C)
+                  else New_RHS_Item_List_C);
+            else
+               declare
+                  Tail_Element_A : constant Valid_Node_Index := 
Last_List_Element (New_RHS_Item_List_A);
+                  Head_Element_B : constant Valid_Node_Index := 
First_List_Element
+                    (New_RHS_Item_List_C, +rhs_element_ID);
+               begin
+                  Tree.Set_Children
+                    (Tree.Parent (Head_Element_B),
+                     (+rhs_item_list_ID, 1),
+                     (Tree.Parent (Tail_Element_A), Head_Element_B));
+               end;
+
+               New_RHS_AC :=
+                 (if Tree.ID (Container) = +rhs_ID
+                  then Add_Actions (New_RHS_Item_List_C)
+                  else New_RHS_Item_List_C);
+            end if;
+         end if;
+
+         if Trace_Generate > Extra then
+            Ada.Text_IO.New_Line;
+            Ada.Text_IO.Put_Line ("new ac:");
+            Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, New_RHS_AC);
+         end if;
+
+         --  Record copied EBNF nodes
+         declare
+            procedure Record_Copied_Node
+              (Tree : in out WisiToken.Syntax_Trees.Tree;
+               Node : in WisiToken.Syntax_Trees.Valid_Node_Index)
+            is begin
+               if To_Token_Enum (Tree.ID (Node)) in
+                 rhs_optional_item_ID |
+                 rhs_multiple_item_ID |
+                 rhs_group_item_ID |
+                 rhs_attribute_ID |
+                 STRING_LITERAL_2_ID
+               then
+                  Copied_EBNF_Nodes.Append (Node);
+               end if;
+            end Record_Copied_Node;
+         begin
+            Tree.Process_Tree (Record_Copied_Node'Access, New_RHS_AC);
+         end;
+
+         Append_Element (Container_List, New_RHS_AC, +BAR_ID);
+      end Insert_Optional_RHS;
+
+      Compilation_Unit_List_Tail : constant Valid_Node_Index := Tree.Child 
(Tree.Root, 1);
+
+      procedure Add_Compilation_Unit (Unit : in Valid_Node_Index; Prepend : in 
Boolean := False)
+      is
+         Comp_Unit : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+compilation_unit_ID, (if Tree.ID (Unit) = +declaration_ID then 0 
else 1)),
+            (1 => Unit));
+      begin
+         if Prepend then
+            Append_Element
+              (Tree.Parent (First_List_Element (Compilation_Unit_List_Tail, 
+compilation_unit_ID)), Comp_Unit);
+         else
+            Append_Element (Compilation_Unit_List_Tail, Comp_Unit);
+         end if;
+
+         if Trace_Generate > Extra then
+            Ada.Text_IO.New_Line;
+            Ada.Text_IO.Put_Line ("new comp_unit:");
+            Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, Unit);
+         end if;
+      end Add_Compilation_Unit;
+
+      function To_RHS_List (RHS_Element : in Valid_Node_Index) return 
Valid_Node_Index
+      with Pre => Tree.ID (RHS_Element) = +rhs_element_ID
+      is
+         RHS_Item_List : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_item_list_ID, 0), (1 => RHS_Element));
+         RHS           : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_ID, 1),           (1 => RHS_Item_List));
+      begin
+         return Tree.Add_Nonterm ((+rhs_list_ID, 0), (1 => RHS));
+      end To_RHS_List;
+
+      function Convert_RHS_Alternative (Content : in Valid_Node_Index) return 
Valid_Node_Index
+      is
+         --  Convert rhs_alternative_list rooted at Content to an rhs_list
+         Node : Valid_Node_Index := Content;
+      begin
+         loop
+            exit when Tree.RHS_Index (Node) = 0;
+
+            --  current tree:
+            --  rhs_alternative_list : Node
+            --  | rhs_alternative_list: Node.Child (1)
+            --  | |  ...
+            --  | BAR: Node.child (2)
+            --  | rhs_item_list: Node.Child (3)
+
+            --  new tree:
+            --  rhs_list: Node
+            --  | rhs_alternative_list: keep Node.Child (1)
+            --  | |  ...
+            --  | BAR: keep
+            --  | rhs: new
+            --  | | rhs_item_list: keep Node,Child (3)
+
+            Tree.Set_Children
+              (Node,
+               (+rhs_list_ID, 1),
+               (1 => Tree.Child (Node, 1),
+                2 => Tree.Child (Node, 2),
+                3 => Tree.Add_Nonterm
+                  ((+rhs_ID, 1),
+                   (1 => Tree.Child (Node, 3)))));
+
+            Clear_EBNF_Node (Node);
+            Node := Tree.Child (Node, 1);
+         end loop;
+
+         --  current tree:
+         --  rhs_alternative_list : Node
+         --  | rhs_item_list: Node.Child (1)
+
+         --  new tree:
+         --  rhs_list: Node
+         --  | rhs: new
+         --  | | rhs_item_list: Node.Child (1)
+
+         Tree.Set_Children
+           (Node,
+            (+rhs_list_ID, 0),
+            (1 => Tree.Add_Nonterm ((+rhs_ID, 1), (1 => Tree.Child (Node, 
1)))));
+
+         Clear_EBNF_Node (Content);
+         return Content;
+      end Convert_RHS_Alternative;
+
+      procedure New_Nonterminal
+        (New_Identifier : in Identifier_Index;
+         Content        : in Valid_Node_Index)
+         with Pre => To_Token_Enum (Tree.ID (Content)) in 
rhs_alternative_list_ID | rhs_element_ID
+      is
+         --  Convert subtree rooted at Content to an rhs_list contained by a 
new nonterminal
+         --  named New_Identifier.
+         New_Nonterm : constant Valid_Node_Index := Tree_Add_Nonterminal
+           (Child_1   => Tree.Add_Identifier (+IDENTIFIER_ID, New_Identifier, 
Tree.Byte_Region (Content)),
+            Child_2   => Tree.Add_Terminal (+COLON_ID),
+            Child_3   =>
+              (case To_Token_Enum (Tree.ID (Content)) is
+               when rhs_element_ID          => To_RHS_List (Content),
+               when rhs_alternative_list_ID => Convert_RHS_Alternative 
(Content),
+               when others => raise SAL.Programmer_Error with "new_nonterminal 
unimplemented content" &
+                 Tree.Image (Content, Wisitoken_Grammar_Actions.Descriptor)),
+            Child_4   => Tree.Add_Nonterm
+              ((+semicolon_opt_ID, 0),
+               (1     => Tree.Add_Terminal (+SEMICOLON_ID))));
+      begin
+         Add_Compilation_Unit (New_Nonterm);
+      end New_Nonterminal;
+
+      procedure New_Nonterminal_List_1
+        (List_Nonterm  : in Identifier_Index;
+         RHS_Element_1 : in Valid_Node_Index;
+         RHS_Element_3 : in Valid_Node_Index;
+         Byte_Region   : in Buffer_Region)
+      is
+         --  nonterminal: foo_list
+         --  | IDENTIFIER: "foo_list" List_Nonterm
+         --  | COLON:
+         --  | rhs_list:
+         --  | | rhs_list: RHS_List_2
+         --  | | | rhs: RHS_2
+         --  | | | | rhs_item_list: RHS_Item_List_1
+         --  | | | | | rhs_element: RHS_Element_1
+         --  | | | | | | rhs_item: RHS_Item_1
+         --  | | | | | | | IDENTIFIER: List_Element
+         --  | | BAR:
+         --  | | rhs: RHS_3
+         --  | | | rhs_item_list: RHS_Item_List_2
+         --  | | | | | rhs_item_list: RHS_Item_List_3
+         --  | | | | | |  rhs_element: RHS_Element_2
+         --  | | | | | | | rhs_item: RHS_Item_2
+         --  | | | | | | | | IDENTIFIER: List_Nonterm
+         --  | | | | rhs_element: RHS_Element_3
+         --  | | | | | rhs_item: RHS_Item_3
+         --  | | | | | | IDENTIFIER: List_Element
+         --  | semicolon_opt:
+         --  | | SEMICOLON:
+
+         RHS_Item_2 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_ID, 0), (1 => Tree.Add_Identifier (+IDENTIFIER_ID, 
List_Nonterm, Byte_Region)));
+
+         RHS_Element_2 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_element_ID, 0), (1 => RHS_Item_2));
+
+         RHS_Item_List_1 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_item_list_ID, 0), (1 => RHS_Element_1));
+         RHS_Item_List_3 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_item_list_ID, 0), (1 => RHS_Element_2));
+         RHS_Item_List_2 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_list_ID, 1), (1 => RHS_Item_List_3, 2 => 
RHS_Element_3));
+
+         RHS_2 : constant Valid_Node_Index := Tree.Add_Nonterm ((+rhs_ID, 1), 
(1 => RHS_Item_List_1));
+         RHS_3 : constant Valid_Node_Index := Tree.Add_Nonterm ((+rhs_ID, 1), 
(1 => RHS_Item_List_2));
+
+         Bar_1 : constant Valid_Node_Index := Tree.Add_Terminal (+BAR_ID);
+
+         RHS_List_2 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_list_ID, 0), (1 => RHS_2));
+
+         List_Nonterminal : constant Valid_Node_Index := Tree_Add_Nonterminal
+           (Child_1   => Tree.Add_Identifier (+IDENTIFIER_ID, List_Nonterm, 
Byte_Region),
+            Child_2   => Tree.Add_Terminal (+COLON_ID),
+            Child_3   => Tree.Add_Nonterm
+              ((+rhs_list_ID, 1),
+               (1     => RHS_List_2,
+                2     => Bar_1,
+                3     => RHS_3)),
+            Child_4   => Tree.Add_Nonterm
+              ((+semicolon_opt_ID, 0),
+               (1     => Tree.Add_Terminal (+SEMICOLON_ID))));
+      begin
+         Add_Compilation_Unit (List_Nonterminal);
+      end New_Nonterminal_List_1;
+
+      procedure New_Nonterminal_List
+        (List_Nonterm : in Identifier_Index;
+         List_Element : in Identifier_Index;
+         Byte_Region  : in Buffer_Region)
+      is
+         RHS_Item_1 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_ID, 0), (1 => Tree.Add_Identifier (+IDENTIFIER_ID, 
List_Element, Byte_Region)));
+         RHS_Item_3 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_ID, 0), (1 => Tree.Add_Identifier (+IDENTIFIER_ID, 
List_Element, Byte_Region)));
+         RHS_Element_1 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_element_ID, 0), (1 => RHS_Item_1));
+         RHS_Element_3 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_element_ID, 0), (1 => RHS_Item_3));
+      begin
+         New_Nonterminal_List_1 (List_Nonterm, RHS_Element_1, RHS_Element_3, 
Byte_Region);
+      end New_Nonterminal_List;
+
+      procedure New_Nonterminal_List
+        (List_Nonterm : in Identifier_Index;
+         List_Element : in Token_Index;
+         Terminals    : in Base_Token_Arrays.Vector;
+         Byte_Region  : in Buffer_Region)
+      is
+         RHS_Item_1 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_ID, 0), (1 => Tree.Add_Terminal (List_Element, 
Terminals)));
+         RHS_Item_3 : constant Valid_Node_Index := Tree.Add_Nonterm
+           ((+rhs_item_ID, 0), (1 => Tree.Add_Terminal (List_Element, 
Terminals)));
+         RHS_Element_1 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_element_ID, 0), (1 => RHS_Item_1));
+         RHS_Element_3 : constant Valid_Node_Index := Tree.Add_Nonterm 
((+rhs_element_ID, 0), (1 => RHS_Item_3));
+      begin
+         New_Nonterminal_List_1 (List_Nonterm, RHS_Element_1, RHS_Element_3, 
Byte_Region);
+      end New_Nonterminal_List;
+
+      procedure Process_Node (Node : in Valid_Node_Index)
+      is begin
+         if Trace_Generate > Detail then
+            Ada.Text_IO.New_Line;
+            Ada.Text_IO.Put_Line ("translate node" & Node_Index'Image (Node));
+         end if;
+
+         case To_Token_Enum (Tree.ID (Node)) is
+         --  Token_Enum_ID alphabetical order
+         when declaration_ID =>
+            --  Must be "%meta_syntax EBNF"; change to BNF
+            declare
+               Decl_Item : constant Valid_Node_Index := Tree.Find_Descendant
+                 (Tree.Child (Node, 3), +declaration_item_ID);
+               Children : Valid_Node_Index_Array := Tree.Children (Decl_Item);
+            begin
+               Children (1) := Tree.Add_Identifier
+                 (+IDENTIFIER_ID, New_Identifier ("BNF"), Tree.Byte_Region 
(Decl_Item));
+               Tree.Set_Children (Decl_Item, (+declaration_item_ID, 1), 
Children);
+            end;
+
+         when rhs_alternative_list_ID =>
+            --  All handled by New_Nonterminal*
+            raise SAL.Not_Implemented with Tree.Image (Node, 
Wisitoken_Grammar_Actions.Descriptor);
+
+         when rhs_attribute_ID =>
+            --  Just delete it
+            --
+            --  Current tree (so far, attributes are always the first item in 
an rhs):
+            --
+            --  rhs:
+            --  | ...
+            --  | rhs_item_list: RHS_Item_List.Parent 2
+            --  | | rhs_item_list: RHS_Item_List.Parent 1
+            --  | | | rhs_item_list: RHS_Item_List
+            --  | | | | rhs_element: Parent (Node, 2)
+            --  | | | | | rhs_item: Parent (Node, 1)
+            --  | | | | | | rhs_attribute: Node
+            --  | | | rhs_element: next_element 1
+            --  | | rhs_element: next_element 2
+            --
+            --  New tree:
+            --
+            --  rhs:
+            --  | ...
+            --  | rhs_item_list: keep RHS_Item_List.Parent
+            --  | | rhs_element: keep next_element 1
+            --  | rhs_element: kepp next_element 2
+            declare
+               RHS_Item_List : constant Valid_Node_Index   := Tree.Parent 
(Node, 3);
+               Parent        : constant Valid_Node_Index   := Tree.Parent 
(RHS_Item_List);
+            begin
+               if Tree.RHS_Index (RHS_Item_List) /= 0 then
+                  --  Not first
+                  Raise_Programmer_Error ("translate_ebnf_to_bnf 
rhs_attribute_id unimplemented", Tree, Node);
+               end if;
+
+               Tree.Set_Children
+                 (Parent,
+                  (+rhs_item_list_ID, 0),
+                  (1 => Tree.Child (Parent, 2)));
+            end;
+
+         when rhs_group_item_ID =>
+            --  Current tree:
+            --
+            --  rhs_element: Parent (Node, 2)
+            --  | rhs_item: Parent (Node, 1)
+            --  | | rhs_group_item: Node
+            --  | | | LEFT_PAREN
+            --  | | | rhs_alternative_list: Child (Node, 2)
+            --  | | | RIGHT_PAREN
+
+            --  See if there's an existing nonterminal for this content.
+            declare
+               Element_Content : constant String       := Get_Text (Data, 
Tree, Tree.Child (Node, 2));
+               Temp            : Node_Index            := First_List_Element
+                 (Tree.Child (Tree.Root, 1), +compilation_unit_ID);
+               Name_Node       : Node_Index;
+               New_Ident       : Base_Identifier_Index := 
Invalid_Identifier_Index;
+            begin
+               loop
+                  pragma Assert (Tree.ID (Temp) = +compilation_unit_ID);
+
+                  if Tree.Production_ID (Tree.Child (Temp, 1)) = 
(+nonterminal_ID, 0) then
+                     --  Target nonterm is:
+                     --
+                     --  (compilation_unit_1, (111 . 128))
+                     --  | (nonterminal_0, (111 . 128))
+                     --  | |  7;(IDENTIFIER, (111 . 128))
+                     --  | | (COLON)
+                     --  | | (rhs_list_1, (111 . 128))
+                     --  | | | ...
+                     declare
+                        RHS_List_1 : constant Node_Index := Tree.Child 
(Tree.Child (Temp, 1), 3);
+                     begin
+                        if RHS_List_1 /= Invalid_Node_Index and then
+                          Element_Content = Get_Text (Data, Tree, RHS_List_1)
+                        then
+                           Name_Node := Tree.Child (Tree.Child (Temp, 1), 1);
+                           case Tree.Label (Name_Node) is
+                           when Shared_Terminal =>
+                              New_Ident := New_Identifier (Get_Text (Data, 
Tree, Name_Node));
+                           when Virtual_Identifier =>
+                              New_Ident := Tree.Identifier (Name_Node);
+                           when others =>
+                              Raise_Programmer_Error ("process_node 
rhs_group_item", Tree, Name_Node);
+                           end case;
+
+                           exit;
+                        end if;
+                     end;
+                  end if;
+
+                  Temp := Next_List_Element (Temp, +compilation_unit_list_ID);
+                  exit when Temp = Invalid_Node_Index;
+               end loop;
+
+               if New_Ident = Invalid_Identifier_Index then
+                  New_Ident := Next_Nonterm_Name;
+                  New_Nonterminal (New_Ident, Tree.Child (Node, 2));
+               end if;
+
+               Tree.Set_Node_Identifier (Node, +IDENTIFIER_ID, New_Ident);
+               Tree.Set_Children (Tree.Parent (Node), (+rhs_item_ID, 0), (1 => 
Node));
+               Clear_EBNF_Node (Node);
+            end;
+
+         when rhs_multiple_item_ID =>
+            --  We have one of:
+            --
+            --  | a { b }  c
+            --  | a { b } - c
+            --  | a ( b ) + c
+            --  | a ( b ) * c
+            --  | a b+ c
+            --  | a b* c
+            --
+            --  Replace it with a new canonical list nonterminal:
+            --
+            --  nonterminal_nnn
+            --  : b
+            --  | nonterminal_nnn_list b
+            --
+            --  and a second RHS if it can be empty:
+            --  | a c
+
+            --  Current tree:
+            --
+            --  rhs_item: Parent (Node, 1)
+            --  | rhs_multiple_item: Node
+            --  | | LEFT_BRACE | LEFT_PAREN
+            --  | | rhs_alternative_list
+            --  | | | ...
+            --  | | RIGHT_BRACE | RIGHT_PAREN
+            --  | | [MINUS | PLUS | STAR]
+
+            --  or:
+            --
+            --  rhs_item: Parent (Node, 1)
+            --  | rhs_multiple_item: Node
+            --  | | IDENTIFIER
+            --  | | PLUS | STAR
+
+            declare
+               Done                       : Boolean                   := False;
+               RHS_Index                  : constant Integer          := 
Tree.RHS_Index (Node);
+               Plus_Minus_Star            : constant Node_Index       := 
Tree.Child
+                 (Node, (if RHS_Index in 0 .. 3 then 4 else 2));
+               Allow_Empty                : constant Boolean          := 
Plus_Minus_Star = Invalid_Node_Index or else
+                 Tree.ID (Plus_Minus_Star) in +STAR_ID;
+               Parent_RHS_Item            : constant Valid_Node_Index := 
Tree.Parent (Node);
+               List_Nonterm_Virtual_Name  : Base_Identifier_Index     := 
Invalid_Identifier_Index;
+               List_Nonterm_Terminal_Name : Base_Token_Index          := 
Invalid_Token_Index;
+               List_Element               : Base_Identifier_Index     := 
Invalid_Identifier_Index;
+
+               procedure Check_Canonical_List
+               is
+                  --  In EBNF, a canonical list with a separator looks like:
+                  --
+                  --  enumConstants : enumConstant (',' enumConstant)* ;
+                  --
+                  --  or, with no separator:
+                  --
+                  --  SwitchLabels : SwitchLabel {SwitchLabel} ;
+                  --
+                  --  The tokens may have labels.
+                  --
+                  --  Handling these cases specially this eliminates a 
conflict between
+                  --  reducing to enumConstants and reducing to the introduced 
nonterm
+                  --  list.
+                  --
+                  --  Alternately, the no separator case can be:
+                  --
+                  --  enumConstants : enumConstant+ ;
+                  --
+                  --  Handling this no separator case specially would not 
eliminate any conflicts.
+
+                  use all type SAL.Base_Peek_Type;
+
+                  Alt_List_Items : constant Valid_Node_Index_Array := 
Tree.Get_IDs (Node, +rhs_item_ID);
+                  RHS_Element    : constant Valid_Node_Index       := 
Tree.Parent (Node, 2);
+                  Element_1      : constant Node_Index             := 
Prev_List_Element
+                    (RHS_Element, +rhs_item_list_ID);
+                  RHS_2          : constant Valid_Node_Index       := 
Tree.Find_Ancestor
+                    (Node, (+rhs_ID, +rhs_alternative_list_ID));
+               begin
+                  if Tree.ID (RHS_2) = +rhs_alternative_list_ID then return; 
end if;
+                  if not (Alt_List_Items'Last in 1 .. 2) then return; end if;
+                  if Element_1 = Invalid_Node_Index or else
+                    Get_Text (Data, Tree, Tree.Get_IDs (Element_1, 
+rhs_item_ID)(1)) /=
+                    Get_Text (Data, Tree, Alt_List_Items (Alt_List_Items'Last))
+                  then
+                     return;
+                  end if;
+                  if Invalid_Node_Index /= Next_List_Element (RHS_Element, 
+rhs_item_list_ID) then return; end if;
+                  if Invalid_Node_Index /= Next_List_Element (RHS_2, 
+rhs_list_ID) or
+                    Invalid_Node_Index /= Prev_List_Element (RHS_2, 
+rhs_list_ID)
+                  then
+                     return;
+                  end if;
+
+                  --  We have a canonical list declaration. Rewrite it to:
+                  --
+                  --  with separator:
+                  --  rhs_list: keep
+                  --  | rhs_list:
+                  --  | | rhs: new, RHS_1
+                  --  | | | rhs_item_list: new, RHS_Item_List_1
+                  --  | | | | rhs_element: keep, Element_1
+                  --  | | | | | rhs_item: keep
+                  --  | | | | | | IDENTIFIER: keep; element name
+                  --  | BAR: new
+                  --  | rhs: keep, RHS_2
+                  --  | | rhs_item_list: new, RHS_Item_List_2
+                  --  | | | rhs_item_list: keep, rhs_item_list_3
+                  --  | | | | rhs_item_list: keep, rhs_item_list_4
+                  --  | | | | | rhs_element: new
+                  --  | | | | | | rhs_item: new
+                  --  | | | | | | | IDENTIFIER: new, list name
+                  --  | | | | rhs_element: keep
+                  --  | | | | | rhs_item: keep
+                  --  | | | | | | IDENTIFIER: keep, separator
+                  --  | | | rhs_element: keep, alt_list_elements (last)
+                  --  | | | | rhs_item: keep
+                  --  | | | | | IDENTIFIER: keep, element name
+                  --
+                  --  no separator:
+                  --  rhs_list: keep
+                  --  | rhs_list:
+                  --  | | rhs: new, RHS_1
+                  --  | | | rhs_item_list: new, RHS_Item_List_1
+                  --  | | | | rhs_element: keep, Element_1
+                  --  | | | | | rhs_item: keep
+                  --  | | | | | | IDENTIFIER: keep; element name
+                  --  | BAR: new
+                  --  | rhs: keep, RHS_2
+                  --  | | rhs_item_list: keep, rhs_item_list_3
+                  --  | | | rhs_item_list: new, rhs_item_list_4
+                  --  | | | | rhs_element: new
+                  --  | | | | | rhs_item: new
+                  --  | | | | | | IDENTIFIER: new, list name
+                  --  | | | rhs_element: keep, alt_list_elements (last)
+                  --  | | | | rhs_item: keep
+                  --  | | | | | IDENTIFIER: keep, element name
+
+                  declare
+                     List_Name_Node   : constant Valid_Node_Index := 
Tree.Find_Ancestor (RHS_2, +nonterminal_ID);
+                     List_Name_Tok    : constant Token_Index      := 
Tree.Min_Terminal_Index (List_Name_Node);
+                     List_Name_Region : constant Buffer_Region    := 
Data.Terminals.all (List_Name_Tok).Byte_Region;
+                     List_Name        : constant String           := 
Data.Grammar_Lexer.Buffer_Text (List_Name_Region);
+
+                     RHS_2_Index    : constant Integer       := Tree.RHS_Index 
(RHS_2);
+                     RHS_2_Children : Valid_Node_Index_Array := Tree.Children 
(RHS_2);
+
+                     RHS_Item_List_1    : constant Valid_Node_Index := 
Tree.Add_Nonterm
+                       ((+rhs_item_list_ID, 0), (1 => Element_1));
+
+                     RHS_1_Action : constant Node_Index :=
+                       (case RHS_2_Index is
+                        when 2 | 3 => Tree.Add_Terminal
+                          (Tree.Min_Terminal_Index (RHS_2_Children (2)), 
Data.Terminals.all),
+                        when others => Invalid_Node_Index);
+
+                     RHS_1_Check : constant Node_Index :=
+                       (case RHS_2_Index is
+                        when 3 => Tree.Add_Terminal
+                          (Tree.Min_Terminal_Index (RHS_2_Children (3)), 
Data.Terminals.all),
+                        when others => Invalid_Node_Index);
+
+                     RHS_1              : constant Valid_Node_Index :=
+                       (case RHS_2_Index is
+                        when 1 => Tree.Add_Nonterm ((+rhs_ID, 1), (1 => 
RHS_Item_List_1)),
+                        when 2 => Tree.Add_Nonterm ((+rhs_ID, 2), (1 => 
RHS_Item_List_1, 2 => RHS_1_Action)),
+                        when 3 => Tree.Add_Nonterm
+                          ((+rhs_ID, 3), (1 => RHS_Item_List_1, 2 => 
RHS_1_Action, 3 => RHS_1_Check)),
+                        when others => raise SAL.Programmer_Error);
+
+                     Bar                   : constant Valid_Node_Index := 
Tree.Add_Terminal (+BAR_ID);
+                     RHS_Item_List_3       : constant Valid_Node_Index := 
Tree.Child (RHS_2, 1);
+                     RHS_Item_List_4       : constant Valid_Node_Index := 
Tree.Child (RHS_Item_List_3, 1);
+                     New_List_Name_Term    : constant Valid_Node_Index := 
Tree.Add_Terminal
+                       (List_Name_Tok, Data.Terminals.all);
+                     New_List_Name_Item    : constant Valid_Node_Index := 
Tree.Add_Nonterm
+                       ((+rhs_item_ID, 0),
+                        (1      => New_List_Name_Term));
+
+                     New_List_Name_Label : constant Node_Index :=
+                       (if Tree.RHS_Index (Element_1) = 1
+                        then --  tokens have labels
+                           Tree.Add_Identifier (+IDENTIFIER_ID, New_Identifier 
(List_Name), List_Name_Region)
+                        else Invalid_Node_Index);
+
+                     New_List_Name_Element : constant Valid_Node_Index :=
+                       (if Tree.RHS_Index (Element_1) = 1
+                        then --  tokens have labels
+                           Tree.Add_Nonterm
+                             ((+rhs_element_ID, 1),
+                             (1 => New_List_Name_Label,
+                              2 => Tree.Add_Terminal (+EQUAL_ID),
+                              3 => New_List_Name_Item))
+                        else
+                           Tree.Add_Nonterm ((+rhs_element_ID, 0), (1 => 
New_List_Name_Item)));
+
+                     Alt_List_Elements : constant Valid_Node_Index_Array := 
Tree.Get_IDs (Node, +rhs_element_ID);
+                     RHS_Item_List_2   : constant Node_Index       :=
+                       (if Alt_List_Elements'Last = 1
+                        then Invalid_Node_Index -- no separator
+                        else Tree.Add_Nonterm
+                          ((+rhs_item_list_ID, 1),
+                          (1 => RHS_Item_List_3,
+                           2 => Alt_List_Elements (Alt_List_Elements'Last))));
+
+                  begin
+                     Tree.Set_Children (RHS_Item_List_4, (+rhs_item_list_ID, 
0), (1 => New_List_Name_Element));
+
+                     Tree.Set_Children
+                       (RHS_Item_List_3,
+                        (+rhs_item_list_ID, 1),
+                        (1 => RHS_Item_List_4,
+                         2 => Alt_List_Elements (1)));
+
+                     RHS_2_Children (1) :=
+                       (if Alt_List_Elements'Last = 1
+                        then RHS_Item_List_3 -- no separator
+                        else RHS_Item_List_2);
+                     Tree.Set_Children (RHS_2, (+rhs_ID, Tree.RHS_Index 
(RHS_2)), RHS_2_Children);
+
+                     Tree.Set_Children
+                       (Tree.Parent (RHS_2),
+                        (+rhs_list_ID, 1),
+                        (1 => Tree.Add_Nonterm ((+rhs_list_ID, 0), (1 => 
RHS_1)),
+                         2 => Bar,
+                         3 => RHS_2));
+                  end;
+
+                  Done := True;
+
+                  Clear_EBNF_Node (Node);
+
+                  if Trace_Generate > Extra then
+                     Ada.Text_IO.New_Line;
+                     Ada.Text_IO.Put_Line ("edited rhs_list:");
+                     Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, 
Tree.Parent (RHS_2));
+                  end if;
+               end Check_Canonical_List;
+
+               procedure Find_List_Nonterminal_2 (Element_Content : in String)
+               is
+                  --  Look for a virtual pair of nonterms implementing a list 
of Element_Content.
+                  --  If found, set List_Nonterm_Virtual_Name, List_Element
+                  Temp      : Node_Index := First_List_Element (Tree.Child 
(Tree.Root, 1), +compilation_unit_ID);
+                  Name_Node : Node_Index;
+               begin
+                  loop
+                     pragma Assert (Tree.ID (Temp) = +compilation_unit_ID);
+
+                     if Tree.Production_ID (Tree.Child (Temp, 1)) = 
(+nonterminal_ID, 0) and
+                       Tree.Is_Virtual (Tree.Child (Temp, 1))
+                     then
+                        if Element_Content = Get_Text (Data, Tree, Tree.Child 
(Tree.Child (Temp, 1), 3)) then
+                           Name_Node := Tree.Child (Tree.Child (Temp, 1), 1);
+                           case Tree.Label (Name_Node) is
+                           when Virtual_Identifier =>
+                              List_Element := Tree.Identifier (Name_Node);
+                           when others =>
+                              Raise_Programmer_Error
+                                ("unimplemented Find_List_Nonterminal_2 case 
'" & Element_Content & "'",
+                                 Tree, Name_Node);
+                           end case;
+
+                           --  list nonterm is the next nonterminal
+                           Temp := Next_List_Element (Temp, 
+compilation_unit_list_ID);
+                           Name_Node := Tree.Child (Tree.Child (Temp, 1), 1);
+                           case Tree.Label (Name_Node) is
+                           when Virtual_Identifier =>
+                              List_Nonterm_Virtual_Name := Tree.Identifier 
(Name_Node);
+                           when others =>
+                              raise SAL.Programmer_Error;
+                           end case;
+                           exit;
+                        end if;
+                     end if;
+
+                     Temp := Next_List_Element (Temp, 
+compilation_unit_list_ID);
+                     exit when Temp = Invalid_Node_Index;
+                  end loop;
+               end Find_List_Nonterminal_2;
+
+               procedure Find_List_Nonterminal_1 (Element_Content : in String)
+               is
+                  --  Search for a nonterm (virtual or not) implementing a 
list for
+                  --  Element_Content, which is a single rhs_element; no 
List_Element
+                  --  Nonterminal. If found, set List_Nonterm_Virtual_Name or
+                  --  List_Nonterm_Terminal_Name
+                  Temp      : Node_Index := First_List_Element (Tree.Child 
(Tree.Root, 1), +compilation_unit_ID);
+               begin
+                  loop
+                     pragma Assert (Tree.ID (Temp) = +compilation_unit_ID);
+
+                     if Tree.Production_ID (Tree.Child (Temp, 1)) = 
(+nonterminal_ID, 0) then
+                        --  Target List_Nonterm is:
+                        --
+                        --  nonterminal_nnn_list
+                        --     : element
+                        --     | nonterminal_nnn_list element
+                        --
+                        --  compilation_unit
+                        --  | nonterminal
+                        --  | | IDENTIFIER : list_nonterm
+                        --  | | COLON
+                        --  | | rhs_list: rhs_list_1
+                        --  | | | rhs_list: rhs_list_2
+                        --  | | | | rhs
+                        --  | | | | | ... List_element
+                        --  | | | BAR
+                        --  | | | rhs: ... list_nonterm list_element
+                        declare
+                           Name_Node  : constant Node_Index := Tree.Child 
(Tree.Child (Temp, 1), 1);
+                           RHS_List_1 : constant Node_Index := Tree.Child 
(Tree.Child (Temp, 1), 3);
+                           RHS_List_2 : constant Node_Index :=
+                             (if RHS_List_1 = Invalid_Node_Index
+                              then Invalid_Node_Index
+                              else Tree.Child (RHS_List_1, 1));
+                        begin
+                           if RHS_List_2 /= Invalid_Node_Index and
+                             Tree.Child (RHS_List_1, 3) /= Invalid_Node_Index 
and -- second rhs present
+                             Tree.Child (RHS_List_2, 3) = Invalid_Node_Index 
-- no third rhs
+                           then
+                              declare
+                                 RHS_1 : constant String := Get_Text (Data, 
Tree, RHS_List_2);
+                                 RHS_2 : constant String := Get_Text (Data, 
Tree, Tree.Child (RHS_List_1, 3));
+                                 Expected_RHS_2 : constant String := Get_Text 
(Data, Tree, Name_Node) & " " &
+                                   Element_Content;
+                              begin
+                                 if Element_Content = RHS_1 and RHS_2 = 
Expected_RHS_2 then
+                                    case Tree.Label (Name_Node) is
+                                    when Shared_Terminal =>
+                                       List_Nonterm_Terminal_Name := 
Tree.Min_Terminal_Index (Name_Node);
+                                    when Virtual_Identifier =>
+                                       List_Nonterm_Virtual_Name := 
Tree.Identifier (Name_Node);
+                                    when others =>
+                                       Raise_Programmer_Error
+                                         ("unimplemented 
Find_List_Nonterminal_1 case '" & Element_Content & "'",
+                                          Tree, Name_Node);
+                                    end case;
+
+                                    exit;
+                                 end if;
+                              end;
+                           end if;
+                        end;
+                     end if;
+
+                     Temp := Next_List_Element (Temp, 
+compilation_unit_list_ID);
+                     exit when Temp = Invalid_Node_Index;
+                  end loop;
+               end Find_List_Nonterminal_1;
+            begin
+               --  Check if this is a recognized pattern
+               Check_Canonical_List;
+               if Done then return; end if;
+
+               --  Check to see if there is an already declared nonterminal
+               --  list with the same content; if not, create one.
+               case Tree.RHS_Index (Node) is
+               when 0 .. 3 =>
+                  --  { rhs_alternative_list } -?
+                  --  ( rhs_alternative_list ) [+*]
+                  if 0 = Tree.RHS_Index (Tree.Child (Node, 2)) and then
+                    0 = Tree.RHS_Index (Tree.Child (Tree.Child (Node, 2), 1))
+                  then
+                     --  Only one element in the rhs_alternative_list, and in 
the rhs_item_list
+                     Find_List_Nonterminal_1 (Get_Text (Data, Tree, Tree.Child 
(Node, 2)));
+
+                     if List_Nonterm_Virtual_Name = Invalid_Identifier_Index 
and
+                       List_Nonterm_Terminal_Name = Invalid_Token_Index
+                     then
+                        List_Nonterm_Virtual_Name := Next_Nonterm_Name 
("_list");
+                        New_Nonterminal_List
+                          (List_Nonterm_Virtual_Name, Tree.Min_Terminal_Index 
(Tree.Child (Node, 2)),
+                           Data.Terminals.all, Tree.Byte_Region (Node));
+                     end if;
+                  else
+                     Find_List_Nonterminal_2 (Get_Text (Data, Tree, Tree.Child 
(Node, 2)));
+
+                     if List_Nonterm_Virtual_Name = Invalid_Identifier_Index 
then
+                        List_Nonterm_Virtual_Name := Next_Nonterm_Name 
("_list");
+                        List_Element              := Next_Nonterm_Name;
+                        New_Nonterminal (List_Element, Tree.Child (Node, 2));
+                        New_Nonterminal_List (List_Nonterm_Virtual_Name, 
List_Element, Tree.Byte_Region (Node));
+                     end if;
+                  end if;
+
+               when 4 | 5 =>
+                  --  IDENTIFIER + | *
+                  Find_List_Nonterminal_1 (Get_Text (Data, Tree, Tree.Child 
(Node, 1)));
+
+                  if List_Nonterm_Virtual_Name = Invalid_Identifier_Index then
+                     List_Nonterm_Virtual_Name := Next_Nonterm_Name ("_list");
+                     New_Nonterminal_List
+                       (List_Nonterm_Virtual_Name, Tree.Min_Terminal_Index 
(Tree.Child (Node, 1)), Data.Terminals.all,
+                        Tree.Byte_Region (Node));
+                  end if;
+
+               when others =>
+                  Raise_Programmer_Error ("translate_ebnf_to_bnf 
rhs_multiple_item unimplmented", Tree, Node);
+               end case;
+
+               if Allow_Empty then
+                  Insert_Optional_RHS (Node);
+               end if;
+
+               declare
+                  Child : constant Valid_Node_Index :=
+                    (if List_Nonterm_Virtual_Name /= Invalid_Identifier_Index
+                     then Tree.Add_Identifier
+                       (+IDENTIFIER_ID, List_Nonterm_Virtual_Name, 
Tree.Byte_Region (Parent_RHS_Item))
+                     elsif List_Nonterm_Terminal_Name /= Invalid_Token_Index
+                     then Tree.Add_Terminal (List_Nonterm_Terminal_Name, 
Data.Terminals.all)
+                     else raise SAL.Programmer_Error);
+               begin
+                  Tree.Set_Children (Parent_RHS_Item, (+rhs_item_ID, 0), (1 => 
Child));
+               end;
+
+               Clear_EBNF_Node (Node);
+
+               if Trace_Generate > Extra then
+                  Ada.Text_IO.New_Line;
+                  Ada.Text_IO.Put_Line ("edited rhs_item:");
+                  Tree.Print_Tree (Wisitoken_Grammar_Actions.Descriptor, 
Parent_RHS_Item);
+               end if;
+            exception
+            when E : System.Assertions.Assert_Failure =>
+               Raise_Programmer_Error
+                 ("translate_ebnf_to_bnf multiple_item assert: " & 
Ada.Exceptions.Exception_Message (E), Tree, Node);
+            end;
+
+         when rhs_optional_item_ID =>
+            --  Source looks like:
+            --
+            --  | a [b] c
+            --
+            --  where 'a', 'b', 'c' are token sequences. Translate to:
+            --
+            --  | a nonterm_b c
+            --  | a c
+            --
+            --  where 'nonterm_b' is a new nonterminal containing b, unless b 
is
+            --  simple enough to inline.
+            --
+            --  See nested_ebnf_optional.wy for an example of nested optional
+            --  items.
+            --
+            --  current tree:
+            --
+            --  | rhs_list:
+            --  | | rhs | rhs_alternative_list:
+            --  | | | rhs_item_list
+            --  | | | | rhs_item_list
+            --  | | | ...
+            --  | | | | | | rhs_element:
+            --  | | | | | | | rhs_item: contains a tail
+            --  | | | | | rhs_element:
+            --  | | | | | | rhs_item: contains b
+            --  | | | | | | | rhs_optional_item: Node
+            --  | | | | | | | | LEFT_BRACKET: Node.Children (1)
+            --  | | | | | | | | rhs_alternative_item_list: Node.Children (2) b
+            --  | | | | | | | | RIGHT_BRACKET: Node.Children (3)
+            --  | | | | rhs_element: head of c
+            --  | | | | | rhs_item: head of c
+
+            declare
+               Name_Ident    : Base_Identifier_Index := 
Invalid_Identifier_Index;
+               Name_Terminal : Base_Token_Index      := Invalid_Token_Index;
+               Name_Label    : Base_Token_Index      := Invalid_Token_Index;
+               Found         : Boolean               := False;
+            begin
+               case Tree.RHS_Index (Node) is
+               when 0 | 1 =>
+                  --  : LEFT_BRACKET rhs_alternative_list RIGHT_BRACKET
+                  --  | LEFT_PAREN rhs_alternative_list RIGHT_PAREN QUESTION
+
+                  --  Check for special cases
+
+                  if List_Singleton (Tree.Child (Node, 2)) then
+                     if List_Singleton (Tree.Child (Tree.Child (Node, 2), 1)) 
then
+                        --  Single item in rhs_alternative_list and 
rhs_item_list; just use it.
+                        --
+                        --  Single alternative, multiple rhs_items handled 
below
+                        declare
+                           Name_Element_Node    : Valid_Node_Index;
+                           Name_Identifier_Node : Node_Index;
+                        begin
+                           Found     := True;
+                           Name_Element_Node := First_List_Element
+                             (Tree.Child (Tree.Child (Node, 2), 1), 
+rhs_element_ID);
+
+                           if Tree.RHS_Index (Name_Element_Node) = 0 then
+                              Name_Identifier_Node := Tree.Child (Tree.Child 
(Name_Element_Node, 1), 1);
+                           else
+                              --  Name has a label
+                              Name_Label           := Tree.Min_Terminal_Index 
(Tree.Child (Name_Element_Node, 1));
+                              Name_Identifier_Node := Tree.Child (Tree.Child 
(Name_Element_Node, 3), 1);
+                           end if;
+
+                           case Tree.Label (Name_Identifier_Node) is
+                           when Virtual_Identifier =>
+                              Name_Ident := Tree.Identifier 
(Name_Identifier_Node);
+                           when Shared_Terminal =>
+                              Name_Terminal := Tree.Min_Terminal_Index 
(Name_Identifier_Node);
+                           when others =>
+                              Raise_Programmer_Error ("unhandled rhs_optional 
case ", Tree, Name_Identifier_Node);
+                           end case;
+                        end;
+                     end if;
+                  else
+                     --  See if we've already created a nonterminal for this.
+                     declare
+                        New_Text             : constant String := Get_Text 
(Data, Tree, Tree.Child (Node, 2));
+                        Temp                 : Node_Index      := 
First_List_Element
+                          (Tree.Child (Tree.Root, 1), +compilation_unit_ID);
+                        Name_Identifier_Node : Node_Index;
+                     begin
+                        loop
+                           pragma Assert (Tree.ID (Temp) = 
+compilation_unit_ID);
+
+                           if Tree.Production_ID (Tree.Child (Temp, 1)) = 
(+nonterminal_ID, 0) then
+                              if New_Text = Get_Text (Data, Tree, Tree.Child 
(Tree.Child (Temp, 1), 3)) then
+                                 Found := True;
+                                 Name_Identifier_Node := Tree.Child 
(Tree.Child (Temp, 1), 1);
+                                 case Tree.Label (Name_Identifier_Node) is
+                                 when Virtual_Identifier =>
+                                    Name_Ident := Tree.Identifier 
(Name_Identifier_Node);
+                                 when others =>
+                                    Raise_Programmer_Error
+                                      ("unhandled rhs_optional case '" & 
New_Text & "'", Tree, Name_Identifier_Node);
+                                 end case;
+                                 exit;
+                              end if;
+                           end if;
+
+                           Temp := Next_List_Element (Temp, 
+compilation_unit_list_ID);
+                           exit when Found or Temp = Invalid_Node_Index;
+                        end loop;
+                     end;
+                  end if;
+
+                  if Found then
+                     --  Use previously created nonterminal
+                     if Name_Ident /= Invalid_Identifier_Index then
+                        Tree.Set_Node_Identifier (Node, +IDENTIFIER_ID, 
Name_Ident);
+
+                        --  Change RHS_Index, delete Check_EBNF action
+                        Tree.Set_Children (Tree.Parent (Node), (+rhs_item_ID, 
0), (1 => Node));
+
+                     elsif Name_Terminal /= Invalid_Token_Index then
+                        Tree.Set_Children
+                          (Tree.Parent (Node),
+                           (+rhs_item_ID, 0),
+                           (1 => Tree.Add_Terminal (Name_Terminal, 
Data.Terminals.all)));
+
+                     else
+                        raise SAL.Programmer_Error;
+                     end if;
+
+                     if Name_Label /= Invalid_Token_Index then
+                        declare
+                           Label_Node : constant Valid_Node_Index := 
Tree.Add_Terminal
+                             (Name_Label, Data.Terminals.all);
+                           Equal_Node : constant Valid_Node_Index := 
Tree.Add_Terminal (+EQUAL_ID);
+                        begin
+                           Tree.Set_Children
+                             (Tree.Parent (Tree.Parent (Node)),
+                              (+rhs_element_ID, 1),
+                              (1 => Label_Node,
+                               2 => Equal_Node,
+                               3 => Tree.Parent (Node)));
+                        end;
+                     end if;
+
+                  else
+                     --  Create a new nonterm, or handle more special cases
+
+                     if List_Singleton (Tree.Child (Node, 2)) then
+                        --  Single alternative, multiple rhs_items
+                        --
+                        --  No separate nonterminal, so token labels stay in 
the same RHS for
+                        --  actions. Splice together rhs_item_lists a, b, c
+                        declare
+                           Root_List_A    : constant Valid_Node_Index := 
Tree.Child (Tree.Parent (Node, 3), 1);
+                           Tail_Element_A : constant Node_Index       :=
+                             (if Root_List_A = Tree.Parent (Node, 2)
+                              then Invalid_Node_Index -- a is empty
+                              else Last_List_Element (Root_List_A));
+                           Root_List_B    : constant Valid_Node_Index := 
Tree.Child (Tree.Child (Node, 2), 1);
+                           Head_Element_B : constant Valid_Node_Index := 
First_List_Element
+                             (Root_List_B, +rhs_element_ID);
+                           Tail_Element_B : constant Valid_Node_Index := 
Last_List_Element (Root_List_B);
+                           Root_List_C    : constant Valid_Node_Index := 
List_Root (Tree.Parent (Node, 3));
+                           Head_Element_C : constant Node_Index       := 
Next_List_Element
+                             (Tree.Parent (Node, 2), +rhs_item_list_ID);
+                           RHS            : constant Valid_Node_Index := 
Tree.Parent (Root_List_C);
+                           RHS_Children   : Valid_Node_Index_Array    := 
Tree.Children (RHS);
+                        begin
+                           if Tail_Element_A = Invalid_Node_Index and 
Head_Element_C = Invalid_Node_Index then
+                              --  A, C both empty
+                              RHS_Children (1) := Tree.Child (Root_List_B, 1);
+                              Tree.Set_Children (RHS, Tree.Production_ID 
(RHS), RHS_Children);
+
+                           elsif Tail_Element_A = Invalid_Node_Index then
+                              --  A empty, C not empty
+                              declare
+                                 Parent_B2 : constant Valid_Node_Index := 
Tree.Parent (Tail_Element_B);
+                                 Parent_C  : constant Valid_Node_Index := 
Tree.Parent (Head_Element_C);
+                              begin
+                                 Tree.Set_Children (Parent_C, 
(+rhs_item_list_ID, 1), (Parent_B2, Head_Element_C));
+                                 --  Head_Element_C remains the list root.
+                              end;
+
+                           elsif Head_Element_C = Invalid_Node_Index then
+                              --  A not empty, C empty.
+                              declare
+                                 Parent_A : constant Valid_Node_Index := 
Tree.Parent (Tail_Element_A);
+                                 Parent_B : constant Valid_Node_Index := 
Tree.Parent (Head_Element_B);
+                              begin
+                                 Tree.Set_Children (Parent_B, 
(+rhs_item_list_ID, 1), (Parent_A, Head_Element_B));
+                                 RHS_Children (1) := Root_List_B;
+                                 Tree.Set_Children (RHS, Tree.Production_ID 
(RHS), RHS_Children);
+                              end;
+                           else
+                              --  A, C both not empty
+                              declare
+                                 Parent_A  : constant Valid_Node_Index := 
Tree.Parent (Tail_Element_A);
+                                 Parent_B1 : constant Valid_Node_Index := 
Tree.Parent (Head_Element_B);
+                                 Parent_B2 : constant Valid_Node_Index := 
Tree.Parent (Tail_Element_B);
+                                 Parent_C  : constant Valid_Node_Index := 
Tree.Parent (Head_Element_C);
+                              begin
+                                 Tree.Set_Children (Parent_B1, 
(+rhs_item_list_ID, 1), (Parent_A, Head_Element_B));
+                                 Tree.Set_Children (Parent_C, 
(+rhs_item_list_ID, 1), (Parent_B2, Head_Element_C));
+                                 --  Head_Element_C remains the list root.
+                              end;
+                           end if;
+
+                           if Trace_Generate > Extra then
+                              Ada.Text_IO.New_Line;
+                              Ada.Text_IO.Put_Line ("edited rhs:");
+                              Tree.Print_Tree 
(Wisitoken_Grammar_Actions.Descriptor, RHS);
+                           end if;
+                        end;
+                     else
+                        declare
+                           Nonterm_B : constant Identifier_Index := 
Next_Nonterm_Name ("");
+                        begin
+                           New_Nonterminal (Nonterm_B, Tree.Child (Node, 2));
+                           Tree.Set_Node_Identifier (Node, +IDENTIFIER_ID, 
Nonterm_B);
+                        end;
+                        Tree.Set_Children (Tree.Parent (Node), (+rhs_item_ID, 
0), (1 => Node));
+                     end if;
+                  end if;
+
+               when 2 =>
+                  --  | IDENTIFIER QUESTION
+                  Tree.Set_Children (Tree.Parent (Node), (+rhs_item_ID, 0), (1 
=> Tree.Child (Node, 1)));
+
+               when 3 =>
+                  --  | STRING_LITERAL_2 QUESTION
+                  Tree.Set_Children (Tree.Parent (Node), (+rhs_item_ID, 1), (1 
=> Tree.Child (Node, 1)));
+
+               when others =>
+                  Raise_Programmer_Error ("translate_ebnf_to_bnf 
rhs_optional_item unimplmented", Tree, Node);
+               end case;
+
+               Clear_EBNF_Node (Node);
+
+               Insert_Optional_RHS (Node);
+            end;
+
+         when STRING_LITERAL_2_ID =>
+            declare
+               Value      : constant String  := Get_Text (Data, Tree, Node, 
Strip_Quotes => True);
+               Name_Ident : Identifier_Index;
+               Found      : Boolean          := False;
+            begin
+               --  See if Value is already declared
+               declare
+                  Temp : Node_Index := First_List_Element (Tree.Child 
(Tree.Root, 1), +compilation_unit_ID);
+                  Decl : Node_Index;
+               begin
+                  loop
+                     pragma Assert (Tree.ID (Temp) = +compilation_unit_ID);
+
+                     if Tree.Production_ID (Tree.Child (Temp, 1)) = 
(+declaration_ID, 0) then
+                        Decl := Tree.Child (Temp, 1);
+                        declare
+                           Value_Node : constant Valid_Node_Index := 
Tree.Child (Tree.Child (Decl, 4), 1);
+                        begin
+                           if Tree.ID (Value_Node) = +declaration_item_ID and 
then
+                             Tree.ID (Tree.Child (Value_Node, 1)) in
+                             +IDENTIFIER_ID | +STRING_LITERAL_1_ID | 
+STRING_LITERAL_2_ID and then
+                             Value = Get_Text (Data, Tree, Tree.Child 
(Value_Node, 1), Strip_Quotes => True)
+                           then
+                              Found := True;
+                              case Tree.Label (Tree.Child (Decl, 3)) is
+                              when Shared_Terminal =>
+                                 Name_Ident := New_Identifier (Get_Text (Data, 
Tree, Tree.Child (Decl, 3)));
+                              when Virtual_Identifier =>
+                                 Name_Ident := Tree.Identifier (Tree.Child 
(Decl, 3));
+                              when others =>
+                                 raise SAL.Programmer_Error;
+                              end case;
+                           end if;
+                        end;
+                     end if;
+
+                     Temp := Next_List_Element (Temp, 
+compilation_unit_list_ID);
+                     exit when Temp = Invalid_Node_Index;
+                  end loop;
+               end;
+
+               if not Found then
+                  if GNAT.Regexp.Match (Value, Symbol_Regexp) then
+                     Name_Ident := New_Identifier 
(Ada.Characters.Handling.To_Upper (Value));
+                  else
+                     Put_Error
+                       (Error_Message
+                          (Data.Grammar_Lexer.File_Name, Get_Line (Data, Tree, 
Node),
+                           "punctuation token '" & Value & "' not declared"));
+                     return;
+                  end if;
+               end if;
+
+               declare
+                  Parent : constant Valid_Node_Index := Tree.Parent (Node);
+               begin
+                  case To_Token_Enum (Tree.ID (Parent)) is
+                  when rhs_item_ID =>
+                     Tree.Set_Children
+                       (Tree.Parent (Node),
+                        (+rhs_item_ID, 0),
+                        (1 => Tree.Add_Identifier (+IDENTIFIER_ID, Name_Ident, 
Tree.Byte_Region (Node))));
+
+                  when rhs_optional_item_ID =>
+                     Tree.Set_Children
+                       (Tree.Parent (Node),
+                        (+rhs_optional_item_ID, 2),
+                        (1 => Tree.Add_Identifier (+IDENTIFIER_ID, Name_Ident, 
Tree.Byte_Region (Node))));
+
+                  when others =>
+                     Raise_Programmer_Error ("translate_ebnf_to_bnf 
string_literal_2 unimplemented", Tree, Node);
+                  end case;
+               end;
+
+               Clear_EBNF_Node (Node);
+               if Found then return; end if;
+
+               --  Declare token for keyword string literal
+               declare
+                  Keyword        : constant Valid_Node_Index := 
Tree.Add_Identifier
+                    (+KEYWORD_ID, Keyword_Ident, Tree.Byte_Region (Node));
+                  Kind           : constant Valid_Node_Index := 
Tree.Add_Nonterm
+                    ((+token_keyword_non_grammar_ID, 0),
+                     (1 => Keyword));
+                  Value_Literal  : constant Valid_Node_Index := 
Tree.Add_Identifier
+                    (+STRING_LITERAL_1_ID, New_Identifier ('"' & Value & '"'), 
Tree.Byte_Region (Node));
+                  Decl_Item      : constant Valid_Node_Index := 
Tree.Add_Nonterm
+                    ((+declaration_item_ID, 1),
+                     (1 => Value_Literal));
+                  Decl_Item_List : constant Valid_Node_Index := 
Tree.Add_Nonterm
+                    ((+declaration_item_list_ID, 0),
+                     (1 => Decl_Item));
+
+                  Percent : constant Valid_Node_Index := Tree.Add_Identifier
+                    (+PERCENT_ID, Percent_Ident, Tree.Byte_Region (Node));
+                  Name    : constant Valid_Node_Index := Tree.Add_Identifier
+                    (+IDENTIFIER_ID, Name_Ident, Tree.Byte_Region (Node));
+                  Decl    : constant Valid_Node_Index := Tree.Add_Nonterm
+                    ((+declaration_ID, 0), (Percent, Kind, Name, 
Decl_Item_List), Action => declaration_0'Access);
+               begin
+                  Add_Compilation_Unit (Decl, Prepend => True);
+               end;
+            end;
+
+         when others =>
+            Raise_Programmer_Error ("unimplemented EBNF node", Tree, Node);
+         end case;
+      exception
+      when SAL.Programmer_Error =>
+         raise;
+      when E : others =>
+         Raise_Programmer_Error
+           ("unhandled exception " & Ada.Exceptions.Exception_Name (E) & ": " &
+              Ada.Exceptions.Exception_Message (E),
+            Tree, Node);
+      end Process_Node;
+
+   begin
+      --  Process nodes in node increasing order, so contained items are
+      --  translated first, so duplicates of the containing item can be found
+      for I in Data.EBNF_Nodes.First_Index .. Data.EBNF_Nodes.Last_Index loop
+         if Data.EBNF_Nodes (I) then
+            Process_Node (I);
+         end if;
+      end loop;
+
+      --  Processing copied nodes may produce more copied nodes, so we can't
+      --  use a 'for' loop.
+      declare
+         use all type SAL.Base_Peek_Type;
+         I : SAL.Base_Peek_Type := Copied_EBNF_Nodes.First_Index;
+      begin
+         loop
+            exit when I > Copied_EBNF_Nodes.Last_Index;
+            Process_Node (Copied_EBNF_Nodes (I));
+            I := I + 1;
+         end loop;
+      end;
+
+      Data.Meta_Syntax := BNF_Syntax;
+
+      if Trace_Generate > Detail then
+         Ada.Text_IO.New_Line;
+         Ada.Text_IO.Put_Line ("Identifiers:");
+         for I in Data.Tokens.Virtual_Identifiers.First_Index .. 
Data.Tokens.Virtual_Identifiers.Last_Index loop
+            Ada.Text_IO.Put_Line (Base_Identifier_Index'Image (I) & " " & 
(-Data.Tokens.Virtual_Identifiers (I)));
+         end loop;
+      end if;
+   exception
+   when E : SAL.Not_Implemented =>
+      Ada.Text_IO.Put_Line
+        (Ada.Text_IO.Standard_Error, "Translate_EBNF_To_BNF not implemented: " 
& Ada.Exceptions.Exception_Message (E));
+   end Translate_EBNF_To_BNF;
+
+   procedure Print_Source
+     (File_Name : in String;
+      Tree      : in WisiToken.Syntax_Trees.Tree;
+      Data      : in User_Data_Type)
+   is
+      use Ada.Text_IO;
+      use WisiToken.Syntax_Trees;
+      File                     : File_Type;
+      Comments_Include_Newline : Boolean;
+
+      procedure Put_Comments (Node : in Valid_Node_Index)
+      is
+         Token : constant Base_Token_Index := Tree.Max_Terminal_Index (Node);
+      begin
+         --  Not all tokens have trailing non_grammar, so Data.Non_Grammar may
+         --  not have entries for every token.
+         Comments_Include_Newline := False;
+         if Token /= Invalid_Token_Index and then
+           Token in Data.Non_Grammar.First_Index .. Data.Non_Grammar.Last_Index
+         then
+            declare
+               Tokens : Base_Token_Arrays.Vector renames Data.Non_Grammar 
(Token);
+            begin
+               for Token of Tokens loop
+                  if Token.ID = +NEW_LINE_ID then
+                     Comments_Include_Newline := True;
+                  end if;
+                  Put (File, Data.Grammar_Lexer.Buffer_Text 
(Token.Byte_Region));
+               end loop;
+            end;
+         end if;
+      end Put_Comments;
+
+      procedure Put_Declaration_Item (Node : in Valid_Node_Index)
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         case To_Token_Enum (Tree.ID (Children (1))) is
+         when IDENTIFIER_ID | NUMERIC_LITERAL_ID | STRING_LITERAL_1_ID | 
STRING_LITERAL_2_ID =>
+            Put (File, ' ' & Get_Text (Data, Tree, Children (1)));
+         when REGEXP_ID =>
+            Put (File, " %[" & Get_Text (Data, Tree, Children (1)) & "]%");
+         when others =>
+            Put (File, Image (Tree.ID (Children (1)), 
Wisitoken_Grammar_Actions.Descriptor));
+         end case;
+      end Put_Declaration_Item;
+
+      procedure Put_Declaration_Item_List (Node : in Valid_Node_Index)
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         if Children'Length = 1 then
+            Put_Declaration_Item (Children (1));
+         else
+            Put_Declaration_Item_List (Children (1));
+            Put_Declaration_Item (Children (2));
+         end if;
+      end Put_Declaration_Item_List;
+
+      procedure Put_Identifier_List (Node : in Valid_Node_Index)
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         if Children'Length = 1 then
+            Put (File, Get_Text (Data, Tree, Children (1)));
+         else
+            Put_Identifier_List (Children (1));
+            Put (File, ' ');
+            Put (File, Get_Text (Data, Tree, Children (2)));
+         end if;
+      end Put_Identifier_List;
+
+      procedure Put_RHS_Element (Node : in Valid_Node_Index)
+      with Pre => Tree.ID (Node) = +rhs_element_ID
+      is begin
+         --  We don't raise an exception for errors here; it's easier to debug 
from the
+         --  mangled source listing.
+
+         case Tree.RHS_Index (Node) is
+         when 0 =>
+            Put (File, Get_Text (Data, Tree, Node));
+
+         when 1 =>
+            --  Output no spaces around "="
+            declare
+               Children : constant Valid_Node_Index_Array := Tree.Children 
(Node);
+            begin
+               Put (File, Get_Text (Data, Tree, Children (1)) & "=" & Get_Text 
(Data, Tree, Children (3)));
+            end;
+
+         when others =>
+            New_Line (File);
+            Put (File, " ;; not translated: " & Node_Index'Image (Node) & ":" &
+              Tree.Image (Node, Wisitoken_Grammar_Actions.Descriptor, 
Include_Children => True));
+         end case;
+      exception
+      when SAL.Programmer_Error =>
+         raise;
+
+      when E : others =>
+         declare
+            use Ada.Exceptions;
+         begin
+            Raise_Programmer_Error
+              ("Put_RHS_Element: " & Exception_Name (E) & ": " & 
Exception_Message (E), Tree, Node);
+         end;
+      end Put_RHS_Element;
+
+      procedure Put_RHS_Item_List (Node : in Valid_Node_Index)
+      with Pre => Tree.ID (Node) = +rhs_item_list_ID
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         if Children'Length = 1 then
+            Put_RHS_Element (Children (1));
+         else
+            Put_RHS_Item_List (Children (1));
+            Put (File, ' ');
+            Put_RHS_Element (Children (2));
+         end if;
+      exception
+      when SAL.Programmer_Error =>
+         raise;
+
+      when E : others =>
+         declare
+            use Ada.Exceptions;
+         begin
+            Raise_Programmer_Error
+              ("Put_RHS_Item_List: " & Exception_Name (E) & ": " & 
Exception_Message (E), Tree, Node);
+         end;
+      end Put_RHS_Item_List;
+
+      procedure Put_RHS
+        (Node    : in Valid_Node_Index;
+         First   : in Boolean;
+         Virtual : in Boolean)
+      with Pre => Tree.ID (Node) = +rhs_ID
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         Put (File, (if First then "  : " else "  | "));
+         case Tree.RHS_Index (Node) is
+         when 0 =>
+            if Virtual then
+               Put_Line (File, ";; empty");
+            else
+               Put_Comments (Tree.Parent (Node));
+            end if;
+
+         when 1 .. 3 =>
+            Put_RHS_Item_List (Children (1));
+            if Virtual then
+               New_Line (File);
+            else
+               Put_Comments (Children (1));
+            end if;
+
+            if Tree.RHS_Index (Node) > 1 then
+               Put (File, "    %(" & Get_Text (Data, Tree, Children (2)) & 
")%"); -- action
+               if Virtual then
+                  New_Line (File);
+               else
+                  Put_Comments (Children (2));
+               end if;
+               if Tree.RHS_Index (Node) > 2 then
+                  Put (File, "    %(" & Get_Text (Data, Tree, Children (3)) & 
")%"); -- check
+                  if Virtual then
+                     New_Line (File);
+                  else
+                     Put_Comments (Children (3));
+                  end if;
+               end if;
+            end if;
+
+         when others =>
+            Raise_Programmer_Error ("Put_RHS", Tree, Node);
+         end case;
+      exception
+      when SAL.Programmer_Error =>
+         raise;
+
+      when E : others =>
+         declare
+            use Ada.Exceptions;
+         begin
+            Raise_Programmer_Error ("Put_RHS: " & Exception_Name (E) & ": " & 
Exception_Message (E), Tree, Node);
+         end;
+      end Put_RHS;
+
+      procedure Put_RHS_List
+        (Node    : in     Valid_Node_Index;
+         First   : in out Boolean;
+         Virtual : in     Boolean)
+      with Pre => Tree.ID (Node) = +rhs_list_ID
+      is
+         Children : constant Valid_Node_Index_Array := Tree.Children (Node);
+      begin
+         case Tree.RHS_Index (Node) is
+         when 0 =>
+            Put_RHS (Children (1), First, Virtual or Children (1) > 
Data.EBNF_Nodes.Last_Index);
+            First := False;
+         when 1 =>
+            Put_RHS_List (Children (1), First, Virtual);
+            Put_RHS (Children (3), First => False, Virtual => Virtual or 
Children (3) > Data.EBNF_Nodes.Last_Index);
+         when 2 =>
+            Put
+              (File, "%if " & Get_Text (Data, Tree, Children (3)) & " = " & 
Get_Text (Data, Tree, Children (4)));
+            Put_Comments (Node);
+
+         when 3 =>
+            Put (File, "%end if");
+            Put_Comments (Node);
+
+         when others =>
+            Raise_Programmer_Error ("Put_RHS_List", Tree, Node);
+         end case;
+      exception
+      when SAL.Programmer_Error =>
+         raise;
+
+      when E : others =>
+         declare
+            use Ada.Exceptions;
+         begin
+            Raise_Programmer_Error ("Put_RHS_List: " & Exception_Name (E) & ": 
" & Exception_Message (E), Tree, Node);
+         end;
+      end Put_RHS_List;
+
+      procedure Process_Node (Node : in Valid_Node_Index)
+      is begin
+         case To_Token_Enum (Tree.ID (Node)) is
+         --  Enum_Token_ID alphabetical order
+         when compilation_unit_ID =>
+            Process_Node (Tree.Child (Node, 1));
+
+         when compilation_unit_list_ID =>
+            declare
+               Children : constant Valid_Node_Index_Array := Tree.Children 
(Node);
+            begin
+               case To_Token_Enum (Tree.ID (Children (1))) is
+               when compilation_unit_list_ID =>
+                  Process_Node (Children (1));
+                  Process_Node (Children (2));
+               when compilation_unit_ID =>
+                  Process_Node (Children (1));
+               when others =>
+                  raise SAL.Programmer_Error;
+               end case;
+            end;
+
+         when declaration_ID =>
+            declare
+               Children : constant Valid_Node_Index_Array := Tree.Children 
(Node);
+            begin
+               case Tree.RHS_Index (Node) is
+               when 0 =>
+                  case Tree.RHS_Index (Children (2)) is
+                  when 0 =>
+                     Put (File, "%keyword");
+                  when 1 =>
+                     Put (File, "%non_grammar <" & Get_Text (Data, Tree, 
Tree.Child (Children (2), 3)) & ">");
+                  when 2 =>
+                     Put (File, "%token <" & Get_Text (Data, Tree, Tree.Child 
(Children (2), 3)) & ">");
+                  when others =>
+                     raise SAL.Programmer_Error;
+                  end case;
+
+                  Put (File, " " & Get_Text (Data, Tree, Children (3)));
+                  Put_Declaration_Item_List (Children (4));
+                  if Tree.Is_Virtual (Children (4)) then
+                     New_Line (File);
+                  else
+                     Put_Comments (Children (4));
+                  end if;
+
+               when 1 =>
+                  Put (File, "%code ");
+                  Put_Identifier_List (Children (3));
+                  Put (File, " %{" & Get_Text (Data, Tree, Children (4)) & 
"}%"); -- RAW_CODE
+                  Put_Comments (Node);
+
+               when 2 =>
+                  declare
+                     Key : constant String := Get_Text (Data, Tree, Children 
(2));
+                  begin
+                     if Key = "conflict" then
+                        Put (File, Data.Grammar_Lexer.Buffer_Text 
(Tree.Byte_Region (Node)));
+                     else
+                        Put (File, "%" & Key);
+                        Put_Declaration_Item_List (Children (3));
+                     end if;
+                  end;
+                  Put_Comments (Children (3));
+
+               when 3 =>
+                  Put (File, "%" & Get_Text (Data, Tree, Children (2)));
+                  Put_Comments (Children (2));
+
+               when 4 =>
+                  Put
+                    (File, "%if" & Get_Text (Data, Tree, Children (2)) & " = " 
& Get_Text (Data, Tree, Children (4)));
+                  Put_Comments (Node);
+
+               when 5 =>
+                  Put (File, "%end if");
+                  Put_Comments (Node);
+
+               when others =>
+                  raise SAL.Programmer_Error;
+               end case;
+            end;
+
+         when nonterminal_ID =>
+            declare
+               Children : constant Valid_Node_Index_Array := Tree.Children 
(Node);
+               Virtual  : constant Boolean                := Tree.Label 
(Children (1)) = Virtual_Identifier;
+               First    : Boolean                         := True;
+            begin
+               Put (File, Get_Text (Data, Tree, Children (1)));
+               if Virtual then
+                  New_Line (File);
+               else
+                  Put_Comments (Children (1));
+                  if not Comments_Include_Newline then
+                     New_Line (File);
+                  end if;
+               end if;
+
+               Put_RHS_List (Children (3), First, Virtual);
+
+               if Tree.Children (Children (4))'Length > 0 then
+                  if Virtual then
+                     Put_Line (File, "  ;");
+                  else
+                     Put (File, "  ;");
+                     Put_Comments (Children (4));
+                  end if;
+               end if;
+            end;
+
+         when wisitoken_accept_ID =>
+            Process_Node (Tree.Child (Node, 1));
+
+         when others =>
+            raise SAL.Not_Implemented with Image (Tree.ID (Node), 
Wisitoken_Grammar_Actions.Descriptor);
+         end case;
+      end Process_Node;
+   begin
+      Create (File, Out_File, File_Name);
+      Put_Line (File, ";;; generated from " & Data.Grammar_Lexer.File_Name & " 
-*- buffer-read-only:t -*-");
+      Put_Line (File, ";;;");
+
+      declare
+         Tokens : Base_Token_Arrays.Vector renames Data.Non_Grammar (0);
+      begin
+         for Token of Tokens loop
+            Put (File, Data.Grammar_Lexer.Buffer_Text (Token.Byte_Region));
+         end loop;
+      end;
+
+      Process_Node (Tree.Root);
+
+      Close (File);
+   exception
+   when E : SAL.Not_Implemented =>
+      Close (File);
+      Ada.Text_IO.Put_Line
+        (Ada.Text_IO.Standard_Error, "Print_Source not implemented: " & 
Ada.Exceptions.Exception_Message (E));
+   end Print_Source;
+
 end WisiToken_Grammar_Runtime;
+--  Local Variables:
+--  ada-which-func-parse-size: 30000
+--  End:
diff --git a/packages/wisi/wisitoken_grammar_runtime.ads 
b/packages/wisi/wisitoken_grammar_runtime.ads
index 9c9d0ac..df848a9 100644
--- a/packages/wisi/wisitoken_grammar_runtime.ads
+++ b/packages/wisi/wisitoken_grammar_runtime.ads
@@ -2,7 +2,7 @@
 --
 --  Runtime utils for wisi_grammar.wy actions.
 --
---  Copyright (C) 2018 Free Software Foundation, Inc.
+--  Copyright (C) 2018 - 2019 Free Software Foundation, Inc.
 --
 --  This library is free software;  you can redistribute it and/or modify it
 --  under terms of the  GNU General Public License  as published by the Free
@@ -17,11 +17,22 @@
 
 pragma License (Modified_GPL);
 
+with Ada.Containers;
+with SAL.Gen_Unbounded_Definite_Vectors;
 with WisiToken.BNF;
 with WisiToken.Lexer;
 with WisiToken.Syntax_Trees;
 package WisiToken_Grammar_Runtime is
 
+   type Meta_Syntax is (Unknown, BNF_Syntax, EBNF_Syntax);
+   --  Syntax used in grammar file.
+
+   type Action_Phase is (Meta, Other);
+
+   package Base_Token_Array_Arrays is new SAL.Gen_Unbounded_Definite_Vectors
+     (WisiToken.Base_Token_Index, WisiToken.Base_Token_Arrays.Vector,
+      Default_Element => WisiToken.Base_Token_Arrays.Empty_Vector);
+
    type User_Data_Type is new WisiToken.Syntax_Trees.User_Data_Type with
    record
       Grammar_Lexer : WisiToken.Lexer.Handle; -- used to read the .wy file now.
@@ -37,6 +48,12 @@ package WisiToken_Grammar_Runtime is
       Generate_Set : WisiToken.BNF.Generate_Set_Access;
       --  As specified by %generate directives or command line.
 
+      Phase : Action_Phase := Meta;
+      --  Determines which actions Execute_Actions executes:
+      --  Meta  - meta declarations, like %meta_syntax, %generate
+      --  Other - everything else
+
+      Meta_Syntax      : WisiToken_Grammar_Runtime.Meta_Syntax := Unknown;
       Terminals        : WisiToken.Base_Token_Array_Access;
       Raw_Code         : WisiToken.BNF.Raw_Code;
       Language_Params  : WisiToken.BNF.Language_Param_Type;
@@ -44,16 +61,24 @@ package WisiToken_Grammar_Runtime is
       Conflicts        : WisiToken.BNF.Conflict_Lists.List;
       McKenzie_Recover : WisiToken.BNF.McKenzie_Recover_Param_Type;
 
-      Rule_Count      : Integer := 0;
-      Action_Count    : Integer := 0;
-      Check_Count     : Integer := 0;
+      Non_Grammar : Base_Token_Array_Arrays.Vector;
+      --  Non_Grammar (0) contains leading blank lines and comments;
+      --  Non_Grammar (I) contains blank lines and comments following
+      --  Terminals (I). Only used in Print_Source.
+
+      Rule_Count   : Integer                   := 0;
+      Action_Count : Integer                   := 0;
+      Check_Count  : Integer                   := 0;
+      Label_Count  : Ada.Containers.Count_Type := 0;
+
+      EBNF_Nodes : WisiToken.Syntax_Trees.Node_Sets.Vector;
 
       If_Lexer_Present  : Boolean := False;
       If_Parser_Present : Boolean := False;
       --  Set True by %if statements in Execute_Actions.
 
       Ignore_Lines : Boolean := False;
-      --  An '%if' specified a different lexer, during Excute_Actions
+      --  An '%if' specified a different lexer, during Execute_Actions
    end record;
 
    overriding
@@ -64,6 +89,17 @@ package WisiToken_Grammar_Runtime is
 
    overriding procedure Reset (Data : in out User_Data_Type);
 
+   overriding
+   procedure Initialize_Actions
+     (Data : in out User_Data_Type;
+      Tree : in WisiToken.Syntax_Trees.Tree'Class);
+
+   overriding
+   procedure Lexer_To_Augmented
+     (Data  : in out          User_Data_Type;
+      Token : in              WisiToken.Base_Token;
+      Lexer : not null access WisiToken.Lexer.Instance'Class);
+
    procedure Start_If
      (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
       Tree      : in     WisiToken.Syntax_Trees.Tree;
@@ -81,4 +117,25 @@ package WisiToken_Grammar_Runtime is
       Tree      : in     WisiToken.Syntax_Trees.Tree;
       Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array);
 
+   procedure Check_EBNF
+     (User_Data : in out WisiToken.Syntax_Trees.User_Data_Type'Class;
+      Tree      : in     WisiToken.Syntax_Trees.Tree;
+      Tokens    : in     WisiToken.Syntax_Trees.Valid_Node_Index_Array;
+      Token     : in     WisiToken.Positive_Index_Type);
+
+   procedure Translate_EBNF_To_BNF
+     (Tree : in out WisiToken.Syntax_Trees.Tree;
+      Data : in out User_Data_Type);
+   --  Process EBNF nonterms, adding new nonterms as needed, resulting in
+   --  a BNF tree. Descriptor is used for error messages.
+   --
+   --  Generator.LR.*_Generate requires a BNF grammar.
+
+   procedure Print_Source
+     (File_Name : in String;
+      Tree      : in WisiToken.Syntax_Trees.Tree;
+      Data      : in User_Data_Type);
+   --  Print the wisitoken grammar source represented by Tree, Terminals
+   --  to a new file File_Name.
+
 end WisiToken_Grammar_Runtime;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]