--- /dev/null
+%%{section} %%{output-prefix} %%{output-infix} %%".hh"
+/* -*- C++ -*- */
+
+/* A Bison parser, made from %%filename,
+ by GNU bison %%version. */
+
+/* Skeleton output parser for bison,
+ Copyright 1984, 1989, 1990, 2000, 2001 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. */
+
+#include "stack.hh"
+/* #include "parser.hh" */
+#include "location.hh"
+
+namespace yy
+{
+ class %%{name};
+
+ template < typename P >
+ struct Traits
+ {
+ };
+
+ template < >
+ struct Traits< %%{name} >
+ {
+ typedef int StateType;
+ typedef %%{stype} SemanticType;
+ typedef Location LocationType;
+ };
+}
+
+%%{prologue}
+
+namespace yy
+{
+ class %%{name}
+ {
+ public:
+
+ typedef Traits< %%{name} >::StateType StateType;
+ typedef Traits< %%{name} >::SemanticType SemanticType;
+ typedef Traits< %%{name} >::LocationType LocationType;
+
+ typedef Stack< StateType > StateStack;
+ typedef Stack< SemanticType > SemanticStack;
+ typedef Stack< LocationType > LocationStack;
+
+ %%{name} () : debug (1)
+ {
+ looka = empty;
+ }
+
+ virtual int parse ();
+
+ private:
+
+ /* Call to lexical analyser. */
+ virtual
+ void
+ lex ()
+ {
+ looka = yylex (&value);
+ }
+
+ /* 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 short line_[];
+ static const short r1_[];
+ static const short r2_[];
+ static const char* const name_[];
+
+ /* More tables, for debugging. */
+ /* FIXME: These tables should not be printed when not in debug
+ mode. %%ifdef? */
+ static const short rhs_[];
+ static const short prhs_[];
+ static const short rline_[];
+
+ /* Even more tables. */
+ static inline char translate (int token);
+
+ /* Eof and empty. */
+ static const int eof;
+ static const int empty;
+
+ /* State. */
+ int n;
+ int len;
+ int debug;
+ int state;
+
+ /* Lookahead. */
+ int looka;
+ int ilooka;
+
+ /* @$ and $$. */
+ SemanticType value;
+ LocationType location;
+ };
+}
+
+%%{section} %%{output-prefix} %%{output-infix} %%".cc"
+#include "%%{output-prefix}%%{output-infix}.hh"
+
+/* Enable debugging if requested. */
+#if %%{debug}
+
+# include <cstdio>
+# define YYFPRINTF std::fprintf
+
+# define YYDPRINTF(Args) \
+do { \
+ if (debug) \
+ YYFPRINTF Args; \
+} while (0)
+/* Nonzero means print parse trace. [The following comment makes no
+ sense to me. Could someone clarify it? --akim] Since this is
+ uninitialized, it does not stop multiple parsers from coexisting.
+ */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* Tokens. */
+%%{tokendef}
+
+int
+yy::%%{name}::parse ()
+{
+ /* Initialize stack. */
+ state_stack = StateStack (0);
+ semantic_stack = SemanticStack (1);
+ location_stack = LocationStack (1);
+
+ /* Reserve initial space. The C parser needed that, but is it really
+ useful here? */
+ state_stack.reserve (%%{initdepth});
+ semantic_stack.reserve (%%{initdepth});
+ location_stack.reserve (%%{initdepth});
+
+ /* Start. */
+ state = 0;
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ /* New state. */
+ yynewstate:
+ state_stack.push (state);
+ YYDPRINTF ((stderr, "Entering state %d\n", state));
+
+ /* Backup. */
+ yybackup:
+
+ /* Try to take a decision without lookahead. */
+ n = pact_[state];
+ if (n == %%{flag})
+ goto yydefault;
+
+ /* Read a lookahead token. */
+ if (looka == empty)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ lex ();
+ }
+
+ /* Convert token to internal form. */
+ if (looka <= 0)
+ {
+ looka = eof;
+ ilooka = 0;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ ilooka = translate (looka);
+#if %%{debug}
+ YYFPRINTF (stderr, "Next token is %d (%s", looka, name_[ilooka]);
+ YYFPRINTF (stderr, ")\n");
+#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. */
+ YYDPRINTF ((stderr, "Shifting token %d (%s), ", 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);
+ state = n;
+ goto yynewstate;
+
+ /* Default action. */
+ yydefault:
+ n = defact_[state];
+ if (n == 0)
+ goto yyerrlab;
+
+ /* Reduce. */
+ yyreduce:
+ len = r2_[n];
+ value = semantic_stack[1 - len];
+ location = location_stack[1 - len];
+
+#if %%{debug}
+ if (debug)
+ {
+ YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", n - 1, rline_[n]);
+ for (unsigned i = prhs_[n];
+ rhs_[i] >= 0; ++i)
+ YYFPRINTF (stderr, "%s ", name_[rhs_[i]]);
+ YYFPRINTF (stderr, "-> %s\n", name_[r1_[n]]);
+ }
+#endif
+
+ {
+ SemanticType& yyval (value);
+ SemanticStack& yyvsp (semantic_stack);
+
+ switch (n)
+ {
+ %%{actions}
+ }
+ }
+
+ state_stack.pop (len);
+ semantic_stack.pop (len);
+ location_stack.pop (len);
+
+#if %%{debug}
+ if (debug)
+ {
+ YYFPRINTF (stderr, "state stack now");
+ for (StateStack::ConstIterator i = state_stack.begin ();
+ i != state_stack.end (); ++i)
+ YYFPRINTF (stderr, " %d", *i);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+ semantic_stack.push (value);
+ location_stack.push (location);
+
+ /* 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:
+ std::cerr << "Parse error." << std::endl; // FIXME: Need something like yyerror?
+ return 1;
+
+ /* Accept. */
+ yyacceptlab:
+ return 0;
+}
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+const short
+yy::%%{name}::pact_[] =
+{
+ %%{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::%%{name}::defact_[] =
+{
+ %%{defact}
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+const short
+yy::%%{name}::pgoto_[] =
+{
+ %%{pgoto}
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+const short
+yy::%%{name}::defgoto_[] =
+{
+ %%{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::%%{name}::table_[] =
+{
+ %%{table}
+};
+
+/* YYCHECK. */
+const short
+yy::%%{name}::check_[] =
+{
+ %%{check}
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+const short
+yy::%%{name}::line_[] =
+{
+ %%{line}
+};
+
+/*YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+const short
+yy::%%{name}::r1_[] =
+{
+ %%{r1}
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+const short
+yy::%%{name}::r2_[] =
+{
+ %%{r2}
+};
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+const char*
+const yy::%%{name}::name_[] =
+{
+ %%{tname}
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+const short
+yy::%%{name}::rhs_[] =
+{
+ %%{rhs}
+};
+
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+const short
+yy::%%{name}::prhs_[] =
+{
+ %%{prhs}
+};
+
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+const short
+yy::%%{name}::rline_[] =
+{
+ %%{rline}
+};
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+char
+yy::%%{name}::translate (int token)
+{
+ static
+ const char
+ translate_[] =
+ {
+ %%{translate}
+ };
+ return ((unsigned)(token) <= %%{maxtok} ? translate_[token] : %%{nsym});
+}
+
+const int yy::%%{name}::eof = 0;
+const int yy::%%{name}::empty = -2;
+
+%%{epilogue}
+
+%%{section} %%"stack.hh"
+#ifndef BISON_STACK_HH
+# define BISON_STACK_HH
+
+#include <vector>
+
+namespace yy
+{
+ template < class T, class S = std::vector< 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 [] (int index)
+ {
+ return seq_[seq_.size () - 1 + index];
+ }
+
+ inline
+ const T&
+ operator [] (int index) const
+ {
+ return seq_[seq_.size () - 1 + index];
+ }
+
+ inline
+ void
+ push (const T& t)
+ {
+ seq_.push_back (t);
+ }
+
+ inline
+ void
+ pop (unsigned n = 1)
+ {
+ for (; n; --n)
+ seq_.pop_back ();
+ }
+
+ inline
+ void
+ reserve (unsigned n)
+ {
+ seq_.reserve (n);
+ }
+
+ inline ConstIterator begin () const { return seq_.begin (); }
+ inline ConstIterator end () const { return seq_.end (); }
+
+ private:
+
+ S seq_;
+ };
+}
+
+#endif // not BISON_STACK_HH
+
+%%{section} %%"location.hh"
+#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