diff --git a/opm/parser/eclipse/Parser/ParseContext.hpp b/opm/parser/eclipse/Parser/ParseContext.hpp index 284128f9d..702b8a7ea 100644 --- a/opm/parser/eclipse/Parser/ParseContext.hpp +++ b/opm/parser/eclipse/Parser/ParseContext.hpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -84,12 +85,14 @@ namespace Opm { explicit ParseContext(const std::vector>& initial); void handleError( const std::string& errorKey, const std::string& msg ) const; + void handleUnknownKeyword(const std::string& keyword) const; bool hasKey(const std::string& key) const; ParseContext withKey(const std::string& key, InputError::Action action = InputError::WARN) const; ParseContext& withKey(const std::string& key, InputError::Action action = InputError::WARN); void updateKey(const std::string& key , InputError::Action action); void update(InputError::Action action); void update(const std::string& keyString , InputError::Action action); + void ignoreKeyword(const std::string& keyword); InputError::Action get(const std::string& key) const; std::map::const_iterator begin() const; std::map::const_iterator end() const; @@ -256,6 +259,7 @@ namespace Opm { void envUpdate( const std::string& envVariable , InputError::Action action ); void patternUpdate( const std::string& pattern , InputError::Action action); std::map m_errorContexts; + std::set ignore_keywords; }; } diff --git a/src/opm/parser/eclipse/Parser/ParseContext.cpp b/src/opm/parser/eclipse/Parser/ParseContext.cpp index 8fb06c8cb..fe2f0eb39 100644 --- a/src/opm/parser/eclipse/Parser/ParseContext.cpp +++ b/src/opm/parser/eclipse/Parser/ParseContext.cpp @@ -95,6 +95,11 @@ namespace Opm { } + void ParseContext::ignoreKeyword(const std::string& keyword) { + this->ignore_keywords.insert(keyword); + } + + void ParseContext::handleError( const std::string& errorKey, const std::string& msg ) const { @@ -112,6 +117,13 @@ namespace Opm { } } + void ParseContext::handleUnknownKeyword(const std::string& keyword) const { + if (this->ignore_keywords.find(keyword) == this->ignore_keywords.end()) { + std::string msg = "Unknown keyword: " + keyword; + this->handleError(ParseContext::PARSE_UNKNOWN_KEYWORD, msg); + } + } + std::map::const_iterator ParseContext::begin() const { return m_errorContexts.begin(); } diff --git a/src/opm/parser/eclipse/Parser/Parser.cpp b/src/opm/parser/eclipse/Parser/Parser.cpp index 4a96a62e6..0203b3b69 100644 --- a/src/opm/parser/eclipse/Parser/Parser.cpp +++ b/src/opm/parser/eclipse/Parser/Parser.cpp @@ -417,7 +417,7 @@ std::shared_ptr< RawKeyword > createRawKeyword( const string_view& kw, ParserSta if( !parser.isRecognizedKeyword( keywordString ) ) { if( ParserKeyword::validDeckName( keywordString ) ) { std::string msg = "Keyword " + keywordString + " not recognized."; - parserState.parseContext.handleError( ParseContext::PARSE_UNKNOWN_KEYWORD, msg ); + parserState.parseContext.handleUnknownKeyword( keywordString.string() ); parserState.unknown_keyword = true; return {}; } diff --git a/tests/parser/ParseContextTests.cpp b/tests/parser/ParseContextTests.cpp index 8256de6ab..91af8a99d 100644 --- a/tests/parser/ParseContextTests.cpp +++ b/tests/parser/ParseContextTests.cpp @@ -86,6 +86,26 @@ BOOST_AUTO_TEST_CASE(TestUnkownKeyword) { } +BOOST_AUTO_TEST_CASE(TestUnkownKeywordII) { + const char * deck1 = + "RUNSPEC\n" + "DIMENS\n" + " 10 10 10 /n" + "\n"; + + + ParseContext parseContext; + Parser parser(false); + + + parser.addKeyword(); + parseContext.update(ParseContext::PARSE_UNKNOWN_KEYWORD , InputError::THROW_EXCEPTION ); + BOOST_CHECK_THROW( parser.parseString( deck1 , parseContext ) , std::invalid_argument); + parseContext.ignoreKeyword("RUNSPEC"); + BOOST_CHECK_NO_THROW( parser.parseString( deck1 , parseContext ) ); +} + + BOOST_AUTO_TEST_CASE(Handle_extra_records) { const char * deck_string = "EQLDIMS\n"