diff --git a/src/wake/parser.wx b/src/wake/parser.wx index 23c45440..f3f6ebd7 100644 --- a/src/wake/parser.wx +++ b/src/wake/parser.wx @@ -300,6 +300,7 @@ Class Parser Method ParseVars( decls:Stack,flags:Int ) Local kind:=Parse() + Local missingTypeAndInit := New Stack Try Repeat @@ -314,14 +315,50 @@ Class Parser decl.ident=ParseIdent() If flags & DECL_EXTERN - Parse( ":" ) - decl.type=ParseType() - If CParse( "=" ) decl.symbol=ParseString() + If CParse( ":" ) + decl.type=ParseType() + For Local missingDecl := Eachin missingTypeAndInit + missingDecl.type = decl.type + Next + missingTypeAndInit.Clear() + If CParse( "=" ) decl.symbol=ParseString() + Else + missingTypeAndInit.Add( decl ) + Endif Else If CParse( ":" ) decl.type=ParseType() - If CParse( "=" ) decl.init=ParseExpr() + For Local missingDecl := Eachin missingTypeAndInit + If Not missingDecl.type + missingDecl.type = decl.type + Else + Error("Type already initialized: '"+missingDecl.ident+"'") + Endif + Next + If CParse( "=" ) + decl.init=ParseExpr() + For Local missingDecl := Eachin missingTypeAndInit + If Not missingDecl.init + missingDecl.init = decl.init + Endif + Next + Endif + missingTypeAndInit.Clear() Else If CParse( ":=" ) decl.init=ParseExpr() + For Local missingDecl := Eachin missingTypeAndInit + If Not missingDecl.init + missingDecl.init = decl.init + Else + Error("Already initialized: '"+missingDecl.ident+"'") + Endif + Next + missingTypeAndInit.Clear() + Else If CParse( "=" ) + decl.init=ParseExpr() + Error("Missing Type information for: '"+decl.ident+"'.") + missingTypeAndInit.Add( decl ) + Else + missingTypeAndInit.Add( decl ) Endif decl.endpos=EndPos @@ -329,6 +366,15 @@ Class Parser Until Not CParse( "," ) + If Not missingTypeAndInit.Empty + Local vnames:String + For Local vname := Eachin missingTypeAndInit + If vnames Then vnames += ", " + vnames += vname.ident + Next + Error("Missing Type information for: '"+vnames+"'") + Endif + ParseEol() Catch ex:ParseEx