1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Data definitions for internal representation of Bison's input.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1984, 1986, 1989, 1992, 2001-2007, 2009-2012 Free
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Software Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef GRAM_H_
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define GRAM_H_
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Representation of the grammar rules:
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   NTOKENS is the number of tokens, and NVARS is the number of
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   variables (nonterminals).  NSYMS is the total number, ntokens +
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   nvars.
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Each symbol (either token or variable) receives a symbol number.
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Numbers 0 to NTOKENS - 1 are for tokens, and NTOKENS to NSYMS - 1
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   are for variables.  Symbol number zero is the end-of-input token.
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This token is counted in ntokens.  The true number of token values
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   assigned is NTOKENS reduced by one for each alias declaration.
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The rules receive rule numbers 1 to NRULES in the order they are
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   written.  More precisely Bison augments the grammar with the
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   initial rule, `$accept: START-SYMBOL $end', which is numbered 1,
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   all the user rules are 2, 3 etc.  Each time a rule number is
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   presented to the user, we subtract 1, so *displayed* rule numbers
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   are 0, 1, 2...
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Internally, we cannot use the number 0 for a rule because for
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   instance RITEM stores both symbol (the RHS) and rule numbers: the
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   symbols are shorts >= 0, and rule number are stored negative.
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Therefore 0 cannot be used, since it would be both the rule number
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   0, and the token $end).
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Actions are accessed via the rule number.
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The rules themselves are described by several arrays: amongst which
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RITEM, and RULES.
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES is an array of rules, whose members are:
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].lhs -- the symbol of the left hand side of rule R.
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].rhs -- the index in RITEM of the beginning of the portion
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   for rule R.
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].prec -- the symbol providing the precedence level of R.
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].precsym -- the symbol attached (via %prec) to give its
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   precedence to R.  Of course, if set, it is equal to `prec', but we
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   need to distinguish one from the other when reducing: a symbol used
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in a %prec is not useless.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].assoc -- the associativity of R.
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].dprec -- the dynamic precedence level of R (for GLR
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   parsing).
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].merger -- index of merging function for R (for GLR
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   parsing).
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].line -- the line where R was defined.
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RULES[R].useful -- true iff the rule is used (i.e., false if thrown
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   away by reduce).
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The right hand side is stored as symbol numbers in a portion of
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   RITEM.
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The length of the portion is one greater than the number of symbols
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in the rule's right hand side.  The last element in the portion
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   contains minus R, which identifies it as the end of a portion and
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   says which rule it is for.
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The portions of RITEM come in order of increasing rule number.
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   NRITEMS is the total length of RITEM.  Each element of RITEM is
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   called an "item" and its index in RITEM is an item number.
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Item numbers are used in the finite state machine to represent
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   places that parsing can get to.
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   SYMBOLS[I]->prec records the precedence level of each symbol.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Precedence levels are assigned in increasing order starting with 1
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   so that numerically higher precedence values mean tighter binding
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   as they ought to.  Zero as a symbol or rule's precedence means none
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   is assigned.
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Associativities are recorded similarly in SYMBOLS[I]->assoc.  */
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "location.h"
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "symtab.h"
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ISTOKEN(i)	((i) < ntokens)
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ISVAR(i)	((i) >= ntokens)
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int nsyms;
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int ntokens;
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int nvars;
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int item_number;
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define ITEM_NUMBER_MAX INT_MAX
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern item_number *ritem;
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern unsigned int nritems;
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* There is weird relationship between OT1H item_number and OTOH
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   symbol_number and rule_number: we store the latter in
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   item_number.  symbol_number values are stored as-is, while
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the negation of (rule_number + 1) is stored.
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Therefore, a symbol_number must be a valid item_number, and we
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   sometimes have to perform the converse transformation.  */
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline item_number
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_number_as_item_number (symbol_number sym)
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return sym;
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline symbol_number
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number_as_symbol_number (item_number i)
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return i;
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number_is_symbol_number (item_number i)
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return i >= 0;
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Rule numbers.  */
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int rule_number;
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define RULE_NUMBER_MAX INT_MAX
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern rule_number nrules;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline item_number
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_number_as_item_number (rule_number r)
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return -1 - r;
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline rule_number
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number_as_rule_number (item_number i)
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return -1 - i;
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number_is_rule_number (item_number i)
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return i < 0;
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------.
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Rules.  |
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------*/
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The number of the rule in the source.  It is usually the index in
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     RULES too, except if there are useless rules.  */
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number user_number;
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The index in RULES.  Usually the rule number in the source,
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     except if some rules are useless.  */
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number number;
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol *lhs;
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  item_number *rhs;
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* This symbol provides both the associativity, and the precedence. */
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol *prec;
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int dprec;
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int merger;
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* This symbol was attached to the rule via %prec. */
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol *precsym;
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  location location;
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool useful;
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *action;
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  location action_location;
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} rule;
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern rule *rules;
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A function that selects a rule.  */
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef bool (*rule_filter) (rule *);
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return true IFF the rule has a `number' smaller than NRULES.  That is, it is
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   useful in the grammar.  */
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool rule_useful_in_grammar_p (rule *r);
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return true IFF the rule has a `number' higher than NRULES.  That is, it is
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   useless in the grammar.  */
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool rule_useless_in_grammar_p (rule *r);
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return true IFF the rule is not flagged as useful but is useful in the
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   grammar.  In other words, it was discarded because of conflicts.  */
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool rule_useless_in_parser_p (rule *r);
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print this rule's number and lhs on OUT.  If a PREVIOUS_LHS was
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   already displayed (by a previous call for another rule), avoid
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   useless repetitions.  */
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out);
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid rule_lhs_print_xml (rule *r, FILE *out, int level);
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return the length of the RHS.  */
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint rule_rhs_length (rule *r);
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print this rule's RHS on OUT.  */
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid rule_rhs_print (rule *r, FILE *out);
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print this rule on OUT.  */
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid rule_print (rule *r, FILE *out);
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Table of the symbols, indexed by the symbol number. */
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern symbol **symbols;
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   by the user's yylex routine, it yields the internal token number
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   used by the parser and throughout bison.  */
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern symbol_number *token_translations;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int max_user_token_number;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Dump RITEM for traces. */
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid ritem_print (FILE *out);
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return the size of the longest rule RHS.  */
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t ritem_longest_rhs (void);
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Print the grammar's rules that match FILTER on OUT under TITLE.  */
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid grammar_rules_partial_print (FILE *out, const char *title,
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				  rule_filter filter);
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Print the grammar's useful rules on OUT.  */
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid grammar_rules_print (FILE *out);
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Print all of the grammar's rules with a "usefulness" attribute.  */
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid grammar_rules_print_xml (FILE *out, int level);
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Dump the grammar. */
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid grammar_dump (FILE *out, const char *title);
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Report on STDERR the rules that are not flagged USEFUL, using the
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MESSAGE (which can be `rule useless in grammar' when invoked after grammar
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   reduction, or `rule useless in parser due to conflicts' after conflicts
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   were taken into account).  */
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid grammar_rules_useless_report (const char *message);
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Free the packed grammar. */
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid grammar_free (void);
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !GRAM_H_ */
276