1 ///////////////////////////////////////////////////////////////////////////////
2 // This file is generated automatically using Prop (version 2.3.6),
3 // last updated on Nov 2, 1999.
4 // The original source file is "ir.ph".
5 ///////////////////////////////////////////////////////////////////////////////
8 ///////////////////////////////////////////////////////////////////////////////
10 // This file contains the definitions for the intermediate data structures
11 // used within the Prop -> C++ translator. Definitions for types, patterns,
12 // decision trees, and pretty printing formats are located here.
14 ///////////////////////////////////////////////////////////////////////////////
15 #ifndef intermediate_representations_h
16 #define intermediate_representations_h
20 ///////////////////////////////////////////////////////////////////////////////
22 // Forward datatype declarations
24 ///////////////////////////////////////////////////////////////////////////////
27 ///////////////////////////////////////////////////////////////////////////////
29 // Forward class definition for Exp
31 ///////////////////////////////////////////////////////////////////////////////
32 #ifndef datatype_Exp_defined
33 #define datatype_Exp_defined
38 ///////////////////////////////////////////////////////////////////////////////
40 // Forward class definition for Stmt
42 ///////////////////////////////////////////////////////////////////////////////
43 #ifndef datatype_Stmt_defined
44 #define datatype_Stmt_defined
46 typedef a_Stmt
* Stmt
;
49 ///////////////////////////////////////////////////////////////////////////////
51 // Forward class definition for Decl
53 ///////////////////////////////////////////////////////////////////////////////
54 #ifndef datatype_Decl_defined
55 #define datatype_Decl_defined
57 typedef a_Decl
* Decl
;
60 ///////////////////////////////////////////////////////////////////////////////
62 // Forward class definition for MatchRule
64 ///////////////////////////////////////////////////////////////////////////////
65 #ifndef datatype_MatchRule_defined
66 #define datatype_MatchRule_defined
68 typedef a_MatchRule
* MatchRule
;
71 ///////////////////////////////////////////////////////////////////////////////
73 // Forward class definition for CollectionDesc
75 ///////////////////////////////////////////////////////////////////////////////
76 #ifndef datatype_CollectionDesc_defined
77 #define datatype_CollectionDesc_defined
78 class a_CollectionDesc
;
79 typedef a_CollectionDesc
* CollectionDesc
;
89 class DatatypeHierarchy
;
92 ///////////////////////////////////////////////////////////////////////////////
94 // Qualifiers determines various implementation characteristics
97 ///////////////////////////////////////////////////////////////////////////////
98 enum { QUALnone
= 0, // no qualifiers
99 QUALprintable
= 1<<0, // pretty printable
100 QUALtracable
= 1<<1, // reference countable
101 QUALcollectable
= 1<<2, // garbage collectable
102 QUALrewritable
= 1<<3, // rewritable
103 QUALrelation
= 1<<4, // a relation
104 QUALpersistent
= 1<<5, // persistent type
105 QUALclass
= 1<<6, // class type
106 QUALconst
= 1<<7, // const
107 QUALunsigned
= 1<<8, // unsigned
108 QUALsigned
= 1<<9, // signed
109 QUALvirtual
= 1<<10, // virtual inheritance
110 QUALextensible
= 1<<11, // extensible type
111 QUALview
= 1<<12, // a view
112 QUALunifiable
= 1<<13, // an unifiable term
113 QUALtaggedpointer
= 1<<14, // use tagged pointers for representation
114 QUALunboxed
= 1<<15, // use unboxed presentation if possible
115 QUALfinalizable
= 1<<16, // object should be finalized
116 QUALapplicative
= 1<<17, // applicative rewrite
117 QUALtreeparser
= 1<<18, // tree parsing
118 QUALparser
= 1<<19, // parser class
119 QUALlexeme
= 1<<20, // usable as tokens
120 QUALbitfield
= 1<<21, // an opcode or opcode bitfield
121 QUALtopdown
= 1<<22, // use topdown tree matching in rewriting
122 QUALvariable
= 1<<23, // unifiable variable
123 QUALgraphtype
= 1<<24, // a graph type
124 QUALgraphnode
= 1<<25, // a graph node
125 QUALgraphedge
= 1<<26, // a graph edge
126 QUALvirtualdestr
= 1<<27, // virtual destructor
127 QUALinline
= 1<<28, // inline methods
128 QUALextern
= 1<<29 // noninline methods
131 ///////////////////////////////////////////////////////////////////////////////
133 // Optimization options
135 ///////////////////////////////////////////////////////////////////////////////
136 enum { OPTnone
= 0, // no optimization
137 OPTtagless
= 1<<0, // omit the embedded variant tag
138 OPTsubclassless
= 1<<1, // omit the subclass hierarchy
139 OPTbaseclassless
= 1<<2, // omit inheritance from base class
140 OPTtaggedpointer
= 1<<3, // embedded the variant tag in lower bits
142 OPTunboxed
= 1<<4, // use unboxed representation if possible
143 OPTtaggedvar
= 1<<5 // tagged variables
146 ///////////////////////////////////////////////////////////////////////////////
150 ///////////////////////////////////////////////////////////////////////////////
154 PRIVATEscope
= 0, PROTECTEDscope
= 1, PUBLICscope
= 2
160 TYbody
= 0, TYformal
= 1, TYsimpleformal
= 2,
167 ISpositive
= 0, ISnegative
= 1, ISneither
= 2
172 ///////////////////////////////////////////////////////////////////////////////
174 // Forward class definition for Ty
176 ///////////////////////////////////////////////////////////////////////////////
177 #ifndef datatype_Ty_defined
178 #define datatype_Ty_defined
185 ///////////////////////////////////////////////////////////////////////////////
187 // Forward class definition for TyCon
189 ///////////////////////////////////////////////////////////////////////////////
190 #ifndef datatype_TyCon_defined
191 #define datatype_TyCon_defined
193 typedef a_TyCon
* TyCon
;
196 # define POINTERtycon (TyCon)0
197 # define REFtycon (TyCon)1
198 # define TUPLEtycon (TyCon)2
199 # define EXTUPLEtycon (TyCon)3
200 # define FUNtycon (TyCon)4
201 # define TYPEtycon (TyCon)5
203 ///////////////////////////////////////////////////////////////////////////////
205 // Forward class definition for Pat
207 ///////////////////////////////////////////////////////////////////////////////
208 #ifndef datatype_Pat_defined
209 #define datatype_Pat_defined
214 # define NOpat (Pat)0
217 NOTpat
= 0, ANDpat
= 1, ORpat
= 2,
218 EQUIVpat
= 3, XORpat
= 4, IMPLIESpat
= 5
223 ///////////////////////////////////////////////////////////////////////////////
225 // Forward class definition for Literal
227 ///////////////////////////////////////////////////////////////////////////////
228 #ifndef datatype_Literal_defined
229 #define datatype_Literal_defined
231 typedef a_Literal
* Literal
;
234 ///////////////////////////////////////////////////////////////////////////////
236 // Forward class definition for Cons
238 ///////////////////////////////////////////////////////////////////////////////
239 #ifndef datatype_Cons_defined
240 #define datatype_Cons_defined
242 typedef a_Cons
* Cons
;
245 # define NOcons (Cons)0
247 ///////////////////////////////////////////////////////////////////////////////
249 // Forward class definition for ProductionSymbol
251 ///////////////////////////////////////////////////////////////////////////////
252 #ifndef datatype_ProductionSymbol_defined
253 #define datatype_ProductionSymbol_defined
254 class a_ProductionSymbol
;
255 typedef a_ProductionSymbol
* ProductionSymbol
;
258 ///////////////////////////////////////////////////////////////////////////////
260 // Forward class definition for Pid
262 ///////////////////////////////////////////////////////////////////////////////
263 #ifndef datatype_Pid_defined
264 #define datatype_Pid_defined
269 # define PERSISTnone (Pid)0
271 ///////////////////////////////////////////////////////////////////////////////
273 // Forward class definition for Inherit
275 ///////////////////////////////////////////////////////////////////////////////
276 #ifndef datatype_Inherit_defined
277 #define datatype_Inherit_defined
279 typedef a_Inherit
* Inherit
;
282 ///////////////////////////////////////////////////////////////////////////////
283 // Definition of type TyQual
284 ///////////////////////////////////////////////////////////////////////////////
288 ///////////////////////////////////////////////////////////////////////////////
289 // Definition of type TyOpt
290 ///////////////////////////////////////////////////////////////////////////////
294 ///////////////////////////////////////////////////////////////////////////////
295 // Definition of type LabTy
296 ///////////////////////////////////////////////////////////////////////////////
298 typedef struct { Id label
; Ty ty
; } LabTy
;
300 ///////////////////////////////////////////////////////////////////////////////
301 // Definition of type LabPat
302 ///////////////////////////////////////////////////////////////////////////////
304 typedef struct { Id label
; Pat pat
; } LabPat
;
306 ///////////////////////////////////////////////////////////////////////////////
307 // Definition of type Inherits
308 ///////////////////////////////////////////////////////////////////////////////
310 typedef a_List
<Inherit
> * Inherits
;
312 ///////////////////////////////////////////////////////////////////////////////
313 // Definition of type Conses
314 ///////////////////////////////////////////////////////////////////////////////
316 typedef a_List
<Cons
> * Conses
;
318 ///////////////////////////////////////////////////////////////////////////////
319 // Definition of type Tys
320 ///////////////////////////////////////////////////////////////////////////////
322 typedef a_List
<Ty
> * Tys
;
324 ///////////////////////////////////////////////////////////////////////////////
325 // Definition of type LabTys
326 ///////////////////////////////////////////////////////////////////////////////
328 typedef a_List
<LabTy
> * LabTys
;
330 ///////////////////////////////////////////////////////////////////////////////
331 // Definition of type Pats
332 ///////////////////////////////////////////////////////////////////////////////
334 typedef a_List
<Pat
> * Pats
;
336 ///////////////////////////////////////////////////////////////////////////////
337 // Definition of type LabPats
338 ///////////////////////////////////////////////////////////////////////////////
340 typedef a_List
<LabPat
> * LabPats
;
342 ///////////////////////////////////////////////////////////////////////////////
343 // Definition of type TyVar
344 ///////////////////////////////////////////////////////////////////////////////
348 ///////////////////////////////////////////////////////////////////////////////
349 // Definition of type TyVars
350 ///////////////////////////////////////////////////////////////////////////////
352 typedef a_List
<TyVar
> * TyVars
;
354 ///////////////////////////////////////////////////////////////////////////////
355 // Definition of type PrintFormats
356 ///////////////////////////////////////////////////////////////////////////////
358 typedef a_List
<ProductionSymbol
> * PrintFormats
;
363 ///////////////////////////////////////////////////////////////////////////////
365 // Base class for datatype Ty
367 ///////////////////////////////////////////////////////////////////////////////
368 class a_Ty
: public MEM
{
371 tag_VARty
= 0, tag_INDty
= 1, tag_QUALty
= 2,
372 tag_TYCONty
= 3, tag_POLYty
= 4, tag_DEFVALty
= 5,
377 const Tag_Ty tag__
; // variant tag
379 inline a_Ty(Tag_Ty t__
) : tag__(t__
) {}
382 inline int boxed(const a_Ty
* x
) { return x
!= 0; }
383 inline int untag(const a_Ty
* x
) { return x
? (x
->tag__
+1) : 0; }
384 ///////////////////////////////////////////////////////////////////////////////
386 // Class for datatype constructor Ty::VARty
388 ///////////////////////////////////////////////////////////////////////////////
389 class Ty_VARty
: public a_Ty
{
393 Ty_VARty (Ty x_VARty
);
396 ///////////////////////////////////////////////////////////////////////////////
398 // Class for datatype constructor Ty::INDty
400 ///////////////////////////////////////////////////////////////////////////////
401 class Ty_INDty
: public a_Ty
{
405 Ty_INDty (Id x_1
, int x_2
);
408 ///////////////////////////////////////////////////////////////////////////////
410 // Class for datatype constructor Ty::QUALty
412 ///////////////////////////////////////////////////////////////////////////////
413 class Ty_QUALty
: public a_Ty
{
417 Ty_QUALty (TyQual x_1
, Ty x_2
);
420 ///////////////////////////////////////////////////////////////////////////////
422 // Class for datatype constructor Ty::TYCONty
424 ///////////////////////////////////////////////////////////////////////////////
425 class Ty_TYCONty
: public a_Ty
{
428 TyCon _1
; a_List
<Ty
> * _2
;
429 Ty_TYCONty (TyCon x_1
, a_List
<Ty
> * x_2
);
432 ///////////////////////////////////////////////////////////////////////////////
434 // Class for datatype constructor Ty::POLYty
436 ///////////////////////////////////////////////////////////////////////////////
437 class Ty_POLYty
: public a_Ty
{
440 Ty _1
; int _2
; TyVar
* _3
;
441 Ty_POLYty (Ty x_1
, int x_2
, TyVar
* x_3
);
444 ///////////////////////////////////////////////////////////////////////////////
446 // Class for datatype constructor Ty::DEFVALty
448 ///////////////////////////////////////////////////////////////////////////////
449 class Ty_DEFVALty
: public a_Ty
{
453 Ty_DEFVALty (Ty x_1
, Exp x_2
);
456 ///////////////////////////////////////////////////////////////////////////////
458 // Class for datatype constructor Ty::NESTEDty
460 ///////////////////////////////////////////////////////////////////////////////
461 class Ty_NESTEDty
: public a_Ty
{
465 Ty_NESTEDty (Ty x_1
, Ty x_2
);
468 ///////////////////////////////////////////////////////////////////////////////
470 // Datatype constructor functions for Ty
472 ///////////////////////////////////////////////////////////////////////////////
473 extern a_Ty
* VARty (Ty x_VARty
);
474 extern a_Ty
* INDty (Id x_1
, int x_2
);
475 extern a_Ty
* QUALty (TyQual x_1
, Ty x_2
);
476 extern a_Ty
* TYCONty (TyCon x_1
, a_List
<Ty
> * x_2
);
477 extern a_Ty
* POLYty (Ty x_1
, int x_2
, TyVar
* x_3
);
478 extern a_Ty
* DEFVALty (Ty x_1
, Exp x_2
);
479 extern a_Ty
* NESTEDty (Ty x_1
, Ty x_2
);
481 ///////////////////////////////////////////////////////////////////////////////
483 // Base class for datatype TyCon
485 ///////////////////////////////////////////////////////////////////////////////
486 class a_TyCon
: public MEM
{
489 tag_IDtycon
= 0, tag_RECORDtycon
= 1, tag_ARRAYtycon
= 2,
490 tag_BITFIELDtycon
= 3, tag_DATATYPEtycon
= 4, tag_COLtycon
= 5,
491 tag_GRAPHtycon
= 6, tag_NODEtycon
= 7, tag_EDGEtycon
= 8
495 const Tag_TyCon tag__
; // variant tag
497 inline a_TyCon(Tag_TyCon t__
) : tag__(t__
) {}
500 inline int boxed(const a_TyCon
* x
) { return (unsigned long)x
>= 6; }
501 inline int untag(const a_TyCon
* x
) { return boxed(x
) ? x
->tag__
+ 6 : (int)x
; }
502 ///////////////////////////////////////////////////////////////////////////////
504 // Class for datatype constructor TyCon::IDtycon
506 ///////////////////////////////////////////////////////////////////////////////
507 class TyCon_IDtycon
: public a_TyCon
{
511 TyCon_IDtycon (Id x_IDtycon
);
514 ///////////////////////////////////////////////////////////////////////////////
516 // Class for datatype constructor TyCon::RECORDtycon
518 ///////////////////////////////////////////////////////////////////////////////
519 class TyCon_RECORDtycon
: public a_TyCon
{
522 a_List
<Id
> * _1
; Bool _2
;
523 TyCon_RECORDtycon (a_List
<Id
> * x_1
, Bool x_2
);
526 ///////////////////////////////////////////////////////////////////////////////
528 // Class for datatype constructor TyCon::ARRAYtycon
530 ///////////////////////////////////////////////////////////////////////////////
531 class TyCon_ARRAYtycon
: public a_TyCon
{
535 TyCon_ARRAYtycon (Exp x_ARRAYtycon
);
538 ///////////////////////////////////////////////////////////////////////////////
540 // Class for datatype constructor TyCon::BITFIELDtycon
542 ///////////////////////////////////////////////////////////////////////////////
543 class TyCon_BITFIELDtycon
: public a_TyCon
{
546 int width
; Bool is_signed
;
547 TyCon_BITFIELDtycon (int x_width
, Bool x_is_signed
= false);
550 ///////////////////////////////////////////////////////////////////////////////
552 // Class for datatype constructor TyCon::DATATYPEtycon
554 ///////////////////////////////////////////////////////////////////////////////
555 class TyCon_DATATYPEtycon
: public a_TyCon
{
558 Id id
; int unit
; int arg
; Cons
* terms
; TyVars tyvars
; Ty polyty
; a_List
<Inherit
> * inherit
; TyQual qualifiers
; TyOpt opt
; a_List
<Decl
> * body
; Exp view_match
; Loc
const * location
; DatatypeHierarchy
* hierarchy
;
559 TyCon_DATATYPEtycon (Id x_id
, int x_unit
, int x_arg
, Cons
* x_terms
, TyVars x_tyvars
, Ty x_polyty
, a_List
<Inherit
> * x_inherit
, TyQual x_qualifiers
, TyOpt x_opt
, a_List
<Decl
> * x_body
, Exp x_view_match
, Loc
const * x_location
, DatatypeHierarchy
* x_hierarchy
= 0);
562 ///////////////////////////////////////////////////////////////////////////////
564 // Class for datatype constructor TyCon::COLtycon
566 ///////////////////////////////////////////////////////////////////////////////
567 class TyCon_COLtycon
: public a_TyCon
{
570 CollectionDesc COLtycon
;
571 TyCon_COLtycon (CollectionDesc x_COLtycon
);
574 ///////////////////////////////////////////////////////////////////////////////
576 // Class for datatype constructor TyCon::GRAPHtycon
578 ///////////////////////////////////////////////////////////////////////////////
579 class TyCon_GRAPHtycon
: public a_TyCon
{
582 GraphTypeDef
* GRAPHtycon
;
583 TyCon_GRAPHtycon (GraphTypeDef
* x_GRAPHtycon
);
586 ///////////////////////////////////////////////////////////////////////////////
588 // Class for datatype constructor TyCon::NODEtycon
590 ///////////////////////////////////////////////////////////////////////////////
591 class TyCon_NODEtycon
: public a_TyCon
{
595 TyCon_NODEtycon (NodeDef
* x_NODEtycon
);
598 ///////////////////////////////////////////////////////////////////////////////
600 // Class for datatype constructor TyCon::EDGEtycon
602 ///////////////////////////////////////////////////////////////////////////////
603 class TyCon_EDGEtycon
: public a_TyCon
{
607 TyCon_EDGEtycon (EdgeDef
* x_EDGEtycon
);
610 ///////////////////////////////////////////////////////////////////////////////
612 // Datatype constructor functions for TyCon
614 ///////////////////////////////////////////////////////////////////////////////
615 extern a_TyCon
* IDtycon (Id x_IDtycon
);
616 extern a_TyCon
* RECORDtycon (a_List
<Id
> * x_1
, Bool x_2
);
617 extern a_TyCon
* ARRAYtycon (Exp x_ARRAYtycon
);
618 extern a_TyCon
* BITFIELDtycon (int x_width
, Bool x_is_signed
= false);
619 extern a_TyCon
* DATATYPEtycon (Id x_id
, int x_unit
, int x_arg
, Cons
* x_terms
, TyVars x_tyvars
, Ty x_polyty
, a_List
<Inherit
> * x_inherit
, TyQual x_qualifiers
, TyOpt x_opt
, a_List
<Decl
> * x_body
, Exp x_view_match
, Loc
const * x_location
, DatatypeHierarchy
* x_hierarchy
= 0);
620 extern a_TyCon
* COLtycon (CollectionDesc x_COLtycon
);
621 extern a_TyCon
* GRAPHtycon (GraphTypeDef
* x_GRAPHtycon
);
622 extern a_TyCon
* NODEtycon (NodeDef
* x_NODEtycon
);
623 extern a_TyCon
* EDGEtycon (EdgeDef
* x_EDGEtycon
);
625 ///////////////////////////////////////////////////////////////////////////////
627 // Base class for datatype Pat
629 ///////////////////////////////////////////////////////////////////////////////
630 class a_Pat
: public MEM
{
633 tag_WILDpat
= 0, tag_INDpat
= 1, tag_POLYpat
= 2,
634 tag_IDpat
= 3, tag_CONSpat
= 4, tag_APPpat
= 5,
635 tag_TYPEDpat
= 6, tag_ASpat
= 7, tag_LITERALpat
= 8,
636 tag_CONTEXTpat
= 9, tag_LEXEMEpat
= 10, tag_ARRAYpat
= 11,
637 tag_TUPLEpat
= 12, tag_EXTUPLEpat
= 13, tag_RECORDpat
= 14,
638 tag_LISTpat
= 15, tag_VECTORpat
= 16, tag_APPENDpat
= 17,
639 tag_GUARDpat
= 18, tag_LOGICALpat
= 19, tag_BACKEDGEpat
= 20,
640 tag_UNIFYpat
= 21, tag_MARKEDpat
= 22
644 const Tag_Pat tag__
; // variant tag
646 inline a_Pat(Tag_Pat t__
) : tag__(t__
) {}
652 inline int boxed(const a_Pat
* x
) { return x
!= 0; }
653 inline int untag(const a_Pat
* x
) { return x
? (x
->tag__
+1) : 0; }
654 ///////////////////////////////////////////////////////////////////////////////
656 // Class for datatype constructor Pat::WILDpat
658 ///////////////////////////////////////////////////////////////////////////////
659 class Pat_WILDpat
: public a_Pat
{
666 ///////////////////////////////////////////////////////////////////////////////
668 // Class for datatype constructor Pat::INDpat
670 ///////////////////////////////////////////////////////////////////////////////
671 class Pat_INDpat
: public a_Pat
{
674 Id _1
; int _2
; Ty _3
;
675 Pat_INDpat (Id x_1
, int x_2
, Ty x_3
);
678 ///////////////////////////////////////////////////////////////////////////////
680 // Class for datatype constructor Pat::POLYpat
682 ///////////////////////////////////////////////////////////////////////////////
683 class Pat_POLYpat
: public a_Pat
{
686 Id _1
; int _2
; Ids _3
; Pat _4
; Exp _5
; Bool _6
;
687 Pat_POLYpat (Id x_1
, int x_2
, Ids x_3
, Pat x_4
, Exp x_5
, Bool x_6
);
690 ///////////////////////////////////////////////////////////////////////////////
692 // Class for datatype constructor Pat::IDpat
694 ///////////////////////////////////////////////////////////////////////////////
695 class Pat_IDpat
: public a_Pat
{
698 Id _1
; Ty _2
; Exp _3
;
699 Pat_IDpat (Id x_1
, Ty x_2
, Exp x_3
);
702 ///////////////////////////////////////////////////////////////////////////////
704 // Class for datatype constructor Pat::CONSpat
706 ///////////////////////////////////////////////////////////////////////////////
707 class Pat_CONSpat
: public a_Pat
{
711 Pat_CONSpat (Cons x_CONSpat
);
714 ///////////////////////////////////////////////////////////////////////////////
716 // Class for datatype constructor Pat::APPpat
718 ///////////////////////////////////////////////////////////////////////////////
719 class Pat_APPpat
: public a_Pat
{
723 Pat_APPpat (Pat x_1
, Pat x_2
);
726 ///////////////////////////////////////////////////////////////////////////////
728 // Class for datatype constructor Pat::TYPEDpat
730 ///////////////////////////////////////////////////////////////////////////////
731 class Pat_TYPEDpat
: public a_Pat
{
735 Pat_TYPEDpat (Pat x_1
, Ty x_2
);
738 ///////////////////////////////////////////////////////////////////////////////
740 // Class for datatype constructor Pat::ASpat
742 ///////////////////////////////////////////////////////////////////////////////
743 class Pat_ASpat
: public a_Pat
{
746 Id _1
; Pat _2
; Ty _3
; Exp _4
;
747 Pat_ASpat (Id x_1
, Pat x_2
, Ty x_3
, Exp x_4
);
750 ///////////////////////////////////////////////////////////////////////////////
752 // Class for datatype constructor Pat::LITERALpat
754 ///////////////////////////////////////////////////////////////////////////////
755 class Pat_LITERALpat
: public a_Pat
{
759 Pat_LITERALpat (Literal x_LITERALpat
);
762 ///////////////////////////////////////////////////////////////////////////////
764 // Class for datatype constructor Pat::CONTEXTpat
766 ///////////////////////////////////////////////////////////////////////////////
767 class Pat_CONTEXTpat
: public a_Pat
{
771 Pat_CONTEXTpat (Conses x_1
, Pat x_2
);
774 ///////////////////////////////////////////////////////////////////////////////
776 // Class for datatype constructor Pat::LEXEMEpat
778 ///////////////////////////////////////////////////////////////////////////////
779 class Pat_LEXEMEpat
: public a_Pat
{
782 Id _1
; Ty _2
; int _3
; Cons
* _4
;
783 Pat_LEXEMEpat (Id x_1
, Ty x_2
, int x_3
, Cons
* x_4
);
786 ///////////////////////////////////////////////////////////////////////////////
788 // Class for datatype constructor Pat::ARRAYpat
790 ///////////////////////////////////////////////////////////////////////////////
791 class Pat_ARRAYpat
: public a_Pat
{
794 a_List
<Pat
> * _1
; Bool _2
;
795 Pat_ARRAYpat (a_List
<Pat
> * x_1
, Bool x_2
);
798 ///////////////////////////////////////////////////////////////////////////////
800 // Class for datatype constructor Pat::TUPLEpat
802 ///////////////////////////////////////////////////////////////////////////////
803 class Pat_TUPLEpat
: public a_Pat
{
806 a_List
<Pat
> * TUPLEpat
;
807 Pat_TUPLEpat (a_List
<Pat
> * x_TUPLEpat
);
810 ///////////////////////////////////////////////////////////////////////////////
812 // Class for datatype constructor Pat::EXTUPLEpat
814 ///////////////////////////////////////////////////////////////////////////////
815 class Pat_EXTUPLEpat
: public a_Pat
{
818 a_List
<Pat
> * EXTUPLEpat
;
819 Pat_EXTUPLEpat (a_List
<Pat
> * x_EXTUPLEpat
);
822 ///////////////////////////////////////////////////////////////////////////////
824 // Class for datatype constructor Pat::RECORDpat
826 ///////////////////////////////////////////////////////////////////////////////
827 class Pat_RECORDpat
: public a_Pat
{
830 a_List
<LabPat
> * _1
; Bool _2
;
831 Pat_RECORDpat (a_List
<LabPat
> * x_1
, Bool x_2
);
834 ///////////////////////////////////////////////////////////////////////////////
836 // Class for datatype constructor Pat::LISTpat
838 ///////////////////////////////////////////////////////////////////////////////
839 class Pat_LISTpat
: public a_Pat
{
842 Cons cons
; Cons nil
; a_List
<Pat
> * head
; Pat tail
;
843 Pat_LISTpat (Cons x_cons
, Cons x_nil
, a_List
<Pat
> * x_head
, Pat x_tail
);
846 ///////////////////////////////////////////////////////////////////////////////
848 // Class for datatype constructor Pat::VECTORpat
850 ///////////////////////////////////////////////////////////////////////////////
851 class Pat_VECTORpat
: public a_Pat
{
854 Cons cons
; Pat len
; Pat array
; a_List
<Pat
> * elements
; Bool head_flex
; Bool tail_flex
;
855 Pat_VECTORpat (Cons x_cons
, Pat x_len
, Pat x_array
, a_List
<Pat
> * x_elements
, Bool x_head_flex
, Bool x_tail_flex
);
858 ///////////////////////////////////////////////////////////////////////////////
860 // Class for datatype constructor Pat::APPENDpat
862 ///////////////////////////////////////////////////////////////////////////////
863 class Pat_APPENDpat
: public a_Pat
{
866 Pat _1
; Pat _2
; Ty _3
;
867 Pat_APPENDpat (Pat x_1
, Pat x_2
, Ty x_3
);
870 ///////////////////////////////////////////////////////////////////////////////
872 // Class for datatype constructor Pat::GUARDpat
874 ///////////////////////////////////////////////////////////////////////////////
875 class Pat_GUARDpat
: public a_Pat
{
879 Pat_GUARDpat (Pat x_1
, Exp x_2
);
882 ///////////////////////////////////////////////////////////////////////////////
884 // Class for datatype constructor Pat::LOGICALpat
886 ///////////////////////////////////////////////////////////////////////////////
887 class Pat_LOGICALpat
: public a_Pat
{
890 LogicalPat _1
; Pat _2
; Pat _3
;
891 Pat_LOGICALpat (LogicalPat x_1
, Pat x_2
, Pat x_3
= NOpat
);
894 ///////////////////////////////////////////////////////////////////////////////
896 // Class for datatype constructor Pat::BACKEDGEpat
898 ///////////////////////////////////////////////////////////////////////////////
899 class Pat_BACKEDGEpat
: public a_Pat
{
902 int _1
; Id _2
; Pat _3
;
903 Pat_BACKEDGEpat (int x_1
, Id x_2
, Pat x_3
);
906 ///////////////////////////////////////////////////////////////////////////////
908 // Class for datatype constructor Pat::UNIFYpat
910 ///////////////////////////////////////////////////////////////////////////////
911 class Pat_UNIFYpat
: public a_Pat
{
915 Pat_UNIFYpat (Pat x_1
, Exp x_2
);
918 ///////////////////////////////////////////////////////////////////////////////
920 // Class for datatype constructor Pat::MARKEDpat
922 ///////////////////////////////////////////////////////////////////////////////
923 class Pat_MARKEDpat
: public a_Pat
{
927 Pat_MARKEDpat (Loc x_1
, Pat x_2
);
930 ///////////////////////////////////////////////////////////////////////////////
932 // Datatype constructor functions for Pat
934 ///////////////////////////////////////////////////////////////////////////////
935 extern a_Pat
* WILDpat ();
936 extern a_Pat
* INDpat (Id x_1
, int x_2
, Ty x_3
);
937 extern a_Pat
* POLYpat (Id x_1
, int x_2
, Ids x_3
, Pat x_4
, Exp x_5
, Bool x_6
);
938 extern a_Pat
* IDpat (Id x_1
, Ty x_2
, Exp x_3
);
939 extern a_Pat
* CONSpat (Cons x_CONSpat
);
940 extern a_Pat
* APPpat (Pat x_1
, Pat x_2
);
941 extern a_Pat
* TYPEDpat (Pat x_1
, Ty x_2
);
942 extern a_Pat
* ASpat (Id x_1
, Pat x_2
, Ty x_3
, Exp x_4
);
943 extern a_Pat
* LITERALpat (Literal x_LITERALpat
);
944 extern a_Pat
* CONTEXTpat (Conses x_1
, Pat x_2
);
945 extern a_Pat
* LEXEMEpat (Id x_1
, Ty x_2
, int x_3
, Cons
* x_4
);
946 extern a_Pat
* ARRAYpat (a_List
<Pat
> * x_1
, Bool x_2
);
947 extern a_Pat
* TUPLEpat (a_List
<Pat
> * x_TUPLEpat
);
948 extern a_Pat
* EXTUPLEpat (a_List
<Pat
> * x_EXTUPLEpat
);
949 extern a_Pat
* RECORDpat (a_List
<LabPat
> * x_1
, Bool x_2
);
950 extern a_Pat
* LISTpat (Cons x_cons
, Cons x_nil
, a_List
<Pat
> * x_head
, Pat x_tail
);
951 extern a_Pat
* VECTORpat (Cons x_cons
, Pat x_len
, Pat x_array
, a_List
<Pat
> * x_elements
, Bool x_head_flex
, Bool x_tail_flex
);
952 extern a_Pat
* APPENDpat (Pat x_1
, Pat x_2
, Ty x_3
);
953 extern a_Pat
* GUARDpat (Pat x_1
, Exp x_2
);
954 extern a_Pat
* LOGICALpat (LogicalPat x_1
, Pat x_2
, Pat x_3
= NOpat
);
955 extern a_Pat
* BACKEDGEpat (int x_1
, Id x_2
, Pat x_3
);
956 extern a_Pat
* UNIFYpat (Pat x_1
, Exp x_2
);
957 extern a_Pat
* MARKEDpat (Loc x_1
, Pat x_2
);
960 ///////////////////////////////////////////////////////////////////////////////
962 // Base class for datatype Literal
964 ///////////////////////////////////////////////////////////////////////////////
965 class a_Literal
: public MEM
{
968 tag_INTlit
= 0, tag_BOOLlit
= 1, tag_CHARlit
= 2,
969 tag_REALlit
= 3, tag_STRINGlit
= 4, tag_REGEXPlit
= 5,
970 tag_QUARKlit
= 6, tag_BIGINTlit
= 7
974 const Tag_Literal tag__
; // variant tag
976 inline a_Literal(Tag_Literal t__
) : tag__(t__
) {}
979 inline int boxed(const a_Literal
*) { return 1; }
980 inline int untag(const a_Literal
* x
) { return x
->tag__
; }
981 ///////////////////////////////////////////////////////////////////////////////
983 // Class for datatype constructor Literal::INTlit
985 ///////////////////////////////////////////////////////////////////////////////
986 class Literal_INTlit
: public a_Literal
{
990 Literal_INTlit (int x_INTlit
);
993 ///////////////////////////////////////////////////////////////////////////////
995 // Class for datatype constructor Literal::BOOLlit
997 ///////////////////////////////////////////////////////////////////////////////
998 class Literal_BOOLlit
: public a_Literal
{
1002 Literal_BOOLlit (Bool x_BOOLlit
);
1005 ///////////////////////////////////////////////////////////////////////////////
1007 // Class for datatype constructor Literal::CHARlit
1009 ///////////////////////////////////////////////////////////////////////////////
1010 class Literal_CHARlit
: public a_Literal
{
1014 Literal_CHARlit (char x_CHARlit
);
1017 ///////////////////////////////////////////////////////////////////////////////
1019 // Class for datatype constructor Literal::REALlit
1021 ///////////////////////////////////////////////////////////////////////////////
1022 class Literal_REALlit
: public a_Literal
{
1026 Literal_REALlit (double x_REALlit
);
1029 ///////////////////////////////////////////////////////////////////////////////
1031 // Class for datatype constructor Literal::STRINGlit
1033 ///////////////////////////////////////////////////////////////////////////////
1034 class Literal_STRINGlit
: public a_Literal
{
1037 char const * STRINGlit
;
1038 Literal_STRINGlit (char const * x_STRINGlit
);
1041 ///////////////////////////////////////////////////////////////////////////////
1043 // Class for datatype constructor Literal::REGEXPlit
1045 ///////////////////////////////////////////////////////////////////////////////
1046 class Literal_REGEXPlit
: public a_Literal
{
1049 char const * REGEXPlit
;
1050 Literal_REGEXPlit (char const * x_REGEXPlit
);
1053 ///////////////////////////////////////////////////////////////////////////////
1055 // Class for datatype constructor Literal::QUARKlit
1057 ///////////////////////////////////////////////////////////////////////////////
1058 class Literal_QUARKlit
: public a_Literal
{
1061 char const * QUARKlit
;
1062 Literal_QUARKlit (char const * x_QUARKlit
);
1065 ///////////////////////////////////////////////////////////////////////////////
1067 // Class for datatype constructor Literal::BIGINTlit
1069 ///////////////////////////////////////////////////////////////////////////////
1070 class Literal_BIGINTlit
: public a_Literal
{
1073 char const * BIGINTlit
;
1074 Literal_BIGINTlit (char const * x_BIGINTlit
);
1077 ///////////////////////////////////////////////////////////////////////////////
1079 // Datatype constructor functions for Literal
1081 ///////////////////////////////////////////////////////////////////////////////
1082 extern a_Literal
* INTlit (int x_INTlit
);
1083 extern a_Literal
* BOOLlit (Bool x_BOOLlit
);
1084 extern a_Literal
* CHARlit (char x_CHARlit
);
1085 extern a_Literal
* REALlit (double x_REALlit
);
1086 extern a_Literal
* STRINGlit (char const * x_STRINGlit
);
1087 extern a_Literal
* REGEXPlit (char const * x_REGEXPlit
);
1088 extern a_Literal
* QUARKlit (char const * x_QUARKlit
);
1089 extern a_Literal
* BIGINTlit (char const * x_BIGINTlit
);
1091 ///////////////////////////////////////////////////////////////////////////////
1093 // Class for datatype constructor Cons::ONEcons
1095 ///////////////////////////////////////////////////////////////////////////////
1096 class a_Cons
: public MEM
{
1099 Id name
; Ty alg_ty
; Ty cons_ty
; Ty ty
; int tag
; PrintFormats print_formats
; Loc
const * location
; a_List
<Inherit
> * inherit
; a_List
<Decl
> * body
; TyOpt opt
; TyQual qual
; Exp view_predicate
; Exp
* view_selectors
; Pat lexeme_pattern
; DatatypeClass
* class_def
;
1100 a_Cons (Id x_name
, Ty x_alg_ty
, Ty x_cons_ty
, Ty x_ty
, int x_tag
, PrintFormats x_print_formats
, Loc
const * x_location
, a_List
<Inherit
> * x_inherit
, a_List
<Decl
> * x_body
, TyOpt x_opt
, TyQual x_qual
, Exp x_view_predicate
, Exp
* x_view_selectors
, Pat x_lexeme_pattern
, DatatypeClass
* x_class_def
= 0);
1102 inline int boxed(const a_Cons
* x
) { return x
!= 0; }
1103 inline int untag(const a_Cons
* x
) { return x
? 1 : 0; }
1104 ///////////////////////////////////////////////////////////////////////////////
1106 // Datatype constructor functions for Cons
1108 ///////////////////////////////////////////////////////////////////////////////
1109 extern a_Cons
* ONEcons (Id x_name
, Ty x_alg_ty
, Ty x_cons_ty
, Ty x_ty
, int x_tag
, PrintFormats x_print_formats
, Loc
const * x_location
, a_List
<Inherit
> * x_inherit
, a_List
<Decl
> * x_body
, TyOpt x_opt
, TyQual x_qual
, Exp x_view_predicate
, Exp
* x_view_selectors
, Pat x_lexeme_pattern
, DatatypeClass
* x_class_def
= 0);
1111 ///////////////////////////////////////////////////////////////////////////////
1113 // Base class for datatype ProductionSymbol
1115 ///////////////////////////////////////////////////////////////////////////////
1116 class a_ProductionSymbol
: public Loc
{
1118 enum Tag_ProductionSymbol
{
1119 tag_TERMsym
= 0, tag_TERMSTRINGsym
= 1, tag_TERMREGEXPsym
= 2,
1120 tag_TOKENsym
= 3, tag_NONTERMsym
= 4, tag_POSNONTERMsym
= 5,
1121 tag_ACTIONsym
= 6, tag_PREDICATEsym
= 7, tag_PRECsym
= 8,
1122 tag_ERRORsym
= 9, tag_SPECIALsym
= 10
1126 const Tag_ProductionSymbol tag__
; // variant tag
1128 inline a_ProductionSymbol(Tag_ProductionSymbol t__
) : tag__(t__
) {}
1131 inline int boxed(const a_ProductionSymbol
*) { return 1; }
1132 inline int untag(const a_ProductionSymbol
* x
) { return x
->tag__
; }
1133 ///////////////////////////////////////////////////////////////////////////////
1135 // Class for datatype constructor ProductionSymbol::TERMsym
1137 ///////////////////////////////////////////////////////////////////////////////
1138 class ProductionSymbol_TERMsym
: public a_ProductionSymbol
{
1142 ProductionSymbol_TERMsym (char x_TERMsym
);
1145 ///////////////////////////////////////////////////////////////////////////////
1147 // Class for datatype constructor ProductionSymbol::TERMSTRINGsym
1149 ///////////////////////////////////////////////////////////////////////////////
1150 class ProductionSymbol_TERMSTRINGsym
: public a_ProductionSymbol
{
1153 char const * TERMSTRINGsym
;
1154 ProductionSymbol_TERMSTRINGsym (char const * x_TERMSTRINGsym
);
1157 ///////////////////////////////////////////////////////////////////////////////
1159 // Class for datatype constructor ProductionSymbol::TERMREGEXPsym
1161 ///////////////////////////////////////////////////////////////////////////////
1162 class ProductionSymbol_TERMREGEXPsym
: public a_ProductionSymbol
{
1165 char const * TERMREGEXPsym
;
1166 ProductionSymbol_TERMREGEXPsym (char const * x_TERMREGEXPsym
);
1169 ///////////////////////////////////////////////////////////////////////////////
1171 // Class for datatype constructor ProductionSymbol::TOKENsym
1173 ///////////////////////////////////////////////////////////////////////////////
1174 class ProductionSymbol_TOKENsym
: public a_ProductionSymbol
{
1178 ProductionSymbol_TOKENsym (Cons x_TOKENsym
);
1181 ///////////////////////////////////////////////////////////////////////////////
1183 // Class for datatype constructor ProductionSymbol::NONTERMsym
1185 ///////////////////////////////////////////////////////////////////////////////
1186 class ProductionSymbol_NONTERMsym
: public a_ProductionSymbol
{
1190 ProductionSymbol_NONTERMsym (Id x_NONTERMsym
);
1193 ///////////////////////////////////////////////////////////////////////////////
1195 // Class for datatype constructor ProductionSymbol::POSNONTERMsym
1197 ///////////////////////////////////////////////////////////////////////////////
1198 class ProductionSymbol_POSNONTERMsym
: public a_ProductionSymbol
{
1202 ProductionSymbol_POSNONTERMsym (int x_POSNONTERMsym
);
1205 ///////////////////////////////////////////////////////////////////////////////
1207 // Class for datatype constructor ProductionSymbol::ACTIONsym
1209 ///////////////////////////////////////////////////////////////////////////////
1210 class ProductionSymbol_ACTIONsym
: public a_ProductionSymbol
{
1213 a_List
<Decl
> * ACTIONsym
;
1214 ProductionSymbol_ACTIONsym (a_List
<Decl
> * x_ACTIONsym
);
1217 ///////////////////////////////////////////////////////////////////////////////
1219 // Class for datatype constructor ProductionSymbol::PREDICATEsym
1221 ///////////////////////////////////////////////////////////////////////////////
1222 class ProductionSymbol_PREDICATEsym
: public a_ProductionSymbol
{
1226 ProductionSymbol_PREDICATEsym (Exp x_PREDICATEsym
);
1229 ///////////////////////////////////////////////////////////////////////////////
1231 // Class for datatype constructor ProductionSymbol::PRECsym
1233 ///////////////////////////////////////////////////////////////////////////////
1234 class ProductionSymbol_PRECsym
: public a_ProductionSymbol
{
1238 ProductionSymbol_PRECsym (Cons x_PRECsym
);
1241 ///////////////////////////////////////////////////////////////////////////////
1243 // Class for datatype constructor ProductionSymbol::ERRORsym
1245 ///////////////////////////////////////////////////////////////////////////////
1246 class ProductionSymbol_ERRORsym
: public a_ProductionSymbol
{
1250 ProductionSymbol_ERRORsym ();
1253 ///////////////////////////////////////////////////////////////////////////////
1255 // Class for datatype constructor ProductionSymbol::SPECIALsym
1257 ///////////////////////////////////////////////////////////////////////////////
1258 class ProductionSymbol_SPECIALsym
: public a_ProductionSymbol
{
1262 ProductionSymbol_SPECIALsym (char x_SPECIALsym
);
1265 ///////////////////////////////////////////////////////////////////////////////
1267 // Datatype constructor functions for ProductionSymbol
1269 ///////////////////////////////////////////////////////////////////////////////
1270 extern a_ProductionSymbol
* TERMsym (char x_TERMsym
);
1271 extern a_ProductionSymbol
* TERMSTRINGsym (char const * x_TERMSTRINGsym
);
1272 extern a_ProductionSymbol
* TERMREGEXPsym (char const * x_TERMREGEXPsym
);
1273 extern a_ProductionSymbol
* TOKENsym (Cons x_TOKENsym
);
1274 extern a_ProductionSymbol
* NONTERMsym (Id x_NONTERMsym
);
1275 extern a_ProductionSymbol
* POSNONTERMsym (int x_POSNONTERMsym
);
1276 extern a_ProductionSymbol
* ACTIONsym (a_List
<Decl
> * x_ACTIONsym
);
1277 extern a_ProductionSymbol
* PREDICATEsym (Exp x_PREDICATEsym
);
1278 extern a_ProductionSymbol
* PRECsym (Cons x_PRECsym
);
1279 extern a_ProductionSymbol
* ERRORsym ();
1280 extern a_ProductionSymbol
* SPECIALsym (char x_SPECIALsym
);
1282 ///////////////////////////////////////////////////////////////////////////////
1284 // Class for datatype constructor Pid::PERSISTid
1286 ///////////////////////////////////////////////////////////////////////////////
1287 class a_Pid
: public MEM
{
1290 char const * PERSISTid
;
1291 a_Pid (char const * x_PERSISTid
);
1293 inline int boxed(const a_Pid
* x
) { return x
!= 0; }
1294 inline int untag(const a_Pid
* x
) { return x
? 1 : 0; }
1295 ///////////////////////////////////////////////////////////////////////////////
1297 // Datatype constructor functions for Pid
1299 ///////////////////////////////////////////////////////////////////////////////
1300 extern a_Pid
* PERSISTid (char const * x_PERSISTid
);
1302 ///////////////////////////////////////////////////////////////////////////////
1304 // Class for datatype constructor Inherit::INHERIT
1306 ///////////////////////////////////////////////////////////////////////////////
1307 class a_Inherit
: public Loc
{
1310 Ty super_class
; Scope scope
; TyQual qualifiers
;
1311 a_Inherit (Ty x_super_class
, Scope x_scope
= PUBLICscope
, TyQual x_qualifiers
= QUALnone
);
1313 inline int boxed(const a_Inherit
*) { return 1; }
1314 inline int untag(const a_Inherit
*) { return 0; }
1315 ///////////////////////////////////////////////////////////////////////////////
1317 // Datatype constructor functions for Inherit
1319 ///////////////////////////////////////////////////////////////////////////////
1320 extern a_Inherit
* INHERIT (Ty x_super_class
, Scope x_scope
= PUBLICscope
, TyQual x_qualifiers
= QUALnone
);
1326 ///////////////////////////////////////////////////////////////////////////////
1328 // Pretty printing methods
1330 ///////////////////////////////////////////////////////////////////////////////
1331 extern std::ostream
& operator << (std::ostream
&, Ids
);
1332 extern std::ostream
& operator << (std::ostream
&, Scope
);
1333 extern std::ostream
& operator << (std::ostream
&, Ty
);
1334 extern std::ostream
& operator << (std::ostream
&,
1339 extern std::ostream
& operator << (std::ostream
&, Pat
);
1340 extern std::ostream
& operator << (std::ostream
&, LabPat
);
1341 extern std::ostream
& operator << (std::ostream
&, a_List
<Pat
> *
1344 extern std::ostream
& operator << (std::ostream
&, a_List
<LabPat
> *
1347 extern std::ostream
& operator << (std::ostream
&, Literal
);
1348 extern std::ostream
& operator << (std::ostream
&, Inherit
);
1349 extern std::ostream
& operator << (std::ostream
&, a_List
<Inherit
> *
1352 extern std::ostream
& operator << (std::ostream
&, Pid
);
1353 extern std::ostream
& print_cons (std::ostream
&, Cons
);
1354 extern void print_parameter (std::ostream
&, Ty
, Id
, Parameter
);
1355 extern void print_tyvars (std::ostream
&, TyVars
, char, char, Bool
);
1356 extern Id
index_of (int, Id
= 0);
1360 ------------------------------- Statistics -------------------------------
1361 Merge matching rules = yes
1362 Number of DFA nodes merged = 0
1363 Number of ifs generated = 0
1364 Number of switches generated = 0
1365 Number of labels = 0
1367 Adaptive matching = enabled
1368 Fast string matching = disabled
1369 Inline downcasts = enabled
1370 --------------------------------------------------------------------------