]> git.saurik.com Git - bison.git/commitdiff
lalr1.cc: syntax_error as exceptions.
authorAkim Demaille <demaille@gostai.com>
Tue, 8 Sep 2009 20:00:13 +0000 (22:00 +0200)
committerAkim Demaille <demaille@gostai.com>
Wed, 9 Sep 2009 14:38:40 +0000 (16:38 +0200)
It is common to use sort of factories in the user actions.  These
factories may check some "syntactic" constraints that are not
enforced by the grammar itself.  This is possible using YYERROR
within the action itself.  Provide the user with a means to throw
a syntax_error exception.

* data/c++.m4 (b4_public_types_declare, b4_public_types_define):
Declare and define yy::parser::syntax_error.
* data/lalr1.cc: Include stdexcept.
(yy::parser::parse): Wrap the user action within a try/catch.
* data/glr.cc: Include stdexcept.

ChangeLog
data/c++.m4
data/glr.cc
data/lalr1.cc

index 572ebdc282ceef09a190fe63b9351f06093b408b..02d15de9809ac03099ed4563a9c965adddcbbe46 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2009-09-09  Akim Demaille  <demaille@gostai.com>
+
+       lalr1.cc: syntax_error as exceptions.
+       It is common to use sort of factories in the user actions.  These
+       factories may check some "syntactic" constraints that are not
+       enforced by the grammar itself.  This is possible using YYERROR
+       within the action itself.  Provide the user with a means to throw
+       a syntax_error exception.
+
+       * data/c++.m4 (b4_public_types_declare, b4_public_types_define):
+       Declare and define yy::parser::syntax_error.
+       * data/lalr1.cc: Include stdexcept.
+       (yy::parser::parse): Wrap the user action within a try/catch.
+       * data/glr.cc: Include stdexcept.
+
 2009-09-09  Akim Demaille  <demaille@gostai.com>
 
        lalr1.cc: add missing "inline".
index cfe8a6cb8153c839f5e293db2234a02c5b2b137e..3157e47b8ee830671eceb626a9f067410baecda5 100644 (file)
@@ -126,6 +126,13 @@ m4_define([b4_public_types_declare],
     /// Symbol locations.
     typedef b4_percent_define_get([[location_type]]) location_type;])[
 
+    /// Syntax errors thrown from user actions.
+    struct syntax_error : std::runtime_error
+    {
+      syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m);]b4_locations_if([
+      location_type location;])[
+    };
+
     /// Tokens.
     struct token
     {
@@ -195,8 +202,15 @@ m4_define([b4_public_types_declare],
 # ----------------------
 # Provide the implementation needed by the public types.
 m4_define([b4_public_types_define],
-[[  // symbol_base_type.
+[[  inline
+  ]b4_parser_class_name[::syntax_error::syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m)
+    : std::runtime_error (m)]b4_locations_if([
+    , location (l)])[
+  {}
+
+  // symbol_base_type.
   template <typename Exact>
+  inline
   ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type ()
     : value()]b4_locations_if([
     , location()])[
index 0d9e04967417854ac3d26da41ac9207c26090737..87e3eab185d6e9bb27ea66856b08f2b158d7aeba 100644 (file)
@@ -224,6 +224,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
 
 ]b4_percent_code_get([[requires]])[
 
+#include <stdexcept>
 #include <string>
 #include <iostream>
 
index 8e79333e6e9b97e6332c9994ec4164c707c75334..ac2fa35bc6e294d3778511b053d65a0ce8b4caee 100644 (file)
@@ -147,6 +147,7 @@ dnl FIXME: This is wrong, we want computed header guards.
 ]b4_percent_code_get([[requires]])[
 
 ]b4_parse_assert_if([#include <cassert>])[
+#include <stdexcept>
 #include <string>
 #include <iostream>
 #include "stack.hh"
@@ -814,12 +815,21 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
 
     // Perform the reduction.
     YY_REDUCE_PRINT (yyn);
-    switch (yyn)
+    try
+    {
+      switch (yyn)
       {
 ]b4_user_actions[
        default:
           break;
       }
+    }
+    catch (const syntax_error& yyexc)
+    {
+      error (]b4_args(b4_locations_if([yyexc.location]),
+                      [[yyexc.what()]])[);
+      YYERROR;
+    }
     YY_SYMBOL_PRINT ("-> $$ =", yylhs);
 ]b4_variant_if([[
     // Destroy the rhs symbols.