]> git.saurik.com Git - bison.git/blame_incremental - data/bison.c++
* data/bison.c++: Fix m4 quoting in comments.
[bison.git] / data / bison.c++
... / ...
CommitLineData
1#output "b4_output_prefix[]b4_output_infix[]-class.hh"
2/* -*- C++ -*- */
3
4/* A Bison parser, made from %%filename,
5 by GNU bison %%version. */
6
7/* Skeleton output parser for bison,
8 Copyright 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24
25/* As a special exception, when this file is copied by Bison into a
26 Bison output file, you may use that output file without restriction.
27 This special exception was added by the Free Software Foundation
28 in version 1.24 of Bison. */
29
30#include "stack.hh"
31#include "location.hh"
32
33b4_prologue
34
35// FIXME: This should be defined in traits, not here.
36typedef b4_stype yystype;
37
38namespace yy
39{
40 class b4_name;
41
42 template < typename P >
43 struct Traits
44 {
45 };
46
47 template < >
48 struct Traits< b4_name >
49 {
50 typedef int StateType;
51 typedef yystype SemanticType;
52 typedef b4_ltype LocationType;
53 };
54}
55
56namespace yy
57{
58 class b4_name
59 {
60 public:
61
62 typedef Traits< b4_name >::StateType StateType;
63 typedef Traits< b4_name >::SemanticType SemanticType;
64 typedef Traits< b4_name >::LocationType LocationType;
65
66 typedef Stack< StateType > StateStack;
67 typedef Stack< SemanticType > SemanticStack;
68 typedef Stack< LocationType > LocationStack;
69
70 b4_name (bool debug) : debug_ (debug)
71 {
72 looka = empty_;
73 }
74
75 virtual ~b4_name ()
76 {
77 }
78
79 virtual int parse ();
80
81 private:
82
83 /* Call to lexical analyser. */
84 virtual
85 void
86 lex ()
87 {
88 looka = yylex (&value, &location);
89 }
90
91 /* Stacks. */
92 StateStack state_stack;
93 SemanticStack semantic_stack;
94 LocationStack location_stack;
95
96 /* Tables. */
97 static const short pact_[[]];
98 static const short defact_[[]];
99 static const short pgoto_[[]];
100 static const short defgoto_[[]];
101 static const short table_[[]];
102 static const short check_[[]];
103 static const short r1_[[]];
104 static const short r2_[[]];
105 static const char* const name_[[]];
106
107 /* More tables, for debugging. */
108 /* FIXME: These tables should not be printed when not in debug
109 mode. %%ifdef? */
110 static const short rhs_[[]];
111 static const short prhs_[[]];
112 static const short rline_[[]];
113
114 /* Even more tables. */
115 static inline char translate (int token);
116
117 /* Eof and empty. */
118 static const int eof_;
119 static const int empty_;
120 static const int ntokens_;
121
122 /* State. */
123 int n;
124 int len;
125 int debug_;
126 int state;
127
128 /* Lookahead. */
129 int looka;
130 int ilooka;
131
132 /* @$ and $$. */
133 SemanticType value;
134 LocationType location;
135 };
136}
137
138#output "b4_output_prefix[]b4_output_infix[].cc"
139#include "b4_output_prefix[]b4_output_infix-class.hh"
140
141/* Enabling traces. */
142#ifndef YYDEBUG
143# define YYDEBUG b4_debug
144#endif
145
146/* Enable debugging if requested. */
147#if YYDEBUG
148
149# include <cstdio>
150# define YYFPRINTF std::fprintf
151
152# define YYDPRINTF(Args) \
153do { \
154 if (debug_) \
155 YYFPRINTF Args; \
156} while (0)
157/* Nonzero means print parse trace. [The following comment makes no
158 sense to me. Could someone clarify it? --akim] Since this is
159 uninitialized, it does not stop multiple parsers from coexisting.
160 */
161int yydebug;
162#else /* !YYDEBUG */
163# define YYDPRINTF(Args)
164#endif /* !YYDEBUG */
165
166/* Tokens. */
167b4_tokendef
168
169int
170yy::b4_name::parse ()
171{
172 /* Initialize stack. */
173 state_stack = StateStack (0);
174 semantic_stack = SemanticStack (1);
175 location_stack = LocationStack (1);
176
177 /* Reserve initial space. The C parser needed that, but is it really
178 useful here? */
179 state_stack.reserve (b4_initdepth);
180 semantic_stack.reserve (b4_initdepth);
181 location_stack.reserve (b4_initdepth);
182
183 /* Start. */
184 state = 0;
185 YYDPRINTF ((stderr, "Starting parse\n"));
186
187 /* New state. */
188 yynewstate:
189 state_stack.push (state);
190 YYDPRINTF ((stderr, "Entering state %d\n", state));
191 goto yybackup;
192
193 /* Backup. */
194 yybackup:
195
196 /* Try to take a decision without lookahead. */
197 n = pact_[[state]];
198 if (n == b4_flag)
199 goto yydefault;
200
201 /* Read a lookahead token. */
202 if (looka == empty_)
203 {
204 YYDPRINTF ((stderr, "Reading a token: "));
205 lex ();
206 }
207
208 /* Convert token to internal form. */
209 if (looka <= 0)
210 {
211 looka = eof_;
212 ilooka = 0;
213 YYDPRINTF ((stderr, "Now at end of input.\n"));
214 }
215 else
216 {
217 ilooka = translate (looka);
218#if YYDEBUG
219 if (debug_)
220 {
221 YYFPRINTF (stderr, "Next token is %d (%s", looka, name_[[ilooka]]);
222 YYFPRINTF (stderr, ")\n");
223 }
224#endif
225 }
226
227 n += ilooka;
228 if (n < 0 || n > b4_last || check_[[n]] != ilooka)
229 goto yydefault;
230
231 /* Reduce or error. */
232 n = table_[[n]];
233 if (n < 0)
234 {
235 if (n == b4_flag)
236 goto yyerrlab;
237 else
238 {
239 n = -n;
240 goto yyreduce;
241 }
242 }
243 else if (n == 0)
244 goto yyerrlab;
245
246 /* Accept? */
247 if (n == b4_final)
248 goto yyacceptlab;
249
250 /* Shift the lookahead token. */
251 YYDPRINTF ((stderr, "Shifting token %d (%s), ", looka, name_[[ilooka]]));
252
253 /* Discard the token being shifted unless it is eof. */
254 if (looka != eof_)
255 looka = empty_;
256
257 semantic_stack.push (value);
258 location_stack.push (location);
259 state = n;
260 goto yynewstate;
261
262 /* Default action. */
263 yydefault:
264 n = defact_[[state]];
265 if (n == 0)
266 goto yyerrlab;
267 goto yyreduce;
268
269 /* Reduce. */
270 yyreduce:
271 len = r2_[[n]];
272 if (len)
273 {
274 value = semantic_stack[[1 - len]];
275 location = location_stack[[1 - len]];
276 }
277 else
278 {
279 // FIXME: This is truly ugly.
280 value = semantic_stack[[0]];
281 location = location_stack[[0]];
282 }
283
284#if YYDEBUG
285 if (debug_)
286 {
287 YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", n - 1, rline_[[n]]);
288 for (unsigned i = prhs_[[n]];
289 rhs_[[i]] >= 0; ++i)
290 YYFPRINTF (stderr, "%s ", name_[[rhs_[i]]]);
291 YYFPRINTF (stderr, "-> %s\n", name_[[r1_[n]]]);
292 }
293#endif
294
295 {
296 SemanticType& yyval (value);
297 LocationType& yyloc (location);
298 SemanticStack& yyvsp (semantic_stack);
299 LocationStack& yylsp (location_stack);
300
301 switch (n)
302 {
303 b4_actions
304 }
305 }
306
307 state_stack.pop (len);
308 semantic_stack.pop (len);
309 location_stack.pop (len);
310
311#if YYDEBUG
312 if (debug_)
313 {
314 YYFPRINTF (stderr, "state stack now");
315 for (StateStack::ConstIterator i = state_stack.begin ();
316 i != state_stack.end (); ++i)
317 YYFPRINTF (stderr, " %d", *i);
318 YYFPRINTF (stderr, "\n");
319 }
320#endif
321
322 semantic_stack.push (value);
323 location_stack.push (location);
324
325 /* Shift the result of the reduction. */
326 n = r1_[[n]];
327 state = pgoto_[[n - ntokens_]] + state_stack[[0]];
328 if (state >= 0 && state <= b4_last && check_[[state]] == state_stack[[0]])
329 state = table_[[state]];
330 else
331 state = defgoto_[[n - ntokens_]];
332 goto yynewstate;
333
334 /* Report and recover from errors. This is very incomplete. */
335 yyerrlab:
336 std::cerr << "Parse error." << std::endl; // FIXME: Need something like yyerror?
337 return 1;
338
339 /* Accept. */
340 yyacceptlab:
341 return 0;
342}
343
344/* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing
345 STATE-NUM. */
346const short
347yy::b4_name::pact_[[]] =
348{
349 b4_pact
350};
351
352/* YYDEFACT[[S]] -- default rule to reduce with in state S when YYTABLE
353 doesn't specify something else to do. Zero means the default is an
354 error. */
355const short
356yy::b4_name::defact_[[]] =
357{
358 b4_defact
359};
360
361/* YYPGOTO[[NTERM-NUM]]. */
362const short
363yy::b4_name::pgoto_[[]] =
364{
365 b4_pgoto
366};
367
368/* YYDEFGOTO[[NTERM-NUM]]. */
369const short
370yy::b4_name::defgoto_[[]] =
371{
372 b4_defgoto
373};
374
375/* YYTABLE[[YYPACT[STATE-NUM]]]. What to do in state STATE-NUM. If
376 positive, shift that token. If negative, reduce the rule which
377 number is the opposite. If zero, do what YYDEFACT says. */
378const short
379yy::b4_name::table_[[]] =
380{
381 b4_table
382};
383
384/* YYCHECK. */
385const short
386yy::b4_name::check_[[]] =
387{
388 b4_check
389};
390
391/* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */
392const short
393yy::b4_name::rline_[[]] =
394{
395 b4_rline
396};
397
398/* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives. */
399const short
400yy::b4_name::r1_[[]] =
401{
402 b4_r1
403};
404
405/* YYR2[[YYN]] -- Number of symbols composing right hand side of rule YYN. */
406const short
407yy::b4_name::r2_[[]] =
408{
409 b4_r2
410};
411
412/* YYTNAME[[SYMBOL-NUM]] -- String name of the symbol SYMBOL-NUM.
413 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
414const char*
415const yy::b4_name::name_[[]] =
416{
417 b4_tname
418};
419
420/* YYRHS -- A `-1'-separated list of the rules' RHS. */
421const short
422yy::b4_name::rhs_[[]] =
423{
424 b4_rhs
425};
426
427/* YYPRHS[[YYN]] -- Index of the first RHS symbol of rule number YYN in
428 YYRHS. */
429const short
430yy::b4_name::prhs_[[]] =
431{
432 b4_prhs
433};
434
435/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
436char
437yy::b4_name::translate (int token)
438{
439 static
440 const char
441 translate_[[]] =
442 {
443 b4_translate
444 };
445 return ((unsigned)(token) <= b4_maxtok ? translate_[[token]] : b4_nsym);
446}
447
448const int yy::b4_name::eof_ = 0;
449const int yy::b4_name::empty_ = -2;
450const int yy::b4_name::ntokens_ = b4_ntokens;
451
452b4_epilogue
453
454#output "stack.hh"
455#ifndef BISON_STACK_HH
456# define BISON_STACK_HH
457
458#include <vector>
459
460namespace yy
461{
462 template < class T, class S = std::vector< T > >
463 class Stack
464 {
465 public:
466
467 typedef typename S::iterator Iterator;
468 typedef typename S::const_iterator ConstIterator;
469
470 Stack () : seq_ ()
471 {
472 }
473
474 Stack (unsigned n) : seq_ (n)
475 {
476 }
477
478 inline
479 T&
480 operator [[]] (int index)
481 {
482 return seq_[[seq_.size () - 1 + index]];
483 }
484
485 inline
486 const T&
487 operator [[]] (int index) const
488 {
489 return seq_[[seq_.size () - 1 + index]];
490 }
491
492 inline
493 void
494 push (const T& t)
495 {
496 seq_.push_back (t);
497 }
498
499 inline
500 void
501 pop (unsigned n = 1)
502 {
503 for (; n; --n)
504 seq_.pop_back ();
505 }
506
507 inline
508 void
509 reserve (unsigned n)
510 {
511 seq_.reserve (n);
512 }
513
514 inline ConstIterator begin () const { return seq_.begin (); }
515 inline ConstIterator end () const { return seq_.end (); }
516
517 private:
518
519 S seq_;
520 };
521}
522
523#endif // not BISON_STACK_HH
524
525#output "location.hh"
526#ifndef BISON_LOCATION_HH
527# define BISON_LOCATION_HH
528
529namespace yy
530{
531 struct Position
532 {
533 int line;
534 int column;
535 };
536
537 struct Location
538 {
539 Position first;
540 Position last;
541 };
542}
543
544#endif // not BISON_LOCATION_HH
545
546m4_if(b4_defines_flag, 0, [],
547[#output "b4_output_header_name"
548#ifndef b4_header_guard
549# define b4_header_guard
550
551b4_tokendef
552
553#ifndef YYSTYPE
554typedef b4_stype
555yystype;
556# define YYSTYPE yystype
557#endif
558
559m4_if(b4_pure, [0],
560[extern YYSTYPE b4_prefix[]lval;])
561
562m4_if(b4_locations_flag, [0], [],
563[#ifndef YYLTYPE
564typedef struct yyltype
565{
566 int first_line;
567 int first_column;
568 int last_line;
569 int last_column;
570} yyltype;
571# define YYLTYPE yyltype
572#endif
573
574m4_if(b4_pure, [0],
575[extern YYLTYPE b4_prefix[]lloc;])
576])
577#endif /* not b4_header_guard */
578])