]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.cc
(Actions after errors): New test case.
[bison.git] / data / lalr1.cc
index f0844bb2ab281486353c726ae210c72040e3e076..0dd1eb066fc98bc663492d23de1d0b73a3bb3867 100644 (file)
@@ -19,6 +19,23 @@ m4_divert(-1)
 
 m4_include([c.m4])
 
+## ---------------- ##
+## Default values.  ##
+## ---------------- ##
+
+# Stack parameters.
+m4_define_default([b4_stack_depth_init],  [200])
+
+# Default Parser class name.
+m4_define_default([b4_parser_class_name], [Parser])
+
+
+
+## ----------------- ##
+## Semantic Values.  ##
+## ----------------- ##
+
+
 # b4_lhs_value([TYPE])
 # --------------------
 # Expansion of $<TYPE>$.
@@ -31,8 +48,9 @@ m4_define([b4_lhs_value],
 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
 # symbols on RHS.
 m4_define([b4_rhs_value],
-[semantic_stack_@<:@m4_eval([$1 - $2])@:>@m4_ifval([$3], [.$3])])
+[semantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3])])
 
+m4_define_default([b4_location_type], [Location])
 
 # b4_lhs_location()
 # -----------------
@@ -46,27 +64,8 @@ m4_define([b4_lhs_location],
 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
 # on RHS.
 m4_define([b4_rhs_location],
-[location_stack_@<:@m4_eval([$1 - $2])@:>@])
-
-
-m4_define_default([b4_input_suffix], [.y])
-
-m4_define_default([b4_output_parser_suffix],
-[m4_translit(b4_input_suffix, [yY], [cC])])
-
-m4_define_default([b4_output_parser_name],
-[b4_output_prefix[]b4_output_infix[]b4_output_parser_suffix[]])
-
+[location_stack_@{m4_eval([$1 - $2])@}])
 
-m4_define_default([b4_output_header_suffix],
-[m4_translit(b4_input_suffix, [yY], [hH])])
-
-m4_define_default([b4_output_header_name],
-[b4_output_prefix[]b4_output_infix[]b4_output_header_suffix[]])
-
-m4_define_default([b4_header_guard],
-                  [m4_bpatsubst(m4_toupper([BISON_]b4_output_header_name),
-                                [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])])
 
 m4_define([b4_inherit],
           [m4_ifdef([b4_root],
@@ -87,12 +86,14 @@ m4_define([b4_constructor],
                    [])])
 
 
+# We do want M4 expansion after # for CPP macros.
+m4_changecom()
 m4_divert(0)dnl
-#output "b4_output_header_name"
+@output @output_header_name@
 b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
              [2002])
-#ifndef b4_header_guard
-# define b4_header_guard
+#ifndef YYLSP_NEEDED
+# define YYLSP_NEEDED
 
 #include "stack.hh"
 #include "location.hh"
@@ -103,14 +104,13 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
 /* Using locations.  */
 #define YYLSP_NEEDED b4_locations_flag
 
+b4_token_defines(b4_tokens)
+
 /* Copy the first part of user declarations.  */
 b4_pre_prologue
 
 /* Line __line__ of __file__.  */
-#line __oline__ "__ofile__"
-
-/* Tokens.  */
-b4_token_defines(b4_tokens)
+b4_syncline([@oline@], [@ofile@])
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -124,10 +124,10 @@ b4_token_defines(b4_tokens)
 
 #ifndef YYSTYPE
 m4_ifdef([b4_stype],
-[#line b4_stype_line "b4_filename"
+[b4_syncline([b4_stype_line], [b4_filename])
 typedef union b4_stype yystype;
 /* Line __line__ of __file__.  */
-#line __oline__ "__ofile__"],
+b4_syncline([@oline@], [@ofile@])],
 [typedef int yystype;])
 # define YYSTYPE yystype
 #endif
@@ -136,28 +136,16 @@ typedef union b4_stype yystype;
 b4_post_prologue
 
 /* Line __line__ of __file__.  */
-#line __oline__  "__ofile__"
+b4_syncline([@oline@], [@ofile@])
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N) \
    Current.last_line = Rhs[[N]].last_line; \
    Current.last_column = Rhs[[N]].last_column;
 #endif
 
-m4_if(b4_locations_flag, [0], [],
-[#ifndef YYLTYPE
-typedef struct yyltype
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} yyltype;
-# define YYLTYPE yyltype
-#endif])
-
 namespace yy
 {
-  class b4_name;
+  class b4_parser_class_name;
 
   template < typename P >
   struct Traits
@@ -165,47 +153,47 @@ namespace yy
   };
 
   template < >
-  struct Traits< b4_name >
+  struct Traits< b4_parser_class_name >
   {
-    typedef b4_uint_type(b4_translate_max) TokenNumberType;
-    typedef b4_sint_type(b4_rhs_max)       RhsNumberType;
+    typedef b4_int_type_for([b4_translate]) TokenNumberType;
+    typedef b4_int_type_for([b4_rhs])       RhsNumberType;
     typedef int      StateType;
     typedef yystype  SemanticType;
-    typedef b4_ltype LocationType;
+    typedef b4_location_type LocationType;
   };
 }
 
 namespace yy
 {
-  class b4_name b4_inherit
+  class b4_parser_class_name b4_inherit
   {
   public:
 
-    typedef Traits< b4_name >::TokenNumberType TokenNumberType;
-    typedef Traits< b4_name >::RhsNumberType   RhsNumberType;
-    typedef Traits< b4_name >::StateType       StateType;
-    typedef Traits< b4_name >::SemanticType    SemanticType;
-    typedef Traits< b4_name >::LocationType    LocationType;
+    typedef Traits< b4_parser_class_name >::TokenNumberType TokenNumberType;
+    typedef Traits< b4_parser_class_name >::RhsNumberType   RhsNumberType;
+    typedef Traits< b4_parser_class_name >::StateType       StateType;
+    typedef Traits< b4_parser_class_name >::SemanticType    SemanticType;
+    typedef Traits< b4_parser_class_name >::LocationType    LocationType;
 
     typedef Stack< StateType >    StateStack;
     typedef Stack< SemanticType > SemanticStack;
     typedef Stack< LocationType > LocationStack;
 
 #if YYLSP_NEEDED
-    b4_name (bool debug,
+    b4_parser_class_name (bool debug,
            LocationType initlocation[]b4_param) :
       b4_constructor[]debug_ (debug),
       cdebug_ (std::cerr),
       initlocation_ (initlocation)
 #else
-    b4_name (bool debug[]b4_param) :
+    b4_parser_class_name (bool debug[]b4_param) :
       b4_constructor[]debug_ (debug),
       cdebug_ (std::cerr)
 #endif
     {
     }
 
-    virtual ~b4_name ()
+    virtual ~b4_parser_class_name ()
     {
     }
 
@@ -223,14 +211,16 @@ namespace yy
     LocationStack location_stack_;
 
     /* Tables.  */
-    static const short pact_[[]];
-    static const short defact_[[]];
-    static const short pgoto_[[]];
-    static const short defgoto_[[]];
-    static const short table_[[]];
-    static const short check_[[]];
-    static const b4_uint_type(b4_r1_max) r1_[[]];
-    static const b4_uint_type(b4_r2_max) r2_[[]];
+    static const b4_int_type_for([b4_pact]) pact_[[]];
+    static const b4_int_type_for([b4_pact]) pact_ninf_;
+    static const b4_int_type_for([b4_defact]) defact_[[]];
+    static const b4_int_type_for([b4_pgoto]) pgoto_[[]];
+    static const b4_int_type_for([b4_defgoto]) defgoto_[[]];
+    static const b4_int_type_for([b4_table]) table_[[]];
+    static const b4_int_type_for([b4_table]) table_ninf_;
+    static const b4_int_type_for([b4_check]) check_[[]];
+    static const b4_int_type_for([b4_r1]) r1_[[]];
+    static const b4_int_type_for([b4_r2]) r2_[[]];
 
 #if YYDEBUG || YYERROR_VERBOSE
     static const char* const name_[[]];
@@ -239,10 +229,10 @@ namespace yy
     /* More tables, for debugging.  */
 #if YYDEBUG
     static const RhsNumberType rhs_[[]];
-    static const b4_uint_type(b4_prhs_max) prhs_[[]];
-    static const b4_uint_type(b4_rline_max) rline_[[]];
-    static const b4_uint_type(b4_stos_max) stos_[[]];
-    static const short token_number_[[]];
+    static const b4_int_type_for([b4_prhs]) prhs_[[]];
+    static const b4_int_type_for([b4_rline]) rline_[[]];
+    static const b4_int_type_for([b4_stos]) stos_[[]];
+    static const b4_int_type_for([b4_toknum]) token_number_[[]];
 #endif
 
     /* Even more tables.  */
@@ -250,8 +240,8 @@ namespace yy
 
     /* Constants.  */
     static const int eof_;
+    /* LAST_ -- Last index in TABLE_.  */
     static const int last_;
-    static const int flag_;
     static const int nnts_;
     static const int empty_;
     static const int final_;
@@ -282,7 +272,7 @@ namespace yy
     SemanticType value;
     LocationType location;
 
-    /* @$ and $$.  */
+    /* @@$ and $$.  */
     SemanticType yyval;
     LocationType yyloc;
 
@@ -291,13 +281,13 @@ namespace yy
   };
 }
 
-#endif /* not b4_header_guard */
-
-#output "b4_output_prefix[]b4_output_infix[].cc"
+#endif /* ! defined YYLSP_NEEDED */
+dnl
+@output @output_parser_name@
 b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
              [2002])
 
-#include "b4_output_header_name"
+#include @output_header_name@
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -307,7 +297,7 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
 #endif /* !YYDEBUG */
 
 int
-yy::b4_name::parse ()
+yy::b4_parser_class_name::parse ()
 {
   int nerrs = 0;
   int errstatus = 0;
@@ -336,7 +326,7 @@ yy::b4_name::parse ()
 
   /* Try to take a decision without lookahead.  */
   n_ = pact_[[state_]];
-  if (n_ == flag_)
+  if (n_ == pact_ninf_)
     goto yydefault;
 
   /* Read a lookahead token.  */
@@ -368,14 +358,14 @@ yy::b4_name::parse ()
     }
 
   n_ += ilooka_;
-  if (n_ < 0 || n_ > last_ || check_[[n_]] != ilooka_)
+  if (n_ < 0 || last_ < n_ || check_[[n_]] != ilooka_)
     goto yydefault;
 
   /* Reduce or error.  */
   n_ = table_[[n_]];
   if (n_ < 0)
     {
-      if (n_ == flag_)
+      if (n_ == table_ninf_)
        goto yyerrlab;
       else
        {
@@ -435,8 +425,8 @@ yy::b4_name::parse ()
     {
       YYCDEBUG << "Reducing via rule " << n_ - 1
             << " (line " << rline_[[n_]] << "), ";
-      for (b4_uint_type(b4_prhs_max) i = prhs_[[n_]];
-          rhs_[[i]] >= 0; ++i)
+      for (b4_int_type_for([b4_prhs]) i = prhs_[[n_]];
+          0 <= rhs_[[i]]; ++i)
        YYCDEBUG << name_[[rhs_[i]]] << ' ';
       YYCDEBUG << "-> " << name_[[r1_[n_]]] << std::endl;
     }
@@ -454,7 +444,7 @@ yy::b4_name::parse ()
     }
 
 /* Line __line__ of __file__.  */
-#line __oline__ "__ofile__"
+b4_syncline([@oline@], [@ofile@])
 
   state_stack_.pop (len_);
   semantic_stack_.pop (len_);
@@ -477,7 +467,7 @@ yy::b4_name::parse ()
   /* Shift the result of the reduction.  */
   n_ = r1_[[n_]];
   state_ = pgoto_[[n_ - ntokens_]] + state_stack_[[0]];
-  if (state_ >= 0 && state_ <= last_ && check_[[state_]] == state_stack_[[0]])
+  if (0 <= state_ && state_ <= last_ && check_[[state_]] == state_stack_[[0]])
     state_ = table_[[state_]];
   else
     state_ = defgoto_[[n_ - ntokens_]];
@@ -492,20 +482,20 @@ yy::b4_name::parse ()
 
 #if YYERROR_VERBOSE
       n_ = pact_[[state_]];
-      if (n_ > flag_ && n_ < last_)
+      if (pact_ninf_ < n_ && n_ < last_)
        {
-         message = "parse error, unexpected ";
+         message = "syntax error, unexpected ";
          message += name_[[ilooka_]];
          {
            int count = 0;
            for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
-             if (check_[[x + n_]] == x)
+             if (check_[[x + n_]] == x && x != terror_)
                ++count;
            if (count < 5)
              {
                count = 0;
                for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
-                 if (check_[[x + n_]] == x)
+                 if (check_[[x + n_]] == x && x != terror_)
                    {
                      message += (!count++) ? ", expecting " : " or ";
                      message += name_[[x]];
@@ -515,7 +505,7 @@ yy::b4_name::parse ()
        }
       else
 #endif
-       message = "parse error";
+       message = "syntax error";
       error_ ();
     }
   goto yyerrlab1;
@@ -543,7 +533,7 @@ yy::b4_name::parse ()
   for (;;)
     {
       n_ = pact_[[state_]];
-      if (n_ != flag_)
+      if (n_ != pact_ninf_)
        {
          n_ += terror_;
          if (0 <= n_ && n_ <= last_ && check_[[n_]] == terror_)
@@ -617,7 +607,7 @@ yy::b4_name::parse ()
 }
 
 void
-yy::b4_name::lex_ ()
+yy::b4_parser_class_name::lex_ ()
 {
 #if YYLSP_NEEDED
   looka_ = yylex (&value, &location);
@@ -628,8 +618,9 @@ yy::b4_name::lex_ ()
 
 /* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-const short
-yy::b4_name::pact_[[]] =
+const b4_int_type_for([b4_pact]) yy::b4_parser_class_name::pact_ninf_ = b4_pact_ninf;
+const b4_int_type_for([b4_pact])
+yy::b4_parser_class_name::pact_[[]] =
 {
   b4_pact
 };
@@ -637,22 +628,22 @@ yy::b4_name::pact_[[]] =
 /* YYDEFACT[[S]] -- default rule to reduce with in state S when YYTABLE
    doesn't specify something else to do.  Zero means the default is an
    error.  */
-const short
-yy::b4_name::defact_[[]] =
+const b4_int_type_for([b4_defact])
+yy::b4_parser_class_name::defact_[[]] =
 {
   b4_defact
 };
 
 /* YYPGOTO[[NTERM-NUM]].  */
-const short
-yy::b4_name::pgoto_[[]] =
+const b4_int_type_for([b4_pgoto])
+yy::b4_parser_class_name::pgoto_[[]] =
 {
   b4_pgoto
 };
 
 /* YYDEFGOTO[[NTERM-NUM]].  */
-const short
-yy::b4_name::defgoto_[[]] =
+const b4_int_type_for([b4_defgoto])
+yy::b4_parser_class_name::defgoto_[[]] =
 {
   b4_defgoto
 };
@@ -660,15 +651,16 @@ yy::b4_name::defgoto_[[]] =
 /* YYTABLE[[YYPACT[STATE-NUM]]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.  */
-const short
-yy::b4_name::table_[[]] =
+const b4_int_type_for([b4_table]) yy::b4_parser_class_name::table_ninf_ = b4_table_ninf;
+const b4_int_type_for([b4_table])
+yy::b4_parser_class_name::table_[[]] =
 {
   b4_table
 };
 
 /* YYCHECK.  */
-const short
-yy::b4_name::check_[[]] =
+const b4_int_type_for([b4_check])
+yy::b4_parser_class_name::check_[[]] =
 {
   b4_check
 };
@@ -676,31 +668,31 @@ yy::b4_name::check_[[]] =
 #if YYDEBUG
 /* STOS_[[STATE-NUM]] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-const b4_uint_type(b4_stos_max)
-yy::b4_name::stos_[[]] =
+const b4_int_type_for([b4_stos])
+yy::b4_parser_class_name::stos_[[]] =
 {
   b4_stos
 };
 
 /* TOKEN_NUMBER_[[YYLEX-NUM]] -- Internal token number corresponding
    to YYLEX-NUM.  */
-const short
-yy::b4_name::token_number_[[]] =
+const b4_int_type_for([b4_toknum])
+yy::b4_parser_class_name::token_number_[[]] =
 {
   b4_toknum
 };
 #endif
 
 /* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives.  */
-const b4_uint_type(b4_r1_max)
-yy::b4_name::r1_[[]] =
+const b4_int_type_for([b4_r1])
+yy::b4_parser_class_name::r1_[[]] =
 {
   b4_r1
 };
 
 /* YYR2[[YYN]] -- Number of symbols composing right hand side of rule YYN.  */
-const b4_uint_type(b4_r2_max)
-yy::b4_name::r2_[[]] =
+const b4_int_type_for([b4_r2])
+yy::b4_parser_class_name::r2_[[]] =
 {
   b4_r2
 };
@@ -709,7 +701,7 @@ yy::b4_name::r2_[[]] =
 /* YYTNAME[[SYMBOL-NUM]] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
 const char*
-const yy::b4_name::name_[[]] =
+const yy::b4_parser_class_name::name_[[]] =
 {
   b4_tname
 };
@@ -717,31 +709,31 @@ const yy::b4_name::name_[[]] =
 
 #if YYDEBUG
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
-const yy::b4_name::RhsNumberType
-yy::b4_name::rhs_[[]] =
+const yy::b4_parser_class_name::RhsNumberType
+yy::b4_parser_class_name::rhs_[[]] =
 {
   b4_rhs
 };
 
 /* YYPRHS[[YYN]] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-const b4_uint_type(b4_prhs_max)
-yy::b4_name::prhs_[[]] =
+const b4_int_type_for([b4_prhs])
+yy::b4_parser_class_name::prhs_[[]] =
 {
   b4_prhs
 };
 
 /* YYRLINE[[YYN]] -- source line where rule number YYN was defined.  */
-const b4_uint_type(b4_rline_max)
-yy::b4_name::rline_[[]] =
+const b4_int_type_for([b4_rline])
+yy::b4_parser_class_name::rline_[[]] =
 {
   b4_rline
 };
 #endif
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-yy::b4_name::TokenNumberType
-yy::b4_name::translate_ (int token)
+yy::b4_parser_class_name::TokenNumberType
+yy::b4_parser_class_name::translate_ (int token)
 {
   static
   const TokenNumberType
@@ -755,23 +747,22 @@ yy::b4_name::translate_ (int token)
     return undef_token_;
 }
 
-const int yy::b4_name::eof_ = 0;
-const int yy::b4_name::last_ = b4_last;
-const int yy::b4_name::flag_ = b4_flag;
-const int yy::b4_name::nnts_ = b4_nterms_number;
-const int yy::b4_name::empty_ = -2;
-const int yy::b4_name::final_ = b4_final_state_number;
-const int yy::b4_name::terror_ = 1;
-const int yy::b4_name::errcode_ = 256;
-const int yy::b4_name::ntokens_ = b4_tokens_number;
-const int yy::b4_name::initdepth_ = b4_initdepth;
+const int yy::b4_parser_class_name::eof_ = 0;
+const int yy::b4_parser_class_name::last_ = b4_last;
+const int yy::b4_parser_class_name::nnts_ = b4_nterms_number;
+const int yy::b4_parser_class_name::empty_ = -2;
+const int yy::b4_parser_class_name::final_ = b4_final_state_number;
+const int yy::b4_parser_class_name::terror_ = 1;
+const int yy::b4_parser_class_name::errcode_ = 256;
+const int yy::b4_parser_class_name::ntokens_ = b4_tokens_number;
+const int yy::b4_parser_class_name::initdepth_ = b4_stack_depth_init;
 
-const unsigned yy::b4_name::user_token_number_max_ = b4_user_token_number_max;
-const yy::b4_name::TokenNumberType yy::b4_name::undef_token_ = b4_undef_token_number;
+const unsigned yy::b4_parser_class_name::user_token_number_max_ = b4_user_token_number_max;
+const yy::b4_parser_class_name::TokenNumberType yy::b4_parser_class_name::undef_token_ = b4_undef_token_number;
 
 b4_epilogue
-
-#output "stack.hh"
+dnl
+@output stack.hh
 b4_copyright([2002])
 
 #ifndef BISON_STACK_HH
@@ -867,8 +858,8 @@ namespace yy
 }
 
 #endif // not BISON_STACK_HH
-
-#output "location.hh"
+dnl
+@output location.hh
 b4_copyright([2002])
 
 #ifndef BISON_LOCATION_HH