From 07323b12f9f4bd4983414e34163f9fc525ce48a3 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 25 Jul 2023 11:19:00 +0200 Subject: [PATCH] Static init of structs with base classes --- oscar64/Parser.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index c4175e0..97a0d18 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -1215,18 +1215,37 @@ Expression* Parser::ParseInitExpression(Declaration* dtype) } else { - Declaration* mdec = dtype->mParams; - while (mdec) + ExpandingArray path; + + Declaration* ttype = dtype; + while (ttype->mBase) + { + path.Push(ttype); + ttype = ttype->mBase->mBase; + } + + Declaration* mdec = ttype->mParams; + for(;;) { if (ConsumeTokenIf(TK_DOT)) { if (mScanner->mToken == TK_IDENT) { - Declaration* ndec = dtype->mScope->Lookup(mScanner->mTokenIdent); + ttype = dtype; + + path.SetSize(0); + Declaration* ndec = ttype->mScope->Lookup(mScanner->mTokenIdent, SLEVEL_SCOPE); + while (!ndec && ttype->mBase) + { + path.Push(ttype); + ttype = ttype->mBase->mBase; + ndec = ttype->mScope->Lookup(mScanner->mTokenIdent, SLEVEL_SCOPE); + } + if (ndec) mdec = ndec; else - mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "Struct member not found"); + mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "Struct member not found", mScanner->mTokenIdent); mScanner->NextToken(); ConsumeToken(TK_ASSIGN); @@ -1234,6 +1253,9 @@ Expression* Parser::ParseInitExpression(Declaration* dtype) else mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "Identifier expected"); } + + if (!mdec) + break; Expression* texp = ParseInitExpression(mdec->mBase); @@ -1247,7 +1269,10 @@ Expression* Parser::ParseInitExpression(Declaration* dtype) if (!ConsumeTokenIf(TK_COMMA)) break; + mdec = mdec->mNext; + while (!mdec && path.Size()) + mdec = path.Pop()->mParams; } }