From: Akim Demaille Date: Thu, 27 Jun 2002 12:08:20 +0000 (+0000) Subject: * data/bison.simple, data/bison.c++: Rename as... X-Git-Tag: BISON-1_49b~130 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/60491a948b9339a6f68fafb63b51e9899d4e6aad * data/bison.simple, data/bison.c++: Rename as... * data/yacc.c, data/lalr1.cc: these. * doc/bison.texinfo (Environment Variables): Remove. --- diff --git a/ChangeLog b/ChangeLog index fe51f376..f38f8b9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2002-06-27 Akim Demaille + + * data/bison.simple, data/bison.c++: Rename as... + * data/yacc.c, data/lalr1.cc: these. + * doc/bison.texinfo (Environment Variables): Remove. + 2002-06-25 Raja R Harinath * src/getargs.c (report_argmatch): Initialize strtok(). diff --git a/data/Makefile.am b/data/Makefile.am index 57d89ac3..605d5918 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -15,7 +15,7 @@ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ## 02111-1307 USA -dist_pkgdata_DATA = bison.simple bison.c++ +dist_pkgdata_DATA = yacc.c lalr1.cc m4sugardir = $(pkgdatadir)/m4sugar dist_m4sugar_DATA = m4sugar/m4sugar.m4 m4sugar/version.m4 diff --git a/data/bison.c++ b/data/bison.c++ deleted file mode 100644 index d95e7936..00000000 --- a/data/bison.c++ +++ /dev/null @@ -1,932 +0,0 @@ -m4_divert(-1) - -# b4_sint_type(MAX) -# ----------------- -# Return the smallest signed int type able to handle the number MAX. -m4_define([b4_sint_type], -[m4_if(m4_eval([$1 <= 127]), [1], [signed char], - m4_eval([$1 <= 32767]), [1], [signed short], - [signed int])]) - - -# b4_uint_type(MAX) -# ----------------- -# Return the smallest unsigned int type able to handle the number MAX. -m4_define([b4_uint_type], -[m4_if(m4_eval([$1 <= 255]), [1], [unsigned char], - m4_eval([$1 <= 65535]), [1], [unsigned short], - [unsigned int])]) - - -# b4_lhs_value([TYPE]) -# -------------------- -# Expansion of $$. -m4_define([b4_lhs_value], -[yyval[]m4_ifval([$1], [.$1])]) - - -# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) -# -------------------------------------- -# Expansion of $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])]) - - -# b4_lhs_location() -# ----------------- -# Expansion of @$. -m4_define([b4_lhs_location], -[yyloc]) - - -# b4_rhs_location(RULE-LENGTH, NUM) -# --------------------------------- -# Expansion of @NUM, where the current rule has RULE-LENGTH symbols -# on RHS. -m4_define([b4_rhs_location], -[location_stack_@<:@m4_eval([$1 - $2])@:>@]) - - -# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) -# ----------------------------------------- -# Output the definition of this token as #define. -m4_define([b4_token_define], -[#define $1 $2 -]) - - -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ------------------------------------------------------- -# Output the definition of the tokens as #define. -m4_define([b4_token_defines], -[m4_map([b4_token_define], [$@])]) - -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[]]) - - -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], - [: public b4_root -], - [])]) - -m4_define([b4_param], - [m4_ifdef([b4_root], - [, - const Param& param], - [])]) - -m4_define([b4_constructor], - [m4_ifdef([b4_root], - [b4_root (param), - ], - [])]) - -m4_define([b4_copyright], - [/* -*- C++ -*- */ -/* A Bison parser, made from b4_filename, - by GNU bison b4_version. */ - -/* Skeleton output parser for bison, - Copyright 2002 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */]) - -m4_divert(0)dnl -#output "b4_output_header_name" -b4_copyright -#ifndef b4_header_guard -# define b4_header_guard - -#include "stack.hh" -#include "location.hh" - -#include -#include - -/* Using locations. */ -#define YYLSP_NEEDED b4_locations_flag - -/* Copy the first part of user declarations. */ -b4_pre_prologue - -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" - -/* Tokens. */ -b4_token_defines(b4_tokens) - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG b4_debug -#endif - -/* Enabling verbose error message. */ -#ifndef YYERROR_VERBOSE -# define YYERROR_VERBOSE b4_error_verbose -#endif - -#ifndef YYSTYPE -m4_ifdef([b4_stype], -[#line b4_stype_line "b4_filename" -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], -[typedef int yystype;]) -# define YYSTYPE yystype -#endif - -/* Copy the second part of user declarations. */ -b4_post_prologue - -/* Line __line__ of __file__. */ -#line __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; - - template < typename P > - struct Traits - { - }; - - template < > - struct Traits< b4_name > - { - typedef b4_uint_type(b4_translate_max) TokenNumberType; - typedef b4_sint_type(b4_rhs_max) RhsNumberType; - typedef int StateType; - typedef yystype SemanticType; - typedef b4_ltype LocationType; - }; -} - -namespace yy -{ - class b4_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 Stack< StateType > StateStack; - typedef Stack< SemanticType > SemanticStack; - typedef Stack< LocationType > LocationStack; - -#if YYLSP_NEEDED - b4_name (bool debug, - LocationType initlocation[]b4_param) : - b4_constructor[]debug_ (debug), - cdebug_ (std::cerr), - initlocation_ (initlocation) -#else - b4_name (bool debug[]b4_param) : - b4_constructor[]debug_ (debug), - cdebug_ (std::cerr) -#endif - { - } - - virtual ~b4_name () - { - } - - virtual int parse (); - - private: - - virtual void lex_ (); - virtual void error_ (); - virtual void print_ (); - - /* Stacks. */ - StateStack state_stack_; - SemanticStack semantic_stack_; - 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_[[]]; - -#if YYDEBUG || YYERROR_VERBOSE - static const char* const name_[[]]; -#endif - - /* 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_[[]]; -#endif - - /* Even more tables. */ - static inline TokenNumberType translate_ (int token); - - /* Constants. */ - static const int eof_; - static const int last_; - static const int flag_; - static const int nnts_; - static const int nsym_; - static const int empty_; - static const int final_; - static const int terror_; - static const int errcode_; - static const int ntokens_; - static const int initdepth_; - static const unsigned user_token_number_max_; - static const TokenNumberType undef_token_; - - /* State. */ - int n_; - int len_; - int state_; - - /* Debugging. */ - int debug_; - std::ostream &cdebug_; - - /* Lookahead and lookahead in internal form. */ - int looka_; - int ilooka_; - - /* Message. */ - std::string message; - - /* Semantic value and location of lookahead token. */ - SemanticType value; - LocationType location; - - /* @$ and $$. */ - SemanticType yyval; - LocationType yyloc; - - /* Initial location. */ - LocationType initlocation_; - }; -} - -#endif /* not b4_header_guard */ - -#output "b4_output_prefix[]b4_output_infix[].cc" -b4_copyright - -#include "b4_output_header_name" - -/* Enable debugging if requested. */ -#if YYDEBUG -# define YYCDEBUG if (debug_) cdebug_ -#else /* !YYDEBUG */ -# define YYCDEBUG if (0) cdebug_ -#endif /* !YYDEBUG */ - -int -yy::b4_name::parse () -{ - int nerrs = 0; - int errstatus = 0; - - /* Initialize stack. */ - state_stack_ = StateStack (0); - semantic_stack_ = SemanticStack (1); - location_stack_ = LocationStack (1); - - /* Start. */ - state_ = 0; - looka_ = empty_; -#if YYLSP_NEEDED - location = initlocation_; -#endif - YYCDEBUG << "Starting parse" << std::endl; - - /* New state. */ - yynewstate: - state_stack_.push (state_); - YYCDEBUG << "Entering state " << state_ << std::endl; - goto yybackup; - - /* Backup. */ - yybackup: - - /* Try to take a decision without lookahead. */ - n_ = pact_[[state_]]; - if (n_ == flag_) - goto yydefault; - - /* Read a lookahead token. */ - if (looka_ == empty_) - { - YYCDEBUG << "Reading a token: "; - lex_ (); - } - - /* Convert token to internal form. */ - if (looka_ <= 0) - { - looka_ = eof_; - ilooka_ = 0; - YYCDEBUG << "Now at end of input." << std::endl; - } - else - { - ilooka_ = translate_ (looka_); -#if YYDEBUG - if (debug_) - { - YYCDEBUG << "Next token is " << looka_ - << " (" << name_[[ilooka_]]; - print_ (); - YYCDEBUG << ')' << std::endl; - } -#endif - } - - n_ += ilooka_; - if (n_ < 0 || n_ > last_ || check_[[n_]] != ilooka_) - goto yydefault; - - /* Reduce or error. */ - n_ = table_[[n_]]; - if (n_ < 0) - { - if (n_ == flag_) - goto yyerrlab; - else - { - n_ = -n_; - goto yyreduce; - } - } - else if (n_ == 0) - goto yyerrlab; - - /* Accept? */ - if (n_ == final_) - goto yyacceptlab; - - /* Shift the lookahead token. */ - YYCDEBUG << "Shifting token " << looka_ - << " (" << name_[[ilooka_]] << "), "; - - /* Discard the token being shifted unless it is eof. */ - if (looka_ != eof_) - looka_ = empty_; - - semantic_stack_.push (value); - location_stack_.push (location); - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (errstatus) - --errstatus; - - state_ = n_; - goto yynewstate; - - /* Default action. */ - yydefault: - n_ = defact_[[state_]]; - if (n_ == 0) - goto yyerrlab; - goto yyreduce; - - /* Reduce. */ - yyreduce: - len_ = r2_[[n_]]; - if (len_) - { - yyval = semantic_stack_[[len_ - 1]]; - yyloc = location_stack_[[len_ - 1]]; - } - else - { - yyval = semantic_stack_[[0]]; - yyloc = location_stack_[[0]]; - } - -#if YYDEBUG - if (debug_) - { - YYCDEBUG << "Reducing via rule " << n_ - 1 - << " (line " << rline_[[n_]] << "), "; - for (b4_uint_type(b4_prhs_max) i = prhs_[[n_]]; - rhs_[[i]] >= 0; ++i) - YYCDEBUG << name_[[rhs_[i]]] << ' '; - YYCDEBUG << "-> " << name_[[r1_[n_]]] << std::endl; - } -#endif - - if (len_) - { - Slice< LocationType, LocationStack > slice (location_stack_, len_); - YYLLOC_DEFAULT (yyloc, slice, len_); - } - - switch (n_) - { - b4_actions - } - -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" - - state_stack_.pop (len_); - semantic_stack_.pop (len_); - location_stack_.pop (len_); - -#if YYDEBUG - if (debug_) - { - YYCDEBUG << "state stack now"; - for (StateStack::ConstIterator i = state_stack_.begin (); - i != state_stack_.end (); ++i) - YYCDEBUG << ' ' << *i; - YYCDEBUG << std::endl; - } -#endif - - semantic_stack_.push (yyval); - location_stack_.push (yyloc); - - /* 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]]) - state_ = table_[[state_]]; - else - state_ = defgoto_[[n_ - ntokens_]]; - goto yynewstate; - - /* Report and recover from errors. This is very incomplete. */ - yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!errstatus) - { - ++nerrs; - -#if YYERROR_VERBOSE - n_ = pact_[[state_]]; - if (n_ > flag_ && n_ < last_) - { - message = "parse error, unexpected "; - message += name_[[ilooka_]]; - { - int count = 0; - for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) - if (check_[[x + n_]] == x) - ++count; - if (count < 5) - { - count = 0; - for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) - if (check_[[x + n_]] == x) - { - message += (!count++) ? ", expecting " : " or "; - message += name_[[x]]; - } - } - } - } - else -#endif - message = "parse error"; - error_ (); - } - goto yyerrlab1; - - /* Error raised explicitly by an action. */ - yyerrlab1: - if (errstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - /* Return failure if at end of input. */ - if (looka_ == eof_) - goto yyabortlab; - YYCDEBUG << "Discarding token " << looka_ - << " (" << name_[[ilooka_]] << ")." << std::endl; - looka_ = empty_; - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - - errstatus = 3; - - for (;;) - { - n_ = pact_[[state_]]; - if (n_ != flag_) - { - n_ += terror_; - if (0 <= n_ && n_ <= last_ && check_[[n_]] == terror_) - { - n_ = table_[[n_]]; - if (0 < n_) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (!state_stack_.height ()) - goto yyabortlab; - -#if YYDEBUG - if (debug_) - { - if (stos_[[state_]] < ntokens_) - { - YYCDEBUG << "Error: popping token " - << token_number_[[stos_[state_]]] - << " (" << name_[[stos_[state_]]]; -# ifdef YYPRINT - YYPRINT (stderr, token_number_[[stos_[state_]]], - semantic_stack_.top ()); -# endif - YYCDEBUG << ')' << std::endl; - } - else - { - YYCDEBUG << "Error: popping nonterminal (" - << name_[[stos_[state_]]] << ')' << std::endl; - } - } -#endif - - state_ = (state_stack_.pop (), state_stack_[[0]]); - semantic_stack_.pop (); - location_stack_.pop ();; - -#if YYDEBUG - if (debug_) - { - YYCDEBUG << "Error: state stack now"; - for (StateStack::ConstIterator i = state_stack_.begin (); - i != state_stack_.end (); ++i) - YYCDEBUG << ' ' << *i; - YYCDEBUG << std::endl; - } -#endif - } - - if (n_ == final_) - goto yyacceptlab; - - YYCDEBUG << "Shifting error token, "; - - semantic_stack_.push (value); - location_stack_.push (location); - - state_ = n_; - goto yynewstate; - - /* Accept. */ - yyacceptlab: - return 0; - - /* Abort. */ - yyabortlab: - return 1; -} - -void -yy::b4_name::lex_ () -{ -#if YYLSP_NEEDED - looka_ = yylex (&value, &location); -#else - looka_ = yylex (&value); -#endif -} - -/* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -const short -yy::b4_name::pact_[[]] = -{ - b4_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_[[]] = -{ - b4_defact -}; - -/* YYPGOTO[[NTERM-NUM]]. */ -const short -yy::b4_name::pgoto_[[]] = -{ - b4_pgoto -}; - -/* YYDEFGOTO[[NTERM-NUM]]. */ -const short -yy::b4_name::defgoto_[[]] = -{ - b4_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_[[]] = -{ - b4_table -}; - -/* YYCHECK. */ -const short -yy::b4_name::check_[[]] = -{ - b4_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_[[]] = -{ - b4_stos -}; - -/* TOKEN_NUMBER_[[YYLEX-NUM]] -- Internal token number corresponding - to YYLEX-NUM. */ -const short -yy::b4_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_[[]] = -{ - 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_[[]] = -{ - b4_r2 -}; - -#if YYDEBUG || YYERROR_VERBOSE -/* 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_[[]] = -{ - b4_tname -}; -#endif - -#if YYDEBUG -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -const yy::b4_name::RhsNumberType -yy::b4_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_[[]] = -{ - b4_prhs -}; - -/* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */ -const b4_uint_type(b4_rline_max) -yy::b4_name::rline_[[]] = -{ - b4_rline -}; -#endif - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -yy::b4_name::TokenNumberType -yy::b4_name::translate_ (int token) -{ - static - const TokenNumberType - translate_[[]] = - { - b4_translate - }; - if ((unsigned) token <= user_token_number_max_) - return translate_[[token]]; - else - 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_nnts; -const int yy::b4_name::nsym_ = b4_nsym; -const int yy::b4_name::empty_ = -2; -const int yy::b4_name::final_ = b4_final; -const int yy::b4_name::terror_ = 1; -const int yy::b4_name::errcode_ = 256; -const int yy::b4_name::ntokens_ = b4_ntokens; -const int yy::b4_name::initdepth_ = b4_initdepth; - -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; - -b4_epilogue - -#output "stack.hh" -b4_copyright - -#ifndef BISON_STACK_HH -# define BISON_STACK_HH - -#include - -namespace yy -{ - template < class T, class S = std::deque< T > > - class Stack - { - public: - - typedef typename S::iterator Iterator; - typedef typename S::const_iterator ConstIterator; - - Stack () : seq_ () - { - } - - Stack (unsigned n) : seq_ (n) - { - } - - inline - T& - operator [[]] (unsigned index) - { - return seq_[[index]]; - } - - inline - const T& - operator [[]] (unsigned index) const - { - return seq_[[index]]; - } - - inline - void - push (const T& t) - { - seq_.push_front (t); - } - - inline - void - pop (unsigned n = 1) - { - for (; n; --n) - seq_.pop_front (); - } - - inline - unsigned - height () const - { - return seq_.size (); - } - - inline ConstIterator begin () const { return seq_.begin (); } - inline ConstIterator end () const { return seq_.end (); } - - private: - - S seq_; - }; - - template < class T, class S = Stack< T > > - class Slice - { - public: - - Slice (const S& stack, - unsigned range) : stack_ (stack), - range_ (range) - { - } - - inline - const T& - operator [[]] (unsigned index) const - { - return stack_[[range_ - index]]; - } - - private: - - const S& stack_; - unsigned range_; - }; -} - -#endif // not BISON_STACK_HH - -#output "location.hh" -b4_copyright - -#ifndef BISON_LOCATION_HH -# define BISON_LOCATION_HH - -namespace yy -{ - struct Position - { - int line; - int column; - }; - - struct Location - { - Position first; - Position last; - }; -} - -#endif // not BISON_LOCATION_HH diff --git a/data/bison.simple b/data/bison.simple deleted file mode 100644 index 5a4091e5..00000000 --- a/data/bison.simple +++ /dev/null @@ -1,1325 +0,0 @@ -m4_divert(-1) -*- C -*- - -# b4_sint_type(MAX) -# ----------------- -# Return the smallest signed int type able to handle the number MAX. -m4_define([b4_sint_type], -[m4_if(m4_eval([$1 <= 127]), [1], [signed char], - m4_eval([$1 <= 32767]), [1], [signed short], - [signed int])]) - - -# b4_uint_type(MAX) -# ----------------- -# Return the smallest unsigned int type able to handle the number MAX. -m4_define([b4_uint_type], -[m4_if(m4_eval([$1 <= 255]), [1], [unsigned char], - m4_eval([$1 <= 65535]), [1], [unsigned short], - [unsigned int])]) - - -# b4_lhs_value([TYPE]) -# -------------------- -# Expansion of $$. -m4_define([b4_lhs_value], -[yyval[]m4_ifval([$1], [.$1])]) - - -# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) -# -------------------------------------- -# Expansion of $NUM, where the current rule has RULE-LENGTH -# symbols on RHS. -m4_define([b4_rhs_value], -[yyvsp@<:@m4_eval([$2 - $1])@:>@m4_ifval([$3], [.$3])]) - - - -## ----------- ## -## Locations. ## -## ----------- ## - -# b4_location_if(IF-TRUE, IF-FALSE) -# --------------------------------- -# Expand IF-TRUE, if locations are used, IF-FALSE otherwise. -m4_define([b4_location_if], -[m4_if(b4_locations_flag, [1], - [$1], - [$2])]) - - -# b4_lhs_location() -# ----------------- -# Expansion of @$. -m4_define([b4_lhs_location], -[yyloc]) - - -# b4_rhs_location(RULE-LENGTH, NUM) -# --------------------------------- -# Expansion of @NUM, where the current rule has RULE-LENGTH symbols -# on RHS. -m4_define([b4_rhs_location], -[yylsp@<:@m4_eval([$2 - $1])@:>@]) - - - -## -------------- ## -## %pure-parser. ## -## -------------- ## - -# b4_pure_if(IF-TRUE, IF-FALSE) -# ----------------------------- -# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise. -m4_define([b4_pure_if], -[m4_if(b4_pure, [1], - [$1], - [$2])]) - - -## ------------------- ## -## Output file names. ## -## ------------------- ## - -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[]]) - - -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]], [_])]) - - -## ------------------------- ## -## Assigning token numbers. ## -## ------------------------- ## - -# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) -# ----------------------------------------- -# Output the definition of this token as #define. -m4_define([b4_token_define], -[#define $1 $2 -]) - - -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) -# --------------------------------------- -# Output the definition of this token as an enum. -m4_define([b4_token_enum], -[$1 = $2]) - - -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ------------------------------------------------------- -# Output the definition of the tokens (if there are) as enums and #define. -m4_define([b4_token_defines], -[m4_if([$@], [[]], [], -[/* Tokens. */ -#ifndef YYTOKENTYPE -# if defined (__STDC__) || defined (__cplusplus) - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { -m4_map_sep([ b4_token_enum], [, -], - [$@]) - }; -# endif - /* POSIX requires `int' for tokens in interfaces. */ -# define YYTOKENTYPE int -#endif /* !YYTOKENTYPE */ -m4_map([b4_token_define], [$@]) -]) -]) - - -## --------------------------------------------------------- ## -## Defining symbol actions, e.g., printers and destructors. ## -## --------------------------------------------------------- ## - -# b4_symbol_actions(FILENAME, LINENO, -# SYMBOL-TAG, SYMBOL-NUM, -# SYMBOL-ACTION, SYMBOL-TYPENAME) -# ------------------------------------------------- -m4_define([b4_symbol_actions], -[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl -m4_pushdef([b4_at_dollar], [yylocation])dnl - case $4: /* $3 */ -#line $2 "$1" - $5; -#line __oline__ "__ofile__" - break; -m4_popdef([b4_at_dollar])dnl -m4_popdef([b4_dollar_dollar])dnl -]) - - - -m4_divert(0)dnl -#output "b4_output_parser_name" -/* A Bison parser, made from b4_filename - by GNU bison b4_version. */ - -/* Skeleton output parser for Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software - Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser when - the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the original so - called ``semantic'' parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Pure parsers. */ -#define YYPURE b4_pure - -/* Using locations. */ -#define YYLSP_NEEDED b4_locations_flag - -m4_if(b4_prefix[], [yy], [], -[/* If NAME_PREFIX is specified substitute the variables and functions - names. */ -#define yyparse b4_prefix[]parse -#define yylex b4_prefix[]lex -#define yyerror b4_prefix[]error -#define yylval b4_prefix[]lval -#define yychar b4_prefix[]char -#define yydebug b4_prefix[]debug -#define yynerrs b4_prefix[]nerrs -b4_location_if([#define yylloc b4_prefix[]lloc])]) - -/* Copy the first part of user declarations. */ -b4_pre_prologue - -b4_token_defines(b4_tokens) - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG b4_debug -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE b4_error_verbose -#endif - -#ifndef YYSTYPE -m4_ifdef([b4_stype], -[#line b4_stype_line "b4_filename" -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], -[typedef int yystype;]) -# define YYSTYPE yystype -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE b4_ltype -# define YYLTYPE_IS_TRIVIAL 1 -#endif - -/* Copy the second part of user declarations. */ -b4_post_prologue - -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" - -#if ! defined (yyoverflow) || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# else -# ifndef YYSTACK_USE_ALLOCA -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -# define YYSTACK_ALLOC malloc -# define YYSTACK_FREE free -# endif -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ - - -#if (! defined (yyoverflow) \ - && (! defined (__cplusplus) \ - || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - short yyss; - YYSTYPE yyvs; - b4_location_if([ YYLTYPE yyls; -])dnl -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -b4_location_if( -[# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ - + 2 * YYSTACK_GAP_MAX)], -[# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAX)]) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - register YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[[yyi]] = (From)[[yyi]]; \ - } \ - while (0) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL b4_final -#define YYFLAG b4_flag -#define YYLAST b4_last - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS b4_ntokens -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS b4_nnts -/* YYNRULES -- Number of rules. */ -#define YYNRULES b4_nrules -/* YYNRULES -- Number of states. */ -#define YYNSTATES b4_nstates - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK b4_undef_token_number -#define YYMAXUTOK b4_user_token_number_max - -#define YYTRANSLATE(X) \ - ((unsigned)(X) <= YYMAXUTOK ? yytranslate[[X]] : YYUNDEFTOK) - -/* YYTRANSLATE[[YYLEX]] -- Bison symbol number corresponding to YYLEX. */ -static const b4_uint_type(b4_translate_max) yytranslate[[]] = -{ - b4_translate -}; - -#if YYDEBUG -/* YYPRHS[[YYN]] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const b4_uint_type(b4_prhs_max) yyprhs[[]] = -{ - b4_prhs -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const b4_sint_type(b4_rhs_max) yyrhs[[]] = -{ - b4_rhs -}; - -/* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */ -static const b4_uint_type(b4_rline_max) yyrline[[]] = -{ - b4_rline -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[[SYMBOL-NUM]] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[[]] = -{ - b4_tname -}; -#endif - -/* YYTOKNUM[[YYLEX-NUM]] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const short yytoknum[[]] = -{ - b4_toknum -}; - -/* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives. */ -static const b4_uint_type(b4_r1_max) yyr1[[]] = -{ - b4_r1 -}; - -/* YYR2[[YYN]] -- Number of symbols composing right hand side of rule YYN. */ -static const b4_uint_type(b4_r2_max) yyr2[[]] = -{ - b4_r2 -}; - -/* YYDEFACT[[STATE-NAME]] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const short yydefact[[]] = -{ - b4_defact -}; - -/* YYPGOTO[[NTERM-NUM]]. */ -static const short yydefgoto[[]] = -{ - b4_defgoto -}; - -/* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const short yypact[[]] = -{ - b4_pact -}; - -/* YYPGOTO[[NTERM-NUM]]. */ -static const short yypgoto[[]] = -{ - b4_pgoto -}; - -/* 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. */ -static const short yytable[[]] = -{ - b4_table -}; - -static const short yycheck[[]] = -{ - b4_check -}; - -/* YYSTOS[[STATE-NUM]] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const b4_uint_type(b4_stos_max) yystos[[]] = -{ - b4_stos -}; - -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -#endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int -#endif - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror ("syntax error: cannot back up"); \ - YYERROR; \ - } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.first_line = Rhs[[1]].first_line; \ - Current.first_column = Rhs[[1]].first_column; \ - Current.last_line = Rhs[[N]].last_line; \ - Current.last_column = Rhs[[N]].last_column; -#endif - -/* YYLEX -- calling `yylex' with the right arguments. */ - -b4_pure_if( -[#ifdef YYLEX_PARAM -# define YYLEX yylex (&yylval[]b4_location_if([, &yylloc]), YYLEX_PARAM) -#else -# define YYLEX yylex (&yylval[]b4_location_if([, &yylloc])) -#endif], -[#define YYLEX yylex ()]) - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -#endif /* !YYDEBUG */ - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH b4_initdepth -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#if YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH b4_maxdepth -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined (__GLIBC__) && defined (_STRING_H) -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -# if defined (__STDC__) || defined (__cplusplus) -yystrlen (const char *yystr) -# else -yystrlen (yystr) - const char *yystr; -# endif -{ - register const char *yys = yystr; - - while (*yys++ != '\0') - continue; - - return yys - yystr - 1; -} -# endif -# endif - -# ifndef yystpcpy -# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -# if defined (__STDC__) || defined (__cplusplus) -yystpcpy (char *yydest, const char *yysrc) -# else -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -# endif -{ - register char *yyd = yydest; - register const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -#endif /* !YYERROR_VERBOSE */ - - - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -# define YYPARSE_PARAM_DECL -# else -# define YYPARSE_PARAM_ARG YYPARSE_PARAM -# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -# endif -#else /* !YYPARSE_PARAM */ -# define YYPARSE_PARAM_ARG -# define YYPARSE_PARAM_DECL -#endif /* !YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -# ifdef YYPARSE_PARAM -int yyparse (void *); -# else -int yyparse (void); -# endif -#endif - -#if defined (__STDC__) || defined (__cplusplus) -static void yydestruct (int yytype, - YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])); -# if YYDEBUG -static void yysymprint (FILE* out, int yytype, - YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])); -# endif -#endif - -m4_divert_push([KILL])# ======================== M4 code. -# b4_declare_parser_variables -# --------------------------- -# Declare the variables that are global, or local to YYPARSE if -# pure-parser -m4_define([b4_declare_parser_variables], -[/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of parse errors so far. */ -int yynerrs;b4_location_if([ -/* Location data for the lookahead symbol. */ -YYLTYPE yylloc;]) -]) -m4_divert_pop([KILL])dnl# ====================== End of M4 code. - -b4_pure_if([], - [b4_declare_parser_variables]) - -int -yyparse (YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{[ - ]b4_pure_if([b4_declare_parser_variables])[ - register int yystate; - register int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ - int yychar1 = 0; - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; - register short *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - register YYSTYPE *yyvsp; - -]b4_location_if( -[[ /* The location stack. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp;]])[ - -#define YYPOPSTACK (yyvsp--, yyssp--]b4_location_if([, yylsp--])[) - - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; -]b4_location_if([ YYLTYPE yyloc;])[ - - /* When reducing, the number of symbols on the RHS of the reduced - rule. */ - int yylen; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; -]b4_location_if([ yylsp = yyls;])[ - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. - */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -]b4_location_if([ YYLTYPE *yyls1 = yyls;])[ - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), -]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[ - &yystacksize); -]b4_location_if([ yyls = yyls1;])[ - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyoverflowlab; -# else - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - goto yyoverflowlab; - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - - { - short *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyoverflowlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); -]b4_location_if([ YYSTACK_RELOCATE (yyls);])[ -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; -]b4_location_if([ yylsp = yyls + yysize - 1;])[ - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with. */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more. */ - - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yychar1 = YYTRANSLATE (yychar); - - /* We have to keep this `#if YYDEBUG', since we use variables - which are defined only if `YYDEBUG' is set. */ - YYDPRINTF ((stderr, "Next token is ")); - YYDSYMPRINT ((stderr, yychar1, yylval]b4_location_if([, yyloc])[)); - YYDPRINTF ((stderr, "\n")); - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %d (%s), ", - yychar, yytname[yychar1])); - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -]b4_location_if([ *++yylsp = yylloc;])[ - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - yystate = yyn; - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to the semantic value of - the lookahead token. This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - -]b4_location_if( -[ /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);])[ - -#if YYDEBUG - /* We have to keep this `#if YYDEBUG', since we use variables which - are defined only if `YYDEBUG' is set. */ - if (yydebug) - { - int yyi; - - YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", - yyn - 1, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) - YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); - YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - switch (yyn) - ]{ - b4_actions - } - -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" - -[ yyvsp -= yylen; - yyssp -= yylen; -]b4_location_if([ yylsp -= yylen;])[ - -#if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; -]b4_location_if([ *++yylsp = yyloc;])[ - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; - -#if YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - YYSIZE_T yysize = 0; - char *yymsg; - int yyx, yycount; - - yycount = 0; - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) - if (yycheck[yyx + yyn] == yyx) - yysize += yystrlen (yytname[yyx]) + 15, yycount++; - yysize += yystrlen ("parse error, unexpected ") + 1; - yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) - { - char *yyp = yystpcpy (yymsg, "parse error, unexpected "); - yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); - - if (yycount < 5) - { - yycount = 0; - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); - yyx++) - if (yycheck[yyx + yyn] == yyx) - { - const char *yyq = ! yycount ? ", expecting " : " or "; - yyp = yystpcpy (yyp, yyq); - yyp = yystpcpy (yyp, yytname[yyx]); - yycount++; - } - } - yyerror (yymsg); - YYSTACK_FREE (yymsg); - } - else - yyerror ("parse error; also virtual memory exhausted"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror ("parse error"); - } - goto yyerrlab1; - - -/*----------------------------------------------------. -| yyerrlab1 -- error raised explicitly by an action. | -`----------------------------------------------------*/ -yyerrlab1: - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - /* Return failure if at end of input. */ - if (yychar == YYEOF) - { - /* Pop the error token. */ - YYPOPSTACK; - /* Pop the rest of the stack. */ - while (yyssp > yyss) - { - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], - *yyvsp]b4_location_if([, *yylsp])[)); - YYDPRINTF ((stderr, "\n")); - yydestruct (yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[); - YYPOPSTACK; - } - YYABORT; - } - - YYDPRINTF ((stderr, "Discarding token %d (%s).\n", - yychar, yytname[yychar1])); - yydestruct (yychar1, yylval]b4_location_if([, yylloc])[); - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYFLAG) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[)); - YYDPRINTF ((stderr, "\n")); - - yydestruct (yystos[yystate], *yyvsp]b4_location_if([, *yylsp])[); - yyvsp--; - yystate = *--yyssp; -]b4_location_if([ yylsp--;])[ - -#if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "Error: state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } -#endif - } - - if (yyn == YYFINAL) - YYACCEPT; - - YYDPRINTF ((stderr, "Shifting error token, ")); - - *++yyvsp = yylval; -]b4_location_if([ *++yylsp = yylloc;])[ - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif - return yyresult; -]} - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (int yytype, - YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])) -{ - switch (yytype) - { -m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))dnl - default: - break; - } -} - - -#if YYDEBUG -/*-----------------------------. -| Print this symbol on YYOUT. | -`-----------------------------*/ - -static void -yysymprint (FILE* yyout, int yytype, - YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])) -{ - if (yytype < YYNTOKENS) - { - YYFPRINTF (yyout, "token %s (", yytname[[yytype]]); -# ifdef YYPRINT - YYPRINT (yyout, yytoknum[[yytype]], yyvalue); -# endif - } - else - YYFPRINTF (yyout, "nterm %s (", yytname[[yytype]]); - - switch (yytype) - { -m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl - default: - break; - } - YYFPRINTF (yyout, ")"); -} -#endif /* YYDEBUG. */ - -b4_epilogue -m4_if(b4_defines_flag, 0, [], -[#output "b4_output_header_name" -#ifndef b4_header_guard -# define b4_header_guard - -b4_token_defines(b4_tokens) - -#ifndef YYSTYPE -m4_ifdef([b4_stype], -[#line b4_stype_line "b4_filename" -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], -[typedef int yystype;]) -# define YYSTYPE yystype -#endif - -b4_pure_if([], -[extern YYSTYPE b4_prefix[]lval;]) - -b4_location_if( -[#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE yyltype -#endif - -m4_if(b4_pure, [0], -[extern YYLTYPE b4_prefix[]lloc;]) -]) -#endif /* not b4_header_guard */ -]) diff --git a/data/lalr1.cc b/data/lalr1.cc new file mode 100644 index 00000000..4aa3689b --- /dev/null +++ b/data/lalr1.cc @@ -0,0 +1,951 @@ +m4_divert(-1) + +# C++ skeleton for Bison +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + + +# b4_sint_type(MAX) +# ----------------- +# Return the smallest signed int type able to handle the number MAX. +m4_define([b4_sint_type], +[m4_if(m4_eval([$1 <= 127]), [1], [signed char], + m4_eval([$1 <= 32767]), [1], [signed short], + [signed int])]) + + +# b4_uint_type(MAX) +# ----------------- +# Return the smallest unsigned int type able to handle the number MAX. +m4_define([b4_uint_type], +[m4_if(m4_eval([$1 <= 255]), [1], [unsigned char], + m4_eval([$1 <= 65535]), [1], [unsigned short], + [unsigned int])]) + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[yyval[]m4_ifval([$1], [.$1])]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $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])]) + + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[yyloc]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[location_stack_@<:@m4_eval([$1 - $2])@:>@]) + + +# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) +# ----------------------------------------- +# Output the definition of this token as #define. +m4_define([b4_token_define], +[#define $1 $2 +]) + + +# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------- +# Output the definition of the tokens as #define. +m4_define([b4_token_defines], +[m4_map([b4_token_define], [$@])]) + +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[]]) + + +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], + [: public b4_root +], + [])]) + +m4_define([b4_param], + [m4_ifdef([b4_root], + [, + const Param& param], + [])]) + +m4_define([b4_constructor], + [m4_ifdef([b4_root], + [b4_root (param), + ], + [])]) + +m4_define([b4_copyright], + [/* -*- C++ -*- */ +/* A Bison parser, made from b4_filename, + by GNU bison b4_version. */ + +/* Skeleton output parser for bison, + Copyright 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */]) + +m4_divert(0)dnl +#output "b4_output_header_name" +b4_copyright +#ifndef b4_header_guard +# define b4_header_guard + +#include "stack.hh" +#include "location.hh" + +#include +#include + +/* Using locations. */ +#define YYLSP_NEEDED b4_locations_flag + +/* Copy the first part of user declarations. */ +b4_pre_prologue + +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__" + +/* Tokens. */ +b4_token_defines(b4_tokens) + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG b4_debug +#endif + +/* Enabling verbose error message. */ +#ifndef YYERROR_VERBOSE +# define YYERROR_VERBOSE b4_error_verbose +#endif + +#ifndef YYSTYPE +m4_ifdef([b4_stype], +[#line b4_stype_line "b4_filename" +typedef union b4_stype yystype; +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__"], +[typedef int yystype;]) +# define YYSTYPE yystype +#endif + +/* Copy the second part of user declarations. */ +b4_post_prologue + +/* Line __line__ of __file__. */ +#line __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; + + template < typename P > + struct Traits + { + }; + + template < > + struct Traits< b4_name > + { + typedef b4_uint_type(b4_translate_max) TokenNumberType; + typedef b4_sint_type(b4_rhs_max) RhsNumberType; + typedef int StateType; + typedef yystype SemanticType; + typedef b4_ltype LocationType; + }; +} + +namespace yy +{ + class b4_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 Stack< StateType > StateStack; + typedef Stack< SemanticType > SemanticStack; + typedef Stack< LocationType > LocationStack; + +#if YYLSP_NEEDED + b4_name (bool debug, + LocationType initlocation[]b4_param) : + b4_constructor[]debug_ (debug), + cdebug_ (std::cerr), + initlocation_ (initlocation) +#else + b4_name (bool debug[]b4_param) : + b4_constructor[]debug_ (debug), + cdebug_ (std::cerr) +#endif + { + } + + virtual ~b4_name () + { + } + + virtual int parse (); + + private: + + virtual void lex_ (); + virtual void error_ (); + virtual void print_ (); + + /* Stacks. */ + StateStack state_stack_; + SemanticStack semantic_stack_; + 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_[[]]; + +#if YYDEBUG || YYERROR_VERBOSE + static const char* const name_[[]]; +#endif + + /* 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_[[]]; +#endif + + /* Even more tables. */ + static inline TokenNumberType translate_ (int token); + + /* Constants. */ + static const int eof_; + static const int last_; + static const int flag_; + static const int nnts_; + static const int nsym_; + static const int empty_; + static const int final_; + static const int terror_; + static const int errcode_; + static const int ntokens_; + static const int initdepth_; + static const unsigned user_token_number_max_; + static const TokenNumberType undef_token_; + + /* State. */ + int n_; + int len_; + int state_; + + /* Debugging. */ + int debug_; + std::ostream &cdebug_; + + /* Lookahead and lookahead in internal form. */ + int looka_; + int ilooka_; + + /* Message. */ + std::string message; + + /* Semantic value and location of lookahead token. */ + SemanticType value; + LocationType location; + + /* @$ and $$. */ + SemanticType yyval; + LocationType yyloc; + + /* Initial location. */ + LocationType initlocation_; + }; +} + +#endif /* not b4_header_guard */ + +#output "b4_output_prefix[]b4_output_infix[].cc" +b4_copyright + +#include "b4_output_header_name" + +/* Enable debugging if requested. */ +#if YYDEBUG +# define YYCDEBUG if (debug_) cdebug_ +#else /* !YYDEBUG */ +# define YYCDEBUG if (0) cdebug_ +#endif /* !YYDEBUG */ + +int +yy::b4_name::parse () +{ + int nerrs = 0; + int errstatus = 0; + + /* Initialize stack. */ + state_stack_ = StateStack (0); + semantic_stack_ = SemanticStack (1); + location_stack_ = LocationStack (1); + + /* Start. */ + state_ = 0; + looka_ = empty_; +#if YYLSP_NEEDED + location = initlocation_; +#endif + YYCDEBUG << "Starting parse" << std::endl; + + /* New state. */ + yynewstate: + state_stack_.push (state_); + YYCDEBUG << "Entering state " << state_ << std::endl; + goto yybackup; + + /* Backup. */ + yybackup: + + /* Try to take a decision without lookahead. */ + n_ = pact_[[state_]]; + if (n_ == flag_) + goto yydefault; + + /* Read a lookahead token. */ + if (looka_ == empty_) + { + YYCDEBUG << "Reading a token: "; + lex_ (); + } + + /* Convert token to internal form. */ + if (looka_ <= 0) + { + looka_ = eof_; + ilooka_ = 0; + YYCDEBUG << "Now at end of input." << std::endl; + } + else + { + ilooka_ = translate_ (looka_); +#if YYDEBUG + if (debug_) + { + YYCDEBUG << "Next token is " << looka_ + << " (" << name_[[ilooka_]]; + print_ (); + YYCDEBUG << ')' << std::endl; + } +#endif + } + + n_ += ilooka_; + if (n_ < 0 || n_ > last_ || check_[[n_]] != ilooka_) + goto yydefault; + + /* Reduce or error. */ + n_ = table_[[n_]]; + if (n_ < 0) + { + if (n_ == flag_) + goto yyerrlab; + else + { + n_ = -n_; + goto yyreduce; + } + } + else if (n_ == 0) + goto yyerrlab; + + /* Accept? */ + if (n_ == final_) + goto yyacceptlab; + + /* Shift the lookahead token. */ + YYCDEBUG << "Shifting token " << looka_ + << " (" << name_[[ilooka_]] << "), "; + + /* Discard the token being shifted unless it is eof. */ + if (looka_ != eof_) + looka_ = empty_; + + semantic_stack_.push (value); + location_stack_.push (location); + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (errstatus) + --errstatus; + + state_ = n_; + goto yynewstate; + + /* Default action. */ + yydefault: + n_ = defact_[[state_]]; + if (n_ == 0) + goto yyerrlab; + goto yyreduce; + + /* Reduce. */ + yyreduce: + len_ = r2_[[n_]]; + if (len_) + { + yyval = semantic_stack_[[len_ - 1]]; + yyloc = location_stack_[[len_ - 1]]; + } + else + { + yyval = semantic_stack_[[0]]; + yyloc = location_stack_[[0]]; + } + +#if YYDEBUG + if (debug_) + { + YYCDEBUG << "Reducing via rule " << n_ - 1 + << " (line " << rline_[[n_]] << "), "; + for (b4_uint_type(b4_prhs_max) i = prhs_[[n_]]; + rhs_[[i]] >= 0; ++i) + YYCDEBUG << name_[[rhs_[i]]] << ' '; + YYCDEBUG << "-> " << name_[[r1_[n_]]] << std::endl; + } +#endif + + if (len_) + { + Slice< LocationType, LocationStack > slice (location_stack_, len_); + YYLLOC_DEFAULT (yyloc, slice, len_); + } + + switch (n_) + { + b4_actions + } + +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__" + + state_stack_.pop (len_); + semantic_stack_.pop (len_); + location_stack_.pop (len_); + +#if YYDEBUG + if (debug_) + { + YYCDEBUG << "state stack now"; + for (StateStack::ConstIterator i = state_stack_.begin (); + i != state_stack_.end (); ++i) + YYCDEBUG << ' ' << *i; + YYCDEBUG << std::endl; + } +#endif + + semantic_stack_.push (yyval); + location_stack_.push (yyloc); + + /* 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]]) + state_ = table_[[state_]]; + else + state_ = defgoto_[[n_ - ntokens_]]; + goto yynewstate; + + /* Report and recover from errors. This is very incomplete. */ + yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!errstatus) + { + ++nerrs; + +#if YYERROR_VERBOSE + n_ = pact_[[state_]]; + if (n_ > flag_ && n_ < last_) + { + message = "parse error, unexpected "; + message += name_[[ilooka_]]; + { + int count = 0; + for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) + if (check_[[x + n_]] == x) + ++count; + if (count < 5) + { + count = 0; + for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) + if (check_[[x + n_]] == x) + { + message += (!count++) ? ", expecting " : " or "; + message += name_[[x]]; + } + } + } + } + else +#endif + message = "parse error"; + error_ (); + } + goto yyerrlab1; + + /* Error raised explicitly by an action. */ + yyerrlab1: + if (errstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (looka_ == eof_) + goto yyabortlab; + YYCDEBUG << "Discarding token " << looka_ + << " (" << name_[[ilooka_]] << ")." << std::endl; + looka_ = empty_; + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + + errstatus = 3; + + for (;;) + { + n_ = pact_[[state_]]; + if (n_ != flag_) + { + n_ += terror_; + if (0 <= n_ && n_ <= last_ && check_[[n_]] == terror_) + { + n_ = table_[[n_]]; + if (0 < n_) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (!state_stack_.height ()) + goto yyabortlab; + +#if YYDEBUG + if (debug_) + { + if (stos_[[state_]] < ntokens_) + { + YYCDEBUG << "Error: popping token " + << token_number_[[stos_[state_]]] + << " (" << name_[[stos_[state_]]]; +# ifdef YYPRINT + YYPRINT (stderr, token_number_[[stos_[state_]]], + semantic_stack_.top ()); +# endif + YYCDEBUG << ')' << std::endl; + } + else + { + YYCDEBUG << "Error: popping nonterminal (" + << name_[[stos_[state_]]] << ')' << std::endl; + } + } +#endif + + state_ = (state_stack_.pop (), state_stack_[[0]]); + semantic_stack_.pop (); + location_stack_.pop ();; + +#if YYDEBUG + if (debug_) + { + YYCDEBUG << "Error: state stack now"; + for (StateStack::ConstIterator i = state_stack_.begin (); + i != state_stack_.end (); ++i) + YYCDEBUG << ' ' << *i; + YYCDEBUG << std::endl; + } +#endif + } + + if (n_ == final_) + goto yyacceptlab; + + YYCDEBUG << "Shifting error token, "; + + semantic_stack_.push (value); + location_stack_.push (location); + + state_ = n_; + goto yynewstate; + + /* Accept. */ + yyacceptlab: + return 0; + + /* Abort. */ + yyabortlab: + return 1; +} + +void +yy::b4_name::lex_ () +{ +#if YYLSP_NEEDED + looka_ = yylex (&value, &location); +#else + looka_ = yylex (&value); +#endif +} + +/* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +const short +yy::b4_name::pact_[[]] = +{ + b4_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_[[]] = +{ + b4_defact +}; + +/* YYPGOTO[[NTERM-NUM]]. */ +const short +yy::b4_name::pgoto_[[]] = +{ + b4_pgoto +}; + +/* YYDEFGOTO[[NTERM-NUM]]. */ +const short +yy::b4_name::defgoto_[[]] = +{ + b4_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_[[]] = +{ + b4_table +}; + +/* YYCHECK. */ +const short +yy::b4_name::check_[[]] = +{ + b4_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_[[]] = +{ + b4_stos +}; + +/* TOKEN_NUMBER_[[YYLEX-NUM]] -- Internal token number corresponding + to YYLEX-NUM. */ +const short +yy::b4_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_[[]] = +{ + 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_[[]] = +{ + b4_r2 +}; + +#if YYDEBUG || YYERROR_VERBOSE +/* 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_[[]] = +{ + b4_tname +}; +#endif + +#if YYDEBUG +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +const yy::b4_name::RhsNumberType +yy::b4_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_[[]] = +{ + b4_prhs +}; + +/* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */ +const b4_uint_type(b4_rline_max) +yy::b4_name::rline_[[]] = +{ + b4_rline +}; +#endif + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +yy::b4_name::TokenNumberType +yy::b4_name::translate_ (int token) +{ + static + const TokenNumberType + translate_[[]] = + { + b4_translate + }; + if ((unsigned) token <= user_token_number_max_) + return translate_[[token]]; + else + 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_nnts; +const int yy::b4_name::nsym_ = b4_nsym; +const int yy::b4_name::empty_ = -2; +const int yy::b4_name::final_ = b4_final; +const int yy::b4_name::terror_ = 1; +const int yy::b4_name::errcode_ = 256; +const int yy::b4_name::ntokens_ = b4_ntokens; +const int yy::b4_name::initdepth_ = b4_initdepth; + +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; + +b4_epilogue + +#output "stack.hh" +b4_copyright + +#ifndef BISON_STACK_HH +# define BISON_STACK_HH + +#include + +namespace yy +{ + template < class T, class S = std::deque< T > > + class Stack + { + public: + + typedef typename S::iterator Iterator; + typedef typename S::const_iterator ConstIterator; + + Stack () : seq_ () + { + } + + Stack (unsigned n) : seq_ (n) + { + } + + inline + T& + operator [[]] (unsigned index) + { + return seq_[[index]]; + } + + inline + const T& + operator [[]] (unsigned index) const + { + return seq_[[index]]; + } + + inline + void + push (const T& t) + { + seq_.push_front (t); + } + + inline + void + pop (unsigned n = 1) + { + for (; n; --n) + seq_.pop_front (); + } + + inline + unsigned + height () const + { + return seq_.size (); + } + + inline ConstIterator begin () const { return seq_.begin (); } + inline ConstIterator end () const { return seq_.end (); } + + private: + + S seq_; + }; + + template < class T, class S = Stack< T > > + class Slice + { + public: + + Slice (const S& stack, + unsigned range) : stack_ (stack), + range_ (range) + { + } + + inline + const T& + operator [[]] (unsigned index) const + { + return stack_[[range_ - index]]; + } + + private: + + const S& stack_; + unsigned range_; + }; +} + +#endif // not BISON_STACK_HH + +#output "location.hh" +b4_copyright + +#ifndef BISON_LOCATION_HH +# define BISON_LOCATION_HH + +namespace yy +{ + struct Position + { + int line; + int column; + }; + + struct Location + { + Position first; + Position last; + }; +} + +#endif // not BISON_LOCATION_HH diff --git a/data/yacc.c b/data/yacc.c new file mode 100644 index 00000000..3b885221 --- /dev/null +++ b/data/yacc.c @@ -0,0 +1,1343 @@ +m4_divert(-1) -*- C -*- + +# Yacc compatible skeleton for Bison +# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +# b4_sint_type(MAX) +# ----------------- +# Return the smallest signed int type able to handle the number MAX. +m4_define([b4_sint_type], +[m4_if(m4_eval([$1 <= 127]), [1], [signed char], + m4_eval([$1 <= 32767]), [1], [signed short], + [signed int])]) + + +# b4_uint_type(MAX) +# ----------------- +# Return the smallest unsigned int type able to handle the number MAX. +m4_define([b4_uint_type], +[m4_if(m4_eval([$1 <= 255]), [1], [unsigned char], + m4_eval([$1 <= 65535]), [1], [unsigned short], + [unsigned int])]) + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[yyval[]m4_ifval([$1], [.$1])]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[yyvsp@<:@m4_eval([$2 - $1])@:>@m4_ifval([$3], [.$3])]) + + + +## ----------- ## +## Locations. ## +## ----------- ## + +# b4_location_if(IF-TRUE, IF-FALSE) +# --------------------------------- +# Expand IF-TRUE, if locations are used, IF-FALSE otherwise. +m4_define([b4_location_if], +[m4_if(b4_locations_flag, [1], + [$1], + [$2])]) + + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[yyloc]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[yylsp@<:@m4_eval([$2 - $1])@:>@]) + + + +## -------------- ## +## %pure-parser. ## +## -------------- ## + +# b4_pure_if(IF-TRUE, IF-FALSE) +# ----------------------------- +# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise. +m4_define([b4_pure_if], +[m4_if(b4_pure, [1], + [$1], + [$2])]) + + +## ------------------- ## +## Output file names. ## +## ------------------- ## + +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[]]) + + +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]], [_])]) + + +## ------------------------- ## +## Assigning token numbers. ## +## ------------------------- ## + +# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) +# ----------------------------------------- +# Output the definition of this token as #define. +m4_define([b4_token_define], +[#define $1 $2 +]) + + +# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) +# --------------------------------------- +# Output the definition of this token as an enum. +m4_define([b4_token_enum], +[$1 = $2]) + + +# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------- +# Output the definition of the tokens (if there are) as enums and #define. +m4_define([b4_token_defines], +[m4_if([$@], [[]], [], +[/* Tokens. */ +#ifndef YYTOKENTYPE +# if defined (__STDC__) || defined (__cplusplus) + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { +m4_map_sep([ b4_token_enum], [, +], + [$@]) + }; +# endif + /* POSIX requires `int' for tokens in interfaces. */ +# define YYTOKENTYPE int +#endif /* !YYTOKENTYPE */ +m4_map([b4_token_define], [$@]) +]) +]) + + +## --------------------------------------------------------- ## +## Defining symbol actions, e.g., printers and destructors. ## +## --------------------------------------------------------- ## + +# b4_symbol_actions(FILENAME, LINENO, +# SYMBOL-TAG, SYMBOL-NUM, +# SYMBOL-ACTION, SYMBOL-TYPENAME) +# ------------------------------------------------- +m4_define([b4_symbol_actions], +[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl +m4_pushdef([b4_at_dollar], [yylocation])dnl + case $4: /* $3 */ +#line $2 "$1" + $5; +#line __oline__ "__ofile__" + break; +m4_popdef([b4_at_dollar])dnl +m4_popdef([b4_dollar_dollar])dnl +]) + + + +m4_divert(0)dnl +#output "b4_output_parser_name" +/* A Bison parser, made from b4_filename + by GNU bison b4_version. */ + +/* Skeleton output parser for Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser when + the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the original so + called ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Pure parsers. */ +#define YYPURE b4_pure + +/* Using locations. */ +#define YYLSP_NEEDED b4_locations_flag + +m4_if(b4_prefix[], [yy], [], +[/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse b4_prefix[]parse +#define yylex b4_prefix[]lex +#define yyerror b4_prefix[]error +#define yylval b4_prefix[]lval +#define yychar b4_prefix[]char +#define yydebug b4_prefix[]debug +#define yynerrs b4_prefix[]nerrs +b4_location_if([#define yylloc b4_prefix[]lloc])]) + +/* Copy the first part of user declarations. */ +b4_pre_prologue + +b4_token_defines(b4_tokens) + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG b4_debug +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE b4_error_verbose +#endif + +#ifndef YYSTYPE +m4_ifdef([b4_stype], +[#line b4_stype_line "b4_filename" +typedef union b4_stype yystype; +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__"], +[typedef int yystype;]) +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE b4_ltype +# define YYLTYPE_IS_TRIVIAL 1 +#endif + +/* Copy the second part of user declarations. */ +b4_post_prologue + +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + b4_location_if([ YYLTYPE yyls; +])dnl +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +b4_location_if( +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAX)], +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX)]) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[[yyi]] = (From)[[yyi]]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL b4_final +#define YYFLAG b4_flag +#define YYLAST b4_last + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS b4_ntokens +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS b4_nnts +/* YYNRULES -- Number of rules. */ +#define YYNRULES b4_nrules +/* YYNRULES -- Number of states. */ +#define YYNSTATES b4_nstates + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK b4_undef_token_number +#define YYMAXUTOK b4_user_token_number_max + +#define YYTRANSLATE(X) \ + ((unsigned)(X) <= YYMAXUTOK ? yytranslate[[X]] : YYUNDEFTOK) + +/* YYTRANSLATE[[YYLEX]] -- Bison symbol number corresponding to YYLEX. */ +static const b4_uint_type(b4_translate_max) yytranslate[[]] = +{ + b4_translate +}; + +#if YYDEBUG +/* YYPRHS[[YYN]] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const b4_uint_type(b4_prhs_max) yyprhs[[]] = +{ + b4_prhs +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const b4_sint_type(b4_rhs_max) yyrhs[[]] = +{ + b4_rhs +}; + +/* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */ +static const b4_uint_type(b4_rline_max) yyrline[[]] = +{ + b4_rline +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[[SYMBOL-NUM]] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[[]] = +{ + b4_tname +}; +#endif + +/* YYTOKNUM[[YYLEX-NUM]] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const short yytoknum[[]] = +{ + b4_toknum +}; + +/* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives. */ +static const b4_uint_type(b4_r1_max) yyr1[[]] = +{ + b4_r1 +}; + +/* YYR2[[YYN]] -- Number of symbols composing right hand side of rule YYN. */ +static const b4_uint_type(b4_r2_max) yyr2[[]] = +{ + b4_r2 +}; + +/* YYDEFACT[[STATE-NAME]] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const short yydefact[[]] = +{ + b4_defact +}; + +/* YYPGOTO[[NTERM-NUM]]. */ +static const short yydefgoto[[]] = +{ + b4_defgoto +}; + +/* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const short yypact[[]] = +{ + b4_pact +}; + +/* YYPGOTO[[NTERM-NUM]]. */ +static const short yypgoto[[]] = +{ + b4_pgoto +}; + +/* 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. */ +static const short yytable[[]] = +{ + b4_table +}; + +static const short yycheck[[]] = +{ + b4_check +}; + +/* YYSTOS[[STATE-NUM]] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const b4_uint_type(b4_stos_max) yystos[[]] = +{ + b4_stos +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[[1]].first_line; \ + Current.first_column = Rhs[[1]].first_column; \ + Current.last_line = Rhs[[N]].last_line; \ + Current.last_column = Rhs[[N]].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +b4_pure_if( +[#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval[]b4_location_if([, &yylloc]), YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval[]b4_location_if([, &yylloc])) +#endif], +[#define YYLEX yylex ()]) + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH b4_initdepth +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH b4_maxdepth +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +# ifdef YYPARSE_PARAM +int yyparse (void *); +# else +int yyparse (void); +# endif +#endif + +#if defined (__STDC__) || defined (__cplusplus) +static void yydestruct (int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])); +# if YYDEBUG +static void yysymprint (FILE* out, int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])); +# endif +#endif + +m4_divert_push([KILL])# ======================== M4 code. +# b4_declare_parser_variables +# --------------------------- +# Declare the variables that are global, or local to YYPARSE if +# pure-parser +m4_define([b4_declare_parser_variables], +[/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of parse errors so far. */ +int yynerrs;b4_location_if([ +/* Location data for the lookahead symbol. */ +YYLTYPE yylloc;]) +]) +m4_divert_pop([KILL])dnl# ====================== End of M4 code. + +b4_pure_if([], + [b4_declare_parser_variables]) + +int +yyparse (YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{[ + ]b4_pure_if([b4_declare_parser_variables])[ + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + +]b4_location_if( +[[ /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp;]])[ + +#define YYPOPSTACK (yyvsp--, yyssp--]b4_location_if([, yylsp--])[) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; +]b4_location_if([ YYLTYPE yyloc;])[ + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; +]b4_location_if([ yylsp = yyls;])[ + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +]b4_location_if([ YYLTYPE *yyls1 = yyls;])[ + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), +]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[ + &yystacksize); +]b4_location_if([ yyls = yyls1;])[ + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + goto yyoverflowlab; + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); +]b4_location_if([ YYSTACK_RELOCATE (yyls);])[ +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; +]b4_location_if([ yylsp = yyls + yysize - 1;])[ + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with. */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more. */ + + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yychar1 = YYTRANSLATE (yychar); + + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ + YYDPRINTF ((stderr, "Next token is ")); + YYDSYMPRINT ((stderr, yychar1, yylval]b4_location_if([, yyloc])[)); + YYDPRINTF ((stderr, "\n")); + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +]b4_location_if([ *++yylsp = yylloc;])[ + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to the semantic value of + the lookahead token. This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + +]b4_location_if( +[ /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);])[ + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ + if (yydebug) + { + int yyi; + + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn - 1, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + switch (yyn) + ]{ + b4_actions + } + +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__" + +[ yyvsp -= yylen; + yyssp -= yylen; +]b4_location_if([ yylsp -= yylen;])[ + +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; +]b4_location_if([ *++yylsp = yyloc;])[ + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("parse error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("parse error"); + } + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyssp > yyss) + { + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], + *yyvsp]b4_location_if([, *yylsp])[)); + YYDPRINTF ((stderr, "\n")); + yydestruct (yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[); + YYPOPSTACK; + } + YYABORT; + } + + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); + yydestruct (yychar1, yylval]b4_location_if([, yylloc])[); + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYFLAG) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[)); + YYDPRINTF ((stderr, "\n")); + + yydestruct (yystos[yystate], *yyvsp]b4_location_if([, *yylsp])[); + yyvsp--; + yystate = *--yyssp; +]b4_location_if([ yylsp--;])[ + +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } +#endif + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; +]b4_location_if([ *++yylsp = yylloc;])[ + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +]} + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])) +{ + switch (yytype) + { +m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))dnl + default: + break; + } +} + + +#if YYDEBUG +/*-----------------------------. +| Print this symbol on YYOUT. | +`-----------------------------*/ + +static void +yysymprint (FILE* yyout, int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])) +{ + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyout, "token %s (", yytname[[yytype]]); +# ifdef YYPRINT + YYPRINT (yyout, yytoknum[[yytype]], yyvalue); +# endif + } + else + YYFPRINTF (yyout, "nterm %s (", yytname[[yytype]]); + + switch (yytype) + { +m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl + default: + break; + } + YYFPRINTF (yyout, ")"); +} +#endif /* YYDEBUG. */ + +b4_epilogue +m4_if(b4_defines_flag, 0, [], +[#output "b4_output_header_name" +#ifndef b4_header_guard +# define b4_header_guard + +b4_token_defines(b4_tokens) + +#ifndef YYSTYPE +m4_ifdef([b4_stype], +[#line b4_stype_line "b4_filename" +typedef union b4_stype yystype; +/* Line __line__ of __file__. */ +#line __oline__ "__ofile__"], +[typedef int yystype;]) +# define YYSTYPE yystype +#endif + +b4_pure_if([], +[extern YYSTYPE b4_prefix[]lval;]) + +b4_location_if( +[#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE yyltype +#endif + +m4_if(b4_pure, [0], +[extern YYLTYPE b4_prefix[]lloc;]) +]) +#endif /* not b4_header_guard */ +]) diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 0d3ce7d5..2441d0d1 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -5532,7 +5532,6 @@ will produce @file{output.c++} and @file{outfile.h++}. @menu * Bison Options:: All the options described in detail, in alphabetical order by short options. -* Environment Variables:: Variables which affect Bison execution. * Option Cross Key:: Alphabetical list of long options. * VMS Invocation:: Bison command syntax on VMS. @end menu @@ -5681,23 +5680,6 @@ difference is that it has an optionnal argument which is the name of the output graph filename. @end table -@node Environment Variables -@section Environment Variables -@cindex environment variables -@cindex BISON_SIMPLE - -Here is a list of environment variables which affect the way Bison -runs. - -@table @samp -@item BISON_SIMPLE -Much of the parser generated by Bison is copied verbatim from a file -called @file{bison.simple}. If Bison cannot find that file, or if you -would like to direct Bison to use a different copy, setting the -environment variable @code{BISON_SIMPLE} to the path of the file will -cause Bison to use that copy instead. -@end table - @node Option Cross Key @section Option Cross Key diff --git a/src/output.c b/src/output.c index dd3db47b..afe11323 100644 --- a/src/output.c +++ b/src/output.c @@ -1140,7 +1140,7 @@ prepare (void) /* Find the right skeleton file. */ if (!skeleton) - skeleton = "bison.simple"; + skeleton = "yacc.c"; /* Parse the skeleton file and output the needed parsers. */ muscle_insert ("skeleton", skeleton);