]> git.saurik.com Git - bison.git/blame - src/scan-code.h
allow modification on retrieved code_props.
[bison.git] / src / scan-code.h
CommitLineData
28e52c0d 1/* Bison code properties structure and scanner.
e9071366 2
34136e65 3 Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
e9071366
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
e9071366 8 it under the terms of the GNU General Public License as published by
f16b0819 9 the Free Software Foundation, either version 3 of the License, or
e9071366
AD
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
e9071366
AD
19
20#ifndef SCAN_CODE_H_
21# define SCAN_CODE_H_
22
23# include "location.h"
b9f1d9a4 24# include "named-ref.h"
e9071366 25
28e52c0d
JD
26struct symbol_list;
27
28/**
29 * Keeps track of the maximum number of semantic values to the left of a handle
30 * (those referenced by $0, $-1, etc.) that are required by the semantic
31 * actions of this grammar.
32 */
e9071366
AD
33extern int max_left_semantic_context;
34
28e52c0d
JD
35/**
36 * A code passage captured from the grammar file and possibly translated,
37 * and/or properties associated with such a code passage. Don't break
38 * encapsulation by modifying the fields directly. Use the provided interface
39 * functions.
40 */
41typedef struct code_props {
42 /** Set by the init functions. */
43 enum {
44 CODE_PROPS_NONE, CODE_PROPS_PLAIN,
45 CODE_PROPS_SYMBOL_ACTION, CODE_PROPS_RULE_ACTION
46 } kind;
47
48 /** \c NULL iff \c code_props::kind is \c CODE_PROPS_NONE. */
49 char const *code;
50 /** Undefined iff \c code_props::code is \c NULL. */
51 location location;
52
53 /**
54 * \c false iff either:
55 * - \c code_props_translate_code has never previously been invoked for
56 * the \c code_props that would contain the code passage associated
57 * with \c self. (That \c code_props is not the same as this one if this
58 * one is for a RHS \c symbol_list node. Instead, it's the \c code_props
59 * for the LHS symbol of the same rule.)
60 * - \c code_props_translate_code has been invoked for that \c code_props,
61 * but the symbol value associated with this \c code_props was not
62 * referenced in the code passage.
63 */
64 bool is_value_used;
65
ca2a6d15
PH
66 /**
67 * \c true iff this code is an action that is not to be deferred in
68 * a non-deterministic parser.
69 */
70 bool is_predicate;
71
ea9a35c6
VS
72 /**
73 * Whether this is actually used (i.e., not completely masked by
74 * other code props). */
75 bool is_used;
ca2a6d15 76
28e52c0d
JD
77 /** \c NULL iff \c code_props::kind is not \c CODE_PROPS_RULE_ACTION. */
78 struct symbol_list *rule;
b9f1d9a4
AR
79
80 /* Named reference. */
81 named_ref *named_ref;
28e52c0d
JD
82} code_props;
83
84/**
85 * \pre
86 * - <tt>self != NULL</tt>.
87 * \post
88 * - \c self has been overwritten to contain no code.
89 */
90void code_props_none_init (code_props *self);
91
92/** Equivalent to \c code_props_none_init. */
ea9a35c6
VS
93#define CODE_PROPS_NONE_INIT \
94 { \
95 /* .kind = */ CODE_PROPS_NONE, \
96 /* .code = */ NULL, \
97 /* .location = */ EMPTY_LOCATION_INIT, \
98 /* .is_value_used = */ false, \
99 /* .is_predicate = */ false, \
100 /* .is_used = */ false, \
101 /* .rule = */ NULL, \
102 /* .named_ref = */ NULL \
103 }
28e52c0d
JD
104
105/** Initialized by \c CODE_PROPS_NONE_INIT with no further modification. */
70946cff 106extern code_props code_props_none;
28e52c0d
JD
107
108/**
109 * \pre
110 * - <tt>self != NULL</tt>.
111 * - <tt>code != NULL</tt>.
112 * - \c code is an untranslated code passage containing no Bison escapes.
113 * - \c code was extracted from the grammar file at \c code_loc.
114 * \post
115 * - \c self has been overwritten to represent the specified plain code
116 * passage.
117 * - \c self will become invalid if the caller frees \c code before invoking
118 * \c code_props_translate_code on \c self.
119 */
120void code_props_plain_init (code_props *self, char const *code,
121 location code_loc);
122
123/**
124 * \pre
125 * - <tt>self != NULL</tt>.
126 * - <tt>code != NULL</tt>.
127 * - \c code is an untranslated code passage. The only Bison escapes it
128 * might contain are $$ and \@$, referring to a single symbol.
129 * - \c code was extracted from the grammar file at \c code_loc.
130 * \post
131 * - \c self has been overwritten to represent the specified symbol action.
132 * - \c self will become invalid if the caller frees \c code before invoking
133 * \c code_props_translate_code on \c self.
134 */
135void code_props_symbol_action_init (code_props *self, char const *code,
136 location code_loc);
137
138/**
139 * \pre
140 * - <tt>self != NULL</tt>.
141 * - <tt>code != NULL</tt>.
142 * - <tt>rule != NULL</tt>.
143 * - \c code is the untranslated action of the rule for which \c rule is the
144 * LHS node. Thus, \c code possibly contains Bison escapes such as $$, $1,
145 * $2, etc referring to the values of the rule.
146 * - \c code was extracted from the grammar file at \c code_loc.
147 * \post
148 * - \c self has been overwritten to represent the specified rule action.
149 * - \c self does not claim responsibility for the memory of \c rule.
150 * - \c self will become invalid if:
151 * - The caller frees \c code before invoking \c code_props_translate_code
152 * on \c self.
153 * - The caller frees \c rule.
154 */
155void code_props_rule_action_init (code_props *self, char const *code,
b9f1d9a4 156 location code_loc, struct symbol_list *rule,
ca2a6d15 157 named_ref *name, bool is_predicate);
28e52c0d
JD
158
159/**
160 * \pre
161 * - If there's a code passage contained in \c self and it contains Bison
162 * escapes, all grammar declarations have already been parsed as they may
163 * affect warnings and complaints issued here.
164 * \post
165 * - All M4-special symbols and Bison escapes have been translated in
166 * \c self->code.
167 * - <tt>self->code != self->code\@pre</tt> unless
168 * <tt>self->code\@pre = NULL</tt>.
169 */
170void code_props_translate_code (code_props *self);
171
172/**
173 * \pre
174 * - None.
175 * \post
176 * - The dynamic memory allocated by the previous invocation of
177 * \c code_props_translate_code (if any) was freed. The \c code_props
178 * instance for which \c code_props_translate_code was invoked is now
179 * invalid.
180 */
181void code_scanner_last_string_free (void);
182
183/**
184 * \pre
185 * - None.
186 * \post
7c0c6181 187 * - All dynamic memory allocated during invocations of
f6857bbf
JD
188 * \c code_props_translate_code (if any) has been freed. All \c code_props
189 * instances may now be invalid.
28e52c0d 190 */
b0f4c4ea 191void code_scanner_free (void);
76290368 192
e9071366 193#endif /* !SCAN_CODE_H_ */