diff --git a/src/lalr/ErrorCode.hpp b/src/lalr/ErrorCode.hpp index 0fcab63..faf1683 100644 --- a/src/lalr/ErrorCode.hpp +++ b/src/lalr/ErrorCode.hpp @@ -25,7 +25,8 @@ enum ErrorCode PARSER_ERROR_UNDEFINED_SYMBOL, ///< A grammar symbol is referenced but not defined. PARSER_ERROR_UNREFERENCED_SYMBOL, ///< A grammar symbol is defined but not referenced. PARSER_ERROR_ERROR_SYMBOL_ON_LEFT_HAND_SIDE, ///< The 'error' symbol has been used on the left hand side of a production. - PARSER_ERROR_DUPLICATE_ASSOCIATION_ON_IMPLICIT_TERMINAL ///< Both implicit terminal forms specify associativity and precedence. + PARSER_ERROR_DUPLICATE_ASSOCIATION_ON_IMPLICIT_TERMINAL, ///< Both implicit terminal forms specify associativity and precedence. + PARSER_ERROR_ASSOCIATIVITY_ASSIGNED_ON_NON_TERMINAL ///< Associativity has been assigned to a non-terminal. }; } diff --git a/src/lalr/GrammarGenerator.cpp b/src/lalr/GrammarGenerator.cpp index b29b7c8..954b79e 100644 --- a/src/lalr/GrammarGenerator.cpp +++ b/src/lalr/GrammarGenerator.cpp @@ -573,6 +573,10 @@ void GrammarGenerator::calculate_implicit_terminal_symbols() replace_references_to_symbol( non_terminal_symbol, terminal_symbol ); i->reset(); } + else if(non_terminal_symbol->associativity() != ASSOCIATE_NULL && non_terminal_symbol->productions().size()) + { + error( non_terminal_symbol->line(), PARSER_ERROR_ASSOCIATIVITY_ASSIGNED_ON_NON_TERMINAL, "associativity has been assigned to a non-terminal: %s", non_terminal_symbol->identifier().c_str()); + } } }