diff options
Diffstat (limited to 'frontend/postparse.icl')
-rw-r--r-- | frontend/postparse.icl | 156 |
1 files changed, 68 insertions, 88 deletions
diff --git a/frontend/postparse.icl b/frontend/postparse.icl index 25fe1d9..a5153fe 100644 --- a/frontend/postparse.icl +++ b/frontend/postparse.icl @@ -8,31 +8,15 @@ import syntax, parse, utilities, StdCompare { ca_error :: !*ParseErrorAdmin , ca_fun_count :: !Int , ca_rev_fun_defs :: ![FunDef] - , ca_predefs :: !PredefinedIdents - , ca_u_predefs :: !*PredefinedSymbols , ca_hash_table :: !*HashTable } cIsAGlobalDef :== True cIsNotAGlobalDef :== False -:: PredefinedIdents :== {!Ident} - -SelectPredefinedIdents :: *PredefinedSymbols -> (!PredefinedIdents, !*PredefinedSymbols) -SelectPredefinedIdents predefs - = selectIdents 0 (createArray PD_NrOfPredefSymbols {id_name="", id_info = nilPtr}) predefs - where - selectIdents :: Int *PredefinedIdents *PredefinedSymbols -> (*PredefinedIdents, *PredefinedSymbols) - selectIdents i idents symbols - | i == PD_NrOfPredefSymbols - = (idents, symbols) - // otherwise - # (symbol, symbols) = symbols![i] - = selectIdents (i+1) {idents & [i] = symbol.pds_ident} symbols - -predef :: Int PredefinedIdents -> ParsedExpr -predef index ids - = PE_Ident ids.[index] +predef_ident_expr :: Int -> ParsedExpr +predef_ident_expr index + = PE_Ident predefined_idents.[index] optGuardedAltToRhs :: OptGuardedAlts -> Rhs optGuardedAltToRhs optGuardedAlt @@ -62,7 +46,7 @@ prefixAndPositionToIdentExp prefix {lc_line, lc_column} ca=:{ca_hash_table} (`) infixl 9 (`) f a - :== \idents -> apply (f idents) (toParsedExpr a idents) + :== apply f (toParsedExpr a) // apply :: ParsedExpr ParsedExpr -> ParsedExpr @@ -72,21 +56,21 @@ apply (PE_List application) a apply f a = PE_List [f, a] -class toParsedExpr a :: !a -> !PredefinedIdents -> ParsedExpr +class toParsedExpr a :: !a -> ParsedExpr instance toParsedExpr [a] | toParsedExpr a where toParsedExpr [] - = predef PD_NilSymbol + = predef_ident_expr PD_NilSymbol toParsedExpr [hd:tl] - = predef PD_ConsSymbol ` hd ` tl + = predef_ident_expr PD_ConsSymbol ` hd ` tl instance toParsedExpr ParsedExpr where toParsedExpr x - = const x + = x instance toParsedExpr Int where toParsedExpr x - = const (PE_Basic (BVI (toString x))) + = PE_Basic (BVI (toString x)) postParseError :: Position {#Char} *CollectAdmin -> *CollectAdmin postParseError pos msg ps=:{ca_error={pea_file}} @@ -173,10 +157,10 @@ where collectFunctions (PE_UpdateComprehension expr updateExpr identExpr qualifiers) icl_module ca # (compr, ca) = transformUpdateComprehension [expr] [updateExpr] [identExpr] identExpr qualifiers ca = collectFunctions compr icl_module ca - collectFunctions (PE_Sequ sequence) icl_module ca=:{ca_predefs} - = collectFunctions (transformSequence sequence ca_predefs) icl_module ca - collectFunctions (PE_ArrayDenot exprs) icl_module ca=:{ca_predefs} - = collectFunctions (transformArrayDenot exprs ca_predefs) icl_module ca + collectFunctions (PE_Sequ sequence) icl_module ca + = collectFunctions (transformSequence sequence) icl_module ca + collectFunctions (PE_ArrayDenot exprs) icl_module ca + = collectFunctions (transformArrayDenot exprs) icl_module ca collectFunctions (PE_Dynamic exprs opt_dyn_type) icl_module ca # (exprs, ca) = collectFunctions exprs icl_module ca = (PE_Dynamic exprs opt_dyn_type, ca) @@ -380,20 +364,23 @@ transformLambda lam_ident args result pos = MakeNewImpOrDefFunction lam_ident (length args) lam_body (FK_Function cNameLocationDependent) NoPrio No pos makeConsExpressionForGenerator :: GeneratorKind ParsedExpr ParsedExpr *CollectAdmin -> (ParsedExpr,*CollectAdmin) -makeConsExpressionForGenerator gen_kind a1 a2 ca=:{ca_predefs} - #! cons_id = ca_predefs.[case gen_kind of IsListGenerator -> PD_ConsSymbol ; _ -> PD_OverloadedConsSymbol] +makeConsExpressionForGenerator gen_kind a1 a2 ca + #! cons_id = predefined_idents.[case gen_kind of IsListGenerator -> PD_ConsSymbol ; _ -> PD_OverloadedConsSymbol] = (PE_List [PE_Ident cons_id, a1, a2], ca) makeNilExpression :: Int *CollectAdmin -> (ParsedExpr,*CollectAdmin) -makeNilExpression predef_nil_index ca=:{ca_predefs} - #! nil_id = ca_predefs.[predef_nil_index] +makeNilExpression predef_nil_index ca + #! nil_id = predefined_idents.[predef_nil_index] = (PE_Ident nil_id, ca) makeConsExpression :: Int ParsedExpr ParsedExpr *CollectAdmin -> (ParsedExpr,*CollectAdmin) -makeConsExpression predef_cons_index a1 a2 ca=:{ca_predefs} - #! cons_id = ca_predefs.[predef_cons_index] +makeConsExpression predef_cons_index a1 a2 ca + #! cons_id = predefined_idents.[predef_cons_index] = (PE_List [PE_Ident cons_id, a1, a2], ca) +//get_predef_id :: Int -> Ident +get_predef_id predef_index :== predefined_idents.[predef_index] + // +++ change to accessor functions :: TransformedGenerator = { tg_expr :: ([ParsedDefinition],[ParsedExpr]) @@ -418,15 +405,15 @@ transformGenerator {gen_kind=IsArrayGenerator, gen_expr, gen_pattern, gen_positi (a2, ca) = prefixAndPositionToIdentExp "g_a2" gen_position ca (gen_var_case1, ca) = prefixAndPositionToIdent "g_c1" gen_position ca (gen_var_case2, ca) = prefixAndPositionToIdent "g_c2" gen_position ca - (less_or_equal, ca) = get_predef_id PD_LessOrEqualFun ca - (sub, ca) = get_predef_id PD_SubFun ca - (usize, ca) = get_predef_id PD_UnqArraySizeFun ca - (uselect, ca) = get_predef_id PD_UnqArraySelectFun ca + less_or_equal = get_predef_id PD_LessOrEqualFun + sub = get_predef_id PD_SubFun + usize = get_predef_id PD_UnqArraySizeFun + uselect = get_predef_id PD_UnqArraySelectFun pattern = PE_Tuple [gen_pattern, array] = case index_generator of No # (i, ca) = prefixAndPositionToIdentExp "g_i" gen_position ca - (inc, ca) = get_predef_id PD_IncFun ca + inc = get_predef_id PD_IncFun # dec_n = PE_List [n,PE_Ident sub,PE_Basic (BVI "1")] # transformed_generator = { tg_expr = ([PD_NodeDef (LinePos qual_filename gen_position.lc_line) (PE_Tuple [n,a2]) (exprToRhs (PE_List [PE_Ident usize, gen_expr]))], @@ -442,7 +429,7 @@ transformGenerator {gen_kind=IsArrayGenerator, gen_expr, gen_pattern, gen_positi } -> (transformed_generator,Yes (i,[([],dec_n,n2)]),2,ca) Yes (i,[]) - # (inc, ca) = get_predef_id PD_IncFun ca + # inc = get_predef_id PD_IncFun # dec_n = PE_List [n,PE_Ident sub,PE_Basic (BVI "1")] # transformed_generator = { tg_expr = ([PD_NodeDef (LinePos qual_filename gen_position.lc_line) (PE_Tuple [n,a2]) (exprToRhs (PE_List [PE_Ident usize, gen_expr]))], @@ -482,8 +469,8 @@ transformGenerator {gen_kind, gen_expr=PE_Sequ (SQ_FromTo from_exp to_exp), gen_ -> case index_generator of No # (i, ca) = prefixAndPositionToIdentExp "g_i" gen_position ca - # (inc, ca) = get_predef_id PD_IncFun ca - (less_or_equal, ca) = get_predef_id PD_LessOrEqualFun ca + # inc = get_predef_id PD_IncFun + less_or_equal = get_predef_id PD_LessOrEqualFun # transformed_generator = { tg_expr = ([],[from_exp,to_exp]) , tg_lhs_arg = [i,n] @@ -497,8 +484,8 @@ transformGenerator {gen_kind, gen_expr=PE_Sequ (SQ_FromTo from_exp to_exp), gen_ } -> (transformed_generator,Yes (i,[([],to_exp,n)]),2,ca) Yes (i,[]) - # (inc, ca) = get_predef_id PD_IncFun ca - (less_or_equal, ca) = get_predef_id PD_LessOrEqualFun ca + # inc = get_predef_id PD_IncFun + less_or_equal = get_predef_id PD_LessOrEqualFun # transformed_generator = { tg_expr = ([],[to_exp]) , tg_lhs_arg = [n] @@ -526,8 +513,8 @@ transformGenerator {gen_kind, gen_expr=PE_Sequ (SQ_FromTo from_exp to_exp), gen_ -> (transformed_generator,Yes (i,[([],to_exp,n):size_expressions]),0,ca) _ # (i, ca) = prefixAndPositionToIdentExp "g_i" gen_position ca - # (inc, ca) = get_predef_id PD_IncFun ca - (less_or_equal, ca) = get_predef_id PD_LessOrEqualFun ca + # inc = get_predef_id PD_IncFun + less_or_equal = get_predef_id PD_LessOrEqualFun # transformed_generator = { tg_expr = ([],[from_exp,to_exp]) , tg_lhs_arg = [i,n] @@ -548,7 +535,7 @@ transformGenerator {gen_kind, gen_expr=PE_Sequ (SQ_From from_exp), gen_pattern, -> case index_generator of No # (i, ca) = prefixAndPositionToIdentExp "g_i" gen_position ca - # (inc, ca) = get_predef_id PD_IncFun ca + # inc = get_predef_id PD_IncFun # transformed_generator = { tg_expr = ([],[from_exp]) , tg_lhs_arg = [i] @@ -576,7 +563,7 @@ transformGenerator {gen_kind, gen_expr=PE_Sequ (SQ_From from_exp), gen_pattern, -> (transformed_generator,index_generator,0,ca) _ # (i, ca) = prefixAndPositionToIdentExp "g_i" gen_position ca - # (inc, ca) = get_predef_id PD_IncFun ca + # inc = get_predef_id PD_IncFun # transformed_generator = { tg_expr = ([],[from_exp]) , tg_lhs_arg = [i] @@ -636,7 +623,7 @@ transformGeneratorsAndReturnSize [generator:generators] qual_filename index_gene -> (node_defs++[PD_NodeDef NoPos ident (exprToRhs size_exp)],ident) # transformed_generator = store_minimum_of_sizes_in_generator node_defs size_exp index_argument_n transformed_generator - # (inc,ca) = get_predef_id PD_IncFun ca + # inc = get_predef_id PD_IncFun # size_exp = PE_List [PE_Ident inc,size_exp] = ([transformed_generator:transformed_generators],index_generator,size_exp,ca) @@ -674,7 +661,7 @@ where = (PE_Let cIsNotStrict (LocalParsedDefs [node_def1,node_def2]) min_exp,ca) minimum_of_idents ident1 ident2 ca - # (smaller_fun,ca) = get_predef_id PD_SmallerFun ca + # smaller_fun = get_predef_id PD_SmallerFun # (case_ident,ca) = prefixAndPositionToIdent ("g_s"+++toString n) gen_position ca = (PE_Case case_ident (PE_List [ident1,PE_Ident smaller_fun,ident2]) [{calt_pattern = PE_Basic (BVB True), calt_rhs = exprToRhs ident1}, @@ -770,7 +757,7 @@ transformArrayComprehension expr qualifiers ca qual_position = hd_qualifier.qual_position (c_i_ident_exp, ca) = prefixAndPositionToIdentExp "c_i" qual_position ca (c_a_ident_exp, ca) = prefixAndPositionToIdentExp "c_a" qual_position ca - (create_array, ca) = get_predef_id PD__CreateArrayFun ca + create_array = get_predef_id PD__CreateArrayFun | same_index_for_update_and_array_generators qualifiers # index_range = PE_Sequ (SQ_From (PE_Basic (BVI "0"))) # index_generator = {gen_kind=IsListGenerator, gen_pattern=c_i_ident_exp, gen_expr=PE_Sequ (SQ_From (PE_Basic (BVI "0"))), gen_position=qual_position} @@ -790,7 +777,7 @@ transformArrayComprehension expr qualifiers ca # (length, ca) = computeSize qualifiers qual_position hd_qualifier.qual_filename ca # new_array = PE_List [PE_Ident create_array,length] - # (inc,ca) = get_predef_id PD_IncFun ca + # inc = get_predef_id PD_IncFun new_array_and_index = [new_array,PE_Basic (BVI "0")] update = [PE_Update c_a_ident_exp [PS_Array c_i_ident_exp] expr,PE_List [PE_Ident inc,c_i_ident_exp]] = transformUpdateComprehension new_array_and_index update [c_a_ident_exp,c_i_ident_exp] c_a_ident_exp qualifiers ca @@ -853,7 +840,7 @@ computeSize :: [Qualifier] LineAndColumn FileName *CollectAdmin -> (!ParsedExpr, computeSize qualifiers qual_position qual_filename ca # (counter_ident_exp, ca) = prefixAndPositionToIdentExp "c_l_i" qual_position ca (transformed_qualifiers,ca) = transformUpdateQualifiers [counter_ident_exp] [PE_Basic (BVI "0")] qualifiers ca - (inc,ca) = get_predef_id PD_IncFun ca + inc = get_predef_id PD_IncFun success = insert_inc_in_inner_loop (last transformed_qualifiers).tq_continue with insert_inc_in_inner_loop (PE_List [f, a : args]) @@ -976,34 +963,29 @@ makeComprehensions [{tq_generators, tq_filter, tq_end, tq_call, tq_lhs_args, tq_ , {calt_pattern = PE_WildCard, calt_rhs = exprToRhs default_rhs} ]) -get_predef_id :: Int *CollectAdmin -> (Ident, *CollectAdmin) -get_predef_id predef_index ca=:{ca_predefs} - = ca!ca_predefs.[predef_index] - -transformSequence :: Sequence -> PredefinedIdents -> ParsedExpr +transformSequence :: Sequence -> ParsedExpr transformSequence (SQ_FromThen frm then) - = predef PD_FromThen ` frm ` then + = predef_ident_expr PD_FromThen ` frm ` then transformSequence (SQ_FromThenTo frm then to) - = predef PD_FromThenTo ` frm ` then ` to + = predef_ident_expr PD_FromThenTo ` frm ` then ` to transformSequence (SQ_From frm) - = predef PD_From ` frm + = predef_ident_expr PD_From ` frm transformSequence (SQ_FromTo frm to) - = predef PD_FromTo ` frm ` to + = predef_ident_expr PD_FromTo ` frm ` to -transformArrayUpdate :: ParsedExpr [Bind ParsedExpr ParsedExpr] PredefinedIdents -> ParsedExpr -transformArrayUpdate expr updates pi - = foldr (update pi (predef PD_ArrayUpdateFun)) expr updates +transformArrayUpdate :: ParsedExpr [Bind ParsedExpr ParsedExpr] -> ParsedExpr +transformArrayUpdate expr updates + = foldr (update (predef_ident_expr PD_ArrayUpdateFun)) expr updates where - update :: PredefinedIdents (PredefinedIdents -> ParsedExpr) (Bind ParsedExpr ParsedExpr) ParsedExpr -> ParsedExpr - update pi updateIdent {bind_src=value, bind_dst=index} expr - = (updateIdent ` expr ` index ` value) pi + update :: ParsedExpr (Bind ParsedExpr ParsedExpr) ParsedExpr -> ParsedExpr + update updateIdent {bind_src=value, bind_dst=index} expr + = updateIdent ` expr ` index ` value -transformArrayDenot :: [ParsedExpr] PredefinedIdents -> ParsedExpr -transformArrayDenot exprs pi +transformArrayDenot :: [ParsedExpr] -> ParsedExpr +transformArrayDenot exprs = transformArrayUpdate - ((predef PD__CreateArrayFun ` length exprs) pi) - [{bind_dst=toParsedExpr i pi, bind_src=expr} \\ expr <- exprs & i <- [0..]] - pi + (predef_ident_expr PD__CreateArrayFun ` length exprs) + [{bind_dst=toParsedExpr i, bind_src=expr} \\ expr <- exprs & i <- [0..]] scanModules :: [ParsedImport] [ScannedModule] [Ident] SearchPaths Bool (ModTimeFunction *Files) *Files *CollectAdmin -> (Bool, [ScannedModule],*Files, *CollectAdmin) scanModules [] parsed_modules cached_modules searchPaths support_generics modtimefunction files ca @@ -1049,9 +1031,9 @@ MakeEmptyModule name mod_type parseAndScanDclModule :: !Ident !Position ![ScannedModule] ![Ident] !SearchPaths !Bool (ModTimeFunction *Files) !*Files !*CollectAdmin -> *(!Bool, ![ScannedModule],!*Files, !*CollectAdmin) parseAndScanDclModule dcl_module import_file_position parsed_modules cached_modules searchPaths support_generics modtimefunction files ca - # {ca_error, ca_u_predefs, ca_hash_table} = ca - # (parse_ok, mod, ca_hash_table, err_file, ca_u_predefs, files) = wantModule cWantDclFile dcl_module import_file_position support_generics ca_hash_table ca_error.pea_file searchPaths ca_u_predefs modtimefunction files - # ca = {ca & ca_hash_table=ca_hash_table, ca_error={pea_file=err_file,pea_ok=True}, ca_u_predefs=ca_u_predefs } + # {ca_error, ca_hash_table} = ca + # (parse_ok, mod, ca_hash_table, err_file, files) = wantModule cWantDclFile dcl_module import_file_position support_generics ca_hash_table ca_error.pea_file searchPaths modtimefunction files + # ca = {ca & ca_hash_table=ca_hash_table, ca_error={pea_file=err_file,pea_ok=True} } | parse_ok = scan_dcl_module mod parsed_modules searchPaths modtimefunction files ca = (False, [MakeEmptyModule mod.mod_name MK_None: parsed_modules],files, ca) @@ -1071,15 +1053,13 @@ where = scanModules imports [mod : parsed_modules] cached_modules searchPaths support_generics modtimefunction files ca = (pea_ok && import_ok, parsed_modules,files, ca) -scanModule :: !ParsedModule ![Ident] !Bool !*HashTable !*File !SearchPaths !*PredefinedSymbols (ModTimeFunction *Files) !*Files - -> (!Bool, !ScannedModule, !IndexRange, ![FunDef], !Optional ScannedModule, ![ScannedModule],!Int,!Int,!*HashTable, !*File, !*PredefinedSymbols, !*Files) -scanModule mod=:{mod_name,mod_type,mod_defs = pdefs} cached_modules support_generics hash_table err_file searchPaths predefs modtimefunction files - # (predefIdents, predefs) = SelectPredefinedIdents predefs +scanModule :: !ParsedModule ![Ident] !Bool !*HashTable !*File !SearchPaths (ModTimeFunction *Files) !*Files + -> (!Bool, !ScannedModule, !IndexRange, ![FunDef], !Optional ScannedModule, ![ScannedModule],!Int,!Int,!*HashTable, !*File, !*Files) +scanModule mod=:{mod_name,mod_type,mod_defs = pdefs} cached_modules support_generics hash_table err_file searchPaths /*predefs*/ modtimefunction files + # predefIdents = predefined_idents # ca = { ca_error = {pea_file = err_file, pea_ok = True} , ca_fun_count = 0 , ca_rev_fun_defs = [] - , ca_predefs = predefIdents - , ca_u_predefs = predefs , ca_hash_table = hash_table } (fun_defs, defs, imports, imported_objects, ca) = reorganiseDefinitions True pdefs 0 0 0 0 ca @@ -1112,7 +1092,7 @@ scanModule mod=:{mod_name,mod_type,mod_defs = pdefs} cached_modules support_gene (macro_range, ca) = addFunctionsRange macro_defs ca (def_instances, ca) = collectFunctions defs.def_instances True ca - { ca_error = {pea_file = err_file,pea_ok}, ca_predefs = predefs, ca_rev_fun_defs, ca_u_predefs, ca_hash_table } = ca + { ca_error = {pea_file = err_file,pea_ok}, ca_predefs = predefs, ca_rev_fun_defs, ca_hash_table } = ca mod = { mod & mod_imports = imports, mod_imported_objects = imported_objects, mod_defs = { defs & def_instances = def_instances, def_macro_indices = macro_range }} @@ -1121,7 +1101,7 @@ scanModule mod=:{mod_name,mod_type,mod_defs = pdefs} cached_modules support_gene fun_defs = fun_defs++reverse ca_rev_fun_defs fun_range = {ir_from=0,ir_to=n_global_functions} - = (reorganise_icl_ok && pea_ok && import_dcl_ok && import_dcls_ok, mod, fun_range, fun_defs, optional_dcl_mod, modules, dcl_module_n,n_functions_and_macros_in_dcl_modules,hash_table, err_file, ca_u_predefs, files) + = (reorganise_icl_ok && pea_ok && import_dcl_ok && import_dcls_ok, mod, fun_range, fun_defs, optional_dcl_mod, modules, dcl_module_n,n_functions_and_macros_in_dcl_modules,hash_table, err_file, files) where scan_main_dcl_module :: Ident ModuleKind (ModTimeFunction *Files) *Files *CollectAdmin -> (!Bool,!Optional (Module (CollectedDefinitions (ParsedInstance FunDef) [FunDef])),!Int,![ScannedModule],![Ident],!*Files,!*CollectAdmin) scan_main_dcl_module mod_name MK_Main _ files ca @@ -1139,9 +1119,9 @@ where = in_cache (module_n+1) pmods | module_n_in_cache<>NoIndex = (True,No,module_n_in_cache,[],cached_modules,files,ca) - # {ca_error, ca_u_predefs, ca_hash_table} = ca - # (parse_ok, mod, hash_table, err_file, predefs, files) = wantModule cWantDclFile mod_name NoPos support_generics ca_hash_table ca_error.pea_file searchPaths ca_u_predefs modtimefunction files - # ca = {ca & ca_hash_table=hash_table, ca_error={pea_file=err_file,pea_ok=True}, ca_u_predefs=predefs} + # {ca_error, ca_hash_table} = ca + # (parse_ok, mod, hash_table, err_file, /*predefs,*/ files) = wantModule cWantDclFile mod_name NoPos support_generics ca_hash_table ca_error.pea_file searchPaths modtimefunction files + # ca = {ca & ca_hash_table=hash_table, ca_error={pea_file=err_file,pea_ok=True}} | not parse_ok = (False, No,NoIndex, [],cached_modules, files, ca) # pdefs = mod.mod_defs |