107 |
# define ISTOKEN(s) ((s) < ntokens) |
# define ISTOKEN(s) ((s) < ntokens) |
108 |
# define ISVAR(s) ((s) >= ntokens) |
# define ISVAR(s) ((s) >= ntokens) |
109 |
|
|
|
extern int nrules; |
|
110 |
extern int nsyms; |
extern int nsyms; |
111 |
extern int ntokens; |
extern int ntokens; |
112 |
extern int nvars; |
extern int nvars; |
113 |
|
|
|
# define ITEM_NUMBER_MAX INT_MAX |
|
114 |
typedef int item_number_t; |
typedef int item_number_t; |
115 |
|
# define ITEM_NUMBER_MAX ((item_number_t) INT_MAX) |
116 |
extern item_number_t *ritem; |
extern item_number_t *ritem; |
117 |
extern unsigned int nritems; |
extern unsigned int nritems; |
118 |
|
|
119 |
/* There is weird relationship between item_number_t and |
/* There is weird relationship between OT1H item_number_t and OTOH |
120 |
symbol_number_t: we store symbol_number_t in item_number_t, but in |
symbol_number_t and rule_number_t: we store the latter in |
121 |
the latter we also store, as negative numbers, the rule numbers. |
item_number_t. symbol_number_t are stored as are, while |
122 |
|
the negation of rule_number_t are stored. |
123 |
|
|
124 |
Therefore, an symbol_number_t must be a valid item_number_t, and we |
Therefore, an symbol_number_t must be a valid item_number_t, and we |
125 |
sometimes have to perform the converse transformation. */ |
sometimes have to perform the converse transformation. */ |
128 |
|
|
129 |
extern symbol_number_t start_symbol; |
extern symbol_number_t start_symbol; |
130 |
|
|
131 |
|
/* Rules numbers. */ |
132 |
|
typedef short rule_number_t; |
133 |
|
# define RULE_NUMBER_MAX ((rule_number_t) SHRT_MAX) |
134 |
|
extern rule_number_t nrules; |
135 |
|
# define int_of_rule_number(RNum) ((int) (RNum)) |
136 |
|
# define item_number_of_rule_number(RNum) ((item_number_t) (- RNum)) |
137 |
|
# define rule_number_of_item_number(INum) ((rule_number_t) (- INum)) |
138 |
|
|
139 |
|
|
140 |
|
/*--------. |
141 |
|
| Rules. | |
142 |
|
`--------*/ |
143 |
|
|
144 |
typedef struct rule_s |
typedef struct rule_s |
145 |
{ |
{ |
146 |
/* The number of the rule in the source. It is usually the index in |
/* The number of the rule in the source. It is usually the index in |
147 |
RULES too, except if there are useless rules. */ |
RULES too, except if there are useless rules. */ |
148 |
short user_number; |
rule_number_t user_number; |
149 |
|
|
150 |
/* The index in RULES. Usually the rule number in the source, |
/* The index in RULES. Usually the rule number in the source, |
151 |
except if some rules are useless. */ |
except if some rules are useless. */ |
152 |
short number; |
rule_number_t number; |
153 |
|
|
154 |
symbol_t *lhs; |
symbol_t *lhs; |
155 |
item_number_t *rhs; |
item_number_t *rhs; |
211 |
/* Print the grammar's rules numbers from BEGIN (inclusive) to END |
/* Print the grammar's rules numbers from BEGIN (inclusive) to END |
212 |
(exclusive) on OUT under TITLE. */ |
(exclusive) on OUT under TITLE. */ |
213 |
void grammar_rules_partial_print PARAMS ((FILE *out, const char *title, |
void grammar_rules_partial_print PARAMS ((FILE *out, const char *title, |
214 |
int begin, int end)); |
rule_number_t begin, |
215 |
|
rule_number_t end)); |
216 |
|
|
217 |
/* Print the grammar's rules on OUT. */ |
/* Print the grammar's rules on OUT. */ |
218 |
void grammar_rules_print PARAMS ((FILE *out)); |
void grammar_rules_print PARAMS ((FILE *out)); |