From 0010b29a985bf9f34b0313baf1fde6deed2421c6 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 21 Jan 2024 07:01:38 -0500 Subject: [PATCH] Improved "unexpected character" error --- IDEHelper/Compiler/BfParser.cpp | 24 ++++++++++++++++++++++-- IDEHelper/Compiler/BfParser.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index e1a71dec..f927b5b9 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/IDEHelper/Compiler/BfParser.cpp @@ -477,6 +477,25 @@ void BfParser::Fail(const StringImpl& error, int offset) mPassInstance->FailAt(error, mSourceData, mSrcIdx + offset); } +void BfParser::UnexpectedCharacter() +{ + if (mPreprocessorIgnoredSectionNode != NULL) + return; + + int startIdx = mTokenStart; + int endIdx = startIdx; + char32_t c = u8_nextchar((char*)mSrc, &endIdx); + int charLen = endIdx - startIdx; + + String str = "Unexpected character '"; + for (int i = 0; i < charLen; i++) + str += mSrc[startIdx + i]; + str += StrFormat("' (0x%0X)", (int)c); + + mPassInstance->FailAt(str, mSourceData, startIdx); + mSrcIdx = endIdx; +} + void BfParser::TokenFail(const StringImpl& error, int offset) { if (mPreprocessorIgnoredSectionNode == NULL) @@ -2446,7 +2465,8 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro case '#': if (disablePreprocessor) { - TokenFail("Unexpected character"); + mTokenStart = mSrcIdx - 1; + UnexpectedCharacter(); continue; } else @@ -3457,7 +3477,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro { AddErrorNode(mTokenStart, mSrcIdx); mTriviaStart = mSrcIdx; - TokenFail("Unexpected character"); + UnexpectedCharacter(); continue; } } diff --git a/IDEHelper/Compiler/BfParser.h b/IDEHelper/Compiler/BfParser.h index b5a2b297..d195576f 100644 --- a/IDEHelper/Compiler/BfParser.h +++ b/IDEHelper/Compiler/BfParser.h @@ -234,6 +234,7 @@ public: void Fail(const StringImpl& error, int offset = -1); void TokenFail(const StringImpl& error, int offset = -1); + void UnexpectedCharacter(); void SetSource(const char* data, int length); void MoveSource(const char* data, int length); // Takes ownership of data ptr