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.
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
{
except if some rules are useless. */
short number;
- bucket *lhs;
- short *rhs;
+ symbol_t *lhs;
+ item_number_t *rhs;
/* This symbol provides both the associativity, and the precedence. */
- bucket *prec;
+ symbol_t *prec;
/* This symbol was attached to the rule via %prec. */
- bucket *precsym;
+ symbol_t *precsym;
- short line;
+ 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_ */