aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/parse.icl34
-rw-r--r--frontend/postparse.icl19
-rw-r--r--frontend/syntax.dcl2
-rw-r--r--frontend/syntax.icl3
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"