From 199a2d6d729f596ed3652a5ac0185c5afa025023 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 9 Feb 2012 10:34:00 +0100 Subject: [PATCH] tests: lalr1.cc: check syntax_error. * tests/c++.at (Syntax error as exception): New. --- tests/c++.at | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/c++.at b/tests/c++.at index d81a1fb3..36c4d992 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -448,3 +448,78 @@ Reducing 'a'. ]]) AT_CLEANUP + + +## --------------------------- ## +## Syntax error as exception. ## +## --------------------------- ## + +AT_SETUP([[Syntax error as exception]]) + +AT_DATA_GRAMMAR([[input.yy]], +[[%skeleton "lalr1.cc" + +%code +{ + int yylex (yy::parser::semantic_type *); +} + +%defines +%define variant +%define parse.error verbose +%define parse.trace +%% + +start: + thing +| start thing +; + +thing: + error { std::cerr << "caught error" << std::endl; } +| item +; + +item: + 'a' +| 's' + { + throw yy::parser::syntax_error("invalid expression"); + } + +%% + +int +yylex (yy::parser::semantic_type *) +{ + static char const *input = "as"; + switch (int res = *input++) + { + default: + return res; + } +} + +void +yy::parser::error (const std::string &m) +{ + std::cerr << "error: " << m << std::endl; +} + +int +main () +{ + yy::parser parser; + parser.set_debug_level(!!getenv("YYDEBUG")); + return parser.parse (); +} +]]) +AT_BISON_CHECK([[-o input.cc input.yy]]) +AT_COMPILE_CXX([[input]]) + +AT_PARSER_CHECK([[./input]], [[0]], [[]], +[[error: invalid expression +caught error +]]) + +AT_CLEANUP -- 2.47.2