/* Data definitions for internal representation of bison's input,
- Copyright 1984, 1986, 1989, 1992, 2001, 2002
+ Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Therefore 0 cannot be used, since it would be both the rule number
0, and the token EOF).
- Actions and guards are accessed via the rule number.
+ Actions are accessed via the rule number.
The rules themselves are described by several arrays: amongst which
RITEM, and RULES.
RULES is an array of struct rule_s, which members are:
- RULES[R].lhs -- the symbol number of the left hand side of rule R.
- If -1, the rule has been thrown out by reduce.c and should be
- ignored.
+ RULES[R].lhs -- the symbol of the left hand side of rule R.
RULES[R].rhs -- the index in RITEM of the beginning of the portion
for rule R.
- RULES[R].prec -- the precedence level of R.
+ RULES[R].prec -- the symbol providing the precedence level of R.
- RULES[R].precsym -- the symbol-number of the symbol in %prec for R
- (if any).
+ RULES[R].precsym -- the symbol attached (via %prec) to give its
+ precedence to R. Of course, if set, it is equal to `prec', but we
+ need to distinguish one from the other when reducing: a symbol used
+ in a %prec is not useless.
RULES[R].assoc -- the associativity of R.
RULES[R].line -- the line where R was defined.
- RULES[R].useful -- TRUE iff the rule is used.
+ RULES[R].useful -- TRUE iff the rule is used (i.e., FALSE if thrown
+ away by reduce).
The right hand side is stored as symbol numbers in a portion of
RITEM.
contains minus R, which identifies it as the end of a portion and
says which rule it is for.
- The portions of RITEM come in order of increasing rule number and
- are followed by an element which is zero to mark the end. nitems
- is the total length of ritem, not counting the final zero. Each
- element of RITEM is called an "item" and its index in RITEM is an
- item number.
+ The portions of RITEM come in order of increasing rule number.
+ NRITEMS is the total length of RITEM. Each element of RITEM is
+ called an "item" and its index in RITEM is an item number.
Item numbers are used in the finite state machine to represent
places that parsing can get to.
#define ISTOKEN(s) ((s) < ntokens)
#define ISVAR(s) ((s) >= ntokens)
-extern int nitems;
extern int nrules;
extern int nsyms;
extern int ntokens;
extern int nvars;
-extern short *ritem;
-extern int nritems;
+#define ITEM_NUMBER_MAX INT_MAX
+typedef int item_number_t;
+extern item_number_t *ritem;
+extern unsigned int nritems;
+
+/* There is weird relationship between item_number_t and
+ symbol_number_t: we store symbol_number_t in item_number_t, but in
+ the latter we also store, as negative numbers, the rule numbers.
+
+ Therefore, an symbol_number_t must be a valid item_number_t, and we
+ sometimes have to perform the converse transformation. */
+#define symbol_number_as_item_number(Tok) ((item_number_t) (Tok))
+#define item_number_as_symbol_number(Ite) ((symbol_number_t) (Ite))
+
+extern symbol_number_t start_symbol;
-extern int start_symbol;
typedef struct rule_s
{
/* The number of the rule in the source. It is usually the index in
RULES too, except if there are useless rules. */
+ short user_number;
+
+ /* The index in RULES. Usually the rule number in the source,
+ except if some rules are useless. */
short number;
- bucket *lhs;
- short *rhs;
- short prec;
- short precsym;
- associativity assoc;
- short line;
+ symbol_t *lhs;
+ item_number_t *rhs;
+
+ /* This symbol provides both the associativity, and the precedence. */
+ symbol_t *prec;
+
+ /* This symbol was attached to the rule via %prec. */
+ symbol_t *precsym;
+
+ int line;
bool useful;
const char *action;
- short action_line;
-
- const char *guard;
- short guard_line;
+ int action_line;
} rule_t;
extern struct rule_s *rules;
/* Table of the symbols, indexed by the symbol number. */
-extern struct bucket **symbols;
-
-/* token translation table: indexed by a token number as returned by
- the user's yylex routine, it yields the internal token number used
- by the parser and throughout bison. */
+extern symbol_t **symbols;
-extern short *token_translations;
+/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
+ by the user's yylex routine, it yields the internal token number
+ used by the parser and throughout bison. */
+extern symbol_number_t *token_translations;
extern int max_user_token_number;
-/* SEMANTIC_PARSER is nonzero if the input file says to use the hairy
- parser that provides for semantic error recovery. If it is zero,
- the yacc-compatible simplified parser is used. */
-
-extern int semantic_parser;
/* PURE_PARSER is nonzero if should generate a parser that is all pure
and reentrant. */
extern int pure_parser;
-/* ERROR_TOKEN_NUMBER is the token number of the error token. */
-
-extern int error_token_number;
-
/* Report the length of the RHS. */
int rule_rhs_length PARAMS ((rule_t *rule));
/* Return the size of the longest rule RHS. */
size_t ritem_longest_rhs PARAMS ((void));
+/* Dump the grammar. */
+void grammar_dump PARAMS ((FILE *out, const char *title));
+
+/* Free the packed grammar. */
+void grammar_free PARAMS ((void));
+
#endif /* !GRAM_H_ */