Fix use of hash character in preprocessor defines

This commit is contained in:
drmortalwombat 2025-05-08 08:18:57 +02:00
parent 3c306e0899
commit 2b224f262b
2 changed files with 28 additions and 20 deletions

View File

@ -12691,7 +12691,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm)
break; 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; ilast->mAsmInsMode = ASMIM_IMPLIED;
else if (mScanner->mToken == TK_HASH) 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"); 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(); mScanner->NextToken();
offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode); offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode);
@ -12815,7 +12815,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm)
ilast = ilast->mRight; ilast = ilast->mRight;
} }
} }
else if (mScanner->mToken == TK_EOL) else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_SEMICOLON)
{ {
mScanner->NextToken(); mScanner->NextToken();
} }
@ -12823,7 +12823,7 @@ Expression* Parser::ParseAssembler(Declaration* vdasm)
{ {
mErrors->Error(mScanner->mLocation, EERR_ASM_INVALID_INSTRUCTION, "Invalid assembler token"); 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(); mScanner->NextToken();
} }
} }

View File

@ -822,28 +822,36 @@ void Scanner::NextPreToken(void)
} }
else if (mToken == TK_PREP_IDENT) else if (mToken == TK_PREP_IDENT)
{ {
Macro* def = nullptr; if (mTokenIdent->mString[0])
if (mDefineArguments)
def = mDefineArguments->Lookup(mTokenIdent);
if (!def)
def = mDefines->Lookup(mTokenIdent);
if (def)
{ {
if (def->mNumArguments == -1) Macro* def = nullptr;
if (mDefineArguments)
def = mDefineArguments->Lookup(mTokenIdent);
if (!def)
def = mDefines->Lookup(mTokenIdent);
if (def)
{ {
mToken = TK_STRING; if (def->mNumArguments == -1)
int i = 0; {
while ((mTokenString[i] = def->mString[i])) mToken = TK_STRING;
i++; int i = 0;
mTokenStringSize = i; while ((mTokenString[i] = def->mString[i]))
return; i++;
mTokenStringSize = i;
return;
}
else
mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent);
} }
else else
mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent); mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent);
} }
else else
mErrors->Error(mLocation, EERR_INVALID_PREPROCESSOR, "Invalid preprocessor command", mTokenIdent); {
mToken = TK_HASH;
return;
}
} }
else if (mToken == TK_PREP_UNDEF) else if (mToken == TK_PREP_UNDEF)
{ {