]> git.saurik.com Git - bison.git/blame - src/scan-code.h
maint: run "make update-copyright".
[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
72
28e52c0d
JD
73 /** \c NULL iff \c code_props::kind is not \c CODE_PROPS_RULE_ACTION. */
74 struct symbol_list *rule;
b9f1d9a4
AR
75
76 /* Named reference. */
77 named_ref *named_ref;
28e52c0d
JD
78} code_props;
79
80/**
81 * \pre
82 * - <tt>self != NULL</tt>.
83 * \post
84 * - \c self has been overwritten to contain no code.
85 */
86void code_props_none_init (code_props *self);
87
88/** Equivalent to \c code_props_none_init. */
89#define CODE_PROPS_NONE_INIT \
ca2a6d15 90 {CODE_PROPS_NONE, NULL, EMPTY_LOCATION_INIT, false, false, NULL, NULL}
28e52c0d
JD
91
92/** Initialized by \c CODE_PROPS_NONE_INIT with no further modification. */
93extern code_props const code_props_none;
94
95/**
96 * \pre
97 * - <tt>self != NULL</tt>.
98 * - <tt>code != NULL</tt>.
99 * - \c code is an untranslated code passage containing no Bison escapes.
100 * - \c code was extracted from the grammar file at \c code_loc.
101 * \post
102 * - \c self has been overwritten to represent the specified plain code
103 * passage.
104 * - \c self will become invalid if the caller frees \c code before invoking
105 * \c code_props_translate_code on \c self.
106 */
107void code_props_plain_init (code_props *self, char const *code,
108 location code_loc);
109
110/**
111 * \pre
112 * - <tt>self != NULL</tt>.
113 * - <tt>code != NULL</tt>.
114 * - \c code is an untranslated code passage. The only Bison escapes it
115 * might contain are $$ and \@$, referring to a single symbol.
116 * - \c code was extracted from the grammar file at \c code_loc.
117 * \post
118 * - \c self has been overwritten to represent the specified symbol action.
119 * - \c self will become invalid if the caller frees \c code before invoking
120 * \c code_props_translate_code on \c self.
121 */
122void code_props_symbol_action_init (code_props *self, char const *code,
123 location code_loc);
124
125/**
126 * \pre
127 * - <tt>self != NULL</tt>.
128 * - <tt>code != NULL</tt>.
129 * - <tt>rule != NULL</tt>.
130 * - \c code is the untranslated action of the rule for which \c rule is the
131 * LHS node. Thus, \c code possibly contains Bison escapes such as $$, $1,
132 * $2, etc referring to the values of the rule.
133 * - \c code was extracted from the grammar file at \c code_loc.
134 * \post
135 * - \c self has been overwritten to represent the specified rule action.
136 * - \c self does not claim responsibility for the memory of \c rule.
137 * - \c self will become invalid if:
138 * - The caller frees \c code before invoking \c code_props_translate_code
139 * on \c self.
140 * - The caller frees \c rule.
141 */
142void code_props_rule_action_init (code_props *self, char const *code,
b9f1d9a4 143 location code_loc, struct symbol_list *rule,
ca2a6d15 144 named_ref *name, bool is_predicate);
28e52c0d
JD
145
146/**
147 * \pre
148 * - If there's a code passage contained in \c self and it contains Bison
149 * escapes, all grammar declarations have already been parsed as they may
150 * affect warnings and complaints issued here.
151 * \post
152 * - All M4-special symbols and Bison escapes have been translated in
153 * \c self->code.
154 * - <tt>self->code != self->code\@pre</tt> unless
155 * <tt>self->code\@pre = NULL</tt>.
156 */
157void code_props_translate_code (code_props *self);
158
159/**
160 * \pre
161 * - None.
162 * \post
163 * - The dynamic memory allocated by the previous invocation of
164 * \c code_props_translate_code (if any) was freed. The \c code_props
165 * instance for which \c code_props_translate_code was invoked is now
166 * invalid.
167 */
168void code_scanner_last_string_free (void);
169
170/**
171 * \pre
172 * - None.
173 * \post
7c0c6181 174 * - All dynamic memory allocated during invocations of
f6857bbf
JD
175 * \c code_props_translate_code (if any) has been freed. All \c code_props
176 * instances may now be invalid.
28e52c0d 177 */
b0f4c4ea 178void code_scanner_free (void);
76290368 179
e9071366 180#endif /* !SCAN_CODE_H_ */