diff options
-rw-r--r-- | frontend/parse.icl | 34 | ||||
-rw-r--r-- | frontend/postparse.icl | 19 | ||||
-rw-r--r-- | frontend/syntax.dcl | 2 | ||||
-rw-r--r-- | frontend/syntax.icl | 3 |
4 files changed, 36 insertions, 22 deletions
diff --git a/frontend/parse.icl b/frontend/parse.icl index 7ff0b12..8b38c9d 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -557,8 +557,13 @@ where | isIclContext parseContext && isLocalContext parseContext && (token == EqualToken || token == DefinesColonToken) && /* PK isLowerCaseName name.id_name && */ not (isClassOrInstanceDefsContext parseContext) # (rhs, _, pState) = wantRhs False (RhsDefiningSymbolExact token) (tokenBack pState) - = (PD_NodeDef pos (PE_Ident name) rhs, pState) - + | token == EqualToken + = (PD_Function pos name False [] rhs FK_NodeDefOrFunction, pState) + // otherwise // token == DefinesColonToken + | isGlobalContext parseContext + = (PD_Function pos name False [] rhs FK_Caf, pState) + // otherwise + = (PD_NodeDef pos (PE_Ident name) rhs, pState) want_rhs_of_def parseContext (Yes (name, is_infix), args) token pos pState # code_allowed = code_block_allowed token (token, pState) = nextToken FunctionContext pState @@ -782,21 +787,22 @@ isDefiningSymbol RhsDefiningSymbolRuleOrMacro observed definingSymbolToFunKind :: RhsDefiningSymbol -> FunKind definingSymbolToFunKind (RhsDefiningSymbolExact defining_token) - = token_to_fun_kind defining_token - where - token_to_fun_kind ColonDefinesToken - = FK_Macro - token_to_fun_kind EqualToken - = FK_Function cNameNotLocationDependent - token_to_fun_kind DoubleArrowToken - = FK_Function cNameNotLocationDependent - token_to_fun_kind DefinesColonToken - = FK_Caf - token_to_fun_kind _ - = FK_Unknown + = definingTokenToFunKind defining_token definingSymbolToFunKind _ = FK_Unknown +definingTokenToFunKind :: Token -> FunKind +definingTokenToFunKind ColonDefinesToken + = FK_Macro +definingTokenToFunKind EqualToken + = FK_Function cNameNotLocationDependent +definingTokenToFunKind DoubleArrowToken + = FK_Function cNameNotLocationDependent +definingTokenToFunKind DefinesColonToken + = FK_Caf +definingTokenToFunKind _ + = FK_Unknown + wantRhs :: !Bool !RhsDefiningSymbol !ParseState -> (!Rhs, !RhsDefiningSymbol, !ParseState) // FunctionAltDefRhs wantRhs localsExpected definingSymbol pState # (alts, definingSymbol, pState) = want_LetsFunctionBody definingSymbol pState diff --git a/frontend/postparse.icl b/frontend/postparse.icl index a66dd1c..99ac98e 100644 --- a/frontend/postparse.icl +++ b/frontend/postparse.icl @@ -25,15 +25,17 @@ optGuardedAltToRhs optGuardedAlt } exprToRhs expr - :== { rhs_alts = UnGuardedExpr - { ewl_nodes = [] - , ewl_expr = expr - , ewl_locals = LocalParsedDefs [] - , ewl_position= NoPos - } + :== { rhs_alts = UnGuardedExpr (exprToExprWithLocalDefs expr) , rhs_locals = LocalParsedDefs [] } +exprToExprWithLocalDefs expr + :== { ewl_nodes = [] + , ewl_expr = expr + , ewl_locals = LocalParsedDefs [] + , ewl_position= NoPos + } + prefixAndPositionToIdent :: !String !LineAndColumn !*CollectAdmin -> (!Ident, !*CollectAdmin) prefixAndPositionToIdent prefix {lc_line, lc_column} ca=:{ca_hash_table} # ({boxed_ident=ident}, ca_hash_table) = putIdentInHashTable (prefix +++ ";" +++ toString lc_line +++ ";" +++ toString lc_column) IC_Expression ca_hash_table @@ -278,6 +280,11 @@ where reorganiseLocalDefinitions [PD_NodeDef pos pattern {rhs_alts,rhs_locals} : defs] ca # (fun_defs, node_defs, ca) = reorganiseLocalDefinitions defs ca = (fun_defs, [{ nd_dst = pattern, nd_alts = rhs_alts, nd_locals = rhs_locals, nd_position = pos } : node_defs], ca) + + reorganiseLocalDefinitions [PD_Function pos name is_infix [] {rhs_alts, rhs_locals} FK_NodeDefOrFunction : defs] ca + # (fun_defs, node_defs, ca) = reorganiseLocalDefinitions defs ca + = (fun_defs, [{ nd_dst = PE_Ident name, nd_alts = rhs_alts, nd_locals = rhs_locals, nd_position = pos } : node_defs], ca) + reorganiseLocalDefinitions [PD_Function pos name is_infix args rhs fun_kind : defs] ca # prio = if is_infix (Prio NoAssoc 9) NoPrio fun_arity = length args diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index cf2ffdd..5a1f95e 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -174,7 +174,7 @@ cIsNotAFunction :== False | PD_ImportedObjects [ImportedObject] | PD_Erroneous -:: FunKind = FK_Function !Bool | FK_Macro | FK_Caf | FK_Unknown +:: FunKind = FK_Function !Bool | FK_Macro | FK_Caf | FK_NodeDefOrFunction | FK_Unknown cNameNotLocationDependent :== False cNameLocationDependent :== True diff --git a/frontend/syntax.icl b/frontend/syntax.icl index 1f943cb..1a021ca 100644 --- a/frontend/syntax.icl +++ b/frontend/syntax.icl @@ -172,7 +172,7 @@ cIsNotAFunction :== False | PD_ImportedObjects [ImportedObject] | PD_Erroneous -:: FunKind = FK_Function !Bool | FK_Macro | FK_Caf | FK_Unknown +:: FunKind = FK_Function !Bool | FK_Macro | FK_Caf | FK_NodeDefOrFunction | FK_Unknown cNameNotLocationDependent :== False cNameLocationDependent :== True @@ -1759,6 +1759,7 @@ instance <<< FunKind where (<<<) file (FK_Function False) = file <<< "FK_Function" (<<<) file (FK_Function True) = file <<< "Lambda" + (<<<) file FK_NodeDefOrFunction = file <<< "FK_NodeDefOrFunction" (<<<) file FK_Macro = file <<< "FK_Macro" (<<<) file FK_Caf = file <<< "FK_Caf" (<<<) file FK_Unknown = file <<< "FK_Unknown" |