Regen.
[bison/ericb.git] / tests / existing.at
blobba2c40cba58256e0afa4a35cbd6d35c83a5c17f0
1 # Exercising Bison on actual grammars.                   -*- Autotest -*-
3 # Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005,
4 # 2007 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 AT_BANNER([[Existing Grammars.]])
20 ## ----------------- ##
21 ## GNU AWK Grammar.  ##
22 ## ----------------- ##
24 AT_SETUP([GNU AWK Grammar])
26 # We have been careful to strip all the actions excepts the
27 # mid-rule actions.  We rely on %expect to check that there are
28 # indeed 65 SR conflicts.
30 # Bison was once wrong, due to an incorrect computation of nullable.
31 # It reported 485 SR conflicts!
33 AT_DATA([[input.y]],
34 [[%expect 65
36 %token FUNC_CALL NAME REGEXP
37 %token ERROR
38 %token YNUMBER YSTRING
39 %token RELOP APPEND_OP
40 %token ASSIGNOP MATCHOP NEWLINE CONCAT_OP
41 %token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE
42 %token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE
43 %token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION
44 %token LEX_GETLINE LEX_NEXTFILE
45 %token LEX_IN
46 %token LEX_AND LEX_OR INCREMENT DECREMENT
47 %token LEX_BUILTIN LEX_LENGTH
49 /* Lowest to highest */
50 %right ASSIGNOP
51 %right '?' ':'
52 %left LEX_OR
53 %left LEX_AND
54 %left LEX_GETLINE
55 %nonassoc LEX_IN
56 %left FUNC_CALL LEX_BUILTIN LEX_LENGTH
57 %nonassoc ','
58 %nonassoc MATCHOP
59 %nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO
60 %left CONCAT_OP
61 %left YSTRING YNUMBER
62 %left '+' '-'
63 %left '*' '/' '%'
64 %right '!' UNARY
65 %right '^'
66 %left INCREMENT DECREMENT
67 %left '$'
68 %left '(' ')'
71 start
72         : opt_nls program opt_nls
73         ;
75 program
76         : rule
77         | program rule
78         | error
79         | program error
80         | /* empty */
81         ;
83 rule
84         : LEX_BEGIN {} action
85         | LEX_END {}   action
86         | LEX_BEGIN statement_term
87         | LEX_END statement_term
88         | pattern action
89         | action
90         | pattern statement_term
91         | function_prologue function_body
92         ;
94 func_name
95         : NAME
96         | FUNC_CALL
97         | lex_builtin
98         ;
100 lex_builtin
101         : LEX_BUILTIN
102         | LEX_LENGTH
103         ;
105 function_prologue
106         : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls
107         ;
109 function_body
110         : l_brace statements r_brace opt_semi opt_nls
111         | l_brace r_brace opt_semi opt_nls
112         ;
114 pattern
115         : exp
116         | exp ',' exp
117         ;
119 regexp
120         /*
121          * In this rule, want_regexp tells yylex that the next thing
122          * is a regexp so it should read up to the closing slash.
123          */
124         : '/' {} REGEXP '/'
125         ;
127 action
128         : l_brace statements r_brace opt_semi opt_nls
129         | l_brace r_brace opt_semi opt_nls
130         ;
132 statements
133         : statement
134         | statements statement
135         | error
136         | statements error
137         ;
139 statement_term
140         : nls
141         | semi opt_nls
142         ;
144 statement
145         : semi opt_nls
146         | l_brace r_brace
147         | l_brace statements r_brace
148         | if_statement
149         | LEX_WHILE '(' exp r_paren opt_nls statement
150         | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
151         | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement
152         | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement
153         | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement
154         | LEX_BREAK statement_term
155         | LEX_CONTINUE statement_term
156         | print '(' expression_list r_paren output_redir statement_term
157         | print opt_rexpression_list output_redir statement_term
158         | LEX_NEXT statement_term
159         | LEX_NEXTFILE statement_term
160         | LEX_EXIT opt_exp statement_term
161         | LEX_RETURN {} opt_exp statement_term
162         | LEX_DELETE NAME '[' expression_list ']' statement_term
163         | LEX_DELETE NAME  statement_term
164         | exp statement_term
165         ;
167 print
168         : LEX_PRINT
169         | LEX_PRINTF
170         ;
172 if_statement
173         : LEX_IF '(' exp r_paren opt_nls statement
174         | LEX_IF '(' exp r_paren opt_nls statement
175              LEX_ELSE opt_nls statement
176         ;
179         : NEWLINE
180         | nls NEWLINE
181         ;
183 opt_nls
184         : /* empty */
185         | nls
186         ;
188 input_redir
189         : /* empty */
190         | '<' simp_exp
191         ;
193 output_redir
194         : /* empty */
195         | '>' exp
196         | APPEND_OP exp
197         | '|' exp
198         | TWOWAYIO exp
199         ;
201 opt_param_list
202         : /* empty */
203         | param_list
204         ;
206 param_list
207         : NAME
208         | param_list comma NAME
209         | error
210         | param_list error
211         | param_list comma error
212         ;
214 /* optional expression, as in for loop */
215 opt_exp
216         : /* empty */
217         | exp
218         ;
220 opt_rexpression_list
221         : /* empty */
222         | rexpression_list
223         ;
225 rexpression_list
226         : rexp
227         | rexpression_list comma rexp
228         | error
229         | rexpression_list error
230         | rexpression_list error rexp
231         | rexpression_list comma error
232         ;
234 opt_expression_list
235         : /* empty */
236         | expression_list
237         ;
239 expression_list
240         : exp
241         | expression_list comma exp
242         | error
243         | expression_list error
244         | expression_list error exp
245         | expression_list comma error
246         ;
248 /* Expressions, not including the comma operator.  */
249 exp     : variable ASSIGNOP {} exp
250         | '(' expression_list r_paren LEX_IN NAME
251         | exp '|' LEX_GETLINE opt_variable
252         | exp TWOWAYIO LEX_GETLINE opt_variable
253         | LEX_GETLINE opt_variable input_redir
254         | exp LEX_AND exp
255         | exp LEX_OR exp
256         | exp MATCHOP exp
257         | regexp
258         | '!' regexp %prec UNARY
259         | exp LEX_IN NAME
260         | exp RELOP exp
261         | exp '<' exp
262         | exp '>' exp
263         | exp '?' exp ':' exp
264         | simp_exp
265         | exp simp_exp %prec CONCAT_OP
266         ;
268 rexp
269         : variable ASSIGNOP {} rexp
270         | rexp LEX_AND rexp
271         | rexp LEX_OR rexp
272         | LEX_GETLINE opt_variable input_redir
273         | regexp
274         | '!' regexp %prec UNARY
275         | rexp MATCHOP rexp
276         | rexp LEX_IN NAME
277         | rexp RELOP rexp
278         | rexp '?' rexp ':' rexp
279         | simp_exp
280         | rexp simp_exp %prec CONCAT_OP
281         ;
283 simp_exp
284         : non_post_simp_exp
285         /* Binary operators in order of decreasing precedence.  */
286         | simp_exp '^' simp_exp
287         | simp_exp '*' simp_exp
288         | simp_exp '/' simp_exp
289         | simp_exp '%' simp_exp
290         | simp_exp '+' simp_exp
291         | simp_exp '-' simp_exp
292         | variable INCREMENT
293         | variable DECREMENT
294         ;
296 non_post_simp_exp
297         : '!' simp_exp %prec UNARY
298         | '(' exp r_paren
299         | LEX_BUILTIN
300           '(' opt_expression_list r_paren
301         | LEX_LENGTH '(' opt_expression_list r_paren
302         | LEX_LENGTH
303         | FUNC_CALL '(' opt_expression_list r_paren
304         | variable
305         | INCREMENT variable
306         | DECREMENT variable
307         | YNUMBER
308         | YSTRING
309         | '-' simp_exp    %prec UNARY
310         | '+' simp_exp    %prec UNARY
311         ;
313 opt_variable
314         : /* empty */
315         | variable
316         ;
318 variable
319         : NAME
320         | NAME '[' expression_list ']'
321         | '$' non_post_simp_exp
322         ;
324 l_brace
325         : '{' opt_nls
326         ;
328 r_brace
329         : '}' opt_nls
330         ;
332 r_paren
333         : ')'
334         ;
336 opt_semi
337         : /* empty */
338         | semi
339         ;
341 semi
342         : ';'
343         ;
345 comma   : ',' opt_nls
346         ;
351 # Pass plenty of options, to exercise plenty of code, even if we
352 # don't actually check the output.  But SEGV is watching us, and
353 # so might do dmalloc.
354 AT_BISON_CHECK([[--verbose --defines input.y]])
356 AT_CLEANUP
358 ## ----------------- ##
359 ## GNU Cim Grammar.  ##
360 ## ----------------- ##
362 AT_SETUP([GNU Cim Grammar])
364 # GNU Cim, the GNU Simula 87 Compiler.
366 # Bison was once wrong, due to an incorrect computation of the RR conflicts.
367 # It reported 80 SR && 99 RR conflicts instead of 78/10!!!
369 AT_DATA([[input.y]],
370 [[%union {}
372 %token
373         HACTIVATE HAFTER /*HAND*/ HARRAY HAT
374         HBEFORE HBEGIN HBOOLEAN
375         HCHARACTER HCLASS /*HCOMMENT*/ HCONC
376         HDELAY HDO
377         HELSE HEND HEQ /*HEQV*/ HEXTERNAL
378         HFOR
379         HGE HGO HGOTO HGT
380         HHIDDEN
381         HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS
382         HLABEL HLE HLONG HLT
383         HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT
384         /*HOR*/ HOTHERWISE
385         HPRIOR HPROCEDURE HPROTECTED
386         HQUA
387         HREACTIVATE HREAL HREF
388         HSHORT HSTEP HSWITCH
389         HTEXT HTHEN HTHIS HTO
390         HUNTIL
391         HVALUE HVAR HVIRTUAL
392         HWHEN HWHILE
394         HASSIGNVALUE HASSIGNREF
395         /*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR
396         HBEGPAR HENDPAR
397         HEQR HNER
398         HADD HSUB HMUL HDIV HINTDIV HEXP
399         HDOTDOTDOT
401 %token HIDENTIFIER
402 %token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST
403 %token HREALKONST
404 %token HTEXTKONST
407 %right HASSIGN
408 %left   HORELSE
409 %left   HANDTHEN
410 %left   HEQV
411 %left   HIMP
412 %left   HOR
413 %left   HAND
415 %left   HNOT
417 %left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR
419 %left   HCONC
421 %left HTERMOPERATOR
422 %left UNEAR
423 %left HFACTOROPERATOR
424 %left         HPRIMARYOPERATOR
426 %left   HQUA
428 %left   HDOT
430 %start  MAIN_MODULE
432 /* GRAMATIKK FOR PROGRAM MODULES */
433 MAIN_MODULE     :       {}
434                         MODULS
435                 |       error HSTATEMENTSEPARATOR MBEE_DECLSTMS
436                 ;
437 EXT_DECLARATION :       HEXTERNAL
438                         MBEE_TYPE
439                         HPROCEDURE
440                                 {}
441                         EXT_LIST
442                 |
443                         HEXTERNAL
444                         HIDENTIFIER
445                         HPROCEDURE
446                                 {}
447                         HIDENTIFIER {}
448                         EXTERNAL_KIND_ITEM
449                 |       HEXTERNAL
450                         HCLASS
451                                 {}
452                         EXT_LIST
454                 ;
455 EXTERNAL_KIND_ITEM:     EXT_IDENT
456                         HOBJRELOPERATOR
457                                 {}
458                         MBEE_TYPE HPROCEDURE
459                         HIDENTIFIER
460                                 {}
461                         HEADING EMPTY_BLOCK
462                                 {}
463 /*              |
464                         EXT_IDENT
465                                 {}
466                         MBEE_REST_EXT_LIST
467                 ;
468 MBEE_REST_EXT_LIST:     /* EMPTY
469                 |       HPAREXPSEPARATOR EXT_KIND_LIST
470                 ;
471 EXT_KIND_LIST   :       EXT_KIND_ITEM
472                 |       EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM
473                 ;
474 EXT_KIND_ITEM   :       HIDENTIFIER
475                         EXT_IDENT
476                                 {}*/
477                 ;
478 EMPTY_BLOCK     :       /*EMPT*/
479                 |       HBEGIN HEND
480                 ;
481 EXT_LIST        :       EXT_ITEM
482                 |       EXT_LIST HPAREXPSEPARATOR EXT_ITEM
483                 ;
484 EXT_ITEM        :       HIDENTIFIER
485                         EXT_IDENT
486                 ;
487 EXT_IDENT       :       /* EMPTY */
488                 |       HVALRELOPERATOR {}
489                         HTEXTKONST
490                 ;
491 /* GRAMATIKK FOR TYPER */
492 NO_TYPE         :       /*EMPT*/
493                 ;
494 MBEE_TYPE       :       NO_TYPE
495                 |       TYPE
496                 ;
497 TYPE            :       HREF HBEGPAR
498                         HIDENTIFIER
499                                 {}
500                         HENDPAR
501                 |       HTEXT
502                 |       HBOOLEAN
503                 |       HCHARACTER
504                 |       HSHORT HINTEGER
505                 |       HINTEGER
506                 |       HREAL
507                 |       HLONG HREAL
508                 ;
510 /* GRAMATIKK FOR DEL AV SETNINGER */
511 MBEE_ELSE_PART  :       /*EMPT*/
512 /*              |       HELSE
513                         HIF
514                         EXPRESSION
515                         HTHEN   {}
516                         BLOCK   {}
517                         MBEE_ELSE_PART          {}*/
518                 |       HELSE   {}
519                         BLOCK
520                 ;
521 FOR_LIST        :       FOR_LIST_ELEMENT
522                 |       FOR_LIST_ELEMENT
523                         HPAREXPSEPARATOR
524                         FOR_LIST
525                 ;
526 FOR_LIST_ELEMENT:       EXPRESSION
527                         MBEE_F_L_EL_R_PT
528                 ;
529 MBEE_F_L_EL_R_PT:       /*EMPT*/
530                 |       HWHILE
531                         EXPRESSION
532                 |       HSTEP
533                         EXPRESSION
534                         HUNTIL
535                         EXPRESSION
536                 ;
537 GOTO            :       HGO
538                         HTO
539                 |       HGOTO
540                 ;
541 CONN_STATE_R_PT :       WHEN_CLAUSE_LIST
542                 |       HDO   {}
543                         BLOCK
544                 ;
545 WHEN_CLAUSE_LIST:       HWHEN
546                         HIDENTIFIER
547                         HDO    {}
548                         BLOCK
549                 |       WHEN_CLAUSE_LIST
550                         HWHEN
551                         HIDENTIFIER
552                         HDO    {}
553                         BLOCK
554                 ;
555 MBEE_OTWI_CLAUS :       /*EMPT*/
556                 |       HOTHERWISE {}
558                         BLOCK
559                 ;
560 ACTIVATOR       :       HACTIVATE
561                 |       HREACTIVATE
562                 ;
563 SCHEDULE        :       /*EMPT*/
564                 |       ATDELAY EXPRESSION      {}
565                         PRIOR
566                 |       BEFOREAFTER             {}
567                         EXPRESSION
568                 ;
569 ATDELAY         :       HAT
570                 |       HDELAY
571                 ;
572 BEFOREAFTER     :       HBEFORE
573                 |       HAFTER
574                 ;
575 PRIOR           :       /*EMPT*/
576                 |       HPRIOR
577                 ;
578 /* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */
579 MODULSTATEMENT  :       HWHILE
580                         EXPRESSION
581                         HDO     {}
582                         BLOCK
583                 |       HIF
584                         EXPRESSION
585                         HTHEN   {}
586                         BLOCK   {}
587                         MBEE_ELSE_PART
588                 |       HFOR
589                         HIDENTIFIER
590                         HASSIGN {}
591                         FOR_LIST
592                         HDO     {}
593                         BLOCK
594                 |       GOTO
595                         EXPRESSION
596                 |       HINSPECT
597                         EXPRESSION              {}
598                         CONN_STATE_R_PT
599                                 {}
600                         MBEE_OTWI_CLAUS
601                 |       HINNER
602                 |       HIDENTIFIER
603                         HLABELSEPARATOR
604                                 {}
605                         DECLSTATEMENT
606                 |       EXPRESSION_SIMP
607                         HBEGIN
608                                 {}
609                         IMPORT_SPEC_MODULE
610                                 {}
611                         MBEE_DECLSTMS
612                         HEND
613                 |       EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR
614                         MBEE_DECLSTMS HEND
615                 |       EXPRESSION_SIMP HBEGIN error HEND
616                 |       EXPRESSION_SIMP
617                 |       ACTIVATOR EXPRESSION SCHEDULE
618                 |       HBEGIN
619                                 {}
620                         MBEE_DECLSTMS
621                         HEND
622                 |       MBEE_TYPE HPROCEDURE
623                         HIDENTIFIER
624                                 {}
625                         HEADING BLOCK
626                 |       HIDENTIFIER
627                         HCLASS
628                         NO_TYPE
629                                 {}
630                         IMPORT_SPEC_MODULE
631                         HIDENTIFIER
632                                 {}
633                         HEADING
634                         BLOCK
635                 |       HCLASS
636                         NO_TYPE
637                         HIDENTIFIER
638                                 {}
639                         HEADING
640                         BLOCK
641                 |       EXT_DECLARATION
642                 |       /*EMPT*/
643                 ;
644 IMPORT_SPEC_MODULE:
645                 ;
646 DECLSTATEMENT   :       MODULSTATEMENT
647                 |       TYPE
648                         HIDENTIFIER
649                         MBEE_CONSTANT
650                         HPAREXPSEPARATOR
651                                 {}
652                         IDENTIFIER_LISTC
653                 |       TYPE
654                         HIDENTIFIER
655                         MBEE_CONSTANT
656                 |       MBEE_TYPE
657                         HARRAY  {}
658                         ARR_SEGMENT_LIST
659                 |       HSWITCH
660                         HIDENTIFIER
661                         HASSIGN {}
662                         SWITCH_LIST
663                 ;
664 BLOCK           :       DECLSTATEMENT
665                 |       HBEGIN MBEE_DECLSTMS HEND
666                 |       HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND
667                 |       HBEGIN error HEND
668                 ;
669 MBEE_DECLSTMS   :       MBEE_DECLSTMSU
670                 ;
671 MBEE_DECLSTMSU  :       DECLSTATEMENT
672                 |       MBEE_DECLSTMSU
673                         HSTATEMENTSEPARATOR
674                         DECLSTATEMENT
675                 ;
676 MODULS          :       MODULSTATEMENT
677                 |       MODULS HSTATEMENTSEPARATOR MODULSTATEMENT
678                 ;
679 /* GRAMATIKK FOR DEL AV DEKLARASJONER */
680 ARR_SEGMENT_LIST:       ARR_SEGMENT
681                 |       ARR_SEGMENT_LIST
682                         HPAREXPSEPARATOR
683                         ARR_SEGMENT
684                 ;
685 ARR_SEGMENT     :       ARRAY_SEGMENT
686                         HBEGPAR
687                         BAUND_PAIR_LIST HENDPAR
688                 ;
689 ARRAY_SEGMENT   :       ARRAY_SEGMENT_EL        {}
691                 |       ARRAY_SEGMENT_EL
692                         HPAREXPSEPARATOR
693                         ARRAY_SEGMENT
694                 ;
695 ARRAY_SEGMENT_EL:       HIDENTIFIER
696                 ;
697 BAUND_PAIR_LIST :       BAUND_PAIR
698                 |       BAUND_PAIR
699                         HPAREXPSEPARATOR
700                         BAUND_PAIR_LIST
701                 ;
702 BAUND_PAIR      :       EXPRESSION
703                         HLABELSEPARATOR
704                         EXPRESSION
705                 ;
706 SWITCH_LIST     :       EXPRESSION
707                 |       EXPRESSION
708                         HPAREXPSEPARATOR
709                         SWITCH_LIST
710                 ;
711 HEADING         :       MBEE_FMAL_PAR_P HSTATEMENTSEPARATOR {}
712                         MBEE_MODE_PART  {}
713                         MBEE_SPEC_PART  {}
714                         MBEE_PROT_PART  {}
715                         MBEE_VIRT_PART
716                 ;
717 MBEE_FMAL_PAR_P :       /*EMPT*/
718                 |       FMAL_PAR_PART
719                 ;
720 FMAL_PAR_PART   :       HBEGPAR NO_TYPE
721                         MBEE_LISTV HENDPAR
722                 ;
723 MBEE_LISTV      :       /*EMPT*/
724                 |       LISTV
725                 ;
726 LISTV           :       HIDENTIFIER
727                 |       FPP_CATEG HDOTDOTDOT
728                 |       HIDENTIFIER     {}
729                         HPAREXPSEPARATOR LISTV
730                 |       FPP_SPEC
731                 |       FPP_SPEC
732                         HPAREXPSEPARATOR LISTV
733                 ;
734 FPP_HEADING     :       HBEGPAR NO_TYPE
735                         FPP_MBEE_LISTV HENDPAR
736                 ;
737 FPP_MBEE_LISTV  :       /*EMPT*/
738                 |       FPP_LISTV
739                 ;
740 FPP_LISTV       :       FPP_CATEG HDOTDOTDOT
741                 |       FPP_SPEC
742                 |       FPP_SPEC
743                         HPAREXPSEPARATOR LISTV
744                 ;
745 FPP_SPEC        :       FPP_CATEG SPECIFIER HIDENTIFIER
746                 |       FPP_CATEG FPP_PROC_DECL_IN_SPEC
747                 ;
748 FPP_CATEG       :       HNAME HLABELSEPARATOR
749                 |       HVALUE HLABELSEPARATOR
750                 |       HVAR HLABELSEPARATOR
751                 |       /*EMPT*/
752                 ;
753 FPP_PROC_DECL_IN_SPEC:  MBEE_TYPE HPROCEDURE
754                         HIDENTIFIER
755                                         {}
756                         FPP_HEADING {} { /* Yes, two "final" actions. */ }
757                 ;
758 IDENTIFIER_LISTV:       HIDENTIFIER
759                 |       HDOTDOTDOT
760                 |       HIDENTIFIER     {}
761                         HPAREXPSEPARATOR IDENTIFIER_LISTV
762                 ;
763 MBEE_MODE_PART  :       /*EMPT*/
764                 |       MODE_PART
765                 ;
766 MODE_PART       :       NAME_PART
767                 |       VALUE_PART
768                 |       VAR_PART
769                 |       NAME_PART VALUE_PART
770                 |       VALUE_PART NAME_PART
771                 |       NAME_PART VAR_PART
772                 |       VAR_PART NAME_PART
773                 |       VALUE_PART VAR_PART
774                 |       VAR_PART VALUE_PART
775                 |       VAR_PART NAME_PART VALUE_PART
776                 |       NAME_PART VAR_PART VALUE_PART
777                 |       NAME_PART VALUE_PART VAR_PART
778                 |       VAR_PART VALUE_PART NAME_PART
779                 |       VALUE_PART VAR_PART NAME_PART
780                 |       VALUE_PART NAME_PART VAR_PART
781                 ;
782 NAME_PART       :       HNAME           {}
783                         IDENTIFIER_LISTV
784                         HSTATEMENTSEPARATOR
785                 ;
786 VAR_PART        :       HVAR            {}
787                         IDENTIFIER_LISTV
788                         HSTATEMENTSEPARATOR
789                 ;
790 VALUE_PART      :       HVALUE          {}
791                         IDENTIFIER_LISTV HSTATEMENTSEPARATOR
792                 ;
793 MBEE_SPEC_PART  :       /*EMPT*/
794                 |       SPEC_PART
795                 ;
796 SPEC_PART       :       ONE_SPEC
797                 |       SPEC_PART ONE_SPEC
798                 ;
799 ONE_SPEC        :       SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR
800                 |       NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR
801                           {}
802                         PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
803                 |       FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
804                 |       MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR
805                 |       MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR
806                         IDENTIFIER_LIST HSTATEMENTSEPARATOR
807                 ;
808 SPECIFIER       :       TYPE
809                 |       MBEE_TYPE
810                         HARRAY
811                 |       HLABEL
812                 |       HSWITCH
813                 ;
814 PROC_DECL_IN_SPEC:      MBEE_TYPE HPROCEDURE
815                         HIDENTIFIER
816                                         {}
817                         HEADING
818                                         {}
819                         MBEE_BEGIN_END
820                 ;
821 MBEE_BEGIN_END  :       /* EMPTY */
822                 |       HBEGIN HEND
823                 ;
824 MBEE_PROT_PART  :       /*EMPT*/
825                 |       PROTECTION_PART
826                 ;
827 PROTECTION_PART :       PROT_SPECIFIER IDENTIFIER_LIST
828                         HSTATEMENTSEPARATOR
829                 |       PROTECTION_PART  PROT_SPECIFIER
830                         IDENTIFIER_LIST HSTATEMENTSEPARATOR
831                 ;
832 PROT_SPECIFIER  :       HHIDDEN
833                 |       HPROTECTED
834                 |       HHIDDEN
835                         HPROTECTED
836                 |       HPROTECTED
837                         HHIDDEN
838                 ;
839 MBEE_VIRT_PART  :       /*EMPT*/
840                 |       VIRTUAL_PART
841                 ;
842 VIRTUAL_PART    :       HVIRTUAL
843                         HLABELSEPARATOR
844                         MBEE_SPEC_PART
845                 ;
846 IDENTIFIER_LIST :       HIDENTIFIER
847                 |       IDENTIFIER_LIST HPAREXPSEPARATOR
848                         HIDENTIFIER
849                 ;
850 IDENTIFIER_LISTC:       HIDENTIFIER
851                         MBEE_CONSTANT
852                 |       IDENTIFIER_LISTC HPAREXPSEPARATOR
853                         HIDENTIFIER
854                         MBEE_CONSTANT
855                 ;
856 MBEE_CONSTANT   :       /* EMPTY */
857                 |       HVALRELOPERATOR
858                                 {}
859                         EXPRESSION
860                 ;
862 /* GRAMATIKK FOR UTTRYKK */
863 EXPRESSION      :       EXPRESSION_SIMP
864                 |       HIF
865                         EXPRESSION
866                         HTHEN
867                         EXPRESSION
868                         HELSE
869                         EXPRESSION
870                 ;
871 EXPRESSION_SIMP :       EXPRESSION_SIMP
872                         HASSIGN
873                         EXPRESSION
874                 |
876                         EXPRESSION_SIMP
877                         HCONC
878                         EXPRESSION_SIMP
879                 |       EXPRESSION_SIMP HOR
880                         HELSE
881                         EXPRESSION_SIMP
882                         %prec HORELSE
883                 |       EXPRESSION_SIMP HAND
884                         HTHEN
885                         EXPRESSION_SIMP
886                         %prec HANDTHEN
887                 |       EXPRESSION_SIMP
888                         HEQV EXPRESSION_SIMP
889                 |       EXPRESSION_SIMP
890                         HIMP EXPRESSION_SIMP
891                 |       EXPRESSION_SIMP
892                         HOR EXPRESSION_SIMP
893                 |       EXPRESSION_SIMP
894                         HAND EXPRESSION_SIMP
895                 |       HNOT EXPRESSION_SIMP
896                 |       EXPRESSION_SIMP
897                         HVALRELOPERATOR
898                         EXPRESSION_SIMP
899                 |       EXPRESSION_SIMP
900                         HREFRELOPERATOR
901                         EXPRESSION_SIMP
902                 |       EXPRESSION_SIMP
903                         HOBJRELOPERATOR
904                         EXPRESSION_SIMP
905                 |       HTERMOPERATOR
906                         EXPRESSION_SIMP %prec UNEAR
907                 |       EXPRESSION_SIMP
908                         HTERMOPERATOR
909                         EXPRESSION_SIMP
910                 |       EXPRESSION_SIMP
911                         HFACTOROPERATOR
912                         EXPRESSION_SIMP
913                 |       EXPRESSION_SIMP
914                         HPRIMARYOPERATOR
915                         EXPRESSION_SIMP
916                 |       HBEGPAR
917                         EXPRESSION HENDPAR
918                 |       HTEXTKONST
919                 |       HCHARACTERKONST
920                 |       HREALKONST
921                 |       HINTEGERKONST
922                 |       HBOOLEANKONST
923                 |       HNONE
924                 |       HIDENTIFIER
925                                 {}
926                         MBEE_ARG_R_PT
927                 |       HTHIS HIDENTIFIER
928                 |       HNEW
929                         HIDENTIFIER
930                         ARG_R_PT
931                 |       EXPRESSION_SIMP
932                         HDOT
933                         EXPRESSION_SIMP
934                 |       EXPRESSION_SIMP
935                         HQUA HIDENTIFIER
936                 ;
937 ARG_R_PT        :       /*EMPTY*/
938                 |       HBEGPAR
939                         ARGUMENT_LIST HENDPAR
940                 ;
941 MBEE_ARG_R_PT   :       /*EMPTY*/
942                 |       HBEGPAR
943                         ARGUMENT_LIST HENDPAR
944                 ;
945 ARGUMENT_LIST   :       EXPRESSION
946                 |       EXPRESSION
947                         HPAREXPSEPARATOR
948                         ARGUMENT_LIST
949                 ;
953 # Pass plenty of options, to exercise plenty of code, even if we
954 # don't actually check the output.  But SEGV is watching us, and
955 # so might do dmalloc.
956 AT_BISON_CHECK([[--verbose --defines input.y]], 0, [],
957 [[input.y: conflicts: 78 shift/reduce, 10 reduce/reduce
960 AT_CHECK([[grep '^State.*conflicts:' input.output]], 0,
961 [[State 64 conflicts: 14 shift/reduce
962 State 164 conflicts: 1 shift/reduce
963 State 201 conflicts: 33 shift/reduce, 4 reduce/reduce
964 State 206 conflicts: 1 shift/reduce
965 State 240 conflicts: 1 shift/reduce
966 State 335 conflicts: 9 shift/reduce, 2 reduce/reduce
967 State 356 conflicts: 1 shift/reduce
968 State 360 conflicts: 9 shift/reduce, 2 reduce/reduce
969 State 427 conflicts: 9 shift/reduce, 2 reduce/reduce
972 AT_CLEANUP
974 ## ----------------- ##
975 ## GNU pic Grammar.  ##
976 ## ----------------- ##
978 AT_SETUP([GNU pic Grammar])
980 # GNU pic, part of groff.
982 # Bison once reported shift/reduce conflicts that it shouldn't have.
984 AT_DATA([[input.y]],
985 [[%union {}
987 %token LABEL
988 %token VARIABLE
989 %token NUMBER
990 %token TEXT
991 %token COMMAND_LINE
992 %token DELIMITED
993 %token ORDINAL
994 %token TH
995 %token LEFT_ARROW_HEAD
996 %token RIGHT_ARROW_HEAD
997 %token DOUBLE_ARROW_HEAD
998 %token LAST
999 %token UP
1000 %token DOWN
1001 %token LEFT
1002 %token RIGHT
1003 %token BOX
1004 %token CIRCLE
1005 %token ELLIPSE
1006 %token ARC
1007 %token LINE
1008 %token ARROW
1009 %token MOVE
1010 %token SPLINE
1011 %token HEIGHT
1012 %token RADIUS
1013 %token WIDTH
1014 %token DIAMETER
1015 %token FROM
1016 %token TO
1017 %token AT
1018 %token WITH
1019 %token BY
1020 %token THEN
1021 %token SOLID
1022 %token DOTTED
1023 %token DASHED
1024 %token CHOP
1025 %token SAME
1026 %token INVISIBLE
1027 %token LJUST
1028 %token RJUST
1029 %token ABOVE
1030 %token BELOW
1031 %token OF
1032 %token THE
1033 %token WAY
1034 %token BETWEEN
1035 %token AND
1036 %token HERE
1037 %token DOT_N
1038 %token DOT_E
1039 %token DOT_W
1040 %token DOT_S
1041 %token DOT_NE
1042 %token DOT_SE
1043 %token DOT_NW
1044 %token DOT_SW
1045 %token DOT_C
1046 %token DOT_START
1047 %token DOT_END
1048 %token DOT_X
1049 %token DOT_Y
1050 %token DOT_HT
1051 %token DOT_WID
1052 %token DOT_RAD
1053 %token SIN
1054 %token COS
1055 %token ATAN2
1056 %token LOG
1057 %token EXP
1058 %token SQRT
1059 %token K_MAX
1060 %token K_MIN
1061 %token INT
1062 %token RAND
1063 %token SRAND
1064 %token COPY
1065 %token THRU
1066 %token TOP
1067 %token BOTTOM
1068 %token UPPER
1069 %token LOWER
1070 %token SH
1071 %token PRINT
1072 %token CW
1073 %token CCW
1074 %token FOR
1075 %token DO
1076 %token IF
1077 %token ELSE
1078 %token ANDAND
1079 %token OROR
1080 %token NOTEQUAL
1081 %token EQUALEQUAL
1082 %token LESSEQUAL
1083 %token GREATEREQUAL
1084 %token LEFT_CORNER
1085 %token RIGHT_CORNER
1086 %token NORTH
1087 %token SOUTH
1088 %token EAST
1089 %token WEST
1090 %token CENTER
1091 %token END
1092 %token START
1093 %token RESET
1094 %token UNTIL
1095 %token PLOT
1096 %token THICKNESS
1097 %token FILL
1098 %token COLORED
1099 %token OUTLINED
1100 %token SHADED
1101 %token ALIGNED
1102 %token SPRINTF
1103 %token COMMAND
1105 %left '.'
1107 /* this ensures that plot 17 "%g" parses as (plot 17 "%g") */
1108 %left PLOT
1109 %left TEXT SPRINTF
1111 /* give text adjustments higher precedence than TEXT, so that
1112 box "foo" above ljust == box ("foo" above ljust)
1115 %left LJUST RJUST ABOVE BELOW
1117 %left LEFT RIGHT
1118 /* Give attributes that take an optional expression a higher
1119 precedence than left and right, so that eg `line chop left'
1120 parses properly. */
1121 %left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED
1122 %left LABEL
1124 %left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST
1125 %left ORDINAL HERE '`'
1127 %left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '[' /* ] */
1129 /* these need to be lower than '-' */
1130 %left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS
1132 /* these must have higher precedence than CHOP so that `label %prec CHOP'
1133 works */
1134 %left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C
1135 %left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER
1136 %left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END
1138 %left ','
1139 %left OROR
1140 %left ANDAND
1141 %left EQUALEQUAL NOTEQUAL
1142 %left '<' '>' LESSEQUAL GREATEREQUAL
1144 %left BETWEEN OF
1145 %left AND
1147 %left '+' '-'
1148 %left '*' '/' '%'
1149 %right '!'
1150 %right '^'
1154 top:
1155         optional_separator
1156         | element_list
1157         ;
1159 element_list:
1160         optional_separator middle_element_list optional_separator
1161         ;
1163 middle_element_list:
1164         element
1165         | middle_element_list separator element
1166         ;
1168 optional_separator:
1169         /* empty */
1170         | separator
1171         ;
1173 separator:
1174         ';'
1175         | separator ';'
1176         ;
1178 placeless_element:
1179         VARIABLE '=' any_expr
1180         | VARIABLE ':' '=' any_expr
1181         | UP
1182         | DOWN
1183         | LEFT
1184         | RIGHT
1185         | COMMAND_LINE
1186         | COMMAND print_args
1187         | PRINT print_args
1188         | SH
1189                 {}
1190           DELIMITED
1191         | COPY TEXT
1192         | COPY TEXT THRU
1193                 {}
1194           DELIMITED
1195                 {}
1196           until
1197         | COPY THRU
1198                 {}
1199           DELIMITED
1200                 {}
1201           until
1202         | FOR VARIABLE '=' expr TO expr optional_by DO
1203                 {}
1204           DELIMITED
1205         | simple_if
1206         | simple_if ELSE
1207                 {}
1208           DELIMITED
1209         | reset_variables
1210         | RESET
1211         ;
1213 reset_variables:
1214         RESET VARIABLE
1215         | reset_variables VARIABLE
1216         | reset_variables ',' VARIABLE
1217         ;
1219 print_args:
1220         print_arg
1221         | print_args print_arg
1222         ;
1224 print_arg:
1225         expr                                                    %prec ','
1226         | text
1227         | position                                              %prec ','
1228         ;
1230 simple_if:
1231         IF any_expr THEN
1232                 {}
1233         DELIMITED
1234         ;
1236 until:
1237         /* empty */
1238         | UNTIL TEXT
1239         ;
1241 any_expr:
1242         expr
1243         | text_expr
1244         ;
1246 text_expr:
1247         text EQUALEQUAL text
1248         | text NOTEQUAL text
1249         | text_expr ANDAND text_expr
1250         | text_expr ANDAND expr
1251         | expr ANDAND text_expr
1252         | text_expr OROR text_expr
1253         | text_expr OROR expr
1254         | expr OROR text_expr
1255         | '!' text_expr
1256         ;
1258 optional_by:
1259         /* empty */
1260         | BY expr
1261         | BY '*' expr
1262         ;
1264 element:
1265         object_spec
1266         | LABEL ':' optional_separator element
1267         | LABEL ':' optional_separator position_not_place
1268         | LABEL ':' optional_separator place
1269         | '{' {} element_list '}'
1270                 {}
1271           optional_element
1272         | placeless_element
1273         ;
1275 optional_element:
1276         /* empty */
1277         | element
1278         ;
1280 object_spec:
1281         BOX
1282         | CIRCLE
1283         | ELLIPSE
1284         | ARC
1285         | LINE
1286         | ARROW
1287         | MOVE
1288         | SPLINE
1289         | text                                                  %prec TEXT
1290         | PLOT expr
1291         | PLOT expr text
1292         | '['
1293                 {}
1294           element_list ']'
1295         | object_spec HEIGHT expr
1296         | object_spec RADIUS expr
1297         | object_spec WIDTH expr
1298         | object_spec DIAMETER expr
1299         | object_spec expr                                      %prec HEIGHT
1300         | object_spec UP
1301         | object_spec UP expr
1302         | object_spec DOWN
1303         | object_spec DOWN expr
1304         | object_spec RIGHT
1305         | object_spec RIGHT expr
1306         | object_spec LEFT
1307         | object_spec LEFT expr
1308         | object_spec FROM position
1309         | object_spec TO position
1310         | object_spec AT position
1311         | object_spec WITH path
1312         | object_spec WITH position                             %prec ','
1313         | object_spec BY expr_pair
1314         | object_spec THEN
1315         | object_spec SOLID
1316         | object_spec DOTTED
1317         | object_spec DOTTED expr
1318         | object_spec DASHED
1319         | object_spec DASHED expr
1320         | object_spec FILL
1321         | object_spec FILL expr
1322         | object_spec SHADED text
1323         | object_spec COLORED text
1324         | object_spec OUTLINED text
1325         | object_spec CHOP
1326         | object_spec CHOP expr
1327         | object_spec SAME
1328         | object_spec INVISIBLE
1329         | object_spec LEFT_ARROW_HEAD
1330         | object_spec RIGHT_ARROW_HEAD
1331         | object_spec DOUBLE_ARROW_HEAD
1332         | object_spec CW
1333         | object_spec CCW
1334         | object_spec text                                      %prec TEXT
1335         | object_spec LJUST
1336         | object_spec RJUST
1337         | object_spec ABOVE
1338         | object_spec BELOW
1339         | object_spec THICKNESS expr
1340         | object_spec ALIGNED
1341         ;
1343 text:
1344         TEXT
1345         | SPRINTF '(' TEXT sprintf_args ')'
1346         ;
1348 sprintf_args:
1349         /* empty */
1350         | sprintf_args ',' expr
1351         ;
1353 position:
1354         position_not_place
1355         | place
1356         ;
1358 position_not_place:
1359         expr_pair
1360         | position '+' expr_pair
1361         | position '-' expr_pair
1362         | '(' position ',' position ')'
1363         | expr between position AND position
1364         | expr '<' position ',' position '>'
1365         ;
1367 between:
1368         BETWEEN
1369         | OF THE WAY BETWEEN
1370         ;
1372 expr_pair:
1373         expr ',' expr
1374         | '(' expr_pair ')'
1375         ;
1377 place:
1378         /* line at A left == line (at A) left */
1379         label                                                   %prec CHOP
1380         | label corner
1381         | corner label
1382         | corner OF label
1383         | HERE
1384         ;
1386 label:
1387         LABEL
1388         | nth_primitive
1389         | label '.' LABEL
1390         ;
1392 ordinal:
1393         ORDINAL
1394         | '`' any_expr TH
1395         ;
1397 optional_ordinal_last:
1398         LAST
1399         | ordinal LAST
1400         ;
1402 nth_primitive:
1403         ordinal object_type
1404         | optional_ordinal_last object_type
1405         ;
1407 object_type:
1408         BOX
1409         | CIRCLE
1410         | ELLIPSE
1411         | ARC
1412         | LINE
1413         | ARROW
1414         | SPLINE
1415         | '[' ']'
1416         | TEXT
1417         ;
1419 label_path:
1420         '.' LABEL
1421         | label_path '.' LABEL
1422         ;
1424 relative_path:
1425         corner                                                  %prec CHOP
1426         /* give this a lower precedence than LEFT and RIGHT so that
1427            [A: box] with .A left == [A: box] with (.A left) */
1428         | label_path                                            %prec TEXT
1429         | label_path corner
1430         ;
1432 path:
1433         relative_path
1434         | '(' relative_path ',' relative_path ')'
1435                 {}
1436         /* The rest of these rules are a compatibility sop. */
1437         | ORDINAL LAST object_type relative_path
1438         | LAST object_type relative_path
1439         | ORDINAL object_type relative_path
1440         | LABEL relative_path
1441         ;
1443 corner:
1444         DOT_N
1445         | DOT_E
1446         | DOT_W
1447         | DOT_S
1448         | DOT_NE
1449         | DOT_SE
1450         | DOT_NW
1451         | DOT_SW
1452         | DOT_C
1453         | DOT_START
1454         | DOT_END
1455         | TOP
1456         | BOTTOM
1457         | LEFT
1458         | RIGHT
1459         | UPPER LEFT
1460         | LOWER LEFT
1461         | UPPER RIGHT
1462         | LOWER RIGHT
1463         | LEFT_CORNER
1464         | RIGHT_CORNER
1465         | UPPER LEFT_CORNER
1466         | LOWER LEFT_CORNER
1467         | UPPER RIGHT_CORNER
1468         | LOWER RIGHT_CORNER
1469         | NORTH
1470         | SOUTH
1471         | EAST
1472         | WEST
1473         | CENTER
1474         | START
1475         | END
1476         ;
1478 expr:
1479         VARIABLE
1480         | NUMBER
1481         | place DOT_X
1482         | place DOT_Y
1483         | place DOT_HT
1484         | place DOT_WID
1485         | place DOT_RAD
1486         | expr '+' expr
1487         | expr '-' expr
1488         | expr '*' expr
1489         | expr '/' expr
1490         | expr '%' expr
1491         | expr '^' expr
1492         | '-' expr                                              %prec '!'
1493         | '(' any_expr ')'
1494         | SIN '(' any_expr ')'
1495         | COS '(' any_expr ')'
1496         | ATAN2 '(' any_expr ',' any_expr ')'
1497         | LOG '(' any_expr ')'
1498         | EXP '(' any_expr ')'
1499         | SQRT '(' any_expr ')'
1500         | K_MAX '(' any_expr ',' any_expr ')'
1501         | K_MIN '(' any_expr ',' any_expr ')'
1502         | INT '(' any_expr ')'
1503         | RAND '(' any_expr ')'
1504         | RAND '(' ')'
1505         | SRAND '(' any_expr ')'
1506         | expr '<' expr
1507         | expr LESSEQUAL expr
1508         | expr '>' expr
1509         | expr GREATEREQUAL expr
1510         | expr EQUALEQUAL expr
1511         | expr NOTEQUAL expr
1512         | expr ANDAND expr
1513         | expr OROR expr
1514         | '!' expr
1515         ;
1518 # Pass plenty of options, to exercise plenty of code, even if we
1519 # don't actually check the output.  But SEGV is watching us, and
1520 # so might do dmalloc.
1521 AT_BISON_CHECK([[--verbose --defines input.y]], 0, [],
1522 [[input.y:453.11-48: warning: rule useless in parser due to conflicts: path: ORDINAL LAST object_type relative_path
1525 AT_CLEANUP