1 /**************************************************************************
4 * Author: Maria M. Gutierrez *
5 * Modified by: Kevin Hammond *
6 * Last date revised: December 13 1991. KH. *
7 * Modification: Haskell 1.1 Syntax. *
10 * Description: This file contains the LALR(1) grammar for Haskell. *
12 * Entry Point: module *
14 * Problems: None known. *
17 * LALR(1) Syntax for Haskell 1.2 *
19 **************************************************************************/
31 #include "constants.h"
34 /**********************************************************************
37 * Imported Variables and Functions *
40 **********************************************************************/
42 static BOOLEAN expect_ccurly = FALSE; /* Used to signal that a CCURLY could be inserted here */
45 extern char *input_filename;
46 static char *the_module_name;
47 static maybe module_exports;
50 extern list reverse_list();
53 /* For FN, PREVPATT and SAMEFN macros */
55 extern BOOLEAN samefn[];
56 extern tree prevpatt[];
57 extern short icontexts;
60 extern int hsplineno, hspcolno;
61 extern int modulelineno;
62 extern int startlineno;
65 /**********************************************************************
68 * Fixity and Precedence Declarations *
71 **********************************************************************/
73 static int Fixity = 0, Precedence = 0;
75 char *ineg PROTO((char *));
77 long source_version = 0;
101 /**********************************************************************
104 * These are lexemes. *
107 **********************************************************************/
110 %token VARID CONID QVARID QCONID
111 VARSYM CONSYM QVARSYM QCONSYM
113 %token INTEGER FLOAT CHAR STRING
114 CHARPRIM STRINGPRIM INTPRIM FLOATPRIM
119 /**********************************************************************
125 **********************************************************************/
127 %token OCURLY CCURLY VCCURLY
128 %token COMMA SEMI OBRACK CBRACK
129 %token WILDCARD BQUOTE OPAREN CPAREN
132 /**********************************************************************
135 * Reserved Operators *
138 **********************************************************************/
140 %token DOTDOT DCOLON EQUAL LAMBDA
141 %token VBAR RARROW LARROW
142 %token AT LAZY DARROW
145 /**********************************************************************
148 * Reserved Identifiers *
151 **********************************************************************/
153 %token CASE CLASS DATA
154 %token DEFAULT DERIVING DO
155 %token ELSE IF IMPORT
156 %token IN INFIX INFIXL
157 %token INFIXR INSTANCE LET
158 %token MODULE NEWTYPE OF
159 %token THEN TYPE WHERE
162 %token CCALL CCALL_GC CASM CASM_GC
165 /**********************************************************************
168 * Special symbols/identifiers which need to be recognised *
171 **********************************************************************/
173 %token MINUS BANG PLUS
174 %token AS HIDING QUALIFIED
177 /**********************************************************************
180 * Special Symbols for the Lexer *
183 **********************************************************************/
185 %token INTERFACE_UPRAGMA SPECIALISE_UPRAGMA
186 %token INLINE_UPRAGMA NOINLINE_UPRAGMA MAGIC_UNFOLDING_UPRAGMA
188 %token SOURCE_UPRAGMA
190 /**********************************************************************
193 * Precedences of the various tokens *
196 **********************************************************************/
201 SCC CASM CCALL CASM_GC CCALL_GC
203 %left VARSYM CONSYM QVARSYM QCONSYM
204 MINUS BQUOTE BANG DARROW PLUS
210 %left OCURLY OBRACK OPAREN
216 /**********************************************************************
219 * Type Declarations *
222 **********************************************************************/
225 %type <ulist> caserest alts alt quals
227 rbinds rbinds1 rpats rpats1 list_exps list_rest
229 constrs constr1 fields
232 pats simple_context simple_context_list
235 impdecls maybeimpdecls impdecl
236 maybefixes fixes fix ops
241 %type <umaybe> maybeexports impspec deriving
243 %type <uliteral> lit_constant
245 %type <utree> exp oexp dexp kexp fexp aexp rbind texps
246 expL oexpL kexpL expLno oexpLno dexpLno kexpLno
247 vallhs funlhs qual leftexp
248 pat cpat bpat apat apatc conpat rpat
249 patk bpatk apatck conpatk
252 %type <uid> MINUS PLUS DARROW AS LAZY
253 VARID CONID VARSYM CONSYM
254 var con varop conop op
255 vark varid varsym varsym_nominus
258 %type <uqid> QVARID QCONID QVARSYM QCONSYM
259 qvarid qconid qvarsym qconsym
260 qvar qcon qvarop qconop qop
261 qvark qconk qtycon qtycls
262 gcon gconk gtycon itycon qop1 qvarop1
265 %type <ubinding> topdecl topdecls letdecls
266 typed datad newtd classd instd defaultd
267 decl decls valdef instdef instdefs
268 maybe_where cbody rinst type_and_maybe_id
270 %type <upbinding> valrhs1 altrest
272 %type <uttype> ctype sigtype sigarrowtype type atype bigatype btype
273 bbtype batype bxtype wierd_atype
274 simple_con_app simple_con_app1 tyvar contype inst_type
276 %type <uconstr> constr constr_after_context field
278 %type <ustring> FLOAT INTEGER INTPRIM
279 FLOATPRIM DOUBLEPRIM CLITLIT
281 %type <uhstring> STRING STRINGPRIM CHAR CHARPRIM
283 %type <uentid> export import
285 %type <ulong> commas importkey get_line_no
287 /**********************************************************************
290 * Start Symbol for the Parser *
293 **********************************************************************/
298 module : modulekey modid maybeexports
300 modulelineno = startlineno;
301 the_module_name = $2;
307 the_module_name = install_literal("Main");
308 module_exports = mknothing();
313 body : ocurly { setstartlineno(); } interface_pragma orestm
314 | vocurly interface_pragma vrestm
317 interface_pragma : /* empty */
318 | INTERFACE_UPRAGMA INTEGER END_UPRAGMA SEMI
320 source_version = atoi($2);
324 orestm : maybeimpdecls maybefixes topdecls ccurly
326 root = mkhmodule(the_module_name,$1,module_exports,
327 $2,$3,source_version,modulelineno);
331 root = mkhmodule(the_module_name,$1,module_exports,
332 Lnil,mknullbind(),source_version,modulelineno);
335 vrestm : maybeimpdecls maybefixes topdecls vccurly
337 root = mkhmodule(the_module_name,$1,module_exports,
338 $2,$3,source_version,modulelineno);
342 root = mkhmodule(the_module_name,$1,module_exports,
343 Lnil,mknullbind(),source_version,modulelineno);
346 maybeexports : /* empty */ { $$ = mknothing(); }
347 | OPAREN export_list CPAREN { $$ = mkjust($2); }
348 | OPAREN export_list COMMA CPAREN { $$ = mkjust($2); }
352 export { $$ = lsing($1); }
353 | export_list COMMA export { $$ = lapp($1, $3); }
356 export : qvar { $$ = mkentid($1); }
357 | gtycon { $$ = mkenttype($1); }
358 | gtycon OPAREN DOTDOT CPAREN { $$ = mkenttypeall($1); }
359 | gtycon OPAREN CPAREN { $$ = mkenttypenamed($1,Lnil); }
360 | gtycon OPAREN enames CPAREN { $$ = mkenttypenamed($1,$3); }
361 | MODULE modid { $$ = mkentmod($2); }
364 enames : ename { $$ = lsing($1); }
365 | enames COMMA ename { $$ = lapp($1,$3); }
372 maybeimpdecls : /* empty */ { $$ = Lnil; }
373 | impdecls SEMI { $$ = $1; }
376 impdecls: impdecl { $$ = $1; }
377 | impdecls SEMI impdecl { $$ = lconc($1,$3); }
381 impdecl : importkey modid impspec
382 { $$ = lsing(mkimport($2,0,mknothing(),$3,$1,startlineno)); }
383 | importkey QUALIFIED modid impspec
384 { $$ = lsing(mkimport($3,1,mknothing(),$4,$1,startlineno)); }
385 | importkey QUALIFIED modid AS modid impspec
386 { $$ = lsing(mkimport($3,1,mkjust($5),$6,$1,startlineno)); }
387 | importkey modid AS modid impspec
388 { $$ = lsing(mkimport($3,1,mkjust($4),$5,$1,startlineno)); }
391 impspec : /* empty */ { $$ = mknothing(); }
392 | OPAREN CPAREN { $$ = mkjust(mkleft(Lnil)); }
393 | OPAREN import_list CPAREN { $$ = mkjust(mkleft($2)); }
394 | OPAREN import_list COMMA CPAREN { $$ = mkjust(mkleft($2)); }
395 | HIDING OPAREN import_list CPAREN { $$ = mkjust(mkright($3)); }
396 | HIDING OPAREN import_list COMMA CPAREN { $$ = mkjust(mkright($3)); }
400 import { $$ = lsing($1); }
401 | import_list COMMA import { $$ = lapp($1, $3); }
404 import : var { $$ = mkentid(mknoqual($1)); }
405 | itycon { $$ = mkenttype($1); }
406 | itycon OPAREN DOTDOT CPAREN { $$ = mkenttypeall($1); }
407 | itycon OPAREN CPAREN { $$ = mkenttypenamed($1,Lnil);}
408 | itycon OPAREN inames CPAREN { $$ = mkenttypenamed($1,$3); }
411 itycon : tycon { $$ = mknoqual($1); }
412 | OBRACK CBRACK { $$ = creategid(NILGID); }
413 | OPAREN CPAREN { $$ = creategid(UNITGID); }
414 | OPAREN commas CPAREN { $$ = creategid($2); }
417 inames : iname { $$ = lsing($1); }
418 | inames COMMA iname { $$ = lapp($1,$3); }
420 iname : var { $$ = mknoqual($1); }
421 | con { $$ = mknoqual($1); }
424 /**********************************************************************
427 * Fixes and Decls etc *
430 **********************************************************************/
432 maybefixes: /* empty */ { $$ = Lnil; }
433 | fixes SEMI { $$ = $1; }
436 fixes : fix { $$ = $1; }
437 | fixes SEMI fix { $$ = lconc($1,$3); }
440 fix : INFIXL INTEGER { Precedence = checkfixity($2); Fixity = INFIXL; }
442 | INFIXR INTEGER { Precedence = checkfixity($2); Fixity = INFIXR; }
444 | INFIX INTEGER { Precedence = checkfixity($2); Fixity = INFIX; }
446 | INFIXL { Fixity = INFIXL; Precedence = 9; }
448 | INFIXR { Fixity = INFIXR; Precedence = 9; }
450 | INFIX { Fixity = INFIX; Precedence = 9; }
454 ops : op { $$ = lsing(mkfixop(mknoqual($1),infixint(Fixity),Precedence,startlineno)); }
455 | ops COMMA op { $$ = lapp($1,mkfixop(mknoqual($3),infixint(Fixity),Precedence,startlineno)); }
459 | topdecls SEMI topdecl
478 topdecl : typed { $$ = $1; FN = NULL; SAMEFN = 0; }
479 | datad { $$ = $1; FN = NULL; SAMEFN = 0; }
480 | newtd { $$ = $1; FN = NULL; SAMEFN = 0; }
481 | classd { $$ = $1; FN = NULL; SAMEFN = 0; }
482 | instd { $$ = $1; FN = NULL; SAMEFN = 0; }
483 | defaultd { $$ = $1; FN = NULL; SAMEFN = 0; }
487 typed : typekey simple_con_app EQUAL type { $$ = mknbind($2,$4,startlineno); }
491 datad : datakey simple_con_app EQUAL constrs deriving
492 { $$ = mktbind(Lnil,$2,$4,$5,startlineno); }
493 | datakey simple_context DARROW simple_con_app EQUAL constrs deriving
494 { $$ = mktbind($2,$4,$6,$7,startlineno); }
497 newtd : newtypekey simple_con_app EQUAL constr1 deriving
498 { $$ = mkntbind(Lnil,$2,$4,$5,startlineno); }
499 | newtypekey simple_context DARROW simple_con_app EQUAL constr1 deriving
500 { $$ = mkntbind($2,$4,$6,$7,startlineno); }
503 deriving: /* empty */ { $$ = mknothing(); }
504 | DERIVING dtyclses { $$ = mkjust($2); }
507 classd : classkey btype DARROW simple_con_app1 cbody
508 /* Context can now be more than simple_context */
509 { $$ = mkcbind(type2context($2),$4,$5,startlineno); }
510 | classkey btype cbody
511 /* We have to say btype rather than simple_con_app1, else
512 we get reduce/reduce errs */
513 { check_class_decl_head($3);
514 $$ = mkcbind(Lnil,$2,$3,startlineno); }
517 cbody : /* empty */ { $$ = mknullbind(); }
518 | WHERE ocurly decls ccurly { checkorder($3); $$ = $3; }
519 | WHERE vocurly decls vccurly { checkorder($3); $$ = $3; }
522 instd : instkey inst_type rinst { $$ = mkibind($2,$3,startlineno); }
526 inst_type : type DARROW type { is_context_format( $3, 0 ); /* Check the instance head */
527 $$ = mkcontext(type2context($1),$3); }
528 | btype { is_context_format( $1, 0 ); /* Check the instance head */
533 rinst : /* empty */ { $$ = mknullbind(); }
534 | WHERE ocurly instdefs ccurly { $$ = $3; }
535 | WHERE vocurly instdefs vccurly { $$ = $3; }
538 defaultd: defaultkey OPAREN types CPAREN { $$ = mkdbind($3,startlineno); }
539 | defaultkey OPAREN CPAREN { $$ = mkdbind(Lnil,startlineno); }
556 Note: if there is an iclasop_pragma here, then we must be
557 doing a class-op in an interface -- unless the user is up
558 to real mischief (ugly, but likely to work).
561 decl : qvarsk DCOLON sigtype
562 { $$ = mksbind($1,$3,startlineno);
563 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
566 /* User-specified pragmas come in as "signatures"...
567 They are similar in that they can appear anywhere in the module,
568 and have to be "joined up" with their related entity.
570 Have left out the case specialising to an overloaded type.
571 Let's get real, OK? (WDP)
573 | SPECIALISE_UPRAGMA qvark DCOLON types_and_maybe_ids END_UPRAGMA
575 $$ = mkvspec_uprag($2, $4, startlineno);
576 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
579 | SPECIALISE_UPRAGMA INSTANCE gtycon atype END_UPRAGMA
581 $$ = mkispec_uprag($3, $4, startlineno);
582 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
585 | SPECIALISE_UPRAGMA DATA gtycon atypes END_UPRAGMA
587 $$ = mkdspec_uprag($3, $4, startlineno);
588 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
591 | INLINE_UPRAGMA qvark END_UPRAGMA
593 $$ = mkinline_uprag($2, startlineno);
594 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
597 | NOINLINE_UPRAGMA qvark END_UPRAGMA
599 $$ = mknoinline_uprag($2, startlineno);
600 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
603 | MAGIC_UNFOLDING_UPRAGMA qvark vark END_UPRAGMA
605 $$ = mkmagicuf_uprag($2, $3, startlineno);
606 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
609 /* end of user-specified pragmas */
612 | /* empty */ { $$ = mknullbind(); PREVPATT = NULL; FN = NULL; SAMEFN = 0; }
615 qvarsk : qvark COMMA qvars_list { $$ = mklcons($1,$3); }
616 | qvark { $$ = lsing($1); }
619 qvars_list: qvar { $$ = lsing($1); }
620 | qvars_list COMMA qvar { $$ = lapp($1,$3); }
623 types_and_maybe_ids :
624 type_and_maybe_id { $$ = lsing($1); }
625 | types_and_maybe_ids COMMA type_and_maybe_id { $$ = lapp($1,$3); }
629 type { $$ = mkvspec_ty_and_id($1,mknothing()); }
630 | type EQUAL qvark { $$ = mkvspec_ty_and_id($1,mkjust($3)); }
633 /**********************************************************************
639 **********************************************************************/
641 /* "DCOLON context => type" vs "DCOLON type" is a problem,
642 because you can't distinguish between
644 foo :: (Baz a, Baz a)
645 bar :: (Baz a, Baz a) => [a] -> [a] -> [a]
647 with one token of lookahead. The HACK is to have "DCOLON ttype"
648 [tuple type] in the first case, then check that it has the right
649 form C a, or (C1 a, C2 b, ... Cn z) and convert it into a
653 /* A sigtype is a rank 2 type; it can have for-alls as function args:
654 f :: All a => (All b => ...) -> Int
656 sigtype : btype DARROW sigarrowtype { $$ = mkcontext(type2context($1),$3); }
660 sigarrowtype : bigatype RARROW sigarrowtype { $$ = mktfun($1,$3); }
661 | btype RARROW sigarrowtype { $$ = mktfun($1,$3); }
665 /* A "big" atype can be a forall-type in brackets. */
666 bigatype: OPAREN btype DARROW type CPAREN { $$ = mkcontext(type2context($2),$4); }
669 /* 1 S/R conflict at DARROW -> shift */
670 ctype : btype DARROW type { $$ = mkcontext(type2context($1),$3); }
674 /* 1 S/R conflict at RARROW -> shift */
675 type : btype RARROW type { $$ = mktfun($1,$3); }
679 btype : btype atype { $$ = mktapp($1,$2); }
683 atype : gtycon { $$ = mktname($1); }
685 | OPAREN type COMMA types CPAREN { $$ = mkttuple(mklcons($2,$4)); }
686 | OBRACK type CBRACK { $$ = mktllist($2); }
687 | OPAREN type CPAREN { $$ = $2; }
691 | OPAREN RARROW CPAREN { $$ = creategid(ARROWGID); }
692 | OBRACK CBRACK { $$ = creategid(NILGID); }
693 | OPAREN CPAREN { $$ = creategid(UNITGID); }
694 | OPAREN commas CPAREN { $$ = creategid($2); }
697 atypes : atype { $$ = lsing($1); }
698 | atypes atype { $$ = lapp($1,$2); }
701 types : type { $$ = lsing($1); }
702 | types COMMA type { $$ = lapp($1,$3); }
705 commas : COMMA { $$ = 1; }
706 | commas COMMA { $$ = $1 + 1; }
709 /**********************************************************************
712 * Declaration stuff *
715 **********************************************************************/
717 /* C a b c, where a,b,c are type variables */
718 /* C can be a class or tycon */
719 simple_con_app: gtycon { $$ = mktname($1); }
720 | simple_con_app1 { $$ = $1; }
723 simple_con_app1: gtycon tyvar { $$ = mktapp(mktname($1),$2); }
724 | simple_con_app tyvar { $$ = mktapp($1, $2); }
727 simple_context : OPAREN simple_context_list CPAREN { $$ = $2; }
728 | simple_con_app1 { $$ = lsing($1); }
731 simple_context_list: simple_con_app1 { $$ = lsing($1); }
732 | simple_context_list COMMA simple_con_app1 { $$ = lapp($1,$3); }
735 constrs : constr { $$ = lsing($1); }
736 | constrs VBAR constr { $$ = lapp($1,$3); }
739 constr : constr_after_context
740 | btype DARROW constr_after_context { $$ = mkconstrcxt ( type2context($1), $3 ); }
743 constr_after_context :
745 /* We have to parse the constructor application as a *type*, else we get
746 into terrible ambiguity problems. Consider the difference between
748 data T = S Int Int Int `R` Int
750 data T = S Int Int Int
752 It isn't till we get to the operator that we discover that the "S" is
753 part of a type in the first, but part of a constructor application in the
757 /* Con !Int (Tree a) */
758 contype { qid tyc; list tys;
759 splittyconapp($1, &tyc, &tys);
760 $$ = mkconstrpre(tyc,tys,hsplineno); }
762 /* !Int `Con` Tree a */
763 | bbtype qconop bbtype { $$ = mkconstrinf($1,$2,$3,hsplineno); }
765 /* (::) (Tree a) Int */
766 | OPAREN qconsym CPAREN batypes { $$ = mkconstrpre($2,$4,hsplineno); }
768 /* Con { op1 :: Int } */
769 | qtycon OCURLY fields CCURLY { $$ = mkconstrrec($1,$3,hsplineno); }
770 | OPAREN qconsym CPAREN OCURLY fields CCURLY { $$ = mkconstrrec($2,$5,hsplineno); }
772 /* 1 S/R conflict on OCURLY -> shift */
775 /* contype has to reduce to a btype unless there are !'s, so that
776 we don't get reduce/reduce conflicts with the second production of constr.
777 But as soon as we see a ! we must switch to using bxtype. */
779 contype : btype { $$ = $1; }
780 | bxtype { $$ = $1; }
783 /* S !Int Bool; at least one ! */
784 bxtype : btype wierd_atype { $$ = mktapp($1, $2); }
785 | bxtype batype { $$ = mktapp($1, $2); }
788 bbtype : btype { $$ = $1; }
789 | wierd_atype { $$ = $1; }
792 batype : atype { $$ = $1; }
793 | wierd_atype { $$ = $1; }
796 /* A wierd atype is one that isn't a regular atype;
797 it starts with a "!", or with a forall. */
798 wierd_atype : BANG bigatype { $$ = mktbang( $2 ); }
799 | BANG atype { $$ = mktbang( $2 ); }
803 batypes : { $$ = Lnil; }
804 | batypes batype { $$ = lapp($1,$2); }
808 fields : field { $$ = lsing($1); }
809 | fields COMMA field { $$ = lapp($1,$3); }
812 field : qvars_list DCOLON ctype { $$ = mkfield($1,$3); }
813 | qvars_list DCOLON BANG atype { $$ = mkfield($1,mktbang($4)); }
814 | qvars_list DCOLON BANG bigatype { $$ = mkfield($1,mktbang($4)); }
817 constr1 : gtycon atype { $$ = lsing(mkconstrnew($1,$2,hsplineno)); }
821 dtyclses: OPAREN dtycls_list CPAREN { $$ = $2; }
822 | OPAREN CPAREN { $$ = Lnil; }
823 | qtycls { $$ = lsing($1); }
826 dtycls_list: qtycls { $$ = lsing($1); }
827 | dtycls_list COMMA qtycls { $$ = lapp($1,$3); }
830 instdefs : /* empty */ { $$ = mknullbind(); }
831 | instdef { $$ = $1; }
832 | instdefs SEMI instdef
844 /* instdef: same as valdef, except certain user-pragmas may appear */
846 SPECIALISE_UPRAGMA qvark DCOLON types_and_maybe_ids END_UPRAGMA
848 $$ = mkvspec_uprag($2, $4, startlineno);
849 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
852 | INLINE_UPRAGMA qvark END_UPRAGMA
854 $$ = mkinline_uprag($2, startlineno);
855 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
858 | NOINLINE_UPRAGMA qvark END_UPRAGMA
860 $$ = mknoinline_uprag($2, startlineno);
861 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
864 | MAGIC_UNFOLDING_UPRAGMA qvark vark END_UPRAGMA
866 $$ = mkmagicuf_uprag($2, $3, startlineno);
867 PREVPATT = NULL; FN = NULL; SAMEFN = 0;
877 tree fn = function($1);
880 if(ttree(fn) == ident)
882 qid fun_id = gident((struct Sident *) fn);
887 else if (ttree(fn) == infixap)
889 qid fun_id = ginffun((struct Sinfixap *) fn);
896 printf("%u\n",startlineno);
898 fprintf(stderr,"%u\tvaldef\n",startlineno);
905 if ( lhs_is_patt($1) )
907 $$ = mkpbind($4, $3);
912 $$ = mkfbind($4, $3);
918 get_line_no : { $$ = startlineno; }
921 vallhs : patk { $$ = $1; }
922 | patk qvarop pat { $$ = mkinfixap($2,$1,$3); }
923 | funlhs { $$ = $1; }
926 funlhs : qvark apat { $$ = mkap(mkident($1),$2); }
927 | funlhs apat { $$ = mkap($1,$2); }
931 valrhs : valrhs1 maybe_where { $$ = lsing(createpat($1, $2)); }
934 valrhs1 : gdrhs { $$ = mkpguards($1); }
935 | EQUAL exp { $$ = mkpnoguards($2); }
938 gdrhs : gd EQUAL exp { $$ = lsing(mkpgdexp($1,$3)); }
939 | gd EQUAL exp gdrhs { $$ = mklcons(mkpgdexp($1,$3),$4); }
943 WHERE ocurly decls ccurly { $$ = $3; }
944 | WHERE vocurly decls vccurly { $$ = $3; }
945 /* A where containing no decls is OK */
946 | WHERE SEMI { $$ = mknullbind(); }
947 | /* empty */ { $$ = mknullbind(); }
950 gd : VBAR quals { $$ = $2; }
954 /**********************************************************************
960 **********************************************************************/
962 exp : oexp DCOLON ctype { $$ = mkrestr($1,$3); }
967 Operators must be left-associative at the same precedence for
968 precedence parsing to work.
970 /* 8 S/R conflicts on qop -> shift */
971 oexp : oexp qop oexp %prec MINUS { $$ = mkinfixap($2,$1,$3); }
976 This comes here because of the funny precedence rules concerning
979 dexp : MINUS kexp { $$ = mknegate($2); }
984 We need to factor out a leading let expression so we can set
985 inpat=TRUE when parsing (non let) expressions inside stmts and quals
987 expLno : oexpLno DCOLON ctype { $$ = mkrestr($1,$3); }
990 oexpLno : oexpLno qop oexp %prec MINUS { $$ = mkinfixap($2,$1,$3); }
993 dexpLno : MINUS kexp { $$ = mknegate($2); }
997 expL : oexpL DCOLON ctype { $$ = mkrestr($1,$3); }
1000 oexpL : oexpL qop oexp %prec MINUS { $$ = mkinfixap($2,$1,$3); }
1005 let/if/lambda/case have higher precedence than infix operators.
1012 /* kexpL = a let expression */
1013 kexpL : letdecls IN exp { $$ = mklet($1,$3); }
1016 /* kexpLno = any other expression more tightly binding than operator application */
1018 { hsincindent(); /* push new context for FN = NULL; */
1019 FN = NULL; /* not actually concerned about indenting */
1020 $<ulong>$ = hsplineno; /* remember current line number */
1025 RARROW exp /* lambda abstraction */
1027 $$ = mklambda($3, $6, $<ulong>2);
1031 | IF {$<ulong>$ = hsplineno;}
1032 exp THEN exp ELSE exp { $$ = mkife($3,$5,$7,$<ulong>2); }
1034 /* Case Expression */
1035 | CASE {$<ulong>$ = hsplineno;}
1036 exp OF caserest { $$ = mkcasee($3,$5,$<ulong>2); }
1039 | DO {$<ulong>$ = hsplineno;}
1040 dorest { $$ = mkdoe($3,$<ulong>2); }
1042 /* CCALL/CASM Expression */
1043 | CCALL ccallid cexps { $$ = mkccall($2,install_literal("n"),$3); }
1044 | CCALL ccallid { $$ = mkccall($2,install_literal("n"),Lnil); }
1045 | CCALL_GC ccallid cexps { $$ = mkccall($2,install_literal("p"),$3); }
1046 | CCALL_GC ccallid { $$ = mkccall($2,install_literal("p"),Lnil); }
1047 | CASM CLITLIT cexps { $$ = mkccall($2,install_literal("N"),$3); }
1048 | CASM CLITLIT { $$ = mkccall($2,install_literal("N"),Lnil); }
1049 | CASM_GC CLITLIT cexps { $$ = mkccall($2,install_literal("P"),$3); }
1050 | CASM_GC CLITLIT { $$ = mkccall($2,install_literal("P"),Lnil); }
1052 /* SCC Expression */
1057 "\"%s\":%d: _scc_ (`set [profiling] cost centre') ignored\n",
1058 input_filename, hsplineno);
1060 $$ = mkpar($3); /* Note the mkpar(). If we don't have it, then
1061 (x >> _scc_ y >> z) parses as (x >> (y >> z)),
1062 right associated. But the precedence reorganiser expects
1063 the parser to *left* associate all operators unless there
1064 are explicit parens. The _scc_ acts like an explicit paren,
1065 so if we omit it we'd better add explicit parens instead. */
1073 fexp : fexp aexp { $$ = mkap($1,$2); }
1077 /* simple expressions */
1078 aexp : qvar { $$ = mkident($1); }
1079 | gcon { $$ = mkident($1); }
1080 | lit_constant { $$ = mklit($1); }
1081 | OPAREN exp CPAREN { $$ = mkpar($2); } /* mkpar: stop infix parsing at ()'s */
1082 | qcon OCURLY rbinds CCURLY { $$ = mkrecord($1,$3); } /* 1 S/R conflict on OCURLY -> shift */
1083 | OBRACK list_exps CBRACK { $$ = mkllist($2); }
1084 | OPAREN exp COMMA texps CPAREN { if (ttree($4) == tuple)
1085 $$ = mktuple(mklcons($2, gtuplelist((struct Stuple *) $4)));
1087 $$ = mktuple(ldub($2, $4)); }
1089 /* only in expressions ... */
1090 | aexp OCURLY rbinds1 CCURLY { $$ = mkrupdate($1,$3); }
1091 | OBRACK exp VBAR quals CBRACK { $$ = mkcomprh($2,$4); }
1092 | OBRACK exp COMMA exp DOTDOT exp CBRACK {$$= mkeenum($2,mkjust($4),mkjust($6)); }
1093 | OBRACK exp COMMA exp DOTDOT CBRACK { $$ = mkeenum($2,mkjust($4),mknothing()); }
1094 | OBRACK exp DOTDOT exp CBRACK { $$ = mkeenum($2,mknothing(),mkjust($4)); }
1095 | OBRACK exp DOTDOT CBRACK { $$ = mkeenum($2,mknothing(),mknothing()); }
1096 | OPAREN oexp qop CPAREN { $$ = mklsection($2,$3); }
1097 | OPAREN qop1 oexp CPAREN { $$ = mkrsection($2,$3); }
1099 /* only in patterns ... */
1100 /* these add 2 S/R conflict with with aexp . OCURLY rbinds CCURLY */
1101 | qvar AT aexp { $$ = mkas($1,$3); }
1102 | LAZY aexp { $$ = mklazyp($2); }
1103 | WILDCARD { $$ = mkwildp(); }
1106 /* ccall arguments */
1107 cexps : cexps aexp { $$ = lapp($1,$2); }
1108 | aexp { $$ = lsing($1); }
1111 caserest: ocurly alts ccurly { $$ = $2; }
1112 | vocurly alts vccurly { $$ = $2; }
1114 dorest : ocurly stmts ccurly { checkdostmts($2); $$ = $2; }
1115 | vocurly stmts vccurly { checkdostmts($2); $$ = $2; }
1118 rbinds : /* empty */ { $$ = Lnil; }
1122 rbinds1 : rbind { $$ = lsing($1); }
1123 | rbinds1 COMMA rbind { $$ = lapp($1,$3); }
1126 rbind : qvar { $$ = mkrbind($1,mknothing()); }
1127 | qvar EQUAL exp { $$ = mkrbind($1,mkjust($3)); }
1130 texps : exp { $$ = mkpar($1); } /* mkpar: so we don't flatten last element in tuple */
1132 { if (ttree($3) == tuple)
1133 $$ = mktuple(mklcons($1, gtuplelist((struct Stuple *) $3)));
1134 else if (ttree($3) == par)
1135 $$ = mktuple(ldub($1, gpare((struct Spar *) $3)));
1137 hsperror("hsparser:texps: panic");
1139 /* right recursion? WDP */
1143 exp { $$ = lsing($1); }
1144 | exp COMMA exp { $$ = mklcons( $1, lsing($3) ); }
1145 | exp COMMA exp COMMA list_rest { $$ = mklcons( $1, mklcons( $3, reverse_list( $5 ))); }
1148 /* Use left recusion for list_rest, because we sometimes get programs with
1149 very long explicit lists. */
1150 list_rest : exp { $$ = lsing($1); }
1151 | list_rest COMMA exp { $$ = mklcons( $3, $1 ); }
1155 exp { $$ = lsing($1); }
1156 | exp COMMA list_exps { $$ = mklcons($1, $3); }
1158 /* right recursion? (WDP)
1160 It has to be this way, though, otherwise you
1161 may do the wrong thing to distinguish between...
1163 [ e1 , e2 .. ] -- an enumeration ...
1164 [ e1 , e2 , e3 ] -- a list
1166 (In fact, if you change the grammar and throw yacc/bison
1167 at it, it *will* do the wrong thing [WDP 94/06])
1170 letdecls: LET ocurly decls ccurly { $$ = $3; }
1171 | LET vocurly decls vccurly { $$ = $3; }
1174 quals : qual { $$ = lsing($1); }
1175 | quals COMMA qual { $$ = lapp($1,$3); }
1178 qual : letdecls { $$ = mkseqlet($1); }
1182 expORpat(LEGIT_EXPR,$1);
1185 expORpat(LEGIT_PATT,$1);
1191 alts : alt { $$ = $1; }
1192 | alts SEMI alt { $$ = lconc($1,$3); }
1195 alt : pat { PREVPATT = $1; } altrest { expORpat(LEGIT_PATT,$1); $$ = lsing($3); PREVPATT = NULL; }
1196 | /* empty */ { $$ = Lnil; }
1199 altrest : gdpat maybe_where { $$ = createpat(mkpguards($1), $2); }
1200 | RARROW exp maybe_where { $$ = createpat(mkpnoguards($2),$3); }
1203 gdpat : gd RARROW exp { $$ = lsing(mkpgdexp($1,$3)); }
1204 | gd RARROW exp gdpat { $$ = mklcons(mkpgdexp($1,$3),$4); }
1207 stmts : stmt { $$ = $1; }
1208 | stmts SEMI stmt { $$ = lconc($1,$3); }
1211 stmt : /* empty */ { $$ = Lnil; }
1212 | letdecls { $$ = lsing(mkseqlet($1)); }
1213 | expL { $$ = lsing(mkdoexp($1,hsplineno)); }
1216 expORpat(LEGIT_EXPR,$1);
1217 $$ = lsing(mkdoexp($1,endlineno));
1219 expORpat(LEGIT_PATT,$1);
1220 $$ = lsing(mkdobind($1,$2,endlineno));
1225 leftexp : LARROW exp { $$ = $2; }
1226 | /* empty */ { $$ = NULL; }
1229 /**********************************************************************
1235 **********************************************************************/
1237 pat : qvar PLUS INTEGER { $$ = mkplusp($1, mkinteger($3)); }
1241 cpat : cpat qconop bpat { $$ = mkinfixap($2,$1,$3); }
1247 | qcon OCURLY rpats CCURLY { $$ = mkrecord($1,$3); }
1248 | MINUS INTEGER { $$ = mknegate(mklit(mkinteger($2))); }
1249 | MINUS FLOAT { $$ = mknegate(mklit(mkfloatr($2))); }
1252 conpat : gcon { $$ = mkident($1); }
1253 | conpat apat { $$ = mkap($1,$2); }
1256 apat : gcon { $$ = mkident($1); }
1257 | qcon OCURLY rpats CCURLY { $$ = mkrecord($1,$3); }
1261 apatc : qvar { $$ = mkident($1); }
1262 | qvar AT apat { $$ = mkas($1,$3); }
1263 | lit_constant { $$ = mklit($1); }
1264 | WILDCARD { $$ = mkwildp(); }
1265 | OPAREN pat CPAREN { $$ = mkpar($2); }
1266 | OPAREN pat COMMA pats CPAREN { $$ = mktuple(mklcons($2,$4)); }
1267 | OBRACK pats CBRACK { $$ = mkllist($2); }
1268 | LAZY apat { $$ = mklazyp($2); }
1272 INTEGER { $$ = mkinteger($1); }
1273 | FLOAT { $$ = mkfloatr($1); }
1274 | CHAR { $$ = mkcharr($1); }
1275 | STRING { $$ = mkstring($1); }
1276 | CHARPRIM { $$ = mkcharprim($1); }
1277 | STRINGPRIM { $$ = mkstringprim($1); }
1278 | INTPRIM { $$ = mkintprim($1); }
1279 | FLOATPRIM { $$ = mkfloatprim($1); }
1280 | DOUBLEPRIM { $$ = mkdoubleprim($1); }
1281 | CLITLIT /* yurble yurble */ { $$ = mkclitlit($1); }
1284 lampats : apat lampats { $$ = mklcons($1,$2); }
1285 | apat { $$ = lsing($1); }
1286 /* right recursion? (WDP) */
1289 pats : pat COMMA pats { $$ = mklcons($1, $3); }
1290 | pat { $$ = lsing($1); }
1291 /* right recursion? (WDP) */
1294 rpats : /* empty */ { $$ = Lnil; }
1298 rpats1 : rpat { $$ = lsing($1); }
1299 | rpats1 COMMA rpat { $$ = lapp($1,$3); }
1302 rpat : qvar { $$ = mkrbind($1,mknothing()); }
1303 | qvar EQUAL pat { $$ = mkrbind($1,mkjust($3)); }
1307 patk : patk qconop bpat { $$ = mkinfixap($2,$1,$3); }
1313 | qconk OCURLY rpats CCURLY { $$ = mkrecord($1,$3); }
1314 | minuskey INTEGER { $$ = mknegate(mklit(mkinteger($2))); }
1315 | minuskey FLOAT { $$ = mknegate(mklit(mkfloatr($2))); }
1318 conpatk : gconk { $$ = mkident($1); }
1319 | conpatk apat { $$ = mkap($1,$2); }
1322 apatck : qvark { $$ = mkident($1); }
1323 | qvark AT apat { $$ = mkas($1,$3); }
1324 | lit_constant { $$ = mklit($1); setstartlineno(); }
1325 | WILDCARD { $$ = mkwildp(); setstartlineno(); }
1326 | oparenkey pat CPAREN { $$ = mkpar($2); }
1327 | oparenkey pat COMMA pats CPAREN { $$ = mktuple(mklcons($2,$4)); }
1328 | obrackkey pats CBRACK { $$ = mkllist($2); }
1329 | lazykey apat { $$ = mklazyp($2); }
1334 | OBRACK CBRACK { $$ = creategid(NILGID); }
1335 | OPAREN CPAREN { $$ = creategid(UNITGID); }
1336 | OPAREN commas CPAREN { $$ = creategid($2); }
1340 | obrackkey CBRACK { $$ = creategid(NILGID); }
1341 | oparenkey CPAREN { $$ = creategid(UNITGID); }
1342 | oparenkey commas CPAREN { $$ = creategid($2); }
1345 /**********************************************************************
1348 * Keywords which record the line start *
1351 **********************************************************************/
1353 importkey: IMPORT { setstartlineno(); $$ = 0; }
1354 | IMPORT SOURCE_UPRAGMA { setstartlineno(); $$ = 1; }
1357 datakey : DATA { setstartlineno();
1360 printf("%u\n",startlineno);
1362 fprintf(stderr,"%u\tdata\n",startlineno);
1367 typekey : TYPE { setstartlineno();
1370 printf("%u\n",startlineno);
1372 fprintf(stderr,"%u\ttype\n",startlineno);
1377 newtypekey : NEWTYPE { setstartlineno();
1380 printf("%u\n",startlineno);
1382 fprintf(stderr,"%u\tnewtype\n",startlineno);
1387 instkey : INSTANCE { setstartlineno();
1390 printf("%u\n",startlineno);
1393 fprintf(stderr,"%u\tinstance\n",startlineno);
1398 defaultkey: DEFAULT { setstartlineno(); }
1401 classkey: CLASS { setstartlineno();
1404 printf("%u\n",startlineno);
1406 fprintf(stderr,"%u\tclass\n",startlineno);
1411 modulekey: MODULE { setstartlineno();
1414 printf("%u\n",startlineno);
1416 fprintf(stderr,"%u\tmodule\n",startlineno);
1421 oparenkey: OPAREN { setstartlineno(); }
1424 obrackkey: OBRACK { setstartlineno(); }
1427 lazykey : LAZY { setstartlineno(); }
1430 minuskey: MINUS { setstartlineno(); }
1434 /**********************************************************************
1437 * Basic qualified/unqualified ids/ops *
1440 **********************************************************************/
1443 | OPAREN qvarsym CPAREN { $$ = $2; }
1446 | OPAREN qconsym CPAREN { $$ = $2; }
1449 | BQUOTE qvarid BQUOTE { $$ = $2; }
1452 | BQUOTE qconid BQUOTE { $$ = $2; }
1458 /* Non "-" op, used in right sections */
1463 /* Non "-" varop, used in right sections */
1465 | varsym_nominus { $$ = mknoqual($1); }
1466 | BQUOTE qvarid BQUOTE { $$ = $2; }
1471 | OPAREN varsym CPAREN { $$ = $2; }
1473 con : tycon /* using tycon removes conflicts */
1474 | OPAREN CONSYM CPAREN { $$ = $2; }
1477 | BQUOTE varid BQUOTE { $$ = $2; }
1480 | BQUOTE CONID BQUOTE { $$ = $2; }
1486 qvark : qvarid { setstartlineno(); $$ = $1; }
1487 | oparenkey qvarsym CPAREN { $$ = $2; }
1489 qconk : qconid { setstartlineno(); $$ = $1; }
1490 | oparenkey qconsym CPAREN { $$ = $2; }
1492 vark : varid { setstartlineno(); $$ = $1; }
1493 | oparenkey varsym CPAREN { $$ = $2; }
1497 | varid { $$ = mknoqual($1); }
1500 | varsym { $$ = mknoqual($1); }
1503 | tycon { $$ = mknoqual($1); } /* using tycon removes conflicts */
1506 | CONSYM { $$ = mknoqual($1); }
1509 | tycon { $$ = mknoqual($1); } /* using tycon removes conflicts */
1512 | tycon { $$ = mknoqual($1); } /* using tycon removes conflicts */
1515 varsym : varsym_nominus
1516 | MINUS { $$ = install_literal("-"); }
1519 /* PLUS, BANG are valid varsyms */
1520 varsym_nominus : VARSYM
1521 | PLUS { $$ = install_literal("+"); }
1522 | BANG { $$ = install_literal("!"); }
1525 /* AS HIDING QUALIFIED are valid varids */
1527 | AS { $$ = install_literal("as"); }
1528 | HIDING { $$ = install_literal("hiding"); }
1529 | QUALIFIED { $$ = install_literal("qualified"); }
1537 tyvar : varid { $$ = mknamedtvar(mknoqual($1)); }
1545 tyvar_list: tyvar { $$ = lsing($1); }
1546 | tyvar_list COMMA tyvar { $$ = lapp($1,$3); }
1550 /**********************************************************************
1553 * Stuff to do with layout *
1556 **********************************************************************/
1558 ocurly : layout OCURLY { hsincindent(); }
1560 vocurly : layout { hssetindent(); }
1563 layout : { hsindentoff(); }
1569 FN = NULL; SAMEFN = 0; PREVPATT = NULL;
1574 vccurly : { expect_ccurly = 1; } vccurly1 { expect_ccurly = 0; }
1580 FN = NULL; SAMEFN = 0; PREVPATT = NULL;
1586 FN = NULL; SAMEFN = 0; PREVPATT = NULL;
1593 /**********************************************************************
1595 * Error Processing and Reporting *
1597 * (This stuff is here in case we want to use Yacc macros and such.) *
1599 **********************************************************************/
1607 hsperror("pattern syntax used in expression");
1611 /* The parser calls "hsperror" when it sees a
1612 `report this and die' error. It sets the stage
1613 and calls "yyerror".
1615 There should be no direct calls in the parser to
1616 "yyerror", except for the one from "hsperror". Thus,
1617 the only other calls will be from the error productions
1618 introduced by yacc/bison/whatever.
1620 We need to be able to recognise the from-error-production
1621 case, because we sometimes want to say, "Oh, never mind",
1622 because the layout rule kicks into action and may save
1626 static BOOLEAN error_and_I_mean_it = FALSE;
1632 error_and_I_mean_it = TRUE;
1636 extern char *yytext;
1643 /* We want to be able to distinguish 'error'-raised yyerrors
1644 from yyerrors explicitly coded by the parser hacker.
1646 if (expect_ccurly && ! error_and_I_mean_it ) {
1650 fprintf(stderr, "%s:%d:%d: %s on input: ",
1651 input_filename, hsplineno, hspcolno + 1, s);
1653 if (yyleng == 1 && *yytext == '\0')
1654 fprintf(stderr, "<EOF>");
1658 format_string(stderr, (unsigned char *) yytext, yyleng);
1661 fputc('\n', stderr);
1663 /* a common problem */
1664 if (strcmp(yytext, "#") == 0)
1665 fprintf(stderr, "\t(Perhaps you forgot a `-cpp' or `-fglasgow-exts' flag?)\n");
1672 format_string(fp, s, len)
1679 case '\0': fputs("\\NUL", fp); break;
1680 case '\007': fputs("\\a", fp); break;
1681 case '\010': fputs("\\b", fp); break;
1682 case '\011': fputs("\\t", fp); break;
1683 case '\012': fputs("\\n", fp); break;
1684 case '\013': fputs("\\v", fp); break;
1685 case '\014': fputs("\\f", fp); break;
1686 case '\015': fputs("\\r", fp); break;
1687 case '\033': fputs("\\ESC", fp); break;
1688 case '\034': fputs("\\FS", fp); break;
1689 case '\035': fputs("\\GS", fp); break;
1690 case '\036': fputs("\\RS", fp); break;
1691 case '\037': fputs("\\US", fp); break;
1692 case '\177': fputs("\\DEL", fp); break;
1697 fprintf(fp, "\\^%c", *s + '@');