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