From 2b224f262b78d081689926ddcf8e9649449545bd Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Thu, 8 May 2025 08:18:57 +0200 Subject: [PATCH] Fix use of hash character in preprocessor defines --- oscar64/Parser.cpp | 10 +++++----- oscar64/Scanner.cpp | 38 +++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 92efaa1..3e0e2e7 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -12691,7 +12691,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm) break; } } - else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE) + else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE || mScanner->mToken == TK_SEMICOLON) ilast->mAsmInsMode = ASMIM_IMPLIED; else if (mScanner->mToken == TK_HASH) { @@ -12799,12 +12799,12 @@ Expression* Parser::ParseAssembler(Declaration* vdasm) } } - if (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE) + if (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE && mScanner->mToken != TK_SEMICOLON) { mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "End of line expected"); } - while (mScanner->mToken != TK_EOL && mScanner->mToken != TK_EOF && mScanner->mToken != TK_CLOSE_BRACE) + while (mScanner->mToken != TK_EOL && mScanner->mToken != TK_EOF && mScanner->mToken != TK_CLOSE_BRACE && mScanner->mToken != TK_SEMICOLON) mScanner->NextToken(); offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode); @@ -12815,7 +12815,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm) ilast = ilast->mRight; } } - else if (mScanner->mToken == TK_EOL) + else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_SEMICOLON) { mScanner->NextToken(); } @@ -12823,7 +12823,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm) { mErrors->Error(mScanner->mLocation, EERR_ASM_INVALID_INSTRUCTION, "Invalid assembler token"); - while (mScanner->mToken != TK_EOL && mScanner->mToken != TK_EOF) + while (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE && mScanner->mToken != TK_SEMICOLON && mScanner->mToken != TK_EOF) mScanner->NextToken(); } } diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index 122c1c6..44caa84 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -822,28 +822,36 @@ void Scanner::NextPreToken(void) } else if (mToken == TK_PREP_IDENT) { - Macro* def = nullptr; - if (mDefineArguments) - def = mDefineArguments->Lookup(mTokenIdent); - if (!def) - def = mDefines->Lookup(mTokenIdent); - - if (def) + if (mTokenIdent->mString[0]) { - if (def->mNumArguments == -1) + Macro* def = nullptr; + if (mDefineArguments) + def = mDefineArguments->Lookup(mTokenIdent); + if (!def) + def = mDefines->Lookup(mTokenIdent); + + if (def) { - mToken = TK_STRING; - int i = 0; - while ((mTokenString[i] = def->mString[i])) - i++; - mTokenStringSize = i; - return; + if (def->mNumArguments == -1) + { + mToken = TK_STRING; + int i = 0; + while ((mTokenString[i] = def->mString[i])) + i++; + mTokenStringSize = i; + return; + } + else + mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent); } else mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent); } else - mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent); + { + mToken = TK_HASH; + return; + } } else if (mToken == TK_PREP_UNDEF) {