diff --git a/src/lalr/lalr_test/TestParsers.cpp b/src/lalr/lalr_test/TestParsers.cpp index e65cfaf..d40e9f1 100644 --- a/src/lalr/lalr_test/TestParsers.cpp +++ b/src/lalr/lalr_test/TestParsers.cpp @@ -64,44 +64,35 @@ SUITE( Parsers ) } }; - struct CheckParserErrorPolicy : public ErrorPolicy + struct CheckErrorPolicy : public ErrorPolicy { - int expected_error; - int errors; + std::vector expected_errors_; + int errors; - CheckParserErrorPolicy( int expected_error ) - : expected_error( expected_error ) + CheckErrorPolicy( int expected_error ) + : expected_errors_() , errors( 0 ) { + expected_errors_.push_back( expected_error ); + } + + CheckErrorPolicy( std::initializer_list expected_errors ) + : expected_errors_() + , errors( 0 ) + { + expected_errors_.insert( expected_errors_.end(), expected_errors.begin(), expected_errors.end() ); } void lalr_error( int /*line*/, int /*column*/, int error, const char* /*format*/, va_list /*args*/ ) { - (void) error; + if ( errors < int(expected_errors_.size()) ) + { + CHECK_EQUAL( expected_errors_[errors], error ); + } ++errors; - CHECK( error == expected_error ); } }; - struct CheckLexerErrorPolicy : public ErrorPolicy - { - int expected_error; - int errors; - - CheckLexerErrorPolicy( int expected_error ) - : expected_error( expected_error ) - , errors( 0 ) - { - } - - void lalr_error( int /*line*/, int /*column*/, int error, const char* /*format*/, va_list /*args*/ ) - { - (void) error; - ++errors; - CHECK( error == expected_error ); - } - }; - TEST( OrOperator ) { const char* or_grammar = @@ -813,7 +804,7 @@ SUITE( Parsers ) "}" ; - CheckParserErrorPolicy error_policy( PARSER_ERROR_SYNTAX ); + CheckErrorPolicy error_policy( PARSER_ERROR_SYNTAX ); ParserStateMachine parser_state_machine( missing_open_brace, missing_open_brace + strlen(missing_open_brace), &error_policy ); CHECK( error_policy.errors == 1 ); CHECK( parser_state_machine.start_state() == NULL ); @@ -830,7 +821,7 @@ SUITE( Parsers ) "}" ; - CheckParserErrorPolicy error_policy( PARSER_ERROR_SYNTAX ); + CheckErrorPolicy error_policy( PARSER_ERROR_SYNTAX ); ParserStateMachine parser_state_machine( missing_close_quotes, missing_close_quotes + strlen(missing_close_quotes), &error_policy ); CHECK( error_policy.errors == 2 ); CHECK( parser_state_machine.start_state() == NULL ); @@ -848,7 +839,7 @@ SUITE( Parsers ) "}" ; - CheckLexerErrorPolicy error_policy( LEXER_ERROR_SYNTAX ); + CheckErrorPolicy error_policy( LEXER_ERROR_SYNTAX ); GrammarCompiler compiler; compiler.compile( syntax_errors_in_regular_expressions_grammar, @@ -867,7 +858,7 @@ SUITE( Parsers ) "}" ; - CheckParserErrorPolicy error_policy( PARSER_ERROR_UNDEFINED_SYMBOL ); + CheckErrorPolicy error_policy( PARSER_ERROR_UNDEFINED_SYMBOL ); GrammarCompiler compiler; compiler.compile( undefined_symbol_grammar, undefined_symbol_grammar + strlen(undefined_symbol_grammar), &error_policy ); CHECK( error_policy.errors == 1 ); @@ -882,7 +873,7 @@ SUITE( Parsers ) "}" ; - CheckParserErrorPolicy error_policy( PARSER_ERROR_UNREFERENCED_SYMBOL ); + CheckErrorPolicy error_policy( PARSER_ERROR_UNREFERENCED_SYMBOL ); GrammarCompiler compiler; compiler.compile( unreferenced_symbol_error_grammar, @@ -913,7 +904,7 @@ SUITE( Parsers ) ; GrammarCompiler compiler; - CheckParserErrorPolicy error_policy( PARSER_ERROR_NONE ); + CheckErrorPolicy error_policy( PARSER_ERROR_NONE ); compiler.compile( precedence_directive_symbols_grammar, precedence_directive_symbols_grammar + strlen(precedence_directive_symbols_grammar), &error_policy ); CHECK( error_policy.errors == 0 ); } @@ -929,7 +920,7 @@ SUITE( Parsers ) " prototype: \"[A-Za-z_][A-Za-z_0-9]*\"; value: \"[A-Za-z_0-9\\./@:-]+\";\n" "}" ; - CheckLexerErrorPolicy error_policy( LEXER_ERROR_SYMBOL_CONFLICT ); + CheckErrorPolicy error_policy( LEXER_ERROR_SYMBOL_CONFLICT ); GrammarCompiler compiler; compiler.compile( lexer_conflict_grammar, lexer_conflict_grammar + strlen(lexer_conflict_grammar), &error_policy ); CHECK( error_policy.errors == 1 ); @@ -971,7 +962,7 @@ SUITE( Parsers ) ; GrammarCompiler compiler; - CheckParserErrorPolicy error_policy( PARSER_ERROR_NONE ); + CheckErrorPolicy error_policy( PARSER_ERROR_NONE ); compiler.compile( lexer_conflict_grammar, lexer_conflict_grammar + strlen(lexer_conflict_grammar), &error_policy ); CHECK( error_policy.errors == 0 ); @@ -1003,7 +994,7 @@ SUITE( Parsers ) "}" ; - CheckParserErrorPolicy error_policy( PARSER_ERROR_PARSE_TABLE_CONFLICT ); + CheckErrorPolicy error_policy( PARSER_ERROR_PARSE_TABLE_CONFLICT ); GrammarCompiler compiler; compiler.compile( associativity_grammar, associativity_grammar + strlen(associativity_grammar), &error_policy ); CHECK( error_policy.errors == 0 ); @@ -1045,7 +1036,7 @@ SUITE( Parsers ) ; GrammarCompiler compiler; - CheckParserErrorPolicy error_policy( PARSER_ERROR_PARSE_TABLE_CONFLICT ); + CheckErrorPolicy error_policy( PARSER_ERROR_PARSE_TABLE_CONFLICT ); compiler.compile( precedence_grammar, precedence_grammar + strlen(precedence_grammar), &error_policy ); CHECK( error_policy.errors == 0 ); @@ -1071,7 +1062,7 @@ SUITE( Parsers ) ; GrammarCompiler compiler; - CheckParserErrorPolicy error_policy( PARSER_ERROR_ERROR_SYMBOL_ON_LEFT_HAND_SIDE ); + CheckErrorPolicy error_policy( PARSER_ERROR_ERROR_SYMBOL_ON_LEFT_HAND_SIDE ); compiler.compile( grammar, grammar + strlen(grammar), &error_policy ); CHECK( error_policy.errors == 1 ); }