Skip to content

Commit

Permalink
#988: Improved error message from CTPG parser.
Browse files Browse the repository at this point in the history
  • Loading branch information
tomuben committed Oct 22, 2024
1 parent 47f6973 commit 7cc7bd5
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,7 @@ void parse(std::string&& code, options_type& result) {
result = res.value();
}
else {
std::stringstream ss;
ss << "Error parsing script options: " << error_buffer.str();
throw OptionParserException(ss.str());
throw OptionParserException(error_buffer.str());
}
}

Expand Down Expand Up @@ -238,9 +236,18 @@ void parseOptions(const std::string& code, options_map_t & result) {
std::optional<LinePositions> currentLinePositions = getNextLine(current_pos, code);
while (currentLinePositions) {

std::string line = code.substr(currentLinePositions->mStartPos, currentLinePositions->mEndPos);
std::string line = code.substr(currentLinePositions->mStartPos,
currentLinePositions->mEndPos - currentLinePositions->mStartPos);
options_type parser_result;
ParserInternals::parse(std::move(line), parser_result);
try {
ParserInternals::parse(std::move(line), parser_result);
} catch(OptionParserException& ex) {
const std::string::difference_type lineNumber =
std::count(code.begin(), code.begin()+currentLinePositions->mStartPos, '\n');
std::stringstream ss;
ss << "Error parsing script options at line " << lineNumber << ": " << ex.what();
throw OptionParserException(ss.str());
}
for (const auto & option: parser_result) {
ScriptOption entry = {
.value = option.value,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,27 @@ TEST(ScriptOptionLinesTest, need_option_termination_character) {
catch( const OptionParserException& e )
{
// and this tests that it has the correct message
EXPECT_STREQ( e.what(), "Error parsing script options: [1:17] PARSE: Syntax error: Unexpected '<eof>'\n");
EXPECT_STREQ( e.what(), "Error parsing script options at line 0: [1:17] PARSE: Syntax error: Unexpected '<eof>'\n");
throw;
}
}, OptionParserException );
}

TEST(ScriptOptionLinesTest, need_option_termination_character_second_line) {
const std::string code =
"%optionA myoption;\n"
"%optionB myoption\n"
"\nmycode";
options_map_t result;
EXPECT_THROW({
try
{
parseOptions(code, result);
}
catch( const OptionParserException& e )
{
// and this tests that it has the correct message
EXPECT_STREQ( e.what(), "Error parsing script options at line 1: [1:18] PARSE: Syntax error: Unexpected '<eof>'\n");
throw;
}
}, OptionParserException );
Expand Down

0 comments on commit 7cc7bd5

Please sign in to comment.