]> git.saurik.com Git - bison.git/blobdiff - tests/existing.at
tests: make deprecation tests more specific
[bison.git] / tests / existing.at
index b2626622ae038958c21844d20f9cd871c1f95e62..20dbde82a1a788ac91e89e3880afa6ab9698d105 100644 (file)
@@ -1,39 +1,83 @@
 # Exercising Bison on actual grammars.                   -*- Autotest -*-
 
-# Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
+# Copyright (C) 1989-1992, 2000-2005, 2007, 2009-2012 Free Software
+# Foundation, Inc.
 
-# This program is free software; you can redistribute it and/or modify
+# This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-
+#
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 AT_BANNER([[Existing Grammars.]])
-## ----------------- ##
-## GNU AWK Grammar.  ##
-## ----------------- ##
 
-AT_SETUP([GNU AWK Grammar])
+# AT_TEST_EXISTING_GRAMMAR(DESCRIPTION,
+#                          DECLS, GRAMMAR, INPUT,
+#                          BISON-STDERR, LAST-STATE, LALR1-DIFF,
+#                          [OTHER-CHECKS],
+#                          [PARSER-EXIT-VALUE],
+#                          [PARSER-STDOUT], [PARSER-STDERR])
+# --------------------------------------------------------------
+m4_define([AT_TEST_EXISTING_GRAMMAR], [_AT_TEST_EXISTING_GRAMMAR([$][1], $@)])
+
+m4_define([_AT_TEST_EXISTING_GRAMMAR],
+[
+dnl See how the parser tables have changed.  As the .output format evolves, the
+dnl diff comments with line numbers might be a pain to maintain.  When that
+dnl time comes, just use sed to drop the line numbers.  For now, as LR(1)
+dnl support is rapidly evolving, let's keep that information to be careful.
+dnl However, we don't do diffs for canonical LR(1) because the diff is huge.
+m4_pushdef([AT_LALR1_DIFF_CHECK],
+[dnl We need diff -u, which is not portable.
+AT_CHECK([diff -u /dev/null /dev/null || exit 77], [0], [ignore])
+
+AT_CHECK([[sed 's/^%define lr.type .*$//' input.y > input-lalr.y]])
+AT_BISON_CHECK([[--report=all input-lalr.y]], [[0]], [ignore], [ignore])
+AT_CHECK([[diff -u input-lalr.output input.output \
+           | sed -n '/^@@/,$p' | sed 's/^ $//']],
+         [[0]], [$1])])
+
+AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]],
+                         [[%define lr.type lalr
+]$3],
+                         [$4], [$5], [$6], [$7],
+                         [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
+AT_TEST_TABLES_AND_PARSE([$2[: IELR(1)]], [[IELR]], [[last-state]],
+                         [[%define lr.type ielr
+]$3],
+                         [$4], [$5], [$6], [$7],
+                         [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
+AT_TEST_TABLES_AND_PARSE([$2[: Canonical LR(1)]], [[canonical LR]],
+                         [[last-state,no-xml]],
+                         [[%define lr.type canonical-lr
+]$3],
+                         [$4], [$5], [$6], [$7],
+                         [$9], [$10], [$11], [$12])
+
+m4_popdef([AT_LALR1_DIFF_CHECK])
+])
+
+
+
+## ----------------------- ##
+## GNU AWK 3.1.0 Grammar.  ##
+## ----------------------- ##
 
 # We have been careful to strip all the actions excepts the
-# mid-rule actions.  We rely on %expect to check that there are
-# indeed 65 SR conflicts.
+# mid-rule actions.
 #
-# Bison was once wrong, due to an incorrect computation of nullable.
-# It reported 485 SR conflicts!
+# There are 65 SR conflicts.  Bison was once wrong, due to an incorrect
+# computation of nullable.  It reported 485 SR conflicts!
 
-AT_DATA([[input.y]],
-[[%expect 65
+AT_TEST_EXISTING_GRAMMAR([[GNU AWK 3.1.0 Grammar]],
+[[%error-verbose
 
 %token FUNC_CALL NAME REGEXP
 %token ERROR
@@ -68,309 +112,676 @@ AT_DATA([[input.y]],
 %left INCREMENT DECREMENT
 %left '$'
 %left '(' ')'
-%%
-
+]],
+[[
 start
-       : opt_nls program opt_nls
-       ;
+        : opt_nls program opt_nls
+        ;
 
 program
-       : rule
-       | program rule
-       | error
-       | program error
-       | /* empty */
-       ;
+        : rule
+        | program rule
+        | error
+        | program error
+        | /* empty */
+        ;
 
 rule
-       : LEX_BEGIN {} action
-       | LEX_END {}   action
-       | LEX_BEGIN statement_term
-       | LEX_END statement_term
-       | pattern action
-       | action
-       | pattern statement_term
-       | function_prologue function_body
-       ;
+        : LEX_BEGIN {} action
+        | LEX_END {}   action
+        | LEX_BEGIN statement_term
+        | LEX_END statement_term
+        | pattern action
+        | action
+        | pattern statement_term
+        | function_prologue function_body
+        ;
 
 func_name
-       : NAME
-       | FUNC_CALL
-       | lex_builtin
-       ;
+        : NAME
+        | FUNC_CALL
+        | lex_builtin
+        ;
 
 lex_builtin
-       : LEX_BUILTIN
-       | LEX_LENGTH
-       ;
+        : LEX_BUILTIN
+        | LEX_LENGTH
+        ;
 
 function_prologue
-       : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls
-       ;
+        : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls
+        ;
 
 function_body
-       : l_brace statements r_brace opt_semi opt_nls
-       | l_brace r_brace opt_semi opt_nls
-       ;
+        : l_brace statements r_brace opt_semi opt_nls
+        | l_brace r_brace opt_semi opt_nls
+        ;
 
 pattern
-       : exp
-       | exp ',' exp
-       ;
+        : exp
+        | exp ',' exp
+        ;
 
 regexp
-       /*
-        * In this rule, want_regexp tells yylex that the next thing
-        * is a regexp so it should read up to the closing slash.
-        */
-       : '/' {} REGEXP '/'
-       ;
+        /*
+         * In this rule, want_regexp tells yylex that the next thing
+         * is a regexp so it should read up to the closing slash.
+         */
+        : '/' {} REGEXP '/'
+        ;
 
 action
-       : l_brace statements r_brace opt_semi opt_nls
-       | l_brace r_brace opt_semi opt_nls
-       ;
+        : l_brace statements r_brace opt_semi opt_nls
+        | l_brace r_brace opt_semi opt_nls
+        ;
 
 statements
-       : statement
-       | statements statement
-       | error
-       | statements error
-       ;
+        : statement
+        | statements statement
+        | error
+        | statements error
+        ;
 
 statement_term
-       : nls
-       | semi opt_nls
-       ;
+        : nls
+        | semi opt_nls
+        ;
 
 statement
-       : semi opt_nls
-       | l_brace r_brace
-       | l_brace statements r_brace
-       | if_statement
-       | LEX_WHILE '(' exp r_paren opt_nls statement
-       | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
-       | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement
-       | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement
-       | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement
-       | LEX_BREAK statement_term
-       | LEX_CONTINUE statement_term
-       | print '(' expression_list r_paren output_redir statement_term
-       | print opt_rexpression_list output_redir statement_term
-       | LEX_NEXT statement_term
-       | LEX_NEXTFILE statement_term
-       | LEX_EXIT opt_exp statement_term
-       | LEX_RETURN {} opt_exp statement_term
-       | LEX_DELETE NAME '[' expression_list ']' statement_term
-       | LEX_DELETE NAME  statement_term
-       | exp statement_term
-       ;
+        : semi opt_nls
+        | l_brace r_brace
+        | l_brace statements r_brace
+        | if_statement
+        | LEX_WHILE '(' exp r_paren opt_nls statement
+        | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
+        | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement
+        | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement
+        | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement
+        | LEX_BREAK statement_term
+        | LEX_CONTINUE statement_term
+        | print '(' expression_list r_paren output_redir statement_term
+        | print opt_rexpression_list output_redir statement_term
+        | LEX_NEXT statement_term
+        | LEX_NEXTFILE statement_term
+        | LEX_EXIT opt_exp statement_term
+        | LEX_RETURN {} opt_exp statement_term
+        | LEX_DELETE NAME '[' expression_list ']' statement_term
+        | LEX_DELETE NAME  statement_term
+        | exp statement_term
+        ;
 
 print
-       : LEX_PRINT
-       | LEX_PRINTF
-       ;
+        : LEX_PRINT
+        | LEX_PRINTF
+        ;
 
 if_statement
-       : LEX_IF '(' exp r_paren opt_nls statement
-       | LEX_IF '(' exp r_paren opt_nls statement
-            LEX_ELSE opt_nls statement
-       ;
+        : LEX_IF '(' exp r_paren opt_nls statement
+        | LEX_IF '(' exp r_paren opt_nls statement
+             LEX_ELSE opt_nls statement
+        ;
 
 nls
-       : NEWLINE
-       | nls NEWLINE
-       ;
+        : NEWLINE
+        | nls NEWLINE
+        ;
 
 opt_nls
-       : /* empty */
-       | nls
-       ;
+        : /* empty */
+        | nls
+        ;
 
 input_redir
-       : /* empty */
-       | '<' simp_exp
-       ;
+        : /* empty */
+        | '<' simp_exp
+        ;
 
 output_redir
-       : /* empty */
-       | '>' exp
-       | APPEND_OP exp
-       | '|' exp
-       | TWOWAYIO exp
-       ;
+        : /* empty */
+        | '>' exp
+        | APPEND_OP exp
+        | '|' exp
+        | TWOWAYIO exp
+        ;
 
 opt_param_list
-       : /* empty */
-       | param_list
-       ;
+        : /* empty */
+        | param_list
+        ;
 
 param_list
-       : NAME
-       | param_list comma NAME
-       | error
-       | param_list error
-       | param_list comma error
-       ;
+        : NAME
+        | param_list comma NAME
+        | error
+        | param_list error
+        | param_list comma error
+        ;
 
 /* optional expression, as in for loop */
 opt_exp
-       : /* empty */
-       | exp
-       ;
+        : /* empty */
+        | exp
+        ;
 
 opt_rexpression_list
-       : /* empty */
-       | rexpression_list
-       ;
+        : /* empty */
+        | rexpression_list
+        ;
 
 rexpression_list
-       : rexp
-       | rexpression_list comma rexp
-       | error
-       | rexpression_list error
-       | rexpression_list error rexp
-       | rexpression_list comma error
-       ;
+        : rexp
+        | rexpression_list comma rexp
+        | error
+        | rexpression_list error
+        | rexpression_list error rexp
+        | rexpression_list comma error
+        ;
 
 opt_expression_list
-       : /* empty */
-       | expression_list
-       ;
+        : /* empty */
+        | expression_list
+        ;
 
 expression_list
-       : exp
-       | expression_list comma exp
-       | error
-       | expression_list error
-       | expression_list error exp
-       | expression_list comma error
-       ;
+        : exp
+        | expression_list comma exp
+        | error
+        | expression_list error
+        | expression_list error exp
+        | expression_list comma error
+        ;
 
 /* Expressions, not including the comma operator.  */
-exp    : variable ASSIGNOP {} exp
-       | '(' expression_list r_paren LEX_IN NAME
-       | exp '|' LEX_GETLINE opt_variable
-       | exp TWOWAYIO LEX_GETLINE opt_variable
-       | LEX_GETLINE opt_variable input_redir
-       | exp LEX_AND exp
-       | exp LEX_OR exp
-       | exp MATCHOP exp
-       | regexp
-       | '!' regexp %prec UNARY
-       | exp LEX_IN NAME
-       | exp RELOP exp
-       | exp '<' exp
-       | exp '>' exp
-       | exp '?' exp ':' exp
-       | simp_exp
-       | exp simp_exp %prec CONCAT_OP
-       ;
+exp     : variable ASSIGNOP {} exp
+        | '(' expression_list r_paren LEX_IN NAME
+        | exp '|' LEX_GETLINE opt_variable
+        | exp TWOWAYIO LEX_GETLINE opt_variable
+        | LEX_GETLINE opt_variable input_redir
+        | exp LEX_AND exp
+        | exp LEX_OR exp
+        | exp MATCHOP exp
+        | regexp
+        | '!' regexp %prec UNARY
+        | exp LEX_IN NAME
+        | exp RELOP exp
+        | exp '<' exp
+        | exp '>' exp
+        | exp '?' exp ':' exp
+        | simp_exp
+        | exp simp_exp %prec CONCAT_OP
+        ;
 
 rexp
-       : variable ASSIGNOP {} rexp
-       | rexp LEX_AND rexp
-       | rexp LEX_OR rexp
-       | LEX_GETLINE opt_variable input_redir
-       | regexp
-       | '!' regexp %prec UNARY
-       | rexp MATCHOP rexp
-       | rexp LEX_IN NAME
-       | rexp RELOP rexp
-       | rexp '?' rexp ':' rexp
-       | simp_exp
-       | rexp simp_exp %prec CONCAT_OP
-       ;
+        : variable ASSIGNOP {} rexp
+        | rexp LEX_AND rexp
+        | rexp LEX_OR rexp
+        | LEX_GETLINE opt_variable input_redir
+        | regexp
+        | '!' regexp %prec UNARY
+        | rexp MATCHOP rexp
+        | rexp LEX_IN NAME
+        | rexp RELOP rexp
+        | rexp '?' rexp ':' rexp
+        | simp_exp
+        | rexp simp_exp %prec CONCAT_OP
+        ;
 
 simp_exp
-       : non_post_simp_exp
-       /* Binary operators in order of decreasing precedence.  */
-       | simp_exp '^' simp_exp
-       | simp_exp '*' simp_exp
-       | simp_exp '/' simp_exp
-       | simp_exp '%' simp_exp
-       | simp_exp '+' simp_exp
-       | simp_exp '-' simp_exp
-       | variable INCREMENT
-       | variable DECREMENT
-       ;
+        : non_post_simp_exp
+        /* Binary operators in order of decreasing precedence.  */
+        | simp_exp '^' simp_exp
+        | simp_exp '*' simp_exp
+        | simp_exp '/' simp_exp
+        | simp_exp '%' simp_exp
+        | simp_exp '+' simp_exp
+        | simp_exp '-' simp_exp
+        | variable INCREMENT
+        | variable DECREMENT
+        ;
 
 non_post_simp_exp
-       : '!' simp_exp %prec UNARY
-       | '(' exp r_paren
-       | LEX_BUILTIN
-         '(' opt_expression_list r_paren
-       | LEX_LENGTH '(' opt_expression_list r_paren
-       | LEX_LENGTH
-       | FUNC_CALL '(' opt_expression_list r_paren
-       | variable
-       | INCREMENT variable
-       | DECREMENT variable
-       | YNUMBER
-       | YSTRING
-       | '-' simp_exp    %prec UNARY
-       | '+' simp_exp    %prec UNARY
-       ;
+        : '!' simp_exp %prec UNARY
+        | '(' exp r_paren
+        | LEX_BUILTIN
+          '(' opt_expression_list r_paren
+        | LEX_LENGTH '(' opt_expression_list r_paren
+        | LEX_LENGTH
+        | FUNC_CALL '(' opt_expression_list r_paren
+        | variable
+        | INCREMENT variable
+        | DECREMENT variable
+        | YNUMBER
+        | YSTRING
+        | '-' simp_exp    %prec UNARY
+        | '+' simp_exp    %prec UNARY
+        ;
 
 opt_variable
-       : /* empty */
-       | variable
-       ;
+        : /* empty */
+        | variable
+        ;
 
 variable
-       : NAME
-       | NAME '[' expression_list ']'
-       | '$' non_post_simp_exp
-       ;
+        : NAME
+        | NAME '[' expression_list ']'
+        | '$' non_post_simp_exp
+        ;
 
 l_brace
-               : '{' opt_nls
-               ;
+        : '{' opt_nls
+        ;
 
 r_brace
-               : '}' opt_nls
-       ;
+        : '}' opt_nls
+        ;
 
 r_paren
-       : ')'
-       ;
+        : ')'
+        ;
 
 opt_semi
-       : /* empty */
-       | semi
-       ;
+        : /* empty */
+        | semi
+        ;
 
 semi
-       : ';'
-       ;
-
-comma  : ',' opt_nls
-       ;
-
-%%
-]])
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]])
-
-AT_CLEANUP
+        : ';'
+        ;
+
+comma   : ',' opt_nls
+        ;
+]],
+
+dnl INPUT
+dnl
+dnl For example, in AWK:
+dnl
+dnl   getline $!4*0;
+dnl
+dnl The grammar below (from GNU AWK 3.1.0) using canonical LR(1) or IELR(1)
+dnl parses it as:
+dnl
+dnl   getline $!(4*0);
+dnl
+dnl That is, they shift `*' immediately and make it part of the getline
+dnl argument.
+dnl
+dnl The grammar below using LALR(1) parses it as a syntax error.  So does
+dnl GNU AWK 3.0.6, 3.1.0, and 3.1.1.  They reduce the full getline expression
+dnl before shifting `*' even though `*' is not a valid lookahead.
+dnl
+dnl GNU AWK 3.1.2, 3.1.3, 3.1.4, and 3.1.5 parse it as:
+dnl
+dnl   (getline $!4)*0;
+dnl
+dnl That is, like the other versions of GNU AWK, they reduce the full getline
+dnl expression before shifting `*'.  However, because of a different LHS on the
+dnl getline rule, `*' actually is a valid lookahead.  Solaris /usr/xpg4/bin/awk
+dnl and the Open Group awk specification seem to agree:
+dnl
+dnl   http://www.opengroup.org/pubs/online/7908799/xcu/awk.html
+dnl
+dnl /bin/nawk and /bin/awk on Solaris 10 report it as a syntax error, but they
+dnl don't like even `print $!4;'.
+[[LEX_GETLINE, '$', '!', YNUMBER, '*', YNUMBER, ';']],
+
+dnl BISON-STDERR
+[AT_COND_CASE([[canonical LR]],
+[[input.y: warning: 265 shift/reduce conflicts [-Wconflicts-sr]]],
+[[input.y: warning: 65 shift/reduce conflicts [-Wconflicts-sr]]])[
+]],
+
+dnl LAST-STATE
+[AT_COND_CASE([[LALR]], [[319]], [[canonical LR]], [[2358]], [[328]])],
+
+dnl LALR1-DIFF not used for canonical LR(1) because the diff is huge.
+dnl Isocore map from LALR(1) state number to new state number plus descriptions
+dnl of any change in the actions resulting in a change in accepted language:
+dnl   - 24 -> 320
+dnl   - 16 -> 321
+dnl   - 17 -> 322
+dnl   - 20 -> 323
+dnl   - 21 -> 324
+dnl   - 54 -> 325
+dnl   - 56 -> 326: reduce -> shift on '*', '/', and '%'
+dnl   - 58 -> 327: reduce -> shift on '*', '/', and '%'
+dnl   - 61 -> 328: reduce -> shift on '*', '/', and '%'
+[AT_COND_CASE([[LALR]], [],
+[[@@ -712,7 +712,7 @@
+   156         | . '$' non_post_simp_exp
+
+     NAME  shift, and go to state 9
+-    '$'   shift, and go to state 24
++    '$'   shift, and go to state 320
+
+     NAME      [reduce using rule 152 (opt_variable)]
+     '$'       [reduce using rule 152 (opt_variable)]
+@@ -5379,7 +5379,7 @@
+   156         | . '$' non_post_simp_exp
+
+     NAME  shift, and go to state 9
+-    '$'   shift, and go to state 24
++    '$'   shift, and go to state 320
+
+     NAME      [reduce using rule 152 (opt_variable)]
+     '$'       [reduce using rule 152 (opt_variable)]
+@@ -5399,7 +5399,7 @@
+   156         | . '$' non_post_simp_exp
+
+     NAME  shift, and go to state 9
+-    '$'   shift, and go to state 24
++    '$'   shift, and go to state 320
+
+     NAME      [reduce using rule 152 (opt_variable)]
+     '$'       [reduce using rule 152 (opt_variable)]
+@@ -6214,7 +6214,7 @@
+   156         | . '$' non_post_simp_exp
+
+     NAME  shift, and go to state 9
+-    '$'   shift, and go to state 24
++    '$'   shift, and go to state 320
+
+     NAME      [reduce using rule 152 (opt_variable)]
+     '$'       [reduce using rule 152 (opt_variable)]
+@@ -11099,3 +11099,274 @@
+    45 statement: LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement .
+
+     $default  reduce using rule 45 (statement)
++
++
++state 320
++
++  139 non_post_simp_exp: . '!' simp_exp
++  140                  | . '(' exp r_paren
++  141                  | . LEX_BUILTIN '(' opt_expression_list r_paren
++  142                  | . LEX_LENGTH '(' opt_expression_list r_paren
++  143                  | . LEX_LENGTH
++  144                  | . FUNC_CALL '(' opt_expression_list r_paren
++  145                  | . variable
++  146                  | . INCREMENT variable
++  147                  | . DECREMENT variable
++  148                  | . YNUMBER
++  149                  | . YSTRING
++  150                  | . '-' simp_exp
++  151                  | . '+' simp_exp
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++  156         | '$' . non_post_simp_exp
++
++    FUNC_CALL    shift, and go to state 8
++    NAME         shift, and go to state 9
++    YNUMBER      shift, and go to state 10
++    YSTRING      shift, and go to state 11
++    INCREMENT    shift, and go to state 321
++    DECREMENT    shift, and go to state 322
++    LEX_BUILTIN  shift, and go to state 18
++    LEX_LENGTH   shift, and go to state 19
++    '+'          shift, and go to state 323
++    '-'          shift, and go to state 324
++    '!'          shift, and go to state 325
++    '$'          shift, and go to state 320
++    '('          shift, and go to state 55
++
++    non_post_simp_exp  go to state 62
++    variable           go to state 63
++
++
++state 321
++
++  146 non_post_simp_exp: INCREMENT . variable
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++
++    NAME  shift, and go to state 9
++    '$'   shift, and go to state 320
++
++    variable  go to state 50
++
++
++state 322
++
++  147 non_post_simp_exp: DECREMENT . variable
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++
++    NAME  shift, and go to state 9
++    '$'   shift, and go to state 320
++
++    variable  go to state 51
++
++
++state 323
++
++  130 simp_exp: . non_post_simp_exp
++  131         | . simp_exp '^' simp_exp
++  132         | . simp_exp '*' simp_exp
++  133         | . simp_exp '/' simp_exp
++  134         | . simp_exp '%' simp_exp
++  135         | . simp_exp '+' simp_exp
++  136         | . simp_exp '-' simp_exp
++  137         | . variable INCREMENT
++  138         | . variable DECREMENT
++  139 non_post_simp_exp: . '!' simp_exp
++  140                  | . '(' exp r_paren
++  141                  | . LEX_BUILTIN '(' opt_expression_list r_paren
++  142                  | . LEX_LENGTH '(' opt_expression_list r_paren
++  143                  | . LEX_LENGTH
++  144                  | . FUNC_CALL '(' opt_expression_list r_paren
++  145                  | . variable
++  146                  | . INCREMENT variable
++  147                  | . DECREMENT variable
++  148                  | . YNUMBER
++  149                  | . YSTRING
++  150                  | . '-' simp_exp
++  151                  | . '+' simp_exp
++  151                  | '+' . simp_exp
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++
++    FUNC_CALL    shift, and go to state 8
++    NAME         shift, and go to state 9
++    YNUMBER      shift, and go to state 10
++    YSTRING      shift, and go to state 11
++    INCREMENT    shift, and go to state 16
++    DECREMENT    shift, and go to state 17
++    LEX_BUILTIN  shift, and go to state 18
++    LEX_LENGTH   shift, and go to state 19
++    '+'          shift, and go to state 20
++    '-'          shift, and go to state 21
++    '!'          shift, and go to state 54
++    '$'          shift, and go to state 24
++    '('          shift, and go to state 55
++
++    simp_exp           go to state 326
++    non_post_simp_exp  go to state 35
++    variable           go to state 57
++
++
++state 324
++
++  130 simp_exp: . non_post_simp_exp
++  131         | . simp_exp '^' simp_exp
++  132         | . simp_exp '*' simp_exp
++  133         | . simp_exp '/' simp_exp
++  134         | . simp_exp '%' simp_exp
++  135         | . simp_exp '+' simp_exp
++  136         | . simp_exp '-' simp_exp
++  137         | . variable INCREMENT
++  138         | . variable DECREMENT
++  139 non_post_simp_exp: . '!' simp_exp
++  140                  | . '(' exp r_paren
++  141                  | . LEX_BUILTIN '(' opt_expression_list r_paren
++  142                  | . LEX_LENGTH '(' opt_expression_list r_paren
++  143                  | . LEX_LENGTH
++  144                  | . FUNC_CALL '(' opt_expression_list r_paren
++  145                  | . variable
++  146                  | . INCREMENT variable
++  147                  | . DECREMENT variable
++  148                  | . YNUMBER
++  149                  | . YSTRING
++  150                  | . '-' simp_exp
++  150                  | '-' . simp_exp
++  151                  | . '+' simp_exp
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++
++    FUNC_CALL    shift, and go to state 8
++    NAME         shift, and go to state 9
++    YNUMBER      shift, and go to state 10
++    YSTRING      shift, and go to state 11
++    INCREMENT    shift, and go to state 16
++    DECREMENT    shift, and go to state 17
++    LEX_BUILTIN  shift, and go to state 18
++    LEX_LENGTH   shift, and go to state 19
++    '+'          shift, and go to state 20
++    '-'          shift, and go to state 21
++    '!'          shift, and go to state 54
++    '$'          shift, and go to state 24
++    '('          shift, and go to state 55
++
++    simp_exp           go to state 327
++    non_post_simp_exp  go to state 35
++    variable           go to state 57
++
++
++state 325
++
++  130 simp_exp: . non_post_simp_exp
++  131         | . simp_exp '^' simp_exp
++  132         | . simp_exp '*' simp_exp
++  133         | . simp_exp '/' simp_exp
++  134         | . simp_exp '%' simp_exp
++  135         | . simp_exp '+' simp_exp
++  136         | . simp_exp '-' simp_exp
++  137         | . variable INCREMENT
++  138         | . variable DECREMENT
++  139 non_post_simp_exp: . '!' simp_exp
++  139                  | '!' . simp_exp
++  140                  | . '(' exp r_paren
++  141                  | . LEX_BUILTIN '(' opt_expression_list r_paren
++  142                  | . LEX_LENGTH '(' opt_expression_list r_paren
++  143                  | . LEX_LENGTH
++  144                  | . FUNC_CALL '(' opt_expression_list r_paren
++  145                  | . variable
++  146                  | . INCREMENT variable
++  147                  | . DECREMENT variable
++  148                  | . YNUMBER
++  149                  | . YSTRING
++  150                  | . '-' simp_exp
++  151                  | . '+' simp_exp
++  154 variable: . NAME
++  155         | . NAME '[' expression_list ']'
++  156         | . '$' non_post_simp_exp
++
++    FUNC_CALL    shift, and go to state 8
++    NAME         shift, and go to state 9
++    YNUMBER      shift, and go to state 10
++    YSTRING      shift, and go to state 11
++    INCREMENT    shift, and go to state 16
++    DECREMENT    shift, and go to state 17
++    LEX_BUILTIN  shift, and go to state 18
++    LEX_LENGTH   shift, and go to state 19
++    '+'          shift, and go to state 20
++    '-'          shift, and go to state 21
++    '!'          shift, and go to state 54
++    '$'          shift, and go to state 24
++    '('          shift, and go to state 55
++
++    simp_exp           go to state 328
++    non_post_simp_exp  go to state 35
++    variable           go to state 57
++
++
++state 326
++
++  131 simp_exp: simp_exp . '^' simp_exp
++  132         | simp_exp . '*' simp_exp
++  133         | simp_exp . '/' simp_exp
++  134         | simp_exp . '%' simp_exp
++  135         | simp_exp . '+' simp_exp
++  136         | simp_exp . '-' simp_exp
++  151 non_post_simp_exp: '+' simp_exp .  [error, FUNC_CALL, NAME, YNUMBER, YSTRING, RELOP, APPEND_OP, MATCHOP, NEWLINE, LEX_IN, LEX_AND, LEX_OR, INCREMENT, DECREMENT, LEX_BUILTIN, LEX_LENGTH, '?', ':', ',', '<', '>', '|', TWOWAYIO, '+', '-', '!', '$', '(', ')', '@:>@', '{', ';']
++
++    '*'  shift, and go to state 89
++    '/'  shift, and go to state 90
++    '%'  shift, and go to state 91
++    '^'  shift, and go to state 92
++
++    $default  reduce using rule 151 (non_post_simp_exp)
++
++    Conflict between rule 151 and token '+' resolved as reduce ('+' < UNARY).
++    Conflict between rule 151 and token '-' resolved as reduce ('-' < UNARY).
++
++
++state 327
++
++  131 simp_exp: simp_exp . '^' simp_exp
++  132         | simp_exp . '*' simp_exp
++  133         | simp_exp . '/' simp_exp
++  134         | simp_exp . '%' simp_exp
++  135         | simp_exp . '+' simp_exp
++  136         | simp_exp . '-' simp_exp
++  150 non_post_simp_exp: '-' simp_exp .  [error, FUNC_CALL, NAME, YNUMBER, YSTRING, RELOP, APPEND_OP, MATCHOP, NEWLINE, LEX_IN, LEX_AND, LEX_OR, INCREMENT, DECREMENT, LEX_BUILTIN, LEX_LENGTH, '?', ':', ',', '<', '>', '|', TWOWAYIO, '+', '-', '!', '$', '(', ')', '@:>@', '{', ';']
++
++    '*'  shift, and go to state 89
++    '/'  shift, and go to state 90
++    '%'  shift, and go to state 91
++    '^'  shift, and go to state 92
++
++    $default  reduce using rule 150 (non_post_simp_exp)
++
++    Conflict between rule 150 and token '+' resolved as reduce ('+' < UNARY).
++    Conflict between rule 150 and token '-' resolved as reduce ('-' < UNARY).
++
++
++state 328
++
++  131 simp_exp: simp_exp . '^' simp_exp
++  132         | simp_exp . '*' simp_exp
++  133         | simp_exp . '/' simp_exp
++  134         | simp_exp . '%' simp_exp
++  135         | simp_exp . '+' simp_exp
++  136         | simp_exp . '-' simp_exp
++  139 non_post_simp_exp: '!' simp_exp .  [error, FUNC_CALL, NAME, YNUMBER, YSTRING, RELOP, APPEND_OP, MATCHOP, NEWLINE, LEX_IN, LEX_AND, LEX_OR, INCREMENT, DECREMENT, LEX_BUILTIN, LEX_LENGTH, '?', ':', ',', '<', '>', '|', TWOWAYIO, '+', '-', '!', '$', '(', ')', '@:>@', '{', ';']
++
++    '*'  shift, and go to state 89
++    '/'  shift, and go to state 90
++    '%'  shift, and go to state 91
++    '^'  shift, and go to state 92
++
++    $default  reduce using rule 139 (non_post_simp_exp)
++
++    Conflict between rule 139 and token '+' resolved as reduce ('+' < UNARY).
++    Conflict between rule 139 and token '-' resolved as reduce ('-' < UNARY).
+]])],
+
+dnl OTHER-CHECKS
+[],
+
+dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
+dnl In the case of the syntax error, the parser recovers, so it returns 0.
+[[0]],
+[],
+[AT_COND_CASE([[LALR]],
+[[syntax error, unexpected '*', expecting NEWLINE or '{' or ';'
+]])])
 
 ## ----------------- ##
 ## GNU Cim Grammar.  ##
 ## ----------------- ##
 
-AT_SETUP([GNU Cim Grammar])
-
 # GNU Cim, the GNU Simula 87 Compiler.
 
 # Bison was once wrong, due to an incorrect computation of the RR conflicts.
 # It reported 80 SR && 99 RR conflicts instead of 78/10!!!
 
-AT_DATA([[input.y]],
-[[%union {}
-
+AT_TEST_EXISTING_GRAMMAR([[GNU Cim Grammar]],
+[[
 %token
         HACTIVATE HAFTER /*HAND*/ HARRAY HAT
         HBEFORE HBEGIN HBOOLEAN
@@ -398,7 +809,7 @@ AT_DATA([[input.y]],
         HBEGPAR HENDPAR
         HEQR HNER
         HADD HSUB HMUL HDIV HINTDIV HEXP
-       HDOTDOTDOT
+        HDOTDOTDOT
 
 %token HIDENTIFIER
 %token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST
@@ -418,7 +829,7 @@ AT_DATA([[input.y]],
 
 %left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR
 
-%left  HCONC
+%left   HCONC
 
 %left HTERMOPERATOR
 %left UNEAR
@@ -430,66 +841,67 @@ AT_DATA([[input.y]],
 %left   HDOT
 
 %start  MAIN_MODULE
-%%
+]],
+[[
 /* GRAMATIKK FOR PROGRAM MODULES */
 MAIN_MODULE     :       {}
-                       MODULS
-               |       error HSTATEMENTSEPARATOR MBEE_DECLSTMS
-               ;
-EXT_DECLARATION        :       HEXTERNAL
-                       MBEE_TYPE
-                       HPROCEDURE
-                               {}
-                       EXT_LIST
-               |
-                       HEXTERNAL
-                       HIDENTIFIER
-                       HPROCEDURE
-                               {}
-                       HIDENTIFIER {}
-                       EXTERNAL_KIND_ITEM
-               |       HEXTERNAL
-                       HCLASS
-                               {}
-                       EXT_LIST
-
-               ;
-EXTERNAL_KIND_ITEM:    EXT_IDENT
-                       HOBJRELOPERATOR
-                               {}
-                       MBEE_TYPE HPROCEDURE
-                       HIDENTIFIER
-                               {}
+                        MODULS
+                |       error HSTATEMENTSEPARATOR MBEE_DECLSTMS
+                ;
+EXT_DECLARATION :       HEXTERNAL
+                        MBEE_TYPE
+                        HPROCEDURE
+                                {}
+                        EXT_LIST
+                |
+                        HEXTERNAL
+                        HIDENTIFIER
+                        HPROCEDURE
+                                {}
+                        HIDENTIFIER {}
+                        EXTERNAL_KIND_ITEM
+                |       HEXTERNAL
+                        HCLASS
+                                {}
+                        EXT_LIST
+
+                ;
+EXTERNAL_KIND_ITEM:     EXT_IDENT
+                        HOBJRELOPERATOR
+                                {}
+                        MBEE_TYPE HPROCEDURE
+                        HIDENTIFIER
+                                {}
                         HEADING EMPTY_BLOCK
-                               {}
-/*             |
-                       EXT_IDENT
-                               {}
-                       MBEE_REST_EXT_LIST
-               ;
-MBEE_REST_EXT_LIST:    /* EMPTY
-               |       HPAREXPSEPARATOR EXT_KIND_LIST
-               ;
-EXT_KIND_LIST  :       EXT_KIND_ITEM
-               |       EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM
-               ;
-EXT_KIND_ITEM  :       HIDENTIFIER
-                       EXT_IDENT
-                               {}*/
-               ;
-EMPTY_BLOCK    :       /*EMPT*/
-               |       HBEGIN HEND
-               ;
-EXT_LIST       :       EXT_ITEM
-               |       EXT_LIST HPAREXPSEPARATOR EXT_ITEM
-               ;
-EXT_ITEM       :       HIDENTIFIER
-                       EXT_IDENT
-               ;
-EXT_IDENT      :       /* EMPTY */
-               |       HVALRELOPERATOR {}
-                       HTEXTKONST
-               ;
+                                {}
+/*              |
+                        EXT_IDENT
+                                {}
+                        MBEE_REST_EXT_LIST
+                ;
+MBEE_REST_EXT_LIST:     /* EMPTY
+                |       HPAREXPSEPARATOR EXT_KIND_LIST
+                ;
+EXT_KIND_LIST   :       EXT_KIND_ITEM
+                |       EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM
+                ;
+EXT_KIND_ITEM   :       HIDENTIFIER
+                        EXT_IDENT
+                                {}*/
+                ;
+EMPTY_BLOCK     :       /*EMPT*/
+                |       HBEGIN HEND
+                ;
+EXT_LIST        :       EXT_ITEM
+                |       EXT_LIST HPAREXPSEPARATOR EXT_ITEM
+                ;
+EXT_ITEM        :       HIDENTIFIER
+                        EXT_IDENT
+                ;
+EXT_IDENT       :       /* EMPTY */
+                |       HVALRELOPERATOR {}
+                        HTEXTKONST
+                ;
 /* GRAMATIKK FOR TYPER */
 NO_TYPE         :       /*EMPT*/
                 ;
@@ -511,8 +923,8 @@ TYPE            :       HREF HBEGPAR
 
 /* GRAMATIKK FOR DEL AV SETNINGER */
 MBEE_ELSE_PART  :       /*EMPT*/
-/*             |       HELSE
-                       HIF
+/*              |       HELSE
+                        HIF
                         EXPRESSION
                         HTHEN   {}
                         BLOCK   {}
@@ -559,48 +971,48 @@ MBEE_OTWI_CLAUS :       /*EMPT*/
 
                         BLOCK
                 ;
-ACTIVATOR      :       HACTIVATE
-               |       HREACTIVATE
-               ;
-SCHEDULE       :       /*EMPT*/
-               |       ATDELAY EXPRESSION      {}
-                       PRIOR
-               |       BEFOREAFTER             {}
-                       EXPRESSION
-               ;
-ATDELAY                :       HAT
-               |       HDELAY
-               ;
-BEFOREAFTER    :       HBEFORE
-               |       HAFTER
-               ;
-PRIOR          :       /*EMPT*/
-               |       HPRIOR
-               ;
+ACTIVATOR       :       HACTIVATE
+                |       HREACTIVATE
+                ;
+SCHEDULE        :       /*EMPT*/
+                |       ATDELAY EXPRESSION      {}
+                        PRIOR
+                |       BEFOREAFTER             {}
+                        EXPRESSION
+                ;
+ATDELAY         :       HAT
+                |       HDELAY
+                ;
+BEFOREAFTER     :       HBEFORE
+                |       HAFTER
+                ;
+PRIOR           :       /*EMPT*/
+                |       HPRIOR
+                ;
 /* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */
 MODULSTATEMENT  :       HWHILE
                         EXPRESSION
                         HDO     {}
                         BLOCK
-               |       HIF
+                |       HIF
                         EXPRESSION
                         HTHEN   {}
                         BLOCK   {}
                         MBEE_ELSE_PART
-               |       HFOR
+                |       HFOR
                         HIDENTIFIER
                         HASSIGN {}
                         FOR_LIST
                         HDO     {}
                         BLOCK
-               |       GOTO
+                |       GOTO
                         EXPRESSION
-               |       HINSPECT
+                |       HINSPECT
                         EXPRESSION              {}
                         CONN_STATE_R_PT
                                 {}
                         MBEE_OTWI_CLAUS
-               |       HINNER
+                |       HINNER
                 |       HIDENTIFIER
                         HLABELSEPARATOR
                                 {}
@@ -608,30 +1020,30 @@ MODULSTATEMENT  :       HWHILE
                 |       EXPRESSION_SIMP
                         HBEGIN
                                 {}
-                       IMPORT_SPEC_MODULE
-                               {}
+                        IMPORT_SPEC_MODULE
+                                {}
                         MBEE_DECLSTMS
                         HEND
-               |       EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR
+                |       EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR
                         MBEE_DECLSTMS HEND
-               |       EXPRESSION_SIMP HBEGIN error HEND
+                |       EXPRESSION_SIMP HBEGIN error HEND
                 |       EXPRESSION_SIMP
-               |       ACTIVATOR EXPRESSION SCHEDULE
+                |       ACTIVATOR EXPRESSION SCHEDULE
                 |       HBEGIN
                                 {}
                         MBEE_DECLSTMS
                         HEND
-               |       MBEE_TYPE HPROCEDURE
+                |       MBEE_TYPE HPROCEDURE
                         HIDENTIFIER
                                 {}
                         HEADING BLOCK
-               |       HIDENTIFIER
-                       HCLASS
+                |       HIDENTIFIER
+                        HCLASS
                         NO_TYPE
-                               {}
-                       IMPORT_SPEC_MODULE
+                                {}
+                        IMPORT_SPEC_MODULE
                         HIDENTIFIER
-                               {}
+                                {}
                         HEADING
                         BLOCK
                 |       HCLASS
@@ -641,20 +1053,20 @@ MODULSTATEMENT  :       HWHILE
                         HEADING
                         BLOCK
                 |       EXT_DECLARATION
-               |       /*EMPT*/
+                |       /*EMPT*/
                 ;
 IMPORT_SPEC_MODULE:
-               ;
-DECLSTATEMENT  :       MODULSTATEMENT
-               |       TYPE
+                ;
+DECLSTATEMENT   :       MODULSTATEMENT
+                |       TYPE
                         HIDENTIFIER
-                       MBEE_CONSTANT
+                        MBEE_CONSTANT
                         HPAREXPSEPARATOR
                                 {}
                         IDENTIFIER_LISTC
                 |       TYPE
                         HIDENTIFIER
-                       MBEE_CONSTANT
+                        MBEE_CONSTANT
                 |       MBEE_TYPE
                         HARRAY  {}
                         ARR_SEGMENT_LIST
@@ -665,9 +1077,9 @@ DECLSTATEMENT      :       MODULSTATEMENT
                 ;
 BLOCK           :       DECLSTATEMENT
                 |       HBEGIN MBEE_DECLSTMS HEND
-               |       HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND
-               |       HBEGIN error HEND
-               ;
+                |       HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND
+                |       HBEGIN error HEND
+                ;
 MBEE_DECLSTMS   :       MBEE_DECLSTMSU
                 ;
 MBEE_DECLSTMSU  :       DECLSTATEMENT
@@ -675,16 +1087,16 @@ MBEE_DECLSTMSU  :       DECLSTATEMENT
                         HSTATEMENTSEPARATOR
                         DECLSTATEMENT
                 ;
-MODULS         :       MODULSTATEMENT
-               |       MODULS HSTATEMENTSEPARATOR MODULSTATEMENT
-               ;
+MODULS          :       MODULSTATEMENT
+                |       MODULS HSTATEMENTSEPARATOR MODULSTATEMENT
+                ;
 /* GRAMATIKK FOR DEL AV DEKLARASJONER */
 ARR_SEGMENT_LIST:       ARR_SEGMENT
                 |       ARR_SEGMENT_LIST
                         HPAREXPSEPARATOR
                         ARR_SEGMENT
                 ;
-ARR_SEGMENT    :       ARRAY_SEGMENT
+ARR_SEGMENT     :       ARRAY_SEGMENT
                         HBEGPAR
                         BAUND_PAIR_LIST HENDPAR
                 ;
@@ -726,7 +1138,7 @@ MBEE_LISTV      :       /*EMPT*/
                 |       LISTV
                 ;
 LISTV           :       HIDENTIFIER
-                |      FPP_CATEG HDOTDOTDOT
+                |       FPP_CATEG HDOTDOTDOT
                 |       HIDENTIFIER     {}
                         HPAREXPSEPARATOR LISTV
                 |       FPP_SPEC
@@ -739,26 +1151,26 @@ FPP_HEADING     :       HBEGPAR NO_TYPE
 FPP_MBEE_LISTV  :       /*EMPT*/
                 |       FPP_LISTV
                 ;
-FPP_LISTV       :      FPP_CATEG HDOTDOTDOT
+FPP_LISTV       :       FPP_CATEG HDOTDOTDOT
                 |       FPP_SPEC
                 |       FPP_SPEC
                         HPAREXPSEPARATOR LISTV
                 ;
 FPP_SPEC        :       FPP_CATEG SPECIFIER HIDENTIFIER
-               |       FPP_CATEG FPP_PROC_DECL_IN_SPEC
-               ;
+                |       FPP_CATEG FPP_PROC_DECL_IN_SPEC
+                ;
 FPP_CATEG       :       HNAME HLABELSEPARATOR
                 |       HVALUE HLABELSEPARATOR
                 |       HVAR HLABELSEPARATOR
                 |       /*EMPT*/
                 ;
-FPP_PROC_DECL_IN_SPEC: MBEE_TYPE HPROCEDURE
+FPP_PROC_DECL_IN_SPEC:  MBEE_TYPE HPROCEDURE
                         HIDENTIFIER
-                                       {}
+                                        {}
                         FPP_HEADING {} { /* Yes, two "final" actions. */ }
-               ;
+                ;
 IDENTIFIER_LISTV:       HIDENTIFIER
-                |      HDOTDOTDOT
+                |       HDOTDOTDOT
                 |       HIDENTIFIER     {}
                         HPAREXPSEPARATOR IDENTIFIER_LISTV
                 ;
@@ -798,31 +1210,31 @@ MBEE_SPEC_PART  :       /*EMPT*/
 SPEC_PART       :       ONE_SPEC
                 |       SPEC_PART ONE_SPEC
                 ;
-ONE_SPEC       :       SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR
-               |       NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR
-                         {}
-                       PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
+ONE_SPEC        :       SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR
+                |       NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR
+                          {}
+                        PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
                 |       FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
                 |       MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR
                 |       MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR
                         IDENTIFIER_LIST HSTATEMENTSEPARATOR
-               ;
+                ;
 SPECIFIER       :       TYPE
                 |       MBEE_TYPE
                         HARRAY
                 |       HLABEL
                 |       HSWITCH
                 ;
-PROC_DECL_IN_SPEC:     MBEE_TYPE HPROCEDURE
+PROC_DECL_IN_SPEC:      MBEE_TYPE HPROCEDURE
                         HIDENTIFIER
-                                       {}
+                                        {}
                         HEADING
-                                       {}
-                       MBEE_BEGIN_END
-               ;
-MBEE_BEGIN_END :       /* EMPTY */
-               |       HBEGIN HEND
-               ;
+                                        {}
+                        MBEE_BEGIN_END
+                ;
+MBEE_BEGIN_END  :       /* EMPTY */
+                |       HBEGIN HEND
+                ;
 MBEE_PROT_PART  :       /*EMPT*/
                 |       PROTECTION_PART
                 ;
@@ -850,16 +1262,16 @@ IDENTIFIER_LIST :       HIDENTIFIER
                         HIDENTIFIER
                 ;
 IDENTIFIER_LISTC:       HIDENTIFIER
-                       MBEE_CONSTANT
+                        MBEE_CONSTANT
                 |       IDENTIFIER_LISTC HPAREXPSEPARATOR
                         HIDENTIFIER
-                       MBEE_CONSTANT
+                        MBEE_CONSTANT
+                ;
+MBEE_CONSTANT   :       /* EMPTY */
+                |       HVALRELOPERATOR
+                                {}
+                        EXPRESSION
                 ;
-MBEE_CONSTANT  :       /* EMPTY */
-               |       HVALRELOPERATOR
-                               {}
-                       EXPRESSION
-               ;
 
 /* GRAMATIKK FOR UTTRYKK */
 EXPRESSION      :       EXPRESSION_SIMP
@@ -870,12 +1282,12 @@ EXPRESSION      :       EXPRESSION_SIMP
                         HELSE
                         EXPRESSION
                 ;
-EXPRESSION_SIMP :      EXPRESSION_SIMP
-                       HASSIGN
-                       EXPRESSION
-               |
+EXPRESSION_SIMP :       EXPRESSION_SIMP
+                        HASSIGN
+                        EXPRESSION
+                |
 
-                       EXPRESSION_SIMP
+                        EXPRESSION_SIMP
                         HCONC
                         EXPRESSION_SIMP
                 |       EXPRESSION_SIMP HOR
@@ -949,17 +1361,28 @@ ARGUMENT_LIST   :       EXPRESSION
                         HPAREXPSEPARATOR
                         ARGUMENT_LIST
                 ;
-%%
-]])
+]],
+
+dnl INPUT
+[[]],
 
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]], 0, [],
-[[input.y: conflicts: 78 shift/reduce, 10 reduce/reduce
-]])
+dnl BISON-STDERR
+[AT_COND_CASE([[canonical LR]],
+[[input.y: warning: 1876 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: 144 reduce/reduce conflicts [-Wconflicts-rr]]],
+[[input.y: warning: 78 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: 10 reduce/reduce conflicts [-Wconflicts-rr]]])[
+]],
 
-AT_CHECK([[grep '^State.*conflicts:' input.output]], 0,
+dnl LAST-STATE
+[AT_COND_CASE([[canonical LR]], [[10425]], [[442]])],
+
+dnl LALR1-DIFF not used for canonical LR(1) because the diff is huge.
+[],
+
+dnl OTHER-CHECKS
+[AT_COND_CASE([[canonical LR]], [[]],
+[AT_CHECK([[grep '^State.*conflicts:' input.output]], [[0]],
 [[State 64 conflicts: 14 shift/reduce
 State 164 conflicts: 1 shift/reduce
 State 201 conflicts: 33 shift/reduce, 4 reduce/reduce
@@ -969,22 +1392,18 @@ State 335 conflicts: 9 shift/reduce, 2 reduce/reduce
 State 356 conflicts: 1 shift/reduce
 State 360 conflicts: 9 shift/reduce, 2 reduce/reduce
 State 427 conflicts: 9 shift/reduce, 2 reduce/reduce
-]])
-
-AT_CLEANUP
-
-## ----------------- ##
-## GNU pic Grammar.  ##
-## ----------------- ##
+]])])])
 
-AT_SETUP([GNU pic Grammar])
+## -------------------------------- ##
+## GNU pic (Groff 1.18.1) Grammar.  ##
+## -------------------------------- ##
 
 # GNU pic, part of groff.
 
 # Bison once reported shift/reduce conflicts that it shouldn't have.
 
-AT_DATA([[input.y]],
-[[%union {}
+AT_TEST_EXISTING_GRAMMAR([[GNU pic (Groff 1.18.1) Grammar]],
+[[%error-verbose
 
 %token LABEL
 %token VARIABLE
@@ -1064,7 +1483,7 @@ AT_DATA([[input.y]],
 %token RAND
 %token SRAND
 %token COPY
-%token THRU
+%token THROUGH
 %token TOP
 %token BOTTOM
 %token UPPER
@@ -1150,376 +1569,1553 @@ works */
 %left '*' '/' '%'
 %right '!'
 %right '^'
-
-%%
-
+]],
+[[
 top:
-       optional_separator
-       | element_list
-       ;
+        optional_separator
+        | element_list
+        ;
 
 element_list:
-       optional_separator middle_element_list optional_separator
-       ;
+        optional_separator middle_element_list optional_separator
+        ;
 
 middle_element_list:
-       element
-       | middle_element_list separator element
-       ;
+        element
+        | middle_element_list separator element
+        ;
 
 optional_separator:
-       /* empty */
-       | separator
-       ;
+        /* empty */
+        | separator
+        ;
 
 separator:
-       ';'
-       | separator ';'
-       ;
+        ';'
+        | separator ';'
+        ;
 
 placeless_element:
-       VARIABLE '=' any_expr
-       | VARIABLE ':' '=' any_expr
-       | UP
-       | DOWN
-       | LEFT
-       | RIGHT
-       | COMMAND_LINE
-       | COMMAND print_args
-       | PRINT print_args
-       | SH
-               {}
-         DELIMITED
-       | COPY TEXT
-       | COPY TEXT THRU
-               {}
-         DELIMITED
-               {}
-         until
-       | COPY THRU
-               {}
-         DELIMITED
-               {}
-         until
-       | FOR VARIABLE '=' expr TO expr optional_by DO
-               {}
-         DELIMITED
-       | simple_if
-       | simple_if ELSE
-               {}
-         DELIMITED
-       | reset_variables
-       | RESET
-       ;
+        VARIABLE '=' any_expr
+        | VARIABLE ':' '=' any_expr
+        | UP
+        | DOWN
+        | LEFT
+        | RIGHT
+        | COMMAND_LINE
+        | COMMAND print_args
+        | PRINT print_args
+        | SH
+                {}
+          DELIMITED
+        | COPY TEXT
+        | COPY TEXT THROUGH
+                {}
+          DELIMITED
+                {}
+          until
+        | COPY THROUGH
+                {}
+          DELIMITED
+                {}
+          until
+        | FOR VARIABLE '=' expr TO expr optional_by DO
+                {}
+          DELIMITED
+        | simple_if
+        | simple_if ELSE
+                {}
+          DELIMITED
+        | reset_variables
+        | RESET
+        ;
 
 reset_variables:
-       RESET VARIABLE
-       | reset_variables VARIABLE
-       | reset_variables ',' VARIABLE
-       ;
+        RESET VARIABLE
+        | reset_variables VARIABLE
+        | reset_variables ',' VARIABLE
+        ;
 
 print_args:
-       print_arg
-       | print_args print_arg
-       ;
+        print_arg
+        | print_args print_arg
+        ;
 
 print_arg:
-       expr                                                    %prec ','
-       | text
-       | position                                              %prec ','
-       ;
+        expr                                                    %prec ','
+        | text
+        | position                                              %prec ','
+        ;
 
 simple_if:
-       IF any_expr THEN
-               {}
-       DELIMITED
-       ;
+        IF any_expr THEN
+                {}
+        DELIMITED
+        ;
 
 until:
-       /* empty */
-       | UNTIL TEXT
-       ;
+        /* empty */
+        | UNTIL TEXT
+        ;
 
 any_expr:
-       expr
-       | text_expr
-       ;
+        expr
+        | text_expr
+        ;
 
 text_expr:
-       text EQUALEQUAL text
-       | text NOTEQUAL text
-       | text_expr ANDAND text_expr
-       | text_expr ANDAND expr
-       | expr ANDAND text_expr
-       | text_expr OROR text_expr
-       | text_expr OROR expr
-       | expr OROR text_expr
-       | '!' text_expr
-       ;
+        text EQUALEQUAL text
+        | text NOTEQUAL text
+        | text_expr ANDAND text_expr
+        | text_expr ANDAND expr
+        | expr ANDAND text_expr
+        | text_expr OROR text_expr
+        | text_expr OROR expr
+        | expr OROR text_expr
+        | '!' text_expr
+        ;
 
 optional_by:
-       /* empty */
-       | BY expr
-       | BY '*' expr
-       ;
+        /* empty */
+        | BY expr
+        | BY '*' expr
+        ;
 
 element:
-       object_spec
-       | LABEL ':' optional_separator element
-       | LABEL ':' optional_separator position_not_place
-       | LABEL ':' optional_separator place
-       | '{}'
-               {}
-         optional_element
-       | placeless_element
-       ;
+        object_spec
+        | LABEL ':' optional_separator element
+        | LABEL ':' optional_separator position_not_place
+        | LABEL ':' optional_separator place
+        | '{' {} element_list '}'
+                {}
+          optional_element
+        | placeless_element
+        ;
 
 optional_element:
-       /* empty */
-       | element
-       ;
+        /* empty */
+        | element
+        ;
 
 object_spec:
-       BOX
-       | CIRCLE
-       | ELLIPSE
-       | ARC
-       | LINE
-       | ARROW
-       | MOVE
-       | SPLINE
-       | text                                                  %prec TEXT
-       | PLOT expr
-       | PLOT expr text
-       | '['
-               {}
-         element_list ']'
-       | object_spec HEIGHT expr
-       | object_spec RADIUS expr
-       | object_spec WIDTH expr
-       | object_spec DIAMETER expr
-       | object_spec expr                                      %prec HEIGHT
-       | object_spec UP
-       | object_spec UP expr
-       | object_spec DOWN
-       | object_spec DOWN expr
-       | object_spec RIGHT
-       | object_spec RIGHT expr
-       | object_spec LEFT
-       | object_spec LEFT expr
-       | object_spec FROM position
-       | object_spec TO position
-       | object_spec AT position
-       | object_spec WITH path
-       | object_spec WITH position                             %prec ','
-       | object_spec BY expr_pair
-       | object_spec THEN
-       | object_spec SOLID
-       | object_spec DOTTED
-       | object_spec DOTTED expr
-       | object_spec DASHED
-       | object_spec DASHED expr
-       | object_spec FILL
-       | object_spec FILL expr
-       | object_spec SHADED text
-       | object_spec COLORED text
-       | object_spec OUTLINED text
-       | object_spec CHOP
-       | object_spec CHOP expr
-       | object_spec SAME
-       | object_spec INVISIBLE
-       | object_spec LEFT_ARROW_HEAD
-       | object_spec RIGHT_ARROW_HEAD
-       | object_spec DOUBLE_ARROW_HEAD
-       | object_spec CW
-       | object_spec CCW
-       | object_spec text                                      %prec TEXT
-       | object_spec LJUST
-       | object_spec RJUST
-       | object_spec ABOVE
-       | object_spec BELOW
-       | object_spec THICKNESS expr
-       | object_spec ALIGNED
-       ;
+        BOX
+        | CIRCLE
+        | ELLIPSE
+        | ARC
+        | LINE
+        | ARROW
+        | MOVE
+        | SPLINE
+        | text                                                  %prec TEXT
+        | PLOT expr
+        | PLOT expr text
+        | '['
+                {}
+          element_list ']'
+        | object_spec HEIGHT expr
+        | object_spec RADIUS expr
+        | object_spec WIDTH expr
+        | object_spec DIAMETER expr
+        | object_spec expr                                      %prec HEIGHT
+        | object_spec UP
+        | object_spec UP expr
+        | object_spec DOWN
+        | object_spec DOWN expr
+        | object_spec RIGHT
+        | object_spec RIGHT expr
+        | object_spec LEFT
+        | object_spec LEFT expr
+        | object_spec FROM position
+        | object_spec TO position
+        | object_spec AT position
+        | object_spec WITH path
+        | object_spec WITH position                             %prec ','
+        | object_spec BY expr_pair
+        | object_spec THEN
+        | object_spec SOLID
+        | object_spec DOTTED
+        | object_spec DOTTED expr
+        | object_spec DASHED
+        | object_spec DASHED expr
+        | object_spec FILL
+        | object_spec FILL expr
+        | object_spec SHADED text
+        | object_spec COLORED text
+        | object_spec OUTLINED text
+        | object_spec CHOP
+        | object_spec CHOP expr
+        | object_spec SAME
+        | object_spec INVISIBLE
+        | object_spec LEFT_ARROW_HEAD
+        | object_spec RIGHT_ARROW_HEAD
+        | object_spec DOUBLE_ARROW_HEAD
+        | object_spec CW
+        | object_spec CCW
+        | object_spec text                                      %prec TEXT
+        | object_spec LJUST
+        | object_spec RJUST
+        | object_spec ABOVE
+        | object_spec BELOW
+        | object_spec THICKNESS expr
+        | object_spec ALIGNED
+        ;
 
 text:
-       TEXT
-       | SPRINTF '(' TEXT sprintf_args ')'
-       ;
+        TEXT
+        | SPRINTF '(' TEXT sprintf_args ')'
+        ;
 
 sprintf_args:
-       /* empty */
-       | sprintf_args ',' expr
-       ;
+        /* empty */
+        | sprintf_args ',' expr
+        ;
 
 position:
-       position_not_place
-       | place
-       ;
+        position_not_place
+        | place
+        ;
 
 position_not_place:
-       expr_pair
-       | position '+' expr_pair
-       | position '-' expr_pair
-       | '(' position ',' position ')'
-       | expr between position AND position
-       | expr '<' position ',' position '>'
-       ;
+        expr_pair
+        | position '+' expr_pair
+        | position '-' expr_pair
+        | '(' position ',' position ')'
+        | expr between position AND position
+        | expr '<' position ',' position '>'
+        ;
 
 between:
-       BETWEEN
-       | OF THE WAY BETWEEN
-       ;
+        BETWEEN
+        | OF THE WAY BETWEEN
+        ;
 
 expr_pair:
-       expr ',' expr
-       | '(' expr_pair ')'
-       ;
+        expr ',' expr
+        | '(' expr_pair ')'
+        ;
 
 place:
-       /* line at A left == line (at A) left */
-       label                                                   %prec CHOP
-       | label corner
-       | corner label
-       | corner OF label
-       | HERE
-       ;
+        /* line at A left == line (at A) left */
+        label                                                   %prec CHOP
+        | label corner
+        | corner label
+        | corner OF label
+        | HERE
+        ;
 
 label:
-       LABEL
-       | nth_primitive
-       | label '.' LABEL
-       ;
+        LABEL
+        | nth_primitive
+        | label '.' LABEL
+        ;
 
 ordinal:
-       ORDINAL
-       | '`' any_expr TH
-       ;
+        ORDINAL
+        | '`' any_expr TH
+        ;
 
 optional_ordinal_last:
-       LAST
-       | ordinal LAST
-       ;
+        LAST
+        | ordinal LAST
+        ;
 
 nth_primitive:
-       ordinal object_type
-       | optional_ordinal_last object_type
-       ;
+        ordinal object_type
+        | optional_ordinal_last object_type
+        ;
 
 object_type:
-       BOX
-       | CIRCLE
-       | ELLIPSE
-       | ARC
-       | LINE
-       | ARROW
-       | SPLINE
-       | '[' ']'
-       | TEXT
-       ;
+        BOX
+        | CIRCLE
+        | ELLIPSE
+        | ARC
+        | LINE
+        | ARROW
+        | SPLINE
+        | '[' ']'
+        | TEXT
+        ;
 
 label_path:
-       '.' LABEL
-       | label_path '.' LABEL
-       ;
+        '.' LABEL
+        | label_path '.' LABEL
+        ;
 
 relative_path:
-       corner                                                  %prec CHOP
-       /* give this a lower precedence than LEFT and RIGHT so that
-          [A: box] with .A left == [A: box] with (.A left) */
-       | label_path                                            %prec TEXT
-       | label_path corner
-       ;
+        corner                                                  %prec CHOP
+        /* give this a lower precedence than LEFT and RIGHT so that
+           [A: box] with .A left == [A: box] with (.A left) */
+        | label_path                                            %prec TEXT
+        | label_path corner
+        ;
 
 path:
-       relative_path
-       | '(' relative_path ',' relative_path ')'
-               {}
-       /* The rest of these rules are a compatibility sop. */
-       | ORDINAL LAST object_type relative_path
-       | LAST object_type relative_path
-       | ORDINAL object_type relative_path
-       | LABEL relative_path
-       ;
+        relative_path
+        | '(' relative_path ',' relative_path ')'
+                {}
+        /* The rest of these rules are a compatibility sop. */
+        | ORDINAL LAST object_type relative_path
+        | LAST object_type relative_path
+        | ORDINAL object_type relative_path
+        | LABEL relative_path
+        ;
 
 corner:
-       DOT_N
-       | DOT_E
-       | DOT_W
-       | DOT_S
-       | DOT_NE
-       | DOT_SE
-       | DOT_NW
-       | DOT_SW
-       | DOT_C
-       | DOT_START
-       | DOT_END
-       | TOP
-       | BOTTOM
-       | LEFT
-       | RIGHT
-       | UPPER LEFT
-       | LOWER LEFT
-       | UPPER RIGHT
-       | LOWER RIGHT
-       | LEFT_CORNER
-       | RIGHT_CORNER
-       | UPPER LEFT_CORNER
-       | LOWER LEFT_CORNER
-       | UPPER RIGHT_CORNER
-       | LOWER RIGHT_CORNER
-       | NORTH
-       | SOUTH
-       | EAST
-       | WEST
-       | CENTER
-       | START
-       | END
-       ;
+        DOT_N
+        | DOT_E
+        | DOT_W
+        | DOT_S
+        | DOT_NE
+        | DOT_SE
+        | DOT_NW
+        | DOT_SW
+        | DOT_C
+        | DOT_START
+        | DOT_END
+        | TOP
+        | BOTTOM
+        | LEFT
+        | RIGHT
+        | UPPER LEFT
+        | LOWER LEFT
+        | UPPER RIGHT
+        | LOWER RIGHT
+        | LEFT_CORNER
+        | RIGHT_CORNER
+        | UPPER LEFT_CORNER
+        | LOWER LEFT_CORNER
+        | UPPER RIGHT_CORNER
+        | LOWER RIGHT_CORNER
+        | NORTH
+        | SOUTH
+        | EAST
+        | WEST
+        | CENTER
+        | START
+        | END
+        ;
 
 expr:
-       VARIABLE
-       | NUMBER
-       | place DOT_X
-       | place DOT_Y
-       | place DOT_HT
-       | place DOT_WID
-       | place DOT_RAD
-       | expr '+' expr
-       | expr '-' expr
-       | expr '*' expr
-       | expr '/' expr
-       | expr '%' expr
-       | expr '^' expr
-       | '-' expr                                              %prec '!'
-       | '(' any_expr ')'
-       | SIN '(' any_expr ')'
-       | COS '(' any_expr ')'
-       | ATAN2 '(' any_expr ',' any_expr ')'
-       | LOG '(' any_expr ')'
-       | EXP '(' any_expr ')'
-       | SQRT '(' any_expr ')'
-       | K_MAX '(' any_expr ',' any_expr ')'
-       | K_MIN '(' any_expr ',' any_expr ')'
-       | INT '(' any_expr ')'
-       | RAND '(' any_expr ')'
-       | RAND '(' ')'
-       | SRAND '(' any_expr ')'
-       | expr '<' expr
-       | expr LESSEQUAL expr
-       | expr '>' expr
-       | expr GREATEREQUAL expr
-       | expr EQUALEQUAL expr
-       | expr NOTEQUAL expr
-       | expr ANDAND expr
-       | expr OROR expr
-       | '!' expr
-       ;
-]])
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]], 0, [], [])
-
-AT_CLEANUP
+        VARIABLE
+        | NUMBER
+        | place DOT_X
+        | place DOT_Y
+        | place DOT_HT
+        | place DOT_WID
+        | place DOT_RAD
+        | expr '+' expr
+        | expr '-' expr
+        | expr '*' expr
+        | expr '/' expr
+        | expr '%' expr
+        | expr '^' expr
+        | '-' expr                                              %prec '!'
+        | '(' any_expr ')'
+        | SIN '(' any_expr ')'
+        | COS '(' any_expr ')'
+        | ATAN2 '(' any_expr ',' any_expr ')'
+        | LOG '(' any_expr ')'
+        | EXP '(' any_expr ')'
+        | SQRT '(' any_expr ')'
+        | K_MAX '(' any_expr ',' any_expr ')'
+        | K_MIN '(' any_expr ',' any_expr ')'
+        | INT '(' any_expr ')'
+        | RAND '(' any_expr ')'
+        | RAND '(' ')'
+        | SRAND '(' any_expr ')'
+        | expr '<' expr
+        | expr LESSEQUAL expr
+        | expr '>' expr
+        | expr GREATEREQUAL expr
+        | expr EQUALEQUAL expr
+        | expr NOTEQUAL expr
+        | expr ANDAND expr
+        | expr OROR expr
+        | '!' expr
+        ;
+]],
+
+dnl INPUT
+dnl
+dnl For example, in pic:
+dnl
+dnl   .PS
+dnl   A: circle "A"
+dnl   B: A left
+dnl   circle "B" at B
+dnl   .PE
+dnl
+dnl Even using groff 1.19.2, the 3rd line above is a syntax error.  Change
+dnl "left" to "right", and it still is.  However, add "upper" or "lower" before
+dnl "left or "right" and it's accepted to mean ".nw", ".ne", ".sw", or ".se".
+dnl (There seem to be no aliases for "north" and "south" that can stand alone
+dnl without being followed by "of".)
+[[VARIABLE, '=', LABEL, LEFT, DOT_X]],
+
+dnl BISON-STDERR
+[[input.y:470.11-48: warning: rule useless in parser due to conflicts: path: ORDINAL LAST object_type relative_path [-Wother]
+]],
+
+dnl LAST-STATE
+[AT_COND_CASE([[LALR]], [[422]], [[canonical LR]], [[4833]], [[427]])],
+
+dnl LALR1-DIFF not used for canonical LR(1) because the diff is huge.
+dnl Isocore map from LALR(1) state number to new state number plus descriptions
+dnl of any change in the actions resulting in a change in accepted language:
+dnl   - 102 -> 423: reduce -> shift on LEFT and RIGHT
+dnl   - 237 -> 425
+dnl   - 266 -> 424
+dnl   - 339 -> 426
+dnl   - 383 -> 427
+[AT_COND_CASE([[LALR]], [],
+[[@@ -1223,7 +1223,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -1377,7 +1377,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -1854,7 +1854,7 @@
+
+     text                   go to state 162
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -2047,7 +2047,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -2571,7 +2571,7 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 191
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -2732,7 +2732,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -2875,7 +2875,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -3018,7 +3018,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -3256,7 +3256,7 @@
+
+ state 102
+
+-  146 place: label .  [$end, LABEL, VARIABLE, NUMBER, TEXT, ORDINAL, LEFT_ARROW_HEAD, RIGHT_ARROW_HEAD, DOUBLE_ARROW_HEAD, LAST, UP, DOWN, LEFT, RIGHT, HEIGHT, RADIUS, WIDTH, DIAMETER, FROM, TO, AT, WITH, BY, THEN, SOLID, DOTTED, DASHED, CHOP, SAME, INVISIBLE, LJUST, RJUST, ABOVE, BELOW, AND, HERE, DOT_X, DOT_Y, DOT_HT, DOT_WID, DOT_RAD, SIN, COS, ATAN2, LOG, EXP, SQRT, K_MAX, K_MIN, INT, RAND, SRAND, CW, CCW, THICKNESS, FILL, COLORED, OUTLINED, SHADED, ALIGNED, SPRINTF, '(', '`', ',', '>', '+', '-', '!', ';', '}', '@:>@', ')']
++  146 place: label .  [$end, LABEL, VARIABLE, NUMBER, TEXT, ORDINAL, LEFT_ARROW_HEAD, RIGHT_ARROW_HEAD, DOUBLE_ARROW_HEAD, LAST, UP, DOWN, LEFT, RIGHT, HEIGHT, RADIUS, WIDTH, DIAMETER, FROM, TO, AT, WITH, BY, THEN, SOLID, DOTTED, DASHED, CHOP, SAME, INVISIBLE, LJUST, RJUST, ABOVE, BELOW, HERE, DOT_X, DOT_Y, DOT_HT, DOT_WID, DOT_RAD, SIN, COS, ATAN2, LOG, EXP, SQRT, K_MAX, K_MIN, INT, RAND, SRAND, CW, CCW, THICKNESS, FILL, COLORED, OUTLINED, SHADED, ALIGNED, SPRINTF, '(', '`', '+', '-', '!', ';', '}', '@:>@']
+   147      | label . corner
+   153 label: label . '.' LABEL
+   180 corner: . DOT_N
+@@ -3645,7 +3645,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -3804,7 +3804,7 @@
+     text_expr              go to state 239
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -4481,7 +4481,7 @@
+     $default  reduce using rule 89 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -4673,7 +4673,7 @@
+     $default  reduce using rule 91 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -4867,7 +4867,7 @@
+     $default  reduce using rule 95 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -5065,7 +5065,7 @@
+     $default  reduce using rule 93 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -5260,7 +5260,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -5403,7 +5403,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -5546,7 +5546,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -5689,7 +5689,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -6475,7 +6475,7 @@
+
+     expr_pair              go to state 280
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -6633,7 +6633,7 @@
+     $default  reduce using rule 105 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -6825,7 +6825,7 @@
+     $default  reduce using rule 107 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -7017,7 +7017,7 @@
+     $default  reduce using rule 114 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -7264,7 +7264,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -7408,7 +7408,7 @@
+     $default  reduce using rule 109 (object_spec)
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -7819,12 +7819,12 @@
+     position_not_place     go to state 296
+     expr_pair              go to state 100
+     place                  go to state 297
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+     corner                 go to state 106
+-    expr                   go to state 266
++    expr                   go to state 424
+
+
+ state 165
+@@ -7987,7 +7987,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8172,7 +8172,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8333,7 +8333,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8494,7 +8494,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8655,7 +8655,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8816,7 +8816,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -8977,7 +8977,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9138,7 +9138,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9299,7 +9299,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9460,7 +9460,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9623,7 +9623,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9784,7 +9784,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -9921,7 +9921,7 @@
+
+     $default  reduce using rule 47 (any_expr)
+
+-    between  go to state 237
++    between  go to state 425
+
+
+ state 193
+@@ -10152,7 +10152,7 @@
+
+     expr_pair              go to state 317
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -10298,7 +10298,7 @@
+
+     expr_pair              go to state 318
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -10622,7 +10622,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -10765,7 +10765,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -10908,7 +10908,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11051,7 +11051,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11194,7 +11194,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11337,7 +11337,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11480,7 +11480,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11637,7 +11637,7 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 100
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11780,7 +11780,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -11923,7 +11923,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12066,7 +12066,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12209,7 +12209,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12352,7 +12352,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12495,7 +12495,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12638,7 +12638,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -12794,12 +12794,12 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 100
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+     corner                 go to state 106
+-    expr                   go to state 266
++    expr                   go to state 424
+
+
+ state 238
+@@ -12937,7 +12937,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -13160,7 +13160,7 @@
+     text_expr              go to state 342
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -13319,7 +13319,7 @@
+     text_expr              go to state 344
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -13502,7 +13502,7 @@
+     text_expr              go to state 348
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -13661,7 +13661,7 @@
+     text_expr              go to state 350
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -13804,7 +13804,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -14747,7 +14747,7 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 191
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -15074,7 +15074,7 @@
+     text                   go to state 113
+     expr_pair              go to state 365
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -15693,12 +15693,12 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 100
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+     corner                 go to state 106
+-    expr                   go to state 266
++    expr                   go to state 424
+
+
+ state 315
+@@ -16124,7 +16124,7 @@
+
+     $default  reduce using rule 239 (expr)
+
+-    between  go to state 237
++    between  go to state 425
+
+     Conflict between rule 239 and token OF resolved as shift ('<' < OF).
+     Conflict between rule 239 and token BETWEEN resolved as shift ('<' < BETWEEN).
+@@ -17234,7 +17234,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -17416,7 +17416,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -17577,7 +17577,7 @@
+     text_expr              go to state 112
+     text                   go to state 113
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -17772,12 +17772,12 @@
+     position_not_place     go to state 99
+     expr_pair              go to state 100
+     place                  go to state 101
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+     corner                 go to state 106
+-    expr                   go to state 266
++    expr                   go to state 424
+
+
+ state 383
+@@ -18071,7 +18071,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -18221,7 +18221,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -18830,7 +18830,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -18987,7 +18987,7 @@
+     '!'           shift, and go to state 94
+
+     place                  go to state 114
+-    label                  go to state 102
++    label                  go to state 423
+     ordinal                go to state 103
+     optional_ordinal_last  go to state 104
+     nth_primitive          go to state 105
+@@ -19089,3 +19089,440 @@
+    29 placeless_element: FOR VARIABLE '=' expr TO expr optional_by DO $@6 DELIMITED .
+
+     $default  reduce using rule 29 (placeless_element)
++
++
++state 423
++
++  146 place: label .  [$end, AND, DOT_X, DOT_Y, DOT_HT, DOT_WID, DOT_RAD, ',', '>', '+', '-', ';', '}', '@:>@', ')']
++  147      | label . corner
++  153 label: label . '.' LABEL
++  180 corner: . DOT_N
++  181       | . DOT_E
++  182       | . DOT_W
++  183       | . DOT_S
++  184       | . DOT_NE
++  185       | . DOT_SE
++  186       | . DOT_NW
++  187       | . DOT_SW
++  188       | . DOT_C
++  189       | . DOT_START
++  190       | . DOT_END
++  191       | . TOP
++  192       | . BOTTOM
++  193       | . LEFT
++  194       | . RIGHT
++  195       | . UPPER LEFT
++  196       | . LOWER LEFT
++  197       | . UPPER RIGHT
++  198       | . LOWER RIGHT
++  199       | . LEFT_CORNER
++  200       | . RIGHT_CORNER
++  201       | . UPPER LEFT_CORNER
++  202       | . LOWER LEFT_CORNER
++  203       | . UPPER RIGHT_CORNER
++  204       | . LOWER RIGHT_CORNER
++  205       | . NORTH
++  206       | . SOUTH
++  207       | . EAST
++  208       | . WEST
++  209       | . CENTER
++  210       | . START
++  211       | . END
++
++    LEFT          shift, and go to state 53
++    RIGHT         shift, and go to state 54
++    DOT_N         shift, and go to state 56
++    DOT_E         shift, and go to state 57
++    DOT_W         shift, and go to state 58
++    DOT_S         shift, and go to state 59
++    DOT_NE        shift, and go to state 60
++    DOT_SE        shift, and go to state 61
++    DOT_NW        shift, and go to state 62
++    DOT_SW        shift, and go to state 63
++    DOT_C         shift, and go to state 64
++    DOT_START     shift, and go to state 65
++    DOT_END       shift, and go to state 66
++    TOP           shift, and go to state 78
++    BOTTOM        shift, and go to state 79
++    UPPER         shift, and go to state 80
++    LOWER         shift, and go to state 81
++    LEFT_CORNER   shift, and go to state 82
++    RIGHT_CORNER  shift, and go to state 83
++    NORTH         shift, and go to state 84
++    SOUTH         shift, and go to state 85
++    EAST          shift, and go to state 86
++    WEST          shift, and go to state 87
++    CENTER        shift, and go to state 88
++    END           shift, and go to state 89
++    START         shift, and go to state 90
++    '.'           shift, and go to state 204
++
++    $default  reduce using rule 146 (place)
++
++    corner  go to state 205
++
++
++state 424
++
++  140 position_not_place: expr . between position AND position
++  141                   | expr . '<' position ',' position '>'
++  142 between: . BETWEEN
++  143        | . OF THE WAY BETWEEN
++  144 expr_pair: expr . ',' expr
++  219 expr: expr . '+' expr
++  220     | expr . '-' expr
++  221     | expr . '*' expr
++  222     | expr . '/' expr
++  223     | expr . '%' expr
++  224     | expr . '^' expr
++  239     | expr . '<' expr
++  240     | expr . LESSEQUAL expr
++  241     | expr . '>' expr
++  242     | expr . GREATEREQUAL expr
++  243     | expr . EQUALEQUAL expr
++  244     | expr . NOTEQUAL expr
++  245     | expr . ANDAND expr
++  246     | expr . OROR expr
++
++    OF            shift, and go to state 220
++    BETWEEN       shift, and go to state 221
++    ANDAND        shift, and go to state 222
++    OROR          shift, and go to state 223
++    NOTEQUAL      shift, and go to state 224
++    EQUALEQUAL    shift, and go to state 225
++    LESSEQUAL     shift, and go to state 226
++    GREATEREQUAL  shift, and go to state 227
++    ','           shift, and go to state 228
++    '<'           shift, and go to state 229
++    '>'           shift, and go to state 230
++    '+'           shift, and go to state 231
++    '-'           shift, and go to state 232
++    '*'           shift, and go to state 233
++    '/'           shift, and go to state 234
++    '%'           shift, and go to state 235
++    '^'           shift, and go to state 236
++
++    between  go to state 425
++
++
++state 425
++
++  134 position: . position_not_place
++  135         | . place
++  136 position_not_place: . expr_pair
++  137                   | . position '+' expr_pair
++  138                   | . position '-' expr_pair
++  139                   | . '(' position ',' position ')'
++  140                   | . expr between position AND position
++  140                   | expr between . position AND position
++  141                   | . expr '<' position ',' position '>'
++  144 expr_pair: . expr ',' expr
++  145          | . '(' expr_pair ')'
++  146 place: . label
++  147      | . label corner
++  148      | . corner label
++  149      | . corner OF label
++  150      | . HERE
++  151 label: . LABEL
++  152      | . nth_primitive
++  153      | . label '.' LABEL
++  154 ordinal: . ORDINAL
++  155        | . '`' any_expr TH
++  156 optional_ordinal_last: . LAST
++  157                      | . ordinal LAST
++  158 nth_primitive: . ordinal object_type
++  159              | . optional_ordinal_last object_type
++  180 corner: . DOT_N
++  181       | . DOT_E
++  182       | . DOT_W
++  183       | . DOT_S
++  184       | . DOT_NE
++  185       | . DOT_SE
++  186       | . DOT_NW
++  187       | . DOT_SW
++  188       | . DOT_C
++  189       | . DOT_START
++  190       | . DOT_END
++  191       | . TOP
++  192       | . BOTTOM
++  193       | . LEFT
++  194       | . RIGHT
++  195       | . UPPER LEFT
++  196       | . LOWER LEFT
++  197       | . UPPER RIGHT
++  198       | . LOWER RIGHT
++  199       | . LEFT_CORNER
++  200       | . RIGHT_CORNER
++  201       | . UPPER LEFT_CORNER
++  202       | . LOWER LEFT_CORNER
++  203       | . UPPER RIGHT_CORNER
++  204       | . LOWER RIGHT_CORNER
++  205       | . NORTH
++  206       | . SOUTH
++  207       | . EAST
++  208       | . WEST
++  209       | . CENTER
++  210       | . START
++  211       | . END
++  212 expr: . VARIABLE
++  213     | . NUMBER
++  214     | . place DOT_X
++  215     | . place DOT_Y
++  216     | . place DOT_HT
++  217     | . place DOT_WID
++  218     | . place DOT_RAD
++  219     | . expr '+' expr
++  220     | . expr '-' expr
++  221     | . expr '*' expr
++  222     | . expr '/' expr
++  223     | . expr '%' expr
++  224     | . expr '^' expr
++  225     | . '-' expr
++  226     | . '(' any_expr ')'
++  227     | . SIN '(' any_expr ')'
++  228     | . COS '(' any_expr ')'
++  229     | . ATAN2 '(' any_expr ',' any_expr ')'
++  230     | . LOG '(' any_expr ')'
++  231     | . EXP '(' any_expr ')'
++  232     | . SQRT '(' any_expr ')'
++  233     | . K_MAX '(' any_expr ',' any_expr ')'
++  234     | . K_MIN '(' any_expr ',' any_expr ')'
++  235     | . INT '(' any_expr ')'
++  236     | . RAND '(' any_expr ')'
++  237     | . RAND '(' ')'
++  238     | . SRAND '(' any_expr ')'
++  239     | . expr '<' expr
++  240     | . expr LESSEQUAL expr
++  241     | . expr '>' expr
++  242     | . expr GREATEREQUAL expr
++  243     | . expr EQUALEQUAL expr
++  244     | . expr NOTEQUAL expr
++  245     | . expr ANDAND expr
++  246     | . expr OROR expr
++  247     | . '!' expr
++
++    LABEL         shift, and go to state 48
++    VARIABLE      shift, and go to state 49
++    NUMBER        shift, and go to state 50
++    ORDINAL       shift, and go to state 51
++    LAST          shift, and go to state 52
++    LEFT          shift, and go to state 53
++    RIGHT         shift, and go to state 54
++    HERE          shift, and go to state 55
++    DOT_N         shift, and go to state 56
++    DOT_E         shift, and go to state 57
++    DOT_W         shift, and go to state 58
++    DOT_S         shift, and go to state 59
++    DOT_NE        shift, and go to state 60
++    DOT_SE        shift, and go to state 61
++    DOT_NW        shift, and go to state 62
++    DOT_SW        shift, and go to state 63
++    DOT_C         shift, and go to state 64
++    DOT_START     shift, and go to state 65
++    DOT_END       shift, and go to state 66
++    SIN           shift, and go to state 67
++    COS           shift, and go to state 68
++    ATAN2         shift, and go to state 69
++    LOG           shift, and go to state 70
++    EXP           shift, and go to state 71
++    SQRT          shift, and go to state 72
++    K_MAX         shift, and go to state 73
++    K_MIN         shift, and go to state 74
++    INT           shift, and go to state 75
++    RAND          shift, and go to state 76
++    SRAND         shift, and go to state 77
++    TOP           shift, and go to state 78
++    BOTTOM        shift, and go to state 79
++    UPPER         shift, and go to state 80
++    LOWER         shift, and go to state 81
++    LEFT_CORNER   shift, and go to state 82
++    RIGHT_CORNER  shift, and go to state 83
++    NORTH         shift, and go to state 84
++    SOUTH         shift, and go to state 85
++    EAST          shift, and go to state 86
++    WEST          shift, and go to state 87
++    CENTER        shift, and go to state 88
++    END           shift, and go to state 89
++    START         shift, and go to state 90
++    '('           shift, and go to state 91
++    '`'           shift, and go to state 92
++    '-'           shift, and go to state 93
++    '!'           shift, and go to state 94
++
++    position               go to state 426
++    position_not_place     go to state 99
++    expr_pair              go to state 100
++    place                  go to state 101
++    label                  go to state 423
++    ordinal                go to state 103
++    optional_ordinal_last  go to state 104
++    nth_primitive          go to state 105
++    corner                 go to state 106
++    expr                   go to state 424
++
++
++state 426
++
++  137 position_not_place: position . '+' expr_pair
++  138                   | position . '-' expr_pair
++  140                   | expr between position . AND position
++
++    AND  shift, and go to state 427
++    '+'  shift, and go to state 197
++    '-'  shift, and go to state 198
++
++
++state 427
++
++  134 position: . position_not_place
++  135         | . place
++  136 position_not_place: . expr_pair
++  137                   | . position '+' expr_pair
++  138                   | . position '-' expr_pair
++  139                   | . '(' position ',' position ')'
++  140                   | . expr between position AND position
++  140                   | expr between position AND . position
++  141                   | . expr '<' position ',' position '>'
++  144 expr_pair: . expr ',' expr
++  145          | . '(' expr_pair ')'
++  146 place: . label
++  147      | . label corner
++  148      | . corner label
++  149      | . corner OF label
++  150      | . HERE
++  151 label: . LABEL
++  152      | . nth_primitive
++  153      | . label '.' LABEL
++  154 ordinal: . ORDINAL
++  155        | . '`' any_expr TH
++  156 optional_ordinal_last: . LAST
++  157                      | . ordinal LAST
++  158 nth_primitive: . ordinal object_type
++  159              | . optional_ordinal_last object_type
++  180 corner: . DOT_N
++  181       | . DOT_E
++  182       | . DOT_W
++  183       | . DOT_S
++  184       | . DOT_NE
++  185       | . DOT_SE
++  186       | . DOT_NW
++  187       | . DOT_SW
++  188       | . DOT_C
++  189       | . DOT_START
++  190       | . DOT_END
++  191       | . TOP
++  192       | . BOTTOM
++  193       | . LEFT
++  194       | . RIGHT
++  195       | . UPPER LEFT
++  196       | . LOWER LEFT
++  197       | . UPPER RIGHT
++  198       | . LOWER RIGHT
++  199       | . LEFT_CORNER
++  200       | . RIGHT_CORNER
++  201       | . UPPER LEFT_CORNER
++  202       | . LOWER LEFT_CORNER
++  203       | . UPPER RIGHT_CORNER
++  204       | . LOWER RIGHT_CORNER
++  205       | . NORTH
++  206       | . SOUTH
++  207       | . EAST
++  208       | . WEST
++  209       | . CENTER
++  210       | . START
++  211       | . END
++  212 expr: . VARIABLE
++  213     | . NUMBER
++  214     | . place DOT_X
++  215     | . place DOT_Y
++  216     | . place DOT_HT
++  217     | . place DOT_WID
++  218     | . place DOT_RAD
++  219     | . expr '+' expr
++  220     | . expr '-' expr
++  221     | . expr '*' expr
++  222     | . expr '/' expr
++  223     | . expr '%' expr
++  224     | . expr '^' expr
++  225     | . '-' expr
++  226     | . '(' any_expr ')'
++  227     | . SIN '(' any_expr ')'
++  228     | . COS '(' any_expr ')'
++  229     | . ATAN2 '(' any_expr ',' any_expr ')'
++  230     | . LOG '(' any_expr ')'
++  231     | . EXP '(' any_expr ')'
++  232     | . SQRT '(' any_expr ')'
++  233     | . K_MAX '(' any_expr ',' any_expr ')'
++  234     | . K_MIN '(' any_expr ',' any_expr ')'
++  235     | . INT '(' any_expr ')'
++  236     | . RAND '(' any_expr ')'
++  237     | . RAND '(' ')'
++  238     | . SRAND '(' any_expr ')'
++  239     | . expr '<' expr
++  240     | . expr LESSEQUAL expr
++  241     | . expr '>' expr
++  242     | . expr GREATEREQUAL expr
++  243     | . expr EQUALEQUAL expr
++  244     | . expr NOTEQUAL expr
++  245     | . expr ANDAND expr
++  246     | . expr OROR expr
++  247     | . '!' expr
++
++    LABEL         shift, and go to state 48
++    VARIABLE      shift, and go to state 49
++    NUMBER        shift, and go to state 50
++    ORDINAL       shift, and go to state 51
++    LAST          shift, and go to state 52
++    LEFT          shift, and go to state 53
++    RIGHT         shift, and go to state 54
++    HERE          shift, and go to state 55
++    DOT_N         shift, and go to state 56
++    DOT_E         shift, and go to state 57
++    DOT_W         shift, and go to state 58
++    DOT_S         shift, and go to state 59
++    DOT_NE        shift, and go to state 60
++    DOT_SE        shift, and go to state 61
++    DOT_NW        shift, and go to state 62
++    DOT_SW        shift, and go to state 63
++    DOT_C         shift, and go to state 64
++    DOT_START     shift, and go to state 65
++    DOT_END       shift, and go to state 66
++    SIN           shift, and go to state 67
++    COS           shift, and go to state 68
++    ATAN2         shift, and go to state 69
++    LOG           shift, and go to state 70
++    EXP           shift, and go to state 71
++    SQRT          shift, and go to state 72
++    K_MAX         shift, and go to state 73
++    K_MIN         shift, and go to state 74
++    INT           shift, and go to state 75
++    RAND          shift, and go to state 76
++    SRAND         shift, and go to state 77
++    TOP           shift, and go to state 78
++    BOTTOM        shift, and go to state 79
++    UPPER         shift, and go to state 80
++    LOWER         shift, and go to state 81
++    LEFT_CORNER   shift, and go to state 82
++    RIGHT_CORNER  shift, and go to state 83
++    NORTH         shift, and go to state 84
++    SOUTH         shift, and go to state 85
++    EAST          shift, and go to state 86
++    WEST          shift, and go to state 87
++    CENTER        shift, and go to state 88
++    END           shift, and go to state 89
++    START         shift, and go to state 90
++    '('           shift, and go to state 91
++    '`'           shift, and go to state 92
++    '-'           shift, and go to state 93
++    '!'           shift, and go to state 94
++
++    position               go to state 402
++    position_not_place     go to state 99
++    expr_pair              go to state 100
++    place                  go to state 101
++    label                  go to state 423
++    ordinal                go to state 103
++    optional_ordinal_last  go to state 104
++    nth_primitive          go to state 105
++    corner                 go to state 106
++    expr                   go to state 424
+]])],
+
+dnl OTHER-CHECKS
+[],
+
+dnl PARSER-EXIT-VALUE, PARSER-STDOUT, PARSER-STDERR
+[AT_COND_CASE([[LALR]], [[1]], [[0]])],
+[],
+[AT_COND_CASE([[LALR]],
+[[syntax error, unexpected LEFT
+]])])