Subversion Repositories tendra.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
7 7u83 2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 *
8
 * 1. Redistributions of source code must retain the above copyright notice,
9
 *    this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
11
 *    this list of conditions and the following disclaimer in the documentation
12
 *    and/or other materials provided with the distribution.
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
14
 *    may be used to endorse or promote products derived from this software
15
 *    without specific, prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 *
29
 * $Id$
30
 */
31
/*
2 7u83 32
    		 Crown Copyright (c) 1997
7 7u83 33
 
2 7u83 34
    This TenDRA(r) Computer Program is subject to Copyright
35
    owned by the United Kingdom Secretary of State for Defence
36
    acting through the Defence Evaluation and Research Agency
37
    (DERA).  It is made available to Recipients with a
38
    royalty-free licence for its use, reproduction, transfer
39
    to other parties and amendment for any purpose not excluding
40
    product development provided that any such use et cetera
41
    shall be deemed to be acceptance of the following conditions:-
7 7u83 42
 
2 7u83 43
        (1) Its Recipients shall ensure that this Notice is
44
        reproduced upon any copies or amended versions of it;
7 7u83 45
 
2 7u83 46
        (2) Any amended version of it shall be clearly marked to
47
        show both the nature of and the organisation responsible
48
        for the relevant amendment or amendments;
7 7u83 49
 
2 7u83 50
        (3) Its onward transfer from a recipient to another
51
        party shall be deemed to be that party's acceptance of
52
        these conditions;
7 7u83 53
 
2 7u83 54
        (4) DERA gives no warranty or assurance as to its
55
        quality or suitability for any purpose and DERA accepts
56
        no liability whatsoever in relation to any use to which
57
        it may be put.
58
*/
59
 
60
 
61
/*** rule.h --- Rule ADT.
62
 *
63
 ** Author: Steve Folkes <smf@hermes.mod.uk>
64
 *
65
 *** Commentary:
66
 *
67
 * This file specifies the interface to the SID rule, alternative and item
68
 * handling routines.  The actual implementations are spread across a number
69
 * of files, but are all logically part of the same file.  See the files named
70
 * in the declarations for more information.
71
 *
72
 *** Change Log:
73
 * $Log: rule.h,v $
74
 * Revision 1.1.1.1  1998/01/17  15:57:46  release
75
 * First version to be checked into rolling release.
76
 *
77
 * Revision 1.3  1994/12/15  09:58:58  smf
78
 * Brought into line with OSSG C Coding Standards Document, as per
79
 * "CR94_178.sid+tld-update".
80
 *
81
 * Revision 1.2  1994/08/22  09:37:29  smf
82
 * Fixed bug DR114:ids-too-long.
83
 *
84
 * Revision 1.1.1.1  1994/07/25  16:04:42  smf
85
 * Initial import of SID 1.8 non shared files.
86
 *
87
**/
88
 
89
/****************************************************************************/
90
 
91
#ifndef H_RULE
92
#define H_RULE
93
 
94
#include "os-interface.h"
95
#include "bitvec.h"
96
#include "dalloc.h"
97
#include "entry.h"
98
#include "entry-list.h"
99
#include "non-local.h"
100
#include "ostream.h"
101
#include "rstack.h"
102
#include "table.h"
103
#include "types.h"
104
 
105
/*--------------------------------------------------------------------------*/
106
 
107
#ifdef FS_NO_ENUM
108
typedef int DFSStateT, *DFSStateP;
109
#define DFS_UNTRACED	(0)
110
#define DFS_TRACING	(1)
111
#define DFS_CYCLING	(2)
112
#define DFS_TRACED	(3)
113
#else
114
typedef enum {
115
    DFS_UNTRACED,
116
    DFS_TRACING,
117
    DFS_CYCLING,
118
    DFS_TRACED
119
} DFSStateT, *DFSStateP;
120
#endif /* defined (FS_NO_ENUM) */
121
 
122
#ifdef FS_NO_ENUM
123
typedef int CycleTypeT, *CycleTypeP;
124
#define CT_LEFT		(0)
125
#define CT_TAIL		(1)
126
#define CT_ALL		(2)
127
#define CT_MUTATE	(3)
128
#else
129
typedef enum {
130
    CT_LEFT,
131
    CT_TAIL,
132
    CT_ALL,
133
    CT_MUTATE
134
} CycleTypeT, *CycleTypeP;
135
#endif /* defined (FS_NO_ENUM) */
136
 
137
typedef struct ItemT {
138
    struct ItemT	       *next;
139
    TypeTupleT			param;
140
    TypeTupleT			result;
141
    EntryTypeT			type;
142
    EntryP			entry;
143
    BoolT			inlinable;
144
    BoolT			tail_call;
145
} ItemT, *ItemP;
146
 
147
typedef struct AltT {
148
    struct AltT		       *next;
149
    TypeTupleT			names;
150
    BitVecT			first_set;
151
    ItemP			item_head;
152
    ItemP		       *item_tail;
153
} AltT, *AltP;
154
 
155
typedef struct RuleT {
156
    EntryP			entry;
157
    TypeTupleT			param;
158
    TypeTupleT			result;
159
    NonLocalListT		non_locals;
160
    NStringT			maximum_scope;
161
    BoolT			defined;
162
    BoolT			has_empty_alt;
163
    BoolT			required;
164
    EntryListT			reverse_list;
165
    DFSStateT			dfs_state;
166
    struct RuleT	       *next_in_root_list;
167
    struct RuleT	       *next_in_dfs;
168
    struct RuleT	       *next_in_reverse_dfs;
169
    BoolT			no_cycles;
170
    unsigned			cycle_index;
171
    BoolT			computed_first_set;
172
    BoolT			computing_first_set;
173
    BitVecT			first_set;
174
    EntryListT			predicate_first;
175
    BoolT			see_through;
176
    unsigned			priority;
177
    BoolT			factored;
178
    struct RuleT	       *tail_group;
179
    BoolT			being_inlined;
180
    BoolT			checked_for_inlining;
181
    EntryListT			call_list;
182
    struct RuleT	       *next_in_table;
183
    BitVecT			follow_set;
184
    EntryListT			predicate_follow;
185
    BoolT			started_follows;
186
    AltP			see_through_alt;
187
    BoolT			needs_function;
188
    BoolT			all_basics;
189
    SaveRStackT			rstack_state;
190
    SaveRStackT			non_local_state;
191
    BoolT			being_output;
192
    unsigned			start_label;
193
    unsigned			call_count;
194
    unsigned			end_label;
195
    BoolT			used_end_label;
196
    unsigned			next_label;
197
    unsigned			handler_label;
198
    BoolT			used_handler_label;
199
    AltP			handler;
200
    AltP			alt_head;
201
    AltP		       *alt_tail;
202
} RuleT, *RuleP;
203
 
204
typedef struct RuleListT {
205
    RuleP			head;
206
    RuleP		       *tail;
207
} RuleListT, *RuleListP;
208
 
209
typedef struct FactorClosureT {
210
    BitVecT			bitvec1;
211
    BitVecT			bitvec2;
212
    TableP			table;
213
    EntryP			predicate_id;
214
} FactorClosureT, *FactorClosureP;
215
 
216
typedef struct SimpClosureT {
217
    BoolT			did_inline;
218
    TableP			table;
219
} SimpClosureT, *SimpClosureP;
220
 
221
typedef struct ClashListT {
222
    struct ClashListT	       *next;
223
    RuleP			rule;
224
    AltP			alt;
225
    ItemP			item;
226
} ClashListT, *ClashListP;
227
 
228
/*--------------------------------------------------------------------------*/
229
 
230
/* Defined in "rule.c": */
7 7u83 231
extern RuleP		rule_create(EntryP);
232
extern void		rule_reinit(RuleP);
233
extern EntryP		rule_entry(RuleP);
234
extern TypeTupleP	rule_param(RuleP);
235
extern TypeTupleP	rule_result(RuleP);
236
extern NonLocalListP	rule_non_locals(RuleP);
237
extern NStringP		rule_maximum_scope(RuleP);
238
extern BoolT		rule_is_defined(RuleP);
239
extern void		rule_defined(RuleP);
240
extern void		rule_add_alt(RuleP, AltP);
241
extern BoolT		rule_has_empty_alt(RuleP);
242
extern void		rule_add_empty_alt(RuleP);
243
extern BoolT		rule_has_one_alt(RuleP);
244
extern void		rule_compute_result_intersect(RuleP);
245
extern void		rule_compute_minimal_dataflow(RuleP, TypeTupleP);
246
extern BoolT		rule_is_required(RuleP);
247
extern void		rule_required(RuleP);
248
extern void		rule_compute_reverse_list(RuleP, CycleTypeT);
249
extern void		rule_reinit_reverse_list(RuleP);
250
extern EntryListP	rule_reverse_list(RuleP);
251
extern void		rule_set_dfs_state(RuleP, DFSStateT);
252
extern RuleP		rule_next_in_root_list(RuleP);
253
extern void		rule_build_root_list(EntryP, GenericP);
254
extern RuleP		rule_get_next_in_dfs(RuleP);
255
extern void		rule_compute_dfs(RuleP, CycleTypeT, RuleP *);
256
extern RuleP		rule_get_next_in_reverse_dfs(RuleP);
257
extern RuleP	       *rule_next_in_reverse_dfs_ref(RuleP);
258
extern void		rule_compute_reverse_dfs(RuleP, RuleP, RuleP *);
259
extern BoolT		rule_has_no_cycles(RuleP);
260
extern void		rule_no_cycles(RuleP);
261
extern unsigned		rule_get_cycle_index(RuleP);
262
extern void		rule_set_cycle_index(RuleP, unsigned);
263
extern void		rule_reset_cycle_index(RuleP);
264
extern BoolT		rule_has_computed_first_set(RuleP);
265
extern void		rule_computed_first_set(RuleP);
266
extern BoolT		rule_is_computing_first_set(RuleP);
267
extern void		rule_computing_first_set(RuleP);
268
extern BitVecP		rule_first_set(RuleP);
269
extern EntryListP	rule_predicate_first(RuleP);
270
extern BoolT		rule_is_see_through(RuleP);
271
extern void		rule_see_through(RuleP);
272
extern unsigned		rule_get_priority(RuleP);
273
extern void		rule_set_priority(RuleP, unsigned);
274
extern BoolT		rule_is_factored(RuleP);
275
extern void		rule_factored(RuleP);
276
extern RuleP		rule_get_tail_group(RuleP);
277
extern void		rule_set_tail_group(RuleP, RuleP);
278
extern BoolT		rule_is_being_inlined(RuleP);
279
extern void		rule_being_inlined(RuleP);
280
extern BoolT		rule_is_checked_for_inlining(RuleP);
281
extern void		rule_checked_for_inlining(RuleP);
282
extern EntryListP	rule_call_list(RuleP);
283
extern RuleP		rule_get_next_in_table(RuleP);
284
extern RuleP	       *rule_get_next_in_table_ref(RuleP);
285
extern void		rule_set_next_in_table(RuleP, RuleP);
286
extern BitVecP		rule_follow_set(RuleP);
287
extern EntryListP	rule_predicate_follow(RuleP);
288
extern BoolT		rule_has_started_follows(RuleP);
289
extern void		rule_started_follows(RuleP);
290
extern void		rule_set_see_through_alt(RuleP, AltP);
291
extern AltP		rule_see_through_alt(RuleP);
292
extern BoolT		rule_needs_function(RuleP);
293
extern void		rule_will_need_function(RuleP);
294
extern BoolT		rule_is_all_basics(RuleP);
295
extern void		rule_all_basics(RuleP);
296
extern SaveRStackP	rule_rstack_state(RuleP);
297
extern SaveRStackP	rule_non_local_state(RuleP);
298
extern BoolT		rule_is_being_output(RuleP);
299
extern void		rule_being_output(RuleP);
300
extern void		rule_not_being_output(RuleP);
301
extern unsigned		rule_get_start_label(RuleP);
302
extern void		rule_set_start_label(RuleP, unsigned);
303
extern unsigned		rule_get_call_count(RuleP);
304
extern void		rule_inc_call_count(RuleP);
305
extern unsigned		rule_get_end_label(RuleP);
306
extern void		rule_set_end_label(RuleP, unsigned);
307
extern BoolT		rule_used_end_label(RuleP);
308
extern unsigned		rule_get_next_label(RuleP);
309
extern void		rule_set_next_label(RuleP, unsigned);
310
extern unsigned		rule_get_handler_label(RuleP);
311
extern void		rule_set_handler_label(RuleP, unsigned);
312
extern BoolT		rule_used_handler_label(RuleP);
313
extern AltP		rule_get_handler(RuleP);
314
extern void		rule_set_handler(RuleP, AltP);
315
extern AltP		rule_alt_head(RuleP);
316
extern void		rule_renumber(RuleP, BoolT, EntryP);
317
extern void		rule_iter_for_table(RuleP, BoolT,
318
					    void(*)(EntryP, GenericP),
319
					    GenericP);
320
extern void		rule_deallocate(RuleP);
2 7u83 321
 
7 7u83 322
extern void		write_rule_lhs(OStreamP, RuleP);
323
extern void		write_rule(OStreamP, RuleP);
2 7u83 324
 
7 7u83 325
extern void		rule_list_init(RuleListP);
326
extern void		rule_list_append (RuleListP, RuleP, RuleP *);
327
extern void		rule_list_terminate(RuleListP);
328
extern RuleP		rule_list_head(RuleListP);
2 7u83 329
 
330
/* Defined in "rule-check.c": */
7 7u83 331
extern void		rule_check_first_set(EntryP, GenericP);
332
extern void		rule_compute_follow_set(EntryP, GenericP);
333
extern void		rule_compute_see_through_alt(EntryP, GenericP);
334
extern void		rule_compute_alt_first_sets(EntryP, GenericP);
2 7u83 335
 
7 7u83 336
extern void		write_clashes(OStreamP, ClashListP);
2 7u83 337
 
338
/* Defined in "rule-error.c": */
7 7u83 339
extern void		rule_compute_error_list(EntryP, GenericP);
2 7u83 340
 
341
/* Defined in "rule-factor.c": */
7 7u83 342
extern void		rule_factor(EntryP, GenericP);
343
extern void		rule_set_factor_limit(unsigned);
2 7u83 344
 
345
/* Defined in "rule-firsts.c": */
7 7u83 346
extern void		rule_compute_first_set_1(RuleP);
347
extern void		rule_compute_first_set(EntryP, GenericP);
2 7u83 348
 
349
/* Defined in "rule-lre.c": */
7 7u83 350
extern void		rule_remove_left_cycle(RuleP, EntryP, TableP);
2 7u83 351
 
352
/* Defined in "rule-mutate.c": */
7 7u83 353
extern void		rule_compute_mutations(EntryP, GenericP);
2 7u83 354
 
355
/* Defined in "rule-name.c": */
7 7u83 356
extern void		rule_recompute_alt_names(EntryP, GenericP);
2 7u83 357
 
358
/* Defined in "rule-simp.c": */
7 7u83 359
extern void		rule_remove_duplicates(TableP, EntryP);
2 7u83 360
 
361
/* Defined in "rule-tail.c": */
7 7u83 362
extern void		rule_handle_tails(RuleP);
363
extern void		rule_compute_all_basics(EntryP, GenericP);
364
extern void		rule_compute_inlining(EntryP, GenericP);
365
extern void		rule_compute_needed_functions(EntryP, GenericP);
366
extern void		rule_handle_need_functions(RuleP);
367
extern BoolT		rule_get_inline_tail_calls(void);
368
extern void		rule_set_inline_tail_calls(BoolT);
369
extern void		rule_set_inline_all_basics(BoolT);
370
extern void		rule_set_inline_singles(BoolT);
371
extern void		rule_set_inline_non_tail_calls(BoolT);
372
extern void		rule_set_multiple_inlining(BoolT);
2 7u83 373
 
374
/* Defined in "alt.c": */
7 7u83 375
extern AltP		alt_create(void);
376
extern AltP		alt_create_merge(ItemP, ItemP, TypeTransP, TableP);
377
extern AltP		alt_duplicate(AltP);
378
extern BoolT		alt_less_than(AltP, AltP);
379
extern BoolT		alt_equal(AltP, AltP);
380
extern AltP		alt_next(AltP);
381
extern AltP	       *alt_next_ref(AltP);
382
extern void		alt_set_next(AltP, AltP);
383
extern TypeTupleP	alt_names(AltP);
384
extern BitVecP		alt_first_set(AltP);
385
extern ItemP		alt_item_head(AltP);
386
extern ItemP		alt_unlink_item_head(AltP);
387
extern void		alt_add_item(AltP, ItemP);
388
extern AltP		alt_deallocate(AltP);
2 7u83 389
 
7 7u83 390
extern void		write_alt(OStreamP, AltP);
391
extern void		write_alt_highlighting(OStreamP, AltP, ItemP);
2 7u83 392
 
393
/* Defined in "item.c": */
7 7u83 394
extern ItemP		item_create(EntryP);
395
extern ItemP		item_duplicate(ItemP);
396
extern ItemP		item_duplicate_and_translate(ItemP, TypeTransP, TableP);
397
extern void		item_translate_list(ItemP, TypeBTransP);
398
extern void		item_to_predicate(ItemP);
399
extern ItemP		item_next (ItemP);
400
extern ItemP	       *item_next_ref(ItemP);
401
extern void		item_set_next(ItemP, ItemP);
402
extern EntryP		item_entry(ItemP);
403
extern void		item_set_entry(ItemP, EntryP);
404
extern EntryTypeT	item_type(ItemP);
405
extern BoolT		item_is_rule(ItemP);
406
extern BoolT		item_is_action(ItemP);
407
extern BoolT		item_is_predicate(ItemP);
408
extern BoolT		item_is_basic(ItemP);
409
extern BoolT		item_is_rename(ItemP);
410
extern TypeTupleP	item_param(ItemP);
411
extern void		item_add_param(ItemP, TypeTupleP);
412
extern TypeTupleP	item_result(ItemP);
413
extern void		item_add_result(ItemP, TypeTupleP);
414
extern BoolT		item_is_inlinable(ItemP);
415
extern void		item_inlinable(ItemP);
416
extern BoolT		item_is_tail_call(ItemP);
417
extern void		item_tail_call(ItemP);
418
extern BoolT		item_names_used_in_list(ItemP, TypeTupleP);
419
extern void		item_compute_minimal_dataflow(ItemP, TypeTupleP);
420
extern ItemP		item_deallocate(ItemP);
2 7u83 421
 
7 7u83 422
extern void		write_item(OStreamP, ItemP);
2 7u83 423
 
424
/*--------------------------------------------------------------------------*/
425
 
426
#ifdef FS_FAST
7 7u83 427
#define rule_entry(r)			((r)->entry)
428
#define rule_param(r)			(&((r)->param))
429
#define rule_result(r)			(&((r)->result))
430
#define rule_non_locals(r)		(&((r)->non_locals))
431
#define rule_maximum_scope(r)		(&((r)->maximum_scope))
432
#define rule_is_defined(r)		((r)->defined)
433
#define rule_defined(r)			((r)->defined = TRUE)
434
#define rule_has_empty_alt(r)		((r)->has_empty_alt)
435
#define rule_add_empty_alt(r)		((r)->has_empty_alt = TRUE)
436
#define rule_is_required(r)		((r)->required)
437
#define rule_required(r)		((r)->required = TRUE)
438
#define rule_reverse_list(r)		(&((r)->reverse_list))
439
#define rule_set_dfs_state(r, s)	((r)->dfs_state = (s))
440
#define rule_next_in_root_list(r)	((r)->next_in_root_list)
441
#define rule_get_next_in_dfs(r)		((r)->next_in_dfs)
442
#define rule_get_next_in_reverse_dfs(r)	((r)->next_in_reverse_dfs)
443
#define rule_next_in_reverse_dfs_ref(r)	(&((r)->next_in_reverse_dfs))
444
#define rule_has_no_cycles(r)		((r)->no_cycles)
445
#define rule_no_cycles(r)		((r)->no_cycles = TRUE)
446
#define rule_get_cycle_index(r)		((r)->cycle_index)
447
#define rule_set_cycle_index(r, i)	((r)->cycle_index = (i))
448
#define rule_reset_cycle_index(r)	((r)->cycle_index = 0)
449
#define rule_has_computed_first_set(r)	((r)->computed_first_set)
450
#define rule_computed_first_set(r)	((r)->computed_first_set = TRUE)
451
#define rule_is_computing_first_set(r)	((r)->computing_first_set)
452
#define rule_computing_first_set(r)	((r)->computing_first_set = TRUE)
453
#define rule_first_set(r)		(&((r)->first_set))
454
#define rule_predicate_first(r)		(&((r)->predicate_first))
455
#define rule_is_see_through(r)		((r)->see_through)
456
#define rule_see_through(r)		((r)->see_through = TRUE)
457
#define rule_get_priority(r)		((r)->priority)
458
#define rule_set_priority(r, p)		((r)->priority = (p))
459
#define rule_is_factored(r)		((r)->factored)
460
#define rule_factored(r)		((r)->factored = TRUE)
461
#define rule_get_tail_group(r)		((r)->tail_group)
462
#define rule_set_tail_group(r1, r2)	((r1)->tail_group = (r2))
463
#define rule_is_being_inlined(r)	((r)->being_inlined)
464
#define rule_being_inlined(r)		((r)->being_inlined = TRUE)
465
#define rule_is_checked_for_inlining(r)	((r)->checked_for_inlining)
466
#define rule_checked_for_inlining(r)	((r)->checked_for_inlining = TRUE)
467
#define rule_call_list(r)		(&((r)->call_list))
468
#define rule_get_next_in_table(r)	((r)->next_in_table)
469
#define rule_get_next_in_table_ref(r)	(&((r)->next_in_table))
470
#define rule_set_next_in_table(r1, r2)	((r1)->next_in_table = (r2))
471
#define rule_follow_set(r)		(&((r)->follow_set))
472
#define rule_predicate_follow(r)	(&((r)->predicate_follow))
473
#define rule_has_started_follows(r)	((r)->started_follows)
474
#define rule_started_follows(r)		((r)->started_follows = TRUE)
475
#define rule_set_all_action_alt(r, a)	((r)->all_action_alt = (a))
476
#define rule_all_action_alt(r)		((r)->all_action_alt)
477
#define rule_needs_function(r)		((r)->needs_function)
478
#define rule_will_need_function(r)	((r)->needs_function = TRUE)
479
#define rule_is_all_basics(r)		((r)->all_basics)
480
#define rule_all_basics(r)		((r)->all_basics = TRUE)
481
#define rule_rstack_state(r)		(&((r)->rstack_state))
482
#define rule_non_local_state(r)		(&((r)->non_local_state))
483
#define rule_is_being_output(r)		((r)->being_output)
484
#define rule_being_output(r)		((r)->being_output = TRUE)
485
#define rule_not_being_output(r)	((r)->being_output = FALSE)
486
#define rule_get_start_label(r)		((r)->start_label)
487
#define rule_set_start_label(r, l)	((r)->start_label = (l))
488
#define rule_get_call_count(r)		((r)->call_count)
489
#define rule_inc_call_count(r)		((r)->call_count++)
490
#define rule_used_end_label(r)		((r)->used_end_label)
491
#define rule_get_next_label(r)		((r)->next_label)
492
#define rule_set_next_label(r, l)	((r)->next_label = (l))
493
#define rule_used_handler_label(r)	((r)->used_handler_label)
494
#define rule_get_handler(r)		((r)->handler)
495
#define rule_set_handler(r, a)		((r)->handler = (a))
496
#define rule_alt_head(r)		((r)->alt_head)
2 7u83 497
 
7 7u83 498
#define rule_list_terminate(r)		((*((r)->tail)) = NIL(RuleP))
499
#define rule_list_head(r)		((r)->head)
2 7u83 500
 
7 7u83 501
#define alt_next(a)			((a)->next)
502
#define alt_next_ref(a)			(&((a)->next))
503
#define alt_set_next(a1, a2)		((a1)->next = (a2))
504
#define alt_names(a)			(&((a)->names))
505
#define alt_first_set(a)		(&((a)->first_set))
506
#define alt_item_head(a)		((a)->item_head)
2 7u83 507
 
7 7u83 508
#define item_next(i)			((i)->next)
509
#define item_next_ref(i)		(&((i)->next))
510
#define item_set_next(i1, i2)		((i1)->next = (i2))
511
#define item_entry(i)			((i)->entry)
512
#define item_set_entry(i, e)		((i)->entry = (e))
513
#define item_type(i)			((i)->type)
514
#define item_is_rule(i)			((i)->type == ET_RULE)
515
#define item_is_action(i)		((i)->type == ET_ACTION)
516
#define item_is_predicate(i)		((i)->type == ET_PREDICATE)
517
#define item_is_basic(i)		((i)->type == ET_BASIC)
518
#define item_is_rename(i)		((i)->type == ET_RENAME)
519
#define item_param(i)			(&((i)->param))
520
#define item_add_param(i, t)		(types_assign(&((i)->param), (t)))
521
#define item_result(i)			(&((i)->result))
522
#define item_add_result(i, t)		(types_assign(&((i)->result), (t)))
523
#define item_is_inlinable(i)		((i)->inlinable)
524
#define item_inlinable(i)		((i)->inlinable = TRUE)
525
#define item_is_tail_call(i)		((i)->tail_call)
526
#define item_tail_call(i)		((i)->tail_call = TRUE)
2 7u83 527
#endif /* defined (FS_FAST) */
528
 
529
#endif /* !defined (H_RULE) */
530
 
531
/*
532
 * Local variables(smf):
533
 * eval: (include::add-path-entry "../os-interface" "../library")
534
 * eval: (include::add-path-entry "../generated")
535
 * end:
536
**/