diff options
Diffstat (limited to 'frontend/syntax.icl')
-rw-r--r-- | frontend/syntax.icl | 1774 |
1 files changed, 1774 insertions, 0 deletions
diff --git a/frontend/syntax.icl b/frontend/syntax.icl new file mode 100644 index 0000000..abf9140 --- /dev/null +++ b/frontend/syntax.icl @@ -0,0 +1,1774 @@ +implementation module syntax + +import StdEnv, compare_constructor + +import RWSDebug + +import scanner, general, Heap, typeproperties, utilities + +:: Ident = + { id_name :: !String + , id_info :: !SymbolPtr + } + +instance toString Ident +where toString {id_name} = id_name + +instance toString (Import from_symbol) +where toString {import_module} = toString import_module + + +/* Each Identifier is equipped with a pointer to a SymbolTableEntry that is + used for binding the identifier with its definition. +*/ + +:: SymbolTable :== Heap SymbolTableEntry +:: SymbolPtr :== Ptr SymbolTableEntry + +:: SymbolTableEntry = + { ste_kind :: !STE_Kind + , ste_index :: !Index + , ste_def_level :: !Level + , ste_previous :: SymbolTableEntry + } + +:: STE_BoundTypeVariable = { stv_count :: !Int, stv_attribute :: !TypeAttribute, stv_info_ptr :: !TypeVarInfoPtr} + +:: STE_Kind = STE_FunctionOrMacro ![Index] + | STE_Type + | STE_Constructor + | STE_Selector ![Global Index] + | STE_Field !Ident + | STE_Class + | STE_Member + | STE_Instance + | STE_Variable !VarInfoPtr + | STE_TypeVariable !TypeVarInfoPtr + | STE_TypeAttribute !AttrVarInfoPtr + | STE_BoundTypeVariable !STE_BoundTypeVariable + | STE_BoundType !AType + | STE_Imported !STE_Kind !Index + | STE_DclFunction + | STE_Module !(Module (CollectedDefinitions ClassInstance IndexRange)) + | STE_OpenModule !Int !(Module (CollectedDefinitions ClassInstance IndexRange)) + | STE_ClosedModule + | STE_LockedModule + | STE_Empty + | STE_DictType !CheckedTypeDef + | STE_DictCons !ConsDef + | STE_DictField !SelectorDef + | STE_Called ![Index] /* used during macro expansion to indicate that this function is called */ + +:: Global object = + { glob_object :: !object + , glob_module :: !Index + } + +:: Module defs = + { mod_name :: !Ident + , mod_type :: !ModuleKind + , mod_imports :: ![ParsedImport] +// RWS ... + , mod_imported_objects :: ![ImportedObject] +// ... RWS + , mod_defs :: !defs + } + +:: ParsedModule :== Module [ParsedDefinition] +:: ScannedModule :== Module (CollectedDefinitions (ParsedInstance FunDef) IndexRange) + + +:: ModuleKind = MK_Main | MK_Module | MK_System | MK_None + +:: RhsDefsOfType = ConsList ![ParsedConstructor] + | SelectorList !Ident ![ATypeVar] ![ParsedSelector] + | TypeSpec !AType + | EmptyRhs !BITVECT + + +:: CollectedDefinitions instance_kind macro_defs = + { def_types :: ![TypeDef TypeRhs] + , def_constructors :: ![ParsedConstructor] + , def_selectors :: ![ParsedSelector] + , def_macros :: !macro_defs + , def_classes :: ![ClassDef] + , def_members :: ![MemberDef] + , def_funtypes :: ![FunType] + , def_instances :: ![instance_kind] + } + +:: LocalDefs = LocalParsedDefs [ParsedDefinition] | CollectedLocalDefs CollectedLocalDefs + +:: IndexRange = { ir_from :: !Index, ir_to :: !Index } + +:: Index :== Int +NoIndex :== -1 + + +:: Level :== Int +NotALevel :== -1 + +:: CollectedLocalDefs = + { loc_functions :: !IndexRange + , loc_nodes :: ![(Optional SymbolType, NodeDef ParsedExpr)] + } + +:: NodeDef dst = + { nd_dst ::!dst, + nd_alts ::!OptGuardedAlts, + nd_locals ::!LocalDefs + } + +:: Rhs = + { rhs_alts :: !OptGuardedAlts + , rhs_locals :: !LocalDefs + } + +cIsAFunction :== True +cIsNotAFunction :== False + +:: ParsedDefinition + = PD_Function Position Ident Bool [ParsedExpr] Rhs FunKind + | PD_NodeDef Position ParsedExpr Rhs + | PD_Type ParsedTypeDef + | PD_TypeSpec Position Ident Priority (Optional SymbolType) Specials + | PD_Class ClassDef [ParsedDefinition] + | PD_Instance (ParsedInstance ParsedDefinition) + | PD_Instances [ParsedInstance ParsedDefinition] + | PD_Import [ParsedImport] +// RWS ... + | PD_ImportedObjects [ImportedObject] +// ... RWS + | PD_Erroneous + +:: FunKind = FK_Function | FK_Macro | FK_Caf | FK_Unknown + +:: ParsedSelector = + { ps_field_name :: !Ident + , ps_selector_name :: !Ident + , ps_field_type :: !AType + , ps_field_var :: !Ident + , ps_field_pos :: !Position + } + +:: ParsedConstructor = + { pc_cons_name :: !Ident + , pc_cons_arity :: !Int + , pc_exi_vars :: ![ATypeVar] + , pc_arg_types :: ![AType] + , pc_cons_prio :: !Priority + , pc_cons_pos :: !Position + } + +:: ParsedInstance member = + { pi_class :: !Ident + , pi_ident :: !Ident + , pi_types :: ![Type] + , pi_context :: ![TypeContext] + , pi_pos :: !Position + , pi_members :: ![member] + , pi_specials :: !Specials + } + + +:: Specials + = SP_ParsedSubstitutions ![Env Type TypeVar] + | SP_Substitutions ![SpecialSubstitution] + | SP_ContextTypes ![Special] + | SP_FunIndex !Index + | SP_TypeOffset !Int + | SP_None + +:: SpecialSubstitution = + { ss_environ :: !Env Type TypeVar + , ss_context :: ![TypeContext] + , ss_vars :: ![TypeVar] + , ss_attrs :: ![AttributeVar] + } + +:: Special = + { spec_index :: !Global Index + , spec_types :: ![[Type]] + , spec_vars :: ![TypeVar] + , spec_attrs :: ![AttributeVar] + } + + +:: AttrInequality = + { ai_demanded :: !AttributeVar + , ai_offered :: !AttributeVar + } + +:: DefinedSymbol = + { ds_ident :: !Ident + , ds_arity :: !Int + , ds_index :: !Index + } + +:: ClassSymbIdent = + { cs_name :: !Ident + , cs_arity :: !Int + , cs_index :: !Int + } + +:: ClassDef = + { class_name :: !Ident + , class_arity :: !Int + , class_args :: ![TypeVar] + , class_context :: ![TypeContext] + , class_members :: !{# DefinedSymbol} + , class_dictionary :: !DefinedSymbol + , class_pos :: !Position + , class_cons_vars :: !BITVECT + } + +:: MemberDef = + { me_symb :: !Ident + , me_class :: !Global Index + , me_offset :: !Index + , me_type :: !SymbolType + , me_type_ptr :: !VarInfoPtr + , me_class_vars :: ![TypeVar] + , me_pos :: !Position + , me_priority :: !Priority + } + + +:: InstanceType = + { it_vars :: [TypeVar] + , it_types :: ![Type] + , it_attr_vars :: [AttributeVar] + , it_context :: ![TypeContext] + } + +:: ClassInstance = + { ins_class :: !Global DefinedSymbol + , ins_ident :: !Ident + , ins_type :: !InstanceType + , ins_members :: !{# DefinedSymbol} + , ins_specials :: !Specials + , ins_pos :: !Position + } + +:: Import from_symbol = + { import_module :: !Ident + , import_symbols :: ![from_symbol] + , import_file_position:: !(!FileName, !Int) // for error messages // MW++ + } + +:: ParsedImport :== Import ImportDeclaration + +:: ImportedIdent = + { ii_ident :: !Ident + , ii_extended :: !Bool + } + +:: ImportDeclaration = ID_Function !ImportedIdent + | ID_Class !ImportedIdent !(Optional [ImportedIdent]) + | ID_Type !ImportedIdent !(Optional [ImportedIdent]) + | ID_Record !ImportedIdent !(Optional [ImportedIdent]) + | ID_Instance !ImportedIdent !Ident !(![Type],![TypeContext]) + +// MW2 moved some type definitions + +// RWS ... +cIsImportedLibrary :== True +cIsImportedObject :== False +:: ImportedObject = + { io_is_library :: !Bool + , io_name :: !{#Char} + } +// ... RWS + +:: RecordType = + { rt_constructor :: !DefinedSymbol + , rt_fields :: !{# FieldSymbol} + } + +:: FieldSymbol = + { fs_name :: !Ident + , fs_var :: !Ident + , fs_index :: !Index + } + + +:: TypeRhs = AlgType ![DefinedSymbol] + | SynType !AType + | RecordType !RecordType + | AbstractType !BITVECT + | UnknownType + +:: ParsedTypeDef :== TypeDef RhsDefsOfType +:: CheckedTypeDef :== TypeDef TypeRhs + +cAllBitsClear :== 0 + +cIsHyperStrict :== 1 +cIsNonCoercible :== 2 +cMayBeNonCoercible :== 4 + +:: TypeDef type_rhs = + { td_name :: !Ident + , td_index :: !Int + , td_arity :: !Int + , td_args :: ![ATypeVar] + , td_attrs :: ![AttributeVar] + , td_context :: ![TypeContext] + , td_rhs :: !type_rhs + , td_attribute :: !TypeAttribute + , td_pos :: !Position + } + +:: FunType = + { ft_symb :: !Ident + , ft_arity :: !Int + , ft_priority :: !Priority + , ft_type :: !SymbolType + , ft_pos :: !Position + , ft_specials :: !Specials + , ft_type_ptr :: !VarInfoPtr + } + +:: FreeVar = + { fv_def_level :: !Level + , fv_name :: !Ident + , fv_info_ptr :: !VarInfoPtr + , fv_count :: !Int + } + +:: FunCall = + { fc_level :: !Level + , fc_index :: !Index + } + +:: FunInfo = + { fi_calls :: ![FunCall] + , fi_group_index :: !Index + , fi_def_level :: !Level + , fi_free_vars :: ![FreeVar] + , fi_local_vars :: ![FreeVar] + , fi_dynamics :: ![ExprInfoPtr] + } + +:: ParsedBody = + { pb_args :: ![ParsedExpr] + , pb_rhs :: !Rhs + } + +:: CheckedBody = + { cb_args :: ![FreeVar] + , cb_rhs :: ![Expression] + } + +:: TransformedBody = + { tb_args :: ![FreeVar] + , tb_rhs :: !Expression + } + +:: FunctionBody = ParsedBody ![ParsedBody] + | CheckedBody !CheckedBody + /* The next three constructors are used during macro expansion (module transform) */ + | PartioningMacro + | PartioningFunction !CheckedBody !Int + | RhsMacroBody !CheckedBody + /* macro expansion the transforms a CheckedBody into a TransformedBody */ + | TransformedBody !TransformedBody + | Expanding + | BackendBody ![BackendBody] + +:: BackendBody = + { bb_args :: ![FunctionPattern] + , bb_rhs :: !Expression + } + +:: FunDef = + { fun_symb :: !Ident + , fun_arity :: !Int + , fun_priority :: !Priority + , fun_body :: !FunctionBody + , fun_type :: !Optional SymbolType + , fun_pos :: !Position + , fun_index :: !Int + , fun_kind :: !FunKind + , fun_lifted :: !Int +// , fun_type_ptr :: !TypeVarInfoPtr + , fun_info :: !FunInfo + } + +cIsAGlobalVar :== True +cIsALocalVar :== False + +:: ConsClasses = + { cc_size ::!Int + , cc_args ::![ConsClass] + } + +:: ConsClass :== Int + +:: OptionalVariable :== Optional (Bind Ident VarInfoPtr) + +:: AuxiliaryPattern + = AP_Algebraic !(Global DefinedSymbol) !Index [AuxiliaryPattern] OptionalVariable + | AP_Variable !Ident !VarInfoPtr OptionalVariable + | AP_Basic !BasicValue OptionalVariable + | AP_Dynamic !AuxiliaryPattern !DynamicType !OptionalVariable + | AP_Constant !AP_Kind !(Global DefinedSymbol) !Priority + | AP_WildCard OptionalVariable + | AP_Empty !Ident + +:: AP_Kind = APK_Constructor !Index | APK_Macro + +:: VarInfo = VI_Empty | VI_Type !AType | VI_Occurrence !Occurrence | VI_UsedVar (!Ident, ![Int]) | + VI_Expression !Expression | VI_Variable !Ident !VarInfoPtr | VI_LiftedVariable !VarInfoPtr | + VI_Count !Int /* the reference count of a variable */ !Bool /* true if the variable is global, false otherwise */ | + VI_AccVar !ConsClass /* used during fusion to determine accumulating parameters of functions */ | + VI_Alias !BoundVar /* used for resolving aliases just before type checking (in transform) */ | + /* used during elimination and lifting of cases */ + VI_FreeVar !Ident !VarInfoPtr !Int !AType | VI_BoundVar !AType | VI_LocalVar | + VI_Forward !BoundVar | VI_LetVar !LetVarInfo | VI_LetExpression !LetExpressionInfo | VI_CaseVar !VarInfoPtr | + VI_CorrespondenceNumber !Int | VI_SequenceNumber !Int | + VI_Used | /* for indicating that an imported function has been used */ + VI_PropagationType !SymbolType | /* for storing the type with propagation environment of an imported function */ + VI_ExpandedType !SymbolType | /* for storing the (expanded) type of an imported function */ + VI_Record ![AuxiliaryPattern] | + VI_Pattern !AuxiliaryPattern | + VI_Default !Int /* used during conversion of dynamics; the Int indiacted the refenrence count */ + +:: VarInfoPtr :== Ptr VarInfo + +:: LetVarInfo = + { lvi_count :: !Int + , lvi_depth :: !Int + , lvi_new :: !Bool + , lvi_var :: !Ident + , lvi_expression :: !Expression + , lvi_previous :: ![PreviousLetVarInfo] + } + +:: PreviousLetVarInfo = + { plvi_count :: !Int + , plvi_depth :: !Int + , plvi_new :: !Bool + } + +:: LetExpressionStatus = LES_Untouched | LES_Moved | LES_Updated !Expression + +:: LetExpressionInfo = + { lei_count :: !Int + , lei_depth :: !Int + , lei_strict :: !Bool + , lei_var :: !FreeVar + , lei_expression :: !Expression + , lei_status :: !LetExpressionStatus + , lei_type :: !AType + } + +cNotVarNumber :== -1 + +:: BoundVar = + { var_name :: !Ident + , var_info_ptr :: !VarInfoPtr + , var_expr_ptr :: !ExprInfoPtr + } + +:: TypeSymbIdent = + { type_name :: !Ident + , type_arity :: !Int + , type_index :: !Global Index + , type_prop :: !TypeSymbProperties + } + +:: TypeSymbProperties = + { tsp_sign :: !SignClassification + , tsp_propagation :: !PropClassification + , tsp_coercible :: !Bool + } + +:: SymbKind = SK_Unknown + | SK_Function !(Global Index) + | SK_OverloadedFunction !(Global Index) + | SK_Constructor !(Global Index) + | SK_Macro !(Global Index) +// | SK_RecordSelector !(Global Index) + | SK_GeneratedFunction !FunctionInfoPtr !Index + | SK_TypeCode + +// MW2 moved some type definitions + +/* Some auxiliary type definitions used during fusion. Actually, these definitions + should have beengiven in seperate module. Unfortunately, Clean's module system + forbids cyclic dependencies between def modules. + +*/ + +:: FunctionHeap :== Heap FunctionInfo + +:: FunctionInfoPtr :== Ptr FunctionInfo + +:: FunctionInfo = FI_Empty | FI_Function !GeneratedFunction + +:: Producer = PR_Empty + | PR_Function !SymbIdent !Index + | PR_Class !App ![BoundVar] ![Type] +// | PR_Constructor !SymbIdent ![Expression] + | PR_GeneratedFunction !SymbIdent !Index + +:: InstanceInfo = II_Empty | II_Node !{! Producer} !FunctionInfoPtr !InstanceInfo !InstanceInfo + +:: GeneratedFunction = + { gf_fun_def :: !FunDef + , gf_instance_info :: !InstanceInfo + , gf_cons_args :: !ConsClasses + , gf_fun_index :: !Index + } + +/* ... main type definitions continued .... */ + +:: ExpressionHeap :== Heap ExprInfo + +:: ExprInfoPtr :== Ptr ExprInfo + +:: TempLocalVar :== Int + +:: DynamicPtr :== ExprInfoPtr + +:: ExprInfo = EI_Empty + + /* For handling overloading */ + + | EI_Overloaded !OverloadedCall /* initial, set by the type checker */ + | EI_Instance !(Global DefinedSymbol) ![Expression] /* intermedediate, used during resolving of overloading */ + | EI_Selection ![Selection] !BoundVar ![Expression] /* intermedediate, used during resolving of overloading */ + | EI_Context ![Expression] /* intermedediate, used during resolving of overloading */ + + /* For handling dynamics */ + + | EI_Dynamic !(Optional DynamicType) + | EI_DynamicType !DynamicType ![DynamicPtr] + + /* Auxiliary, was EI_DynamicType before checking */ + + | EI_DynamicTypeWithVars ![TypeVar] !DynamicType ![DynamicPtr] + + /* Auxiliary, used during type checking */ + + | EI_TempDynamicType !(Optional DynamicType) !AType ![TypeContext] !ExprInfoPtr !SymbIdent + | EI_TempDynamicPattern ![TypeVar] !DynamicType ![DynamicPtr] ![TempLocalVar] !AType ![TypeContext] !ExprInfoPtr !SymbIdent + + | EI_TypeOfDynamic ![VarInfoPtr] !TypeCodeExpression /* Final */ + | EI_TypeOfDynamicPattern ![VarInfoPtr] !TypeCodeExpression /* Final */ + + | EI_TypeCode !TypeCodeExpression + | EI_TypeCodes ![TypeCodeExpression] + + | EI_Attribute !Int + + + /* EI_FreeVariables is uded to store the (free) variables occurring in the case expression */ + +// | EI_FreeVariables ![UnboundVariable] !ExprInfo + + /* EI_ClassTypes is used to store the instance types of a class These type are used during fusion to generate proper types for + the fusion result (i.e. the resulting function after elimination of dictionaries) */ + + | EI_ClassTypes ![Type] + | EI_CaseType !CaseType + | EI_LetType ![AType] + | EI_CaseTypeAndRefCounts !CaseType !RefCountsInCase + | EI_LetTypeAndRefCounts ![AType] ![Int] + + /* for converting case into function patterns the following auxiliary constuctors are used */ + + | EI_Default !Expression !AType !ExprInfoPtr + | EI_DefaultFunction !SymbIdent ![Expression] + +:: RefCountsInCase = + { rcc_all_variables :: ![CountedVariable] + , rcc_default_variables :: ![CountedVariable] + , rcc_pattern_variables :: ![[CountedVariable]] + } + +:: CountedVariable = + { cv_variable :: !VarInfoPtr + , cv_count :: !Int + } + + +/* + OverloadedCall contains (type) information about functions that are overloaded. This structure is built during type checking + and used after (standard) unification to insert the proper instances of the corresponding functions. + +*/ + +:: OverloadedCall = + { oc_symbol :: !SymbIdent + , oc_context :: ![TypeContext] + , oc_specials :: ![Special] + } + +/* + CaseType contains the type information needed to type the corresponding case construct: + ct_pattern_type : the type of the pattern + ct_result_type : the type of the result (of each pattern) + ct_cons_types : the types of the arguments of each pattern constructor +*/ + +:: CaseType = + { ct_pattern_type :: !AType + , ct_result_type :: !AType + , ct_cons_types :: ![[AType]] + } + + +:: SymbIdent = + { symb_name :: !Ident + , symb_kind :: !SymbKind + , symb_arity :: !Int + } + +:: ConsDef = + { cons_symb :: !Ident + , cons_type :: !SymbolType + , cons_arg_vars :: ![[ATypeVar]] + , cons_priority :: !Priority + , cons_index :: !Index + , cons_type_index :: !Index + , cons_exi_vars :: ![ATypeVar] +// , cons_exi_attrs :: ![AttributeVar] + , cons_type_ptr :: !VarInfoPtr + , cons_pos :: !Position + } + +:: SelectorDef = + { sd_symb :: !Ident + , sd_field :: !Ident + , sd_type :: !SymbolType + , sd_exi_vars :: ![ATypeVar] +// , sd_exi_attrs :: ![AttributeVar] + , sd_field_nr :: !Int + , sd_type_index :: !Int + , sd_type_ptr :: !VarInfoPtr + , sd_pos :: !Position + } + +:: SymbolType = + { st_vars :: ![TypeVar] + , st_args :: ![AType] + , st_arity :: !Int + , st_result :: !AType + , st_context :: ![TypeContext] + , st_attr_vars :: ![AttributeVar] + , st_attr_env :: ![AttrInequality] + } + +:: TypeContext = + { tc_class :: !Global DefinedSymbol + , tc_types :: ![Type] + , tc_var :: !VarInfoPtr + } + +:: AType = + { at_attribute :: !TypeAttribute + , at_annotation :: !Annotation + , at_type :: !Type + } + +:: TempAttrId :== Int +:: TempVarId :== Int + +:: Type = TA !TypeSymbIdent ![AType] + | (-->) infixr 9 !AType !AType + | (:@:) infixl 9 !ConsVariable ![AType] + | TB !BasicType + +// | TFA [ATypeVar] Type + + | GTV !TypeVar + | TV !TypeVar + | TempV !TempVarId /* Auxiliary, used during type checking */ + + + | TQV TypeVar + | TempQV !TempVarId /* Auxiliary, used during type checking */ + + | TLifted !TypeVar /* Auxiliary, used during type checking of lifted arguments */ + | TE + +:: ConsVariable = CV !TypeVar + | TempCV !TempVarId + | TempQCV !TempVarId + + +:: DynamicType = + { dt_uni_vars :: ![ATypeVar] + , dt_global_vars :: ![TypeVar] + , dt_type :: !AType + } + +:: KindHeap :== Heap KindInfo +:: KindInfoPtr :== Ptr KindInfo + +:: KindInfo = KI_Var !KindInfoPtr + | KI_Indirection !KindInfo + | KI_Arrow ![KindInfo] + | KI_Const + + | KI_ConsVar + + | KI_VarBind !KindInfoPtr + | KI_NormVar !Int + + +:: TypeVarInfo = TVI_Empty | TVI_Type !Type | TVI_Forward !TempVarId | TVI_TypeKind !KindInfoPtr + | TVI_SignClass !Index !SignClassification !TypeVarInfo | TVI_PropClass !Index !PropClassification !TypeVarInfo + | TVI_Attribute TypeAttribute + | TVI_CorrespondenceNumber !Int + | TVI_Used /* to adminster that this variable is encountered (in checkOpenTypes) */ + | TVI_TypeCode !TypeCodeExpression + +:: TypeVarInfoPtr :== Ptr TypeVarInfo +:: TypeVarHeap :== Heap TypeVarInfo + +:: AttrVarInfo = AVI_Empty | AVI_Attr !TypeAttribute | AVI_Forward !TempAttrId +:: AttrVarInfoPtr :== Ptr AttrVarInfo +:: AttrVarHeap :== Heap AttrVarInfo + +:: TypeHeaps = + { th_vars :: ! .TypeVarHeap + , th_attrs :: ! .AttrVarHeap + } + +:: TypeVar = + { tv_name :: !Ident + , tv_info_ptr :: !TypeVarInfoPtr + } + + +:: ATypeVar = + { atv_attribute :: !TypeAttribute + , atv_annotation :: !Annotation + , atv_variable :: !TypeVar + } + +:: TypeAttribute = TA_Unique | TA_Multi | TA_Var !AttributeVar | TA_RootVar !AttributeVar | TA_TempVar !Int + | TA_Anonymous | TA_None | TA_List !Int !TypeAttribute | TA_Omega + +:: AttributeVar = + { av_name :: !Ident + , av_info_ptr :: !AttrVarInfoPtr + } + +:: Annotation = AN_Strict | AN_None + +:: BasicType = BT_Int | BT_Char | BT_Real | BT_Bool | BT_Dynamic + | BT_File | BT_World + | BT_String !Type /* the internal string type synonym only used to type string denotations */ + + +:: BasicValue = BVI !String | BVC !String | BVB !Bool | BVR !String | BVS !String + + +:: TypeKind = KindVar !KindInfoPtr | KindConst | KindArrow !Int + +:: Occurrence = + { occ_ref_count :: !ReferenceCount + , occ_bind :: !OccurrenceBinding + , occ_observing :: !Bool + , occ_previous :: ![ReferenceCount] + } + +:: ReferenceCount = RC_Used !RC_Used | RC_Unused + +:: SelectiveUse = { su_field :: !Int, su_multiply :: ![ExprInfoPtr], su_uniquely :: ![ExprInfoPtr] } + +:: RC_Used = { rcu_multiply :: ![ExprInfoPtr], rcu_selectively :: ![SelectiveUse], rcu_uniquely :: ![ExprInfoPtr] } + +:: OccurrenceBinding = OB_Empty | OB_OpenLet !Expression | OB_LockedLet !Expression + | OB_Pattern ![(FreeVar, Int)] !OccurrenceBinding +// | OB_Closed !LetOccurrences | OB_Marked !LetOccurrences + +:: TypeDefInfo = + { tdi_kinds :: ![TypeKind] + , tdi_properties :: !BITVECT + , tdi_group :: ![Global Index] + , tdi_group_nr :: !Int + , tdi_group_vars :: ![Int] + , tdi_cons_vars :: ![Int] + , tdi_classification :: !TypeClassification + } + +:: TypeDefInfos :== {# .{# TypeDefInfo}} + +:: OptGuardedAlts = GuardedAlts ![GuardedExpr] !(Optional ExprWithLocalDefs) + | UnGuardedExpr !ExprWithLocalDefs + +:: GuardedExpr = + { alt_nodes :: ![NodeDefWithLocals] + , alt_guard :: !ParsedExpr + , alt_expr :: !OptGuardedAlts + } + +:: ExprWithLocalDefs = + { ewl_nodes :: ![NodeDefWithLocals] + , ewl_expr :: !ParsedExpr + , ewl_locals :: !LocalDefs + } + +:: NodeDefWithLocals = + { ndwl_strict :: !Bool + , ndwl_def :: !Bind ParsedExpr ParsedExpr + , ndwl_locals :: !LocalDefs + } + + +:: CaseAlt = + { calt_pattern :: !ParsedExpr + , calt_rhs :: !Rhs + } + +:: LocalDef :== ParsedDefinition + +cUniqueSelection :== True +cNonUniqueSelection :== False + +:: ParsedExpr = PE_List ![ParsedExpr] + | PE_Ident !Ident + | PE_Basic !BasicValue + | PE_Bound !BoundExpr + | PE_Lambda !Ident ![ParsedExpr] !ParsedExpr + | PE_Tuple ![ParsedExpr] + | PE_Record !ParsedExpr !(Optional Ident) ![FieldAssignment] + | PE_Array !ParsedExpr ![ElemAssignment] ![Qualifier] + | PE_ArrayDenot ![ParsedExpr] + | PE_Selection !Bool !ParsedExpr ![ParsedSelection] + | PE_Update !ParsedExpr [ParsedSelection] ParsedExpr + | PE_Case !Ident !ParsedExpr [CaseAlt] + | PE_If !Ident !ParsedExpr !ParsedExpr !ParsedExpr + | PE_Let !Bool !LocalDefs !ParsedExpr + | PE_Compr !GeneratorKind !ParsedExpr ![Qualifier] + | PE_Sequ Sequence + | PE_WildCard + | PE_Field !ParsedExpr !(Global FieldSymbol) /* Auxiliary, used during checking */ + + | PE_ABC_Code ![String] !Bool + | PE_Any_Code !(CodeBinding Ident) !(CodeBinding Ident) ![String] + + | PE_DynamicPattern !ParsedExpr !DynamicType + | PE_Dynamic !ParsedExpr !(Optional DynamicType) + | PE_Empty + +:: ParsedSelection = PS_Record !Ident !(Optional Ident) + | PS_Array !ParsedExpr + | PS_Erroneous + + +:: GeneratorKind :== Bool + +cIsListGenerator :== True +cIsArrayGenerator :== False + +:: Generator = + { gen_kind :: !GeneratorKind + , gen_pattern :: !ParsedExpr + , gen_expr :: !ParsedExpr + , gen_var :: !Ident + } + +:: Qualifier = + { qual_generators :: ![Generator] + , qual_filter :: !Optional ParsedExpr + , qual_fun_id :: !Ident + } + +:: Sequence = SQ_FromThen ParsedExpr ParsedExpr + | SQ_FromThenTo ParsedExpr ParsedExpr ParsedExpr + | SQ_From ParsedExpr + | SQ_FromTo ParsedExpr ParsedExpr + +:: BoundExpr :== Bind ParsedExpr Ident + +:: FieldAssignment :== Bind ParsedExpr Ident + +:: ElemAssignment :== Bind ParsedExpr ParsedExpr + +//:: NodeDef :== Bind ParsedExpr ParsedExpr + +cIsStrict :== True +cIsNotStrict :== False + +:: Expression = Var !BoundVar + | App !App + | (@) infixl 9 !Expression ![Expression] + | Let !Let + | Case !Case + | Selection !(Optional (Global DefinedSymbol)) !Expression ![Selection] + | Update !Expression ![Selection] Expression + | RecordUpdate !(Global DefinedSymbol) !Expression ![Bind Expression (Global FieldSymbol)] + | TupleSelect !DefinedSymbol !Int !Expression + | Lambda .[FreeVar] !Expression + | BasicExpr !BasicValue !BasicType + | WildCard + | Conditional !Conditional + + | AnyCodeExpr !(CodeBinding BoundVar) !(CodeBinding FreeVar) ![String] + | ABCCodeExpr ![String] !Bool + + | MatchExpr !(Optional (Global DefinedSymbol)) !(Global DefinedSymbol) !Expression + | FreeVar FreeVar + | Constant !SymbIdent !Int !Priority !Bool /* auxiliary clause used during checking */ + + | DynamicExpr !DynamicExpr +// | TypeCase !TypeCase + + | TypeCodeExpression !TypeCodeExpression + | EE + + +:: CodeBinding variable :== Env String variable + +:: App = + { app_symb :: !SymbIdent + , app_args :: ![Expression] + , app_info_ptr :: !ExprInfoPtr + } + +:: Case = + { case_expr :: !Expression + , case_guards :: !CasePatterns + , case_default :: !Optional Expression + , case_ident :: !Optional Ident + , case_info_ptr :: !ExprInfoPtr + } + +:: Let = + { let_strict :: !Bool + , let_binds :: !(Env Expression FreeVar) + , let_expr :: !Expression + , let_info_ptr :: !ExprInfoPtr + } + + +:: DynamicExpr = + { dyn_expr :: !Expression + , dyn_opt_type :: !Optional DynamicType + , dyn_info_ptr :: !ExprInfoPtr + , dyn_uni_vars :: ![VarInfoPtr] /* filled after type checking */ + , dyn_type_code :: !TypeCodeExpression /* filled after type checking */ + } + +:: CasePatterns = AlgebraicPatterns !(Global Index) ![AlgebraicPattern] + | BasicPatterns !BasicType [BasicPattern] + | DynamicPatterns [DynamicPattern] /* auxiliary */ + | NoPattern /* auxiliary */ + + +:: Selection = RecordSelection !(Global DefinedSymbol) !Int + | ArraySelection !(Global DefinedSymbol) !ExprInfoPtr !Expression + | DictionarySelection !BoundVar ![Selection] !ExprInfoPtr !Expression + +:: TypeCodeExpression = TCE_Empty | TCE_Var !VarInfoPtr | TCE_Constructor !Index ![TypeCodeExpression] | TCE_Selector ![Selection] !VarInfoPtr + +:: GlobalTCType = GTT_Basic !BasicType | GTT_Constructor !TypeSymbIdent | GTT_Function + +:: FunctionPattern = FP_Basic !BasicValue !(Optional FreeVar) + | FP_Algebraic !(Global DefinedSymbol) ![FunctionPattern] !(Optional FreeVar) + | FP_Variable !FreeVar + | FP_Dynamic ![VarInfoPtr] !FreeVar !TypeCodeExpression !(Optional FreeVar) + | FP_Empty + +:: AlgebraicPattern = + { ap_symbol :: !(Global DefinedSymbol) + , ap_vars :: ![FreeVar] + , ap_expr :: !Expression + } + +:: BasicPattern = + { bp_value :: !BasicValue + , bp_expr :: !Expression + } + +:: TypeCase = + { type_case_dynamic :: !Expression + , type_case_patterns :: ![DynamicPattern] + , type_case_default :: !Optional Expression + , type_case_info_ptr :: !ExprInfoPtr + } + +:: DynamicPattern = + { dp_var :: !FreeVar + , dp_type :: !ExprInfoPtr + , dp_type_patterns_vars :: ![VarInfoPtr] /* filled after type checking */ + , dp_type_code :: !TypeCodeExpression /* filled after type checking */ + , dp_rhs :: !Expression + } + + +:: Conditional = + { if_cond :: !Expression + , if_then :: !Expression + , if_else :: !Optional Expression + } + +/* + error handling +*/ + +:: Position = FunPos FileName LineNr FunctName + | LinePos FileName LineNr + | PreDefPos Ident + | NoPos + +:: IdentPos = + { ip_ident :: !Ident + , ip_line :: !Int + , ip_file :: !FileName + } + + +:: FileName :== String + +:: FunctName :== String + +:: LineNr :== Int + +cNotALineNumber :== -1 + +/* Used for hashing identifiers */ + +class needs_brackets a :: a -> Bool + +instance == BoundVar +where + (==) varid1 varid2 + = varid1.var_name == varid2.var_name + +instance == Ident +where + (==) id1 id2 + = id1.id_info == id2.id_info + +instance needs_brackets AType +where + needs_brackets {at_type} + = needs_brackets at_type + +instance needs_brackets Type +where + needs_brackets (TA {type_arity} _) + = type_arity > 0 + needs_brackets (_ --> _) + = True + needs_brackets (_ :@: _) + = True +/* needs_brackets (TFA _ _) + = True +*/ needs_brackets _ + = False + +instance needs_brackets Expression +where + needs_brackets (App app) + = app.app_symb.symb_arity > 0 + needs_brackets (_ @ _) + = True + needs_brackets (Let _) + = True + needs_brackets (Case _) + = True + needs_brackets (Lambda _ _) + = True + needs_brackets (Selection _ _ _) + = True + needs_brackets _ + = False + +instance needs_brackets a +where + needs_brackets _ = False + + +instance <<< BasicType +where + (<<<) file BT_Int = file <<< "Int" + (<<<) file BT_Char = file <<< "Char" + (<<<) file BT_Real = file <<< "Real" + (<<<) file BT_Bool = file <<< "Bool" +/* (<<<) file (BT_String _) = file <<< "String" */ + (<<<) file BT_Dynamic = file <<< "Dynamic" + (<<<) file BT_File = file <<< "File" + (<<<) file BT_World = file <<< "World" + +instance <<< TypeVar +where + (<<<) file varid = file <<< varid.tv_name <<< '[' <<< ptrToInt varid.tv_info_ptr <<< ']' + +instance <<< AttributeVar +where + (<<<) file {av_name,av_info_ptr} = file <<< av_name <<< '[' <<< ptrToInt av_info_ptr <<< ']' + +instance toString AttributeVar +where + toString {av_name,av_info_ptr} = toString av_name + "[" + toString (ptrToInt av_info_ptr) + "]" + +instance <<< AType +where + (<<<) file {at_annotation,at_attribute,at_type} + = file <<< at_annotation <<< at_attribute <<< at_type + +instance <<< TypeAttribute +where + (<<<) file ta + = file <<< toString ta + +instance toString TypeAttribute +where + toString (TA_Unique) + = "* " + toString (TA_TempVar tav_number) + = "u" + toString tav_number + ": " + toString (TA_Var avar) + = toString avar + ": " +/* toString (TA_TempExVar tav_number) + = "e" + toString tav_number + ": " + toString (TA_ExVar avar) + = toString avar + "': " +*/ + toString (TA_RootVar avar) + = toString avar + ": " + toString (TA_Anonymous) + = ". " + toString TA_None + = "" + toString TA_Multi + = "o " + toString TA_Omega + = "w " + toString (TA_List _ _) + = "??? " + +instance <<< Annotation +where + (<<<) file an = file <<< toString an + +instance toString Annotation +where + toString AN_Strict = "!" + toString _ = "" + +instance <<< ATypeVar +where + (<<<) file {atv_annotation,atv_attribute,atv_variable} + = file <<< atv_annotation <<< atv_attribute <<< atv_variable + +instance <<< ConsVariable +where + (<<<) file (CV tv) + = file <<< tv + (<<<) file (TempCV tv) + = file <<< "v" <<< tv <<< ' ' + +instance <<< Type +where + (<<<) file (TV varid) + = file <<< varid + (<<<) file (TempV tv_number) + = file <<< 'v' <<< tv_number <<< ' ' + (<<<) file (TA consid types) + = file <<< consid <<< " " <<< types + (<<<) file (arg_type --> res_type) + = file <<< arg_type <<< " -> " <<< res_type + (<<<) file (type :@: types) + = file <<< type <<< " @" <<< types + (<<<) file (TB tb) + = file <<< tb +/* (<<<) file (TFA vars types) + = file <<< "A." <<< vars <<< ':' <<< types +*/ (<<<) file (TQV varid) + = file <<< "E." <<< varid + (<<<) file (TempQV tv_number) + = file <<< "E." <<< tv_number <<< ' ' + (<<<) file TE + = file <<< "### EMPTY ###" +/* +instance <<< [a] | <<< , needs_brackets a +where + (<<<) file [] = file + (<<<) file [x:xs] + | needs_brackets x + = file <<< " (" <<< x <<< ')' <<< xs + = file <<< ' ' <<< x <<< xs +*/ + +instance <<< SymbolType +where + (<<<) file st=:{st_vars,st_attr_vars} + | st.st_arity == 0 + = write_inequalities st.st_attr_env (write_contexts st.st_context (file <<< '[' <<< st_vars <<< ',' <<< st_attr_vars <<< ']' <<< st.st_result)) + = write_inequalities st.st_attr_env (write_contexts st.st_context (file <<< '[' <<< st_vars <<< ',' <<< st_attr_vars <<< ']' <<< st.st_args <<< " -> " <<< st.st_result)) + +write_contexts [] file + = file +write_contexts [tc : tcs] file + = write_contexts2 tcs (file <<< " | " <<< tc) +where + write_contexts2 [] file + = file + write_contexts2 [tc : tcs] file + = write_contexts2 tcs (file <<< " & " <<< tc) + +instance <<< AttrInequality +where + (<<<) file {ai_demanded,ai_offered} + = file <<< ai_offered <<< " <= " <<< ai_demanded + +write_inequalities [] file + = file +write_inequalities [ineq:ineqs] file + = write_remaining_inequalities ineqs (file <<< ',' <<< ineq) +where + write_remaining_inequalities [] file + = file + write_remaining_inequalities [ineq:ineqs] file + = write_remaining_inequalities ineqs (file <<< ' ' <<< ineq) + +instance <<< TypeContext +where + (<<<) file co = file <<< co.tc_class <<< " " <<< co.tc_types + +instance <<< SymbIdent +where + (<<<) file symb=:{symb_kind = SK_Function symb_index } = file <<< symb.symb_name <<< '.' <<< symb_index + (<<<) file symb=:{symb_kind = SK_GeneratedFunction _ symb_index } = file <<< symb.symb_name <<< '.' <<< symb_index + (<<<) file symb=:{symb_kind = SK_OverloadedFunction symb_index } = file <<< symb.symb_name <<< "OL" + (<<<) file symb = file <<< symb.symb_name + +instance <<< TypeSymbIdent +where + (<<<) file symb = file <<< symb.type_name <<< '.' <<< symb.type_arity + +instance <<< ClassSymbIdent +where + (<<<) file symb = file <<< symb.cs_name + +instance <<< BoundVar +where + (<<<) file {var_name,var_info_ptr,var_expr_ptr} + = file <<< var_name <<< '<' <<< ptrToInt var_info_ptr <<< ',' <<< ptrToInt var_expr_ptr <<< '>' + +instance <<< Bind a b | <<< a & <<< b +where + (<<<) file {bind_src,bind_dst} = file <<< bind_dst <<< " = " <<< bind_src + + +instance <<< AlgebraicPattern +where + (<<<) file g = file <<< g.ap_symbol <<< g.ap_vars <<< " -> " <<< g.ap_expr + +instance <<< BasicPattern +where + (<<<) file g = file <<< g.bp_value <<< " -> " <<< g.bp_expr + +instance <<< CasePatterns +where + (<<<) file (BasicPatterns type patterns) = file <<< patterns + (<<<) file (AlgebraicPatterns type patterns) = file <<< patterns + (<<<) file (DynamicPatterns patterns) = file <<< patterns + (<<<) file NoPattern = file + +instance <<< Qualifier +where + (<<<) file {qual_generators,qual_filter = Yes qual_filter} = file <<< qual_generators <<< "| " <<< qual_filter + (<<<) file {qual_generators,qual_filter = No} = file <<< qual_generators + +instance <<< Generator +where + (<<<) file {gen_kind,gen_pattern,gen_expr} + = file <<< gen_pattern <<< (if gen_kind "<-" "<-:") <<< gen_expr + +instance <<< BasicValue +where + (<<<) file (BVI int) = file <<< int + (<<<) file (BVC char) = file <<< char + (<<<) file (BVB bool) = file <<< bool + (<<<) file (BVR real) = file <<< real + (<<<) file (BVS string) = file <<< string + +instance <<< Sequence +where + (<<<) file (SQ_From expr) = file <<< expr + (<<<) file (SQ_FromTo from_expr to_expr) = file <<< from_expr <<< ".." <<< to_expr + (<<<) file (SQ_FromThen from_expr then_expr) = file <<< from_expr <<< ',' <<< then_expr <<< ".." + (<<<) file (SQ_FromThenTo from_expr then_expr to_expr) = file <<< from_expr <<< ',' <<< then_expr <<< ".." <<< to_expr + +instance <<< Expression +where + (<<<) file (Var ident) = file <<< ident + (<<<) file (App {app_symb, app_args}) + = file <<< app_symb <<< ' ' <<< app_args + (<<<) file (f_exp @ a_exp) = file <<< '(' <<< f_exp <<< " @ " <<< a_exp <<< ')' + (<<<) file (Let {let_binds, let_expr}) = write_binds (file <<< "let " <<< '\n') let_binds <<< "in\n" <<< let_expr + where + write_binds file [] + = file + write_binds file [bind : binds] + = write_binds (file <<< bind <<< '\n') binds + (<<<) file (Case {case_expr,case_guards,case_default=No}) + = file <<< "case " <<< case_expr <<< " of\n" <<< case_guards + (<<<) file (Case {case_expr,case_guards,case_default= Yes def_expr}) + = file <<< "case " <<< case_expr <<< " of\n" <<< case_guards <<< "\n\t-> " <<< def_expr + (<<<) file (BasicExpr basic_value basic_type) = file <<< basic_value + (<<<) file (Conditional {if_cond,if_then,if_else}) = + else_part (file <<< "IF " <<< if_cond <<< "\nTHEN\n" <<< if_then) if_else + where + else_part file No = file <<< '\n' + else_part file (Yes else) = file <<< "\nELSE\n" <<< else <<< '\n' + +/* (<<<) file (Conditional {if_cond = {con_positive,con_expression},if_then,if_else}) = + else_part (file <<< (if con_positive "IF " "IFNOT ") <<< con_expression <<< "\nTHEN\n" <<< if_then) if_else + where + else_part file No = file <<< '\n' + else_part file (Yes else) = file <<< "\nELSE\n" <<< else <<< '\n' +*/ + (<<<) file (Selection opt_tuple expr selectors) = file <<< expr <<< selector_kind opt_tuple <<< selectors + where + selector_kind No = '.' + selector_kind (Yes _) = '!' + (<<<) file (Update expr1 selections expr2) = file <<< '{' <<< expr1 <<< " & " <<< selections <<< " = " <<< expr2 <<< '}' + (<<<) file (RecordUpdate cons_symbol expression expressions) = file <<< '{' <<< cons_symbol <<< ' ' <<< expression <<< " & " <<< expressions <<< '}' + (<<<) file (TupleSelect field field_nr expr) = file <<< expr <<<'.' <<< field_nr + (<<<) file (Lambda vars expr) = file <<< '\\' <<< vars <<< " -> " <<< expr + (<<<) file WildCard = file <<< '_' + (<<<) file (MatchExpr _ cons expr) = file <<< cons <<< " =: " <<< expr + (<<<) file EE = file <<< "** E **" + (<<<) file (DynamicExpr {dyn_expr,dyn_uni_vars,dyn_type_code}) = writeVarPtrs (file <<< "dynamic " <<< dyn_expr <<< " :: ") dyn_uni_vars <<< dyn_type_code +// (<<<) file (TypeCase type_case) = file <<< type_case + (<<<) file (TypeCodeExpression type_code) = file <<< type_code + (<<<) file (Constant symb _ _ _) = file <<< "** Constant **" <<< symb + + (<<<) file (ABCCodeExpr code_sequence do_inline) = file <<< (if do_inline "code inline\n" "code\n") <<< code_sequence + (<<<) file (AnyCodeExpr input output code_sequence) = file <<< "code\n" <<< input <<< "\n" <<< output <<< "\n" <<< code_sequence + + (<<<) file (FreeVar {fv_name}) = file <<< "FREEVAR " <<< fv_name + (<<<) file expr = abort ("<<< (Expression) [line 1290]" <<- expr) + +instance <<< TypeCase +where + (<<<) file {type_case_dynamic,type_case_patterns,type_case_default} + = file <<< "typecase " <<< type_case_dynamic <<< "of\n" <<< + type_case_patterns <<< type_case_default + +instance <<< DynamicPattern +where + (<<<) file {dp_type_patterns_vars,dp_var,dp_rhs,dp_type_code} + = writeVarPtrs (file <<< dp_var <<< " :: ") dp_type_patterns_vars <<< dp_type_code <<< " = " <<< dp_rhs + +writeVarPtrs file [] + = file +writeVarPtrs file vars + = write_var_ptrs (file <<< '<') vars <<< '>' + where + write_var_ptrs file [var] + = file <<< ptrToInt var + write_var_ptrs file [var : vars] + = write_var_ptrs (file <<< ptrToInt var <<< '.') vars + + +instance <<< TypeCodeExpression +where + (<<<) file TCE_Empty + = file + (<<<) file (TCE_Var info_ptr) + = file <<< "VAR " <<< ptrToInt info_ptr + (<<<) file (TCE_Constructor index exprs) + = file <<< "CONS " <<< index <<< ' ' <<< exprs + (<<<) file (TCE_Selector selectors info_ptr) + = file <<< "CONS " <<< selectors <<< "VAR " <<< ptrToInt info_ptr + +instance <<< Selection +where + (<<<) file (RecordSelection selector _) = file <<< selector + (<<<) file (ArraySelection _ _ index_expr) = file <<< '[' <<< index_expr <<< ']' + (<<<) file (DictionarySelection var selections _ index_expr) = file <<< '(' <<< var <<< '.' <<< selections <<< ')' <<< '[' <<< index_expr <<< ']' + +instance <<< LocalDefs +where + (<<<) file (LocalParsedDefs defs) = file <<< defs + (<<<) file (CollectedLocalDefs defs) = file <<< defs + +instance <<< NodeDef dst | <<< dst +where + (<<<) file {nd_dst,nd_alts,nd_locals} = file <<< nd_dst <<< nd_alts <<< nd_locals + + +instance <<< CollectedLocalDefs +where + (<<<) file {loc_functions,loc_nodes} + = file <<< loc_functions <<< loc_nodes +/* + (<<<) file {def_types,def_constructors,def_selectors,def_macros,def_classes,def_members,def_instances} + = file <<< def_types <<< def_constructors <<< def_selectors <<< def_macros <<< def_classes <<< def_members <<< def_instances +*/ + +instance <<< ParsedExpr +where + (<<<) file (PE_List exprs) = file <<< exprs + (<<<) file (PE_Tuple args) = file <<< '(' <<< args <<< ')' + (<<<) file (PE_Basic basic_value) = file <<< basic_value + (<<<) file (PE_Selection is_unique expr selectors) = file <<< expr <<< (if is_unique '!' '.') <<< selectors + (<<<) file (PE_Update expr1 selections expr2) = file <<< '{' <<< expr1 <<< " & " <<< selections <<< " = " <<< expr2 <<< '}' + (<<<) file (PE_Record PE_Empty _ fields) = file <<< '{' <<< fields <<< '}' + (<<<) file (PE_Record rec _ fields) = file <<< '{' <<< rec <<< " & " <<< fields <<< '}' + (<<<) file (PE_Compr True expr quals) = file <<< '[' <<< expr <<< " \\ " <<< quals <<< ']' + (<<<) file (PE_Compr False expr quals) = file <<< '{' <<< expr <<< " \\ " <<< quals <<< '}' + (<<<) file (PE_Sequ seq) = file <<< '[' <<< seq <<< ']' + (<<<) file PE_Empty = file <<< "** E **" + (<<<) file (PE_Ident symb) = file <<< symb + (<<<) file PE_WildCard = file <<< '_' + (<<<) file (PE_Lambda _ exprs expr) = file <<< '\\' <<< exprs <<< " -> " <<< expr + (<<<) file (PE_Bound bind) = file <<< bind + (<<<) file (PE_Case _ expr alts) = file <<< "case " <<< expr <<< " of\n" <<< alts + (<<<) file (PE_Let _ defs expr) = file <<< "let " <<< defs <<< " in\n" <<< expr + (<<<) file (PE_DynamicPattern expr type) = file <<< expr <<< "::" <<< type + (<<<) file (PE_Dynamic expr maybetype) + = case maybetype of + Yes type + -> file <<< "dynamic " <<< expr <<< "::" <<< type + No + -> file <<< "dynamic " <<< expr + (<<<) file _ = file <<< "some expression" + + +instance <<< ParsedSelection +where + (<<<) file (PS_Record selector _) = file <<< selector + (<<<) file (PS_Array index_expr) = file <<< '[' <<< index_expr <<< ']' + (<<<) file PS_Erroneous = file <<< "Erroneous selector" // PK + +instance <<< CaseAlt +where + (<<<) file {calt_pattern,calt_rhs} = file <<< calt_pattern <<< " -> " <<< calt_rhs + +instance <<< ParsedBody +where + (<<<) file {pb_args,pb_rhs} = file <<< pb_args <<< " = " <<< pb_rhs + +instance <<< BackendBody +where + (<<<) file {bb_args,bb_rhs} = file <<< bb_args <<< " = " <<< bb_rhs + +instance <<< FunctionPattern +where + (<<<) file (FP_Basic val (Yes var)) + = file <<< var <<< "=:" <<< val + (<<<) file (FP_Basic val No) + = file <<< val + (<<<) file (FP_Algebraic constructor vars (Yes var)) + = file <<< var <<< "=:" <<< constructor <<< vars + (<<<) file (FP_Algebraic constructor vars No) + = file <<< constructor <<< vars + (<<<) file (FP_Variable var) = file <<< var + (<<<) file (FP_Dynamic vars var type_code _) + = writeVarPtrs (file <<< var <<< " :: ") vars <<< type_code + (<<<) file (FP_Empty) = file <<< '_' + + +instance <<< FunDef +where + (<<<) file {fun_symb,fun_index,fun_body=ParsedBody bodies} = file <<< fun_symb <<< '.' <<< fun_index <<< ' ' <<< bodies + (<<<) file {fun_symb,fun_index,fun_body=CheckedBody {cb_args,cb_rhs},fun_info={fi_free_vars,fi_def_level,fi_calls}} = file <<< fun_symb <<< '.' + <<< fun_index <<< "C " <<< cb_args <<< " = " <<< cb_rhs +// <<< fun_index <<< '.' <<< fi_def_level <<< ' ' <<< '[' <<< fi_free_vars <<< ']' <<< cb_args <<< " = " <<< cb_rhs + (<<<) file {fun_symb,fun_index,fun_body=TransformedBody {tb_args,tb_rhs},fun_info={fi_free_vars,fi_def_level,fi_calls}} = file <<< fun_symb <<< '.' + <<< fun_index <<< "T " <<< tb_args <<< '[' <<< fi_calls <<< ']' <<< " = " <<< tb_rhs +// <<< fun_index <<< '.' <<< fi_def_level <<< ' ' <<< '[' <<< fi_free_vars <<< ']' <<< tb_args <<< " = " <<< tb_rhs + (<<<) file {fun_symb,fun_index,fun_body=BackendBody body,fun_type=Yes type} = file <<< type <<< '\n' <<< fun_symb <<< '.' + <<< fun_index <<< body <<< '\n' +instance <<< FunCall +where + (<<<) file { fc_level,fc_index } + = file <<< fc_index <<< '.' <<< fc_level + +instance <<< FreeVar +where + (<<<) file {fv_name,fv_info_ptr} = file <<< fv_name <<< '<' <<< ptrToInt fv_info_ptr <<< '>' + +instance <<< DynamicType +where + (<<<) file {dt_uni_vars,dt_type} + | isEmpty dt_uni_vars + = file <<< dt_type + = file <<< "A." <<< dt_uni_vars <<< ":" <<< dt_type + + +instance <<< SignClassification +where + (<<<) file {sc_pos_vect,sc_neg_vect} = write_signs file sc_pos_vect sc_neg_vect 0 + where + write_signs file sc_pos_vect sc_neg_vect index + | sc_pos_vect == 0 && sc_neg_vect == 0 + = file + # index_bit = (1 << index) + | sc_pos_vect bitand index_bit == 0 + | sc_neg_vect bitand index_bit == 0 + = write_signs (file <<< 'O') sc_pos_vect sc_neg_vect (inc index) + = write_signs (file <<< '-') sc_pos_vect (sc_neg_vect bitand (bitnot index_bit)) (inc index) + | sc_neg_vect bitand index_bit == 0 + = write_signs (file <<< '+') (sc_pos_vect bitand (bitnot index_bit)) sc_neg_vect (inc index) + = write_signs (file <<< 'T') (sc_pos_vect bitand (bitnot index_bit)) (sc_neg_vect bitand (bitnot index_bit)) (inc index) + +instance <<< TypeKind +where + (<<<) file (KindVar _) = file <<< "**" + (<<<) file KindConst + = file <<< '*' + (<<<) file (KindArrow arity) + = write_kinds file arity + where + write_kinds file 1 + = file <<< "* -> *" + write_kinds file n + = write_kinds (file <<< "* -> ") (dec n) + + +instance <<< TypeDefInfo +where + (<<<) file {tdi_group,tdi_group_vars,tdi_cons_vars} + = file <<< '[' <<< tdi_group <<< '=' <<< tdi_group_vars <<< '=' <<< tdi_cons_vars <<< ']' + +instance <<< DefinedSymbol +where + (<<<) file {ds_ident} + = file <<< ds_ident + +instance <<< TypeDef a | <<< a +where + (<<<) file {td_name, td_args, td_rhs} + = file <<< ":: " <<< td_name <<< ' ' <<< td_args <<< td_rhs + +instance <<< TypeRhs +where + (<<<) file (SynType type) + = file <<< " :== " <<< type + (<<<) file (AlgType data) + = file <<< " = " <<< data + (<<<) file (RecordType record) + = file <<< " = " <<< '{' <<< record <<< '}' + (<<<) file _ + = file + + +instance <<< RecordType +where + (<<<) file {rt_fields} = iFoldSt (\index file -> file <<< rt_fields.[index]) 0 (size rt_fields) file + +instance <<< FieldSymbol +where + (<<<) file {fs_name} = file <<< fs_name + +/* + where + write_data_defs file [] + = file + write_data_defs file [d:ds] + = write_data_defs (file <<< d <<< '\n') ds +*/ + +instance <<< InstanceType +where + (<<<) file it = write_contexts it.it_context (file <<< it.it_types) + +instance <<< RhsDefsOfType +where + (<<<) file (ConsList cons_defs) = file <<< cons_defs + (<<<) file (SelectorList _ _ sel_defs) = file <<< sel_defs + (<<<) file (TypeSpec type) = file <<< type + (<<<) file _ = file + +instance <<< ParsedConstructor +where + (<<<) file {pc_cons_name,pc_arg_types} = file <<< pc_cons_name <<< pc_arg_types + +instance <<< ParsedSelector +where + (<<<) file {ps_field_name,ps_field_type} = file <<< ps_field_name <<< ps_field_type + + +instance <<< ModuleKind +where + (<<<) file kind = file + +instance <<< ConsDef +where + (<<<) file {cons_symb,cons_type} = file <<< cons_symb <<< " :: " <<< cons_type + +instance <<< SelectorDef +where + (<<<) file {sd_symb} = file <<< sd_symb + +instance <<< ClassDef +where + (<<<) file {class_name} = file <<< class_name + +instance <<< ClassInstance +where + (<<<) file {ins_class,ins_type} = file <<< ins_class <<< " :: " <<< ins_type + +instance <<< Optional a | <<< a +where + (<<<) file (Yes x) = file <<< x + (<<<) file No = file + +instance <<< Module a | <<< a +where + (<<<) file {mod_name,mod_type,mod_defs} = file <<< mod_type <<< mod_name <<< mod_defs + +instance <<< CollectedDefinitions a b | <<< a & <<< b +where + (<<<) file {def_types,def_constructors,def_selectors,def_macros,def_classes,def_members,def_instances} + = file + +instance <<< ParsedDefinition +where + (<<<) file (PD_Function _ name _ exprs rhs _ ) = file <<< name <<< exprs <<< " = " <<< rhs + (<<<) file (PD_NodeDef _ pattern rhs) = file <<< pattern <<< " =: " <<< rhs + (<<<) file (PD_TypeSpec _ name prio st sp) = file <<< name <<< st + (<<<) file (PD_Type td) = file <<< td + (<<<) file _ = file + +instance <<< Rhs +where + (<<<) file {rhs_alts,rhs_locals} = file <<< rhs_alts <<< rhs_locals + +instance <<< OptGuardedAlts +where + (<<<) file (GuardedAlts guarded_exprs def_expr) = file <<<guarded_exprs <<< def_expr + (<<<) file (UnGuardedExpr unguarded_expr) = file <<< unguarded_expr + +instance <<< ExprWithLocalDefs +where + (<<<) file {ewl_expr,ewl_locals} = file <<< ewl_expr <<< ewl_locals + +instance <<< GuardedExpr +where + (<<<) file {alt_nodes,alt_guard,alt_expr} = file <<< '|' <<< alt_guard <<< alt_expr + + +instance <<< IndexRange +where + (<<<) file {ir_from,ir_to} + | ir_from == ir_to + = file + = file <<< ir_from <<< "---" <<< ir_to + +instance <<< Ident +where +// (<<<) file {id_name,id_index} = file <<< id_name <<< '.' <<< id_index + (<<<) file {id_name} = file <<< id_name + +instance <<< Global a | <<< a +where + (<<<) file {glob_object,glob_module} = file <<< glob_object <<< '.' <<< glob_module + +instance <<< Position +where + (<<<) file (FunPos file_name line func) = file <<< '[' <<< file_name <<< ',' <<< line <<< ',' <<< func <<< ']' + (<<<) file (LinePos file_name line) = file <<< '[' <<< file_name <<< ',' <<< line <<< ']' + (<<<) file _ = file + +instance <<< TypeVarInfo +where + (<<<) file TVI_Empty = file <<< "TVI_Empty" + (<<<) file (TVI_Type _) = file <<< "TVI_Type" + (<<<) file (TVI_Forward _) = file <<< "TVI_Forward" + (<<<) file (TVI_TypeKind _) = file <<< "TVI_TypeKind" + (<<<) file (TVI_SignClass _ _ _) = file <<< "TVI_SignClass" + (<<<) file (TVI_PropClass _ _ _) = file <<< "TVI_PropClass" + +instance <<< (Import from_symbol) | <<< from_symbol +where + (<<<) file {import_module, import_symbols} + = file <<< "import " <<< import_module <<< import_symbols + +instance <<< ImportDeclaration +where + (<<<) file (ID_Function ident) = file <<< ident + (<<<) file (ID_Class ident optIdents) = file <<< "class " <<< ident <<< optIdents + (<<<) file (ID_Type ident optIdents) = file <<< ":: " <<< ident <<< optIdents + (<<<) file (ID_Record ident optIdents) = file <<< ident <<< " { " <<< optIdents <<< " } " + (<<<) file (ID_Instance i1 i2 tup) = file <<< "instance " <<< i1 <<< i2 <<< tup // !ImportedIdent !Ident !(![Type],![TypeContext]) + +instance <<< ImportedIdent +where + (<<<) file {ii_ident, ii_extended} = file <<< ii_ident <<< ' ' <<< ii_extended + +instance == ModuleKind +where + (==) mk1 mk2 = equal_constructor mk1 mk2 + +instance == TypeAttribute +where + (==) attr1 attr2 = equal_constructor attr1 attr2 + +instance == Annotation +where + (==) a1 a2 = equal_constructor a1 a2 + +EmptySymbolTableEntry :== + { ste_kind = STE_Empty, ste_index = NoIndex, ste_def_level = NotALevel, ste_previous = abort "empty SymbolTableEntry" } + +cNotAGroupNumber :== -1 + +EmptyTypeDefInfo :== { tdi_kinds = [], tdi_properties = cAllBitsClear, tdi_group = [], tdi_group_vars = [], tdi_cons_vars = [], + tdi_classification = EmptyTypeClassification, tdi_group_nr = cNotAGroupNumber } + +MakeTypeVar name :== { tv_name = name, tv_info_ptr = nilPtr } +MakeVar name :== { var_name = name, var_info_ptr = nilPtr, var_expr_ptr = nilPtr } + +MakeAttributedType type :== { at_attribute = TA_None, at_annotation = AN_None, at_type = type } +MakeAttributedTypeVar type_var :== { atv_attribute = TA_None, atv_annotation = AN_None, atv_variable = type_var } + +EmptyFunInfo :== { fi_calls = [], fi_group_index = NoIndex, fi_def_level = NotALevel, + fi_free_vars = [], fi_local_vars = [], fi_dynamics = [] } + +BottomSignClass :== { sc_pos_vect = 0, sc_neg_vect = 0 } +PostiveSignClass :== { sc_pos_vect = bitnot 0, sc_neg_vect = 0 } + +NoPropClass :== 0 +PropClass :== bitnot 0 + +MakeNewTypeSymbIdent name arity + :== MakeTypeSymbIdent { glob_object = NoIndex, glob_module = NoIndex } name arity + +MakeTypeSymbIdent type_index name arity + :== { type_name = name, type_arity = arity, type_index = type_index, + type_prop = { tsp_sign = BottomSignClass, tsp_propagation = NoPropClass, tsp_coercible = True }} + +MakeSymbIdent name arity :== { symb_name = name, symb_kind = SK_Unknown, symb_arity = arity } +MakeConstant name :== MakeSymbIdent name 0 + +ParsedSelectorToSelectorDef ps var_ptr :== + { sd_symb = ps.ps_selector_name, sd_field_nr = NoIndex, sd_pos = ps.ps_field_pos, sd_type_index = NoIndex, + sd_exi_vars = [], /* sd_exi_attrs = [], */ sd_type_ptr = var_ptr, sd_field = ps.ps_field_name, + sd_type = { st_vars = [], st_args = [], st_result = ps.ps_field_type, st_arity = 0, st_context = [], + st_attr_env = [], st_attr_vars = [] }} + +ParsedConstructorToConsDef pc var_ptr :== + { cons_symb = pc.pc_cons_name, cons_pos = pc.pc_cons_pos, cons_priority = pc.pc_cons_prio, cons_index = NoIndex, cons_type_index = NoIndex, + cons_type = { st_vars = [], st_args = pc.pc_arg_types, st_result = MakeAttributedType TE, + st_arity = pc.pc_cons_arity, st_context = [], st_attr_env = [], st_attr_vars = []}, + cons_exi_vars = pc.pc_exi_vars, /* cons_exi_attrs = [], */ cons_type_ptr = var_ptr, cons_arg_vars = [] } + +ParsedInstanceToClassInstance pi members :== + { ins_class = {glob_object = MakeDefinedSymbol pi.pi_class NoIndex (length pi.pi_types), glob_module = NoIndex}, ins_ident = pi.pi_ident, + ins_type = { it_vars = [], it_types = pi.pi_types, it_attr_vars = [], + it_context = pi.pi_context }, ins_members = members, ins_specials = pi.pi_specials, ins_pos = pi.pi_pos } + +MakeTypeDef name lhs rhs attr contexts pos :== + { td_name = name, td_index = -1, td_arity = length lhs, td_args = lhs, td_attrs = [], td_attribute = attr, td_context = contexts, + td_pos = pos, td_rhs = rhs } + +MakeDefinedSymbol ident index arity :== { ds_ident = ident, ds_arity = arity, ds_index = index } + +MakeNewFunctionType name arity prio type pos specials var_ptr + :== { ft_symb = name, ft_arity = arity, ft_priority = prio, ft_type = type, ft_pos = pos, ft_specials = specials, ft_type_ptr = var_ptr } + |