diff options
author | ronny | 1999-11-17 11:19:13 +0000 |
---|---|---|
committer | ronny | 1999-11-17 11:19:13 +0000 |
commit | 1bb990b559fd228cb781678865158e59608bb328 (patch) | |
tree | 732273022566cdedf14a3a1aeba00f6f470fa5d8 | |
parent | bug fix: no crash after detecting an overloading error (diff) |
fixed name conflict for ids in nested update transformation
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@56 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r-- | frontend/parse.icl | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/frontend/parse.icl b/frontend/parse.icl index fb4d0e5..0ce8eda 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -2184,7 +2184,7 @@ where want_updates token update_expr pState # (updates, pState) = parse_updates token update_expr pState - = transform_record_or_array_update update_expr updates pState + = transform_record_or_array_update update_expr updates 0 pState where parse_updates :: Token ParsedExpr ParseState -> ([NestedUpdate], ParseState) parse_updates token update_expr pState @@ -2206,12 +2206,12 @@ where = ({nu_selectors = selectors, nu_update_expr = expr}, pState) = ({nu_selectors = selectors, nu_update_expr = PE_Empty}, parseError "field assignment" (Yes token) "=" pState) - transform_record_or_array_update :: ParsedExpr [NestedUpdate] ParseState -> (ParsedExpr, ParseState) - transform_record_or_array_update expr updates pState + transform_record_or_array_update :: ParsedExpr [NestedUpdate] !Int ParseState -> (ParsedExpr, ParseState) + transform_record_or_array_update expr updates level pState | is_record_update sortedUpdates - = transform_record_update expr groupedUpdates pState + = transform_record_update expr groupedUpdates level pState // otherwise - = transform_array_update expr updates pState + = transform_array_update expr updates level pState where sortedUpdates // sort updates by first field name, array updates last @@ -2253,10 +2253,10 @@ where is_record_select _ = False - transform_record_update :: ParsedExpr ![[NestedUpdate]] ParseState -> (ParsedExpr, ParseState) - transform_record_update expr groupedUpdates pState + transform_record_update :: ParsedExpr ![[NestedUpdate]] !Int ParseState -> (ParsedExpr, ParseState) + transform_record_update expr groupedUpdates level pState # (assignments, (optionalIdent, pState)) - = mapSt transform_update groupedUpdates (No, pState) + = mapSt (transform_update level) groupedUpdates (No, pState) updateExpr = build_update optionalIdent expr assignments = (updateExpr, pState) @@ -2264,28 +2264,28 @@ where // transform one group of nested updates with the same first field // for example: f.g1 = e1, f.g2 = e2 -> f = {id.f & g1 = e1, g2 = e2}, // (id is ident to shared expression that's being updated) - transform_update :: [NestedUpdate] (Optional Ident, ParseState) -> (FieldAssignment, (Optional Ident, ParseState)) - transform_update [{nu_selectors=[PS_Record fieldIdent _], nu_update_expr}] state + transform_update :: !Int [NestedUpdate] (Optional Ident, ParseState) -> (FieldAssignment, !(!Optional Ident, ParseState)) + transform_update _ [{nu_selectors=[PS_Record fieldIdent _], nu_update_expr}] state = ({bind_dst = fieldIdent, bind_src = nu_update_expr}, state) - transform_update updates=:[{nu_selectors=[PS_Record fieldIdent _ : _]} : _] (optionalIdent, pState) + transform_update level updates=:[{nu_selectors=[PS_Record fieldIdent _ : _]} : _] (optionalIdent, pState) # (shareIdent, pState) - = make_ident optionalIdent pState + = make_ident optionalIdent level pState select = PE_Selection cNonUniqueSelection (PE_Ident shareIdent) [PS_Record fieldIdent No] (update_expr, pState) - = transform_record_or_array_update select (map sub_update updates) pState + = transform_record_or_array_update select (map sub_update updates) (level+1) pState = ({bind_dst = fieldIdent, bind_src = update_expr}, (Yes shareIdent, pState)) where - make_ident :: (Optional Ident) ParseState -> (Ident, ParseState) - make_ident (Yes ident) pState + make_ident :: (Optional Ident) !Int ParseState -> (Ident, ParseState) + make_ident (Yes ident) _ pState = (ident, pState) - make_ident No pState - = internalIdent "s;" pState + make_ident No level pState + = internalIdent ("s" +++ toString level +++ ";") pState sub_update :: NestedUpdate -> NestedUpdate sub_update update=:{nu_selectors} = {update & nu_selectors = tl nu_selectors} - transform_update _ (_, pState) + transform_update _ _ (_, pState) # pState = parseError "record or array" No "field assignments mixed with array assignments not" /* expected */ pState = ({bind_dst = errorIdent, bind_src = PE_Empty}, (No, pState)) @@ -2297,14 +2297,14 @@ where = PE_Let False (LocalParsedDefs [buildNodeDef (PE_Ident ident) expr]) (PE_Record (PE_Ident ident) No assignments) - transform_array_update :: ParsedExpr [NestedUpdate] ParseState -> (ParsedExpr, ParseState) - transform_array_update expr updates pState + transform_array_update :: ParsedExpr [NestedUpdate] !Int ParseState -> (ParsedExpr, ParseState) + transform_array_update expr updates level pState // transform {<e> & [i].<...> = e1, ... } to {{<e> & [i1].<...> = e1} & ...} - = foldSt transform_update updates (expr, pState) + = foldSt (transform_update level) updates (expr, pState) where - transform_update :: NestedUpdate (ParsedExpr, ParseState) -> (ParsedExpr, ParseState) - transform_update {nu_selectors, nu_update_expr} (expr1, pState) - = build_update expr1 (split_selectors nu_selectors) nu_update_expr pState + transform_update :: !Int NestedUpdate (ParsedExpr, ParseState) -> (ParsedExpr, ParseState) + transform_update level {nu_selectors, nu_update_expr} (expr1, pState) + = build_update expr1 (split_selectors nu_selectors) nu_update_expr level pState where // split selectors into final record selectors and initial selectors // (resulting selectors are reversed) @@ -2312,21 +2312,21 @@ where split_selectors selectors = span is_record_select (reverse selectors) - build_update :: ParsedExpr ([ParsedSelection], [ParsedSelection]) ParsedExpr ParseState -> (ParsedExpr, ParseState) - build_update expr ([], initial_selectors) update_expr pState + build_update :: ParsedExpr ([ParsedSelection], [ParsedSelection]) ParsedExpr !Int ParseState -> (ParsedExpr, ParseState) + build_update expr ([], initial_selectors) update_expr _ pState = (PE_Update expr (reverse initial_selectors) update_expr, pState) // transform {<e> & <...>.[i].f.g. = e1} to // let // index_id = i // (element_id, array_id) = <e>!<...>.[index_id] // in {array_id & [index_id] = {element_id & f.g = e1}} - build_update expr (record_selectors, [PS_Array index : initial_selectors]) update_expr pState + build_update expr (record_selectors, [PS_Array index : initial_selectors]) update_expr level pState # (index_id, pState) - = internalIdent "i;" pState + = internalIdent ("i" +++ toString level +++ ";") pState # (element_id, pState) - = internalIdent "e;" pState + = internalIdent ("e" +++ toString level +++ ";") pState # (array_id, pState) - = internalIdent "a;" pState + = internalIdent ("a" +++ toString level +++ ";") pState index_def = buildNodeDef (PE_Ident index_id) index select_def @@ -2336,7 +2336,7 @@ where (updated_element, pState) = transform_record_update (PE_Ident element_id) - [[{nu_selectors=(reverse record_selectors), nu_update_expr=update_expr}]] pState + [[{nu_selectors=(reverse record_selectors), nu_update_expr=update_expr}]] (level+1) pState = (PE_Let False (LocalParsedDefs [index_def, select_def]) (PE_Update (PE_Ident array_id) (reverse [PS_Array (PE_Ident index_id) : initial_selectors]) updated_element), pState) |