From f14621aeba4e59f639390c9e587bdf1907fa08ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Fri, 18 Aug 2023 14:48:39 +0200 Subject: [PATCH] Recognise Extension Keywords Whose Names Exceed Size Limits This commit adds targeted support for identifying keywords whose names exceed the maximum compatibility keyword length limit. This, in turn, enables seamless recognition of extension keywords such as STRESSEQUILNUM without compromising the parser's ability to identify long keyword names that match existing keywords in the first eight characters. For example, the input string 'GUIDERATE' will still match the keyword 'GUIDERAT' (without the trailing 'E') and will not be accidentally treated as a SUMMARY section request to output a group level UDQ vector. --- src/opm/input/eclipse/Parser/Parser.cpp | 7 ++++++ tests/parser/ParserTests.cpp | 30 ++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/opm/input/eclipse/Parser/Parser.cpp b/src/opm/input/eclipse/Parser/Parser.cpp index 1e8dbc181..86fac44b5 100644 --- a/src/opm/input/eclipse/Parser/Parser.cpp +++ b/src/opm/input/eclipse/Parser/Parser.cpp @@ -881,6 +881,13 @@ newRawKeyword(const std::string& deck_name, return newRawKeyword(parserKeyword, keyword8, parserState, parser); } + else if (parser.isBaseRecognizedKeyword(deck_name)) { + // Typically an OPM extended keyword such as STRESSEQUILNUM. + parserState.unknown_keyword = false; + const auto& parserKeyword = parser.getParserKeywordFromDeckName(deck_name); + + return newRawKeyword(parserKeyword, deck_name, parserState, parser); + } else { parserState.parseContext.handleUnknownKeyword(deck_name, KeywordLocation { diff --git a/tests/parser/ParserTests.cpp b/tests/parser/ParserTests.cpp index 28aa18f77..6fd16fee5 100644 --- a/tests/parser/ParserTests.cpp +++ b/tests/parser/ParserTests.cpp @@ -2354,12 +2354,36 @@ GUIDERATE / )"; + const auto stressequilnum_string = std::string { R"(RUNSPEC +DIMENS +1 5 2 / +REGIONS +STRESSEQUILNUM +1 1 1 1 1 +2 2 2 2 2 / +END +)" }; + parseContext.update(ParseContext::PARSE_LONG_KEYWORD, Opm::InputErrorAction::THROW_EXCEPTION); BOOST_CHECK_THROW(parser.parseString(deck_string, parseContext, errors), OpmInputError); - parseContext.update(ParseContext::PARSE_LONG_KEYWORD, Opm::InputErrorAction::IGNORE); - auto deck = parser.parseString(deck_string, parseContext, errors); - BOOST_CHECK( deck.hasKeyword("GUIDERAT") ); + errors.clear(); + + { + parseContext.update(ParseContext::PARSE_LONG_KEYWORD, Opm::InputErrorAction::IGNORE); + auto deck = parser.parseString(deck_string, parseContext, errors); + BOOST_CHECK( deck.hasKeyword("GUIDERAT") ); + } + + errors.clear(); + + { + parseContext.update(ParseContext::PARSE_LONG_KEYWORD, Opm::InputErrorAction::THROW_EXCEPTION); + const auto deck = parser.parseString(stressequilnum_string, parseContext, errors); + + BOOST_CHECK_MESSAGE(deck.hasKeyword("STRESSEQUILNUM"), + R"(Long keyword "STRESSEQUILNUM" must be present in input deck)"); + } } BOOST_AUTO_TEST_CASE(DynamicParser1) {