xref: /aosp_15_r20/external/bc/include/lex.h (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
1*5a6e8488SAndroid Build Coastguard Worker /*
2*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
3*5a6e8488SAndroid Build Coastguard Worker  *
4*5a6e8488SAndroid Build Coastguard Worker  * SPDX-License-Identifier: BSD-2-Clause
5*5a6e8488SAndroid Build Coastguard Worker  *
6*5a6e8488SAndroid Build Coastguard Worker  * Copyright (c) 2018-2024 Gavin D. Howard and contributors.
7*5a6e8488SAndroid Build Coastguard Worker  *
8*5a6e8488SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*5a6e8488SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
10*5a6e8488SAndroid Build Coastguard Worker  *
11*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions of source code must retain the above copyright notice, this
12*5a6e8488SAndroid Build Coastguard Worker  *   list of conditions and the following disclaimer.
13*5a6e8488SAndroid Build Coastguard Worker  *
14*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions in binary form must reproduce the above copyright notice,
15*5a6e8488SAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer in the documentation
16*5a6e8488SAndroid Build Coastguard Worker  *   and/or other materials provided with the distribution.
17*5a6e8488SAndroid Build Coastguard Worker  *
18*5a6e8488SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*5a6e8488SAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*5a6e8488SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*5a6e8488SAndroid Build Coastguard Worker  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*5a6e8488SAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*5a6e8488SAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*5a6e8488SAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*5a6e8488SAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*5a6e8488SAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*5a6e8488SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*5a6e8488SAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
29*5a6e8488SAndroid Build Coastguard Worker  *
30*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
31*5a6e8488SAndroid Build Coastguard Worker  *
32*5a6e8488SAndroid Build Coastguard Worker  * Definitions for bc's lexer.
33*5a6e8488SAndroid Build Coastguard Worker  *
34*5a6e8488SAndroid Build Coastguard Worker  */
35*5a6e8488SAndroid Build Coastguard Worker 
36*5a6e8488SAndroid Build Coastguard Worker #ifndef BC_LEX_H
37*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_H
38*5a6e8488SAndroid Build Coastguard Worker 
39*5a6e8488SAndroid Build Coastguard Worker #include <stdbool.h>
40*5a6e8488SAndroid Build Coastguard Worker #include <stddef.h>
41*5a6e8488SAndroid Build Coastguard Worker 
42*5a6e8488SAndroid Build Coastguard Worker #include <status.h>
43*5a6e8488SAndroid Build Coastguard Worker #include <vector.h>
44*5a6e8488SAndroid Build Coastguard Worker #include <lang.h>
45*5a6e8488SAndroid Build Coastguard Worker 
46*5a6e8488SAndroid Build Coastguard Worker /**
47*5a6e8488SAndroid Build Coastguard Worker  * A convenience macro for throwing errors in lex code. This takes care of
48*5a6e8488SAndroid Build Coastguard Worker  * plumbing like passing in the current line the lexer is on.
49*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
50*5a6e8488SAndroid Build Coastguard Worker  * @param e  The error.
51*5a6e8488SAndroid Build Coastguard Worker  */
52*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG
53*5a6e8488SAndroid Build Coastguard Worker #define bc_lex_err(l, e) (bc_vm_handleError((e), __FILE__, __LINE__, (l)->line))
54*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG
55*5a6e8488SAndroid Build Coastguard Worker #define bc_lex_err(l, e) (bc_vm_handleError((e), (l)->line))
56*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG
57*5a6e8488SAndroid Build Coastguard Worker 
58*5a6e8488SAndroid Build Coastguard Worker /**
59*5a6e8488SAndroid Build Coastguard Worker  * A convenience macro for throwing errors in lex code. This takes care of
60*5a6e8488SAndroid Build Coastguard Worker  * plumbing like passing in the current line the lexer is on.
61*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
62*5a6e8488SAndroid Build Coastguard Worker  * @param e  The error.
63*5a6e8488SAndroid Build Coastguard Worker  */
64*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG
65*5a6e8488SAndroid Build Coastguard Worker #define bc_lex_verr(l, e, ...) \
66*5a6e8488SAndroid Build Coastguard Worker 	(bc_vm_handleError((e), __FILE__, __LINE__, (l)->line, __VA_ARGS__))
67*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG
68*5a6e8488SAndroid Build Coastguard Worker #define bc_lex_verr(l, e, ...) (bc_vm_handleError((e), (l)->line, __VA_ARGS__))
69*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG
70*5a6e8488SAndroid Build Coastguard Worker 
71*5a6e8488SAndroid Build Coastguard Worker // BC_LEX_NEG_CHAR returns the char that corresponds to negative for the
72*5a6e8488SAndroid Build Coastguard Worker // current calculator.
73*5a6e8488SAndroid Build Coastguard Worker //
74*5a6e8488SAndroid Build Coastguard Worker // BC_LEX_LAST_NUM_CHAR returns the char that corresponds to the last valid
75*5a6e8488SAndroid Build Coastguard Worker // char for numbers. In bc and dc, capital letters are part of numbers, to a
76*5a6e8488SAndroid Build Coastguard Worker // point. (dc only goes up to hex, so its last valid char is 'F'.)
77*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
78*5a6e8488SAndroid Build Coastguard Worker 
79*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED
80*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_NEG_CHAR (BC_IS_BC ? '-' : '_')
81*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_LAST_NUM_CHAR (BC_IS_BC ? 'Z' : 'F')
82*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED
83*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_NEG_CHAR ('-')
84*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_LAST_NUM_CHAR ('Z')
85*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED
86*5a6e8488SAndroid Build Coastguard Worker 
87*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED
88*5a6e8488SAndroid Build Coastguard Worker 
89*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_NEG_CHAR ('_')
90*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_LAST_NUM_CHAR ('F')
91*5a6e8488SAndroid Build Coastguard Worker 
92*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
93*5a6e8488SAndroid Build Coastguard Worker 
94*5a6e8488SAndroid Build Coastguard Worker /**
95*5a6e8488SAndroid Build Coastguard Worker  * Returns true if c is a valid number character.
96*5a6e8488SAndroid Build Coastguard Worker  * @param c         The char to check.
97*5a6e8488SAndroid Build Coastguard Worker  * @param pt        If a decimal point has already been seen.
98*5a6e8488SAndroid Build Coastguard Worker  * @param int_only  True if the number is expected to be an int only, false if
99*5a6e8488SAndroid Build Coastguard Worker  *                  non-integers are allowed.
100*5a6e8488SAndroid Build Coastguard Worker  * @return          True if @a c is a valid number character.
101*5a6e8488SAndroid Build Coastguard Worker  */
102*5a6e8488SAndroid Build Coastguard Worker #define BC_LEX_NUM_CHAR(c, pt, int_only)                               \
103*5a6e8488SAndroid Build Coastguard Worker 	(isdigit(c) != 0 || ((c) >= 'A' && (c) <= BC_LEX_LAST_NUM_CHAR) || \
104*5a6e8488SAndroid Build Coastguard Worker 	 ((c) == '.' && !(pt) && !(int_only)))
105*5a6e8488SAndroid Build Coastguard Worker 
106*5a6e8488SAndroid Build Coastguard Worker /// An enum of lex token types.
107*5a6e8488SAndroid Build Coastguard Worker typedef enum BcLexType
108*5a6e8488SAndroid Build Coastguard Worker {
109*5a6e8488SAndroid Build Coastguard Worker 	/// End of file.
110*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_EOF,
111*5a6e8488SAndroid Build Coastguard Worker 
112*5a6e8488SAndroid Build Coastguard Worker 	/// Marker for invalid tokens, used by bc and dc for const data.
113*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_INVALID,
114*5a6e8488SAndroid Build Coastguard Worker 
115*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
116*5a6e8488SAndroid Build Coastguard Worker 
117*5a6e8488SAndroid Build Coastguard Worker 	/// Increment operator.
118*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_INC,
119*5a6e8488SAndroid Build Coastguard Worker 
120*5a6e8488SAndroid Build Coastguard Worker 	/// Decrement operator.
121*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_DEC,
122*5a6e8488SAndroid Build Coastguard Worker 
123*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
124*5a6e8488SAndroid Build Coastguard Worker 
125*5a6e8488SAndroid Build Coastguard Worker 	/// BC_LEX_NEG is not used in lexing; it is only for parsing. The lexer
126*5a6e8488SAndroid Build Coastguard Worker 	/// marks all '-' characters as BC_LEX_OP_MINUS, but the parser needs to be
127*5a6e8488SAndroid Build Coastguard Worker 	/// able to distinguish them.
128*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_NEG,
129*5a6e8488SAndroid Build Coastguard Worker 
130*5a6e8488SAndroid Build Coastguard Worker 	/// Boolean not.
131*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_BOOL_NOT,
132*5a6e8488SAndroid Build Coastguard Worker 
133*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
134*5a6e8488SAndroid Build Coastguard Worker 
135*5a6e8488SAndroid Build Coastguard Worker 	/// Truncation operator.
136*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_TRUNC,
137*5a6e8488SAndroid Build Coastguard Worker 
138*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
139*5a6e8488SAndroid Build Coastguard Worker 
140*5a6e8488SAndroid Build Coastguard Worker 	/// Power operator.
141*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_POWER,
142*5a6e8488SAndroid Build Coastguard Worker 
143*5a6e8488SAndroid Build Coastguard Worker 	/// Multiplication operator.
144*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_MULTIPLY,
145*5a6e8488SAndroid Build Coastguard Worker 
146*5a6e8488SAndroid Build Coastguard Worker 	/// Division operator.
147*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_DIVIDE,
148*5a6e8488SAndroid Build Coastguard Worker 
149*5a6e8488SAndroid Build Coastguard Worker 	/// Modulus operator.
150*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_MODULUS,
151*5a6e8488SAndroid Build Coastguard Worker 
152*5a6e8488SAndroid Build Coastguard Worker 	/// Addition operator.
153*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_PLUS,
154*5a6e8488SAndroid Build Coastguard Worker 
155*5a6e8488SAndroid Build Coastguard Worker 	/// Subtraction operator.
156*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_MINUS,
157*5a6e8488SAndroid Build Coastguard Worker 
158*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
159*5a6e8488SAndroid Build Coastguard Worker 
160*5a6e8488SAndroid Build Coastguard Worker 	/// Places (truncate or extend) operator.
161*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_PLACES,
162*5a6e8488SAndroid Build Coastguard Worker 
163*5a6e8488SAndroid Build Coastguard Worker 	/// Left (decimal) shift operator.
164*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_LSHIFT,
165*5a6e8488SAndroid Build Coastguard Worker 
166*5a6e8488SAndroid Build Coastguard Worker 	/// Right (decimal) shift operator.
167*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_RSHIFT,
168*5a6e8488SAndroid Build Coastguard Worker 
169*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
170*5a6e8488SAndroid Build Coastguard Worker 
171*5a6e8488SAndroid Build Coastguard Worker 	/// Equal operator.
172*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_EQ,
173*5a6e8488SAndroid Build Coastguard Worker 
174*5a6e8488SAndroid Build Coastguard Worker 	/// Less than or equal operator.
175*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_LE,
176*5a6e8488SAndroid Build Coastguard Worker 
177*5a6e8488SAndroid Build Coastguard Worker 	/// Greater than or equal operator.
178*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_GE,
179*5a6e8488SAndroid Build Coastguard Worker 
180*5a6e8488SAndroid Build Coastguard Worker 	/// Not equal operator.
181*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_NE,
182*5a6e8488SAndroid Build Coastguard Worker 
183*5a6e8488SAndroid Build Coastguard Worker 	/// Less than operator.
184*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_LT,
185*5a6e8488SAndroid Build Coastguard Worker 
186*5a6e8488SAndroid Build Coastguard Worker 	/// Greater than operator.
187*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_REL_GT,
188*5a6e8488SAndroid Build Coastguard Worker 
189*5a6e8488SAndroid Build Coastguard Worker 	/// Boolean or operator.
190*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_BOOL_OR,
191*5a6e8488SAndroid Build Coastguard Worker 
192*5a6e8488SAndroid Build Coastguard Worker 	/// Boolean and operator.
193*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_BOOL_AND,
194*5a6e8488SAndroid Build Coastguard Worker 
195*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
196*5a6e8488SAndroid Build Coastguard Worker 
197*5a6e8488SAndroid Build Coastguard Worker 	/// Power assignment operator.
198*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_POWER,
199*5a6e8488SAndroid Build Coastguard Worker 
200*5a6e8488SAndroid Build Coastguard Worker 	/// Multiplication assignment operator.
201*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_MULTIPLY,
202*5a6e8488SAndroid Build Coastguard Worker 
203*5a6e8488SAndroid Build Coastguard Worker 	/// Division assignment operator.
204*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_DIVIDE,
205*5a6e8488SAndroid Build Coastguard Worker 
206*5a6e8488SAndroid Build Coastguard Worker 	/// Modulus assignment operator.
207*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_MODULUS,
208*5a6e8488SAndroid Build Coastguard Worker 
209*5a6e8488SAndroid Build Coastguard Worker 	/// Addition assignment operator.
210*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_PLUS,
211*5a6e8488SAndroid Build Coastguard Worker 
212*5a6e8488SAndroid Build Coastguard Worker 	/// Subtraction assignment operator.
213*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_MINUS,
214*5a6e8488SAndroid Build Coastguard Worker 
215*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
216*5a6e8488SAndroid Build Coastguard Worker 
217*5a6e8488SAndroid Build Coastguard Worker 	/// Places (truncate or extend) assignment operator.
218*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_PLACES,
219*5a6e8488SAndroid Build Coastguard Worker 
220*5a6e8488SAndroid Build Coastguard Worker 	/// Left (decimal) shift assignment operator.
221*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_LSHIFT,
222*5a6e8488SAndroid Build Coastguard Worker 
223*5a6e8488SAndroid Build Coastguard Worker 	/// Right (decimal) shift assignment operator.
224*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN_RSHIFT,
225*5a6e8488SAndroid Build Coastguard Worker 
226*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
227*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
228*5a6e8488SAndroid Build Coastguard Worker 
229*5a6e8488SAndroid Build Coastguard Worker 	/// Assignment operator.
230*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_OP_ASSIGN,
231*5a6e8488SAndroid Build Coastguard Worker 
232*5a6e8488SAndroid Build Coastguard Worker 	/// Newline.
233*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_NLINE,
234*5a6e8488SAndroid Build Coastguard Worker 
235*5a6e8488SAndroid Build Coastguard Worker 	/// Whitespace.
236*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_WHITESPACE,
237*5a6e8488SAndroid Build Coastguard Worker 
238*5a6e8488SAndroid Build Coastguard Worker 	/// Left parenthesis.
239*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_LPAREN,
240*5a6e8488SAndroid Build Coastguard Worker 
241*5a6e8488SAndroid Build Coastguard Worker 	/// Right parenthesis.
242*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_RPAREN,
243*5a6e8488SAndroid Build Coastguard Worker 
244*5a6e8488SAndroid Build Coastguard Worker 	/// Left bracket.
245*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_LBRACKET,
246*5a6e8488SAndroid Build Coastguard Worker 
247*5a6e8488SAndroid Build Coastguard Worker 	/// Comma.
248*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_COMMA,
249*5a6e8488SAndroid Build Coastguard Worker 
250*5a6e8488SAndroid Build Coastguard Worker 	/// Right bracket.
251*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_RBRACKET,
252*5a6e8488SAndroid Build Coastguard Worker 
253*5a6e8488SAndroid Build Coastguard Worker 	/// Left brace.
254*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_LBRACE,
255*5a6e8488SAndroid Build Coastguard Worker 
256*5a6e8488SAndroid Build Coastguard Worker 	/// Semicolon.
257*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_SCOLON,
258*5a6e8488SAndroid Build Coastguard Worker 
259*5a6e8488SAndroid Build Coastguard Worker 	/// Right brace.
260*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_RBRACE,
261*5a6e8488SAndroid Build Coastguard Worker 
262*5a6e8488SAndroid Build Coastguard Worker 	/// String.
263*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STR,
264*5a6e8488SAndroid Build Coastguard Worker 
265*5a6e8488SAndroid Build Coastguard Worker 	/// Identifier/name.
266*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_NAME,
267*5a6e8488SAndroid Build Coastguard Worker 
268*5a6e8488SAndroid Build Coastguard Worker 	/// Constant number.
269*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_NUMBER,
270*5a6e8488SAndroid Build Coastguard Worker 
271*5a6e8488SAndroid Build Coastguard Worker 	// These keywords are in the order they are in for a reason. Don't change
272*5a6e8488SAndroid Build Coastguard Worker 	// the order unless you want a bunch of weird failures in the test suite.
273*5a6e8488SAndroid Build Coastguard Worker 	// In fact, almost all of these tokens are in a specific order for a reason.
274*5a6e8488SAndroid Build Coastguard Worker 
275*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
276*5a6e8488SAndroid Build Coastguard Worker 
277*5a6e8488SAndroid Build Coastguard Worker 	/// bc auto keyword.
278*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_AUTO,
279*5a6e8488SAndroid Build Coastguard Worker 
280*5a6e8488SAndroid Build Coastguard Worker 	/// bc break keyword.
281*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_BREAK,
282*5a6e8488SAndroid Build Coastguard Worker 
283*5a6e8488SAndroid Build Coastguard Worker 	/// bc continue keyword.
284*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_CONTINUE,
285*5a6e8488SAndroid Build Coastguard Worker 
286*5a6e8488SAndroid Build Coastguard Worker 	/// bc define keyword.
287*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_DEFINE,
288*5a6e8488SAndroid Build Coastguard Worker 
289*5a6e8488SAndroid Build Coastguard Worker 	/// bc for keyword.
290*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_FOR,
291*5a6e8488SAndroid Build Coastguard Worker 
292*5a6e8488SAndroid Build Coastguard Worker 	/// bc if keyword.
293*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_IF,
294*5a6e8488SAndroid Build Coastguard Worker 
295*5a6e8488SAndroid Build Coastguard Worker 	/// bc limits keyword.
296*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_LIMITS,
297*5a6e8488SAndroid Build Coastguard Worker 
298*5a6e8488SAndroid Build Coastguard Worker 	/// bc return keyword.
299*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_RETURN,
300*5a6e8488SAndroid Build Coastguard Worker 
301*5a6e8488SAndroid Build Coastguard Worker 	/// bc while keyword.
302*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_WHILE,
303*5a6e8488SAndroid Build Coastguard Worker 
304*5a6e8488SAndroid Build Coastguard Worker 	/// bc halt keyword.
305*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_HALT,
306*5a6e8488SAndroid Build Coastguard Worker 
307*5a6e8488SAndroid Build Coastguard Worker 	/// bc last keyword.
308*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_LAST,
309*5a6e8488SAndroid Build Coastguard Worker 
310*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
311*5a6e8488SAndroid Build Coastguard Worker 
312*5a6e8488SAndroid Build Coastguard Worker 	/// bc ibase keyword.
313*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_IBASE,
314*5a6e8488SAndroid Build Coastguard Worker 
315*5a6e8488SAndroid Build Coastguard Worker 	/// bc obase keyword.
316*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_OBASE,
317*5a6e8488SAndroid Build Coastguard Worker 
318*5a6e8488SAndroid Build Coastguard Worker 	/// bc scale keyword.
319*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_SCALE,
320*5a6e8488SAndroid Build Coastguard Worker 
321*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
322*5a6e8488SAndroid Build Coastguard Worker 
323*5a6e8488SAndroid Build Coastguard Worker 	/// bc seed keyword.
324*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_SEED,
325*5a6e8488SAndroid Build Coastguard Worker 
326*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
327*5a6e8488SAndroid Build Coastguard Worker 
328*5a6e8488SAndroid Build Coastguard Worker 	/// bc length keyword.
329*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_LENGTH,
330*5a6e8488SAndroid Build Coastguard Worker 
331*5a6e8488SAndroid Build Coastguard Worker 	/// bc print keyword.
332*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_PRINT,
333*5a6e8488SAndroid Build Coastguard Worker 
334*5a6e8488SAndroid Build Coastguard Worker 	/// bc sqrt keyword.
335*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_SQRT,
336*5a6e8488SAndroid Build Coastguard Worker 
337*5a6e8488SAndroid Build Coastguard Worker 	/// bc abs keyword.
338*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_ABS,
339*5a6e8488SAndroid Build Coastguard Worker 
340*5a6e8488SAndroid Build Coastguard Worker 	/// bc is_number keyword.
341*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_IS_NUMBER,
342*5a6e8488SAndroid Build Coastguard Worker 
343*5a6e8488SAndroid Build Coastguard Worker 	/// bc is_string keyword.
344*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_IS_STRING,
345*5a6e8488SAndroid Build Coastguard Worker 
346*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
347*5a6e8488SAndroid Build Coastguard Worker 
348*5a6e8488SAndroid Build Coastguard Worker 	/// bc irand keyword.
349*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_IRAND,
350*5a6e8488SAndroid Build Coastguard Worker 
351*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
352*5a6e8488SAndroid Build Coastguard Worker 
353*5a6e8488SAndroid Build Coastguard Worker 	/// bc asciffy keyword.
354*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_ASCIIFY,
355*5a6e8488SAndroid Build Coastguard Worker 
356*5a6e8488SAndroid Build Coastguard Worker 	/// bc modexp keyword.
357*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_MODEXP,
358*5a6e8488SAndroid Build Coastguard Worker 
359*5a6e8488SAndroid Build Coastguard Worker 	/// bc divmod keyword.
360*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_DIVMOD,
361*5a6e8488SAndroid Build Coastguard Worker 
362*5a6e8488SAndroid Build Coastguard Worker 	/// bc quit keyword.
363*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_QUIT,
364*5a6e8488SAndroid Build Coastguard Worker 
365*5a6e8488SAndroid Build Coastguard Worker 	/// bc read keyword.
366*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_READ,
367*5a6e8488SAndroid Build Coastguard Worker 
368*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
369*5a6e8488SAndroid Build Coastguard Worker 
370*5a6e8488SAndroid Build Coastguard Worker 	/// bc rand keyword.
371*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_RAND,
372*5a6e8488SAndroid Build Coastguard Worker 
373*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
374*5a6e8488SAndroid Build Coastguard Worker 
375*5a6e8488SAndroid Build Coastguard Worker 	/// bc maxibase keyword.
376*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_MAXIBASE,
377*5a6e8488SAndroid Build Coastguard Worker 
378*5a6e8488SAndroid Build Coastguard Worker 	/// bc maxobase keyword.
379*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_MAXOBASE,
380*5a6e8488SAndroid Build Coastguard Worker 
381*5a6e8488SAndroid Build Coastguard Worker 	/// bc maxscale keyword.
382*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_MAXSCALE,
383*5a6e8488SAndroid Build Coastguard Worker 
384*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
385*5a6e8488SAndroid Build Coastguard Worker 
386*5a6e8488SAndroid Build Coastguard Worker 	/// bc maxrand keyword.
387*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_MAXRAND,
388*5a6e8488SAndroid Build Coastguard Worker 
389*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
390*5a6e8488SAndroid Build Coastguard Worker 
391*5a6e8488SAndroid Build Coastguard Worker 	/// bc line_length keyword.
392*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_LINE_LENGTH,
393*5a6e8488SAndroid Build Coastguard Worker 
394*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED
395*5a6e8488SAndroid Build Coastguard Worker 
396*5a6e8488SAndroid Build Coastguard Worker 	/// bc global_stacks keyword.
397*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_GLOBAL_STACKS,
398*5a6e8488SAndroid Build Coastguard Worker 
399*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED
400*5a6e8488SAndroid Build Coastguard Worker 
401*5a6e8488SAndroid Build Coastguard Worker 	/// bc leading_zero keyword.
402*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_LEADING_ZERO,
403*5a6e8488SAndroid Build Coastguard Worker 
404*5a6e8488SAndroid Build Coastguard Worker 	/// bc stream keyword.
405*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_STREAM,
406*5a6e8488SAndroid Build Coastguard Worker 
407*5a6e8488SAndroid Build Coastguard Worker 	/// bc else keyword.
408*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_KW_ELSE,
409*5a6e8488SAndroid Build Coastguard Worker 
410*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED
411*5a6e8488SAndroid Build Coastguard Worker 
412*5a6e8488SAndroid Build Coastguard Worker 	/// dc extended registers keyword.
413*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_EXTENDED_REGISTERS,
414*5a6e8488SAndroid Build Coastguard Worker 
415*5a6e8488SAndroid Build Coastguard Worker 	/// A special token for dc to calculate equal without a register.
416*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_EQ_NO_REG,
417*5a6e8488SAndroid Build Coastguard Worker 
418*5a6e8488SAndroid Build Coastguard Worker 	/// Colon (array) operator.
419*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_COLON,
420*5a6e8488SAndroid Build Coastguard Worker 
421*5a6e8488SAndroid Build Coastguard Worker 	/// Execute command.
422*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_EXECUTE,
423*5a6e8488SAndroid Build Coastguard Worker 
424*5a6e8488SAndroid Build Coastguard Worker 	/// Print stack command.
425*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_PRINT_STACK,
426*5a6e8488SAndroid Build Coastguard Worker 
427*5a6e8488SAndroid Build Coastguard Worker 	/// Clear stack command.
428*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_CLEAR_STACK,
429*5a6e8488SAndroid Build Coastguard Worker 
430*5a6e8488SAndroid Build Coastguard Worker 	/// Register stack level command.
431*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_REG_STACK_LEVEL,
432*5a6e8488SAndroid Build Coastguard Worker 
433*5a6e8488SAndroid Build Coastguard Worker 	/// Main stack level command.
434*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STACK_LEVEL,
435*5a6e8488SAndroid Build Coastguard Worker 
436*5a6e8488SAndroid Build Coastguard Worker 	/// Duplicate command.
437*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_DUPLICATE,
438*5a6e8488SAndroid Build Coastguard Worker 
439*5a6e8488SAndroid Build Coastguard Worker 	/// Swap (reverse) command.
440*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_SWAP,
441*5a6e8488SAndroid Build Coastguard Worker 
442*5a6e8488SAndroid Build Coastguard Worker 	/// Pop (remove) command.
443*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_POP,
444*5a6e8488SAndroid Build Coastguard Worker 
445*5a6e8488SAndroid Build Coastguard Worker 	/// Store ibase command.
446*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STORE_IBASE,
447*5a6e8488SAndroid Build Coastguard Worker 
448*5a6e8488SAndroid Build Coastguard Worker 	/// Store obase command.
449*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STORE_OBASE,
450*5a6e8488SAndroid Build Coastguard Worker 
451*5a6e8488SAndroid Build Coastguard Worker 	/// Store scale command.
452*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STORE_SCALE,
453*5a6e8488SAndroid Build Coastguard Worker 
454*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH
455*5a6e8488SAndroid Build Coastguard Worker 
456*5a6e8488SAndroid Build Coastguard Worker 	/// Store seed command.
457*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STORE_SEED,
458*5a6e8488SAndroid Build Coastguard Worker 
459*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH
460*5a6e8488SAndroid Build Coastguard Worker 
461*5a6e8488SAndroid Build Coastguard Worker 	/// Load variable onto stack command.
462*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_LOAD,
463*5a6e8488SAndroid Build Coastguard Worker 
464*5a6e8488SAndroid Build Coastguard Worker 	/// Pop off of variable stack onto results stack command.
465*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_LOAD_POP,
466*5a6e8488SAndroid Build Coastguard Worker 
467*5a6e8488SAndroid Build Coastguard Worker 	/// Push onto variable stack command.
468*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_STORE_PUSH,
469*5a6e8488SAndroid Build Coastguard Worker 
470*5a6e8488SAndroid Build Coastguard Worker 	/// Print with pop command.
471*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_PRINT_POP,
472*5a6e8488SAndroid Build Coastguard Worker 
473*5a6e8488SAndroid Build Coastguard Worker 	/// Parameterized quit command.
474*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_NQUIT,
475*5a6e8488SAndroid Build Coastguard Worker 
476*5a6e8488SAndroid Build Coastguard Worker 	/// Execution stack depth command.
477*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_EXEC_STACK_LENGTH,
478*5a6e8488SAndroid Build Coastguard Worker 
479*5a6e8488SAndroid Build Coastguard Worker 	/// Scale of number command. This is needed specifically for dc because bc
480*5a6e8488SAndroid Build Coastguard Worker 	/// parses the scale function in parts.
481*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_SCALE_FACTOR,
482*5a6e8488SAndroid Build Coastguard Worker 
483*5a6e8488SAndroid Build Coastguard Worker 	/// Array length command. This is needed specifically for dc because bc
484*5a6e8488SAndroid Build Coastguard Worker 	/// just reuses its length keyword.
485*5a6e8488SAndroid Build Coastguard Worker 	BC_LEX_ARRAY_LENGTH,
486*5a6e8488SAndroid Build Coastguard Worker 
487*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED
488*5a6e8488SAndroid Build Coastguard Worker 
489*5a6e8488SAndroid Build Coastguard Worker } BcLexType;
490*5a6e8488SAndroid Build Coastguard Worker 
491*5a6e8488SAndroid Build Coastguard Worker struct BcLex;
492*5a6e8488SAndroid Build Coastguard Worker 
493*5a6e8488SAndroid Build Coastguard Worker /**
494*5a6e8488SAndroid Build Coastguard Worker  * A function pointer to call when another token is needed. Mostly called by the
495*5a6e8488SAndroid Build Coastguard Worker  * parser.
496*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
497*5a6e8488SAndroid Build Coastguard Worker  */
498*5a6e8488SAndroid Build Coastguard Worker typedef void (*BcLexNext)(struct BcLex* l);
499*5a6e8488SAndroid Build Coastguard Worker 
500*5a6e8488SAndroid Build Coastguard Worker /// The lexer.
501*5a6e8488SAndroid Build Coastguard Worker typedef struct BcLex
502*5a6e8488SAndroid Build Coastguard Worker {
503*5a6e8488SAndroid Build Coastguard Worker 	/// A pointer to the text to lex.
504*5a6e8488SAndroid Build Coastguard Worker 	const char* buf;
505*5a6e8488SAndroid Build Coastguard Worker 
506*5a6e8488SAndroid Build Coastguard Worker 	/// The current index into buf.
507*5a6e8488SAndroid Build Coastguard Worker 	size_t i;
508*5a6e8488SAndroid Build Coastguard Worker 
509*5a6e8488SAndroid Build Coastguard Worker 	/// The current line.
510*5a6e8488SAndroid Build Coastguard Worker 	size_t line;
511*5a6e8488SAndroid Build Coastguard Worker 
512*5a6e8488SAndroid Build Coastguard Worker 	/// The length of buf.
513*5a6e8488SAndroid Build Coastguard Worker 	size_t len;
514*5a6e8488SAndroid Build Coastguard Worker 
515*5a6e8488SAndroid Build Coastguard Worker 	/// The current token.
516*5a6e8488SAndroid Build Coastguard Worker 	BcLexType t;
517*5a6e8488SAndroid Build Coastguard Worker 
518*5a6e8488SAndroid Build Coastguard Worker 	/// The previous token.
519*5a6e8488SAndroid Build Coastguard Worker 	BcLexType last;
520*5a6e8488SAndroid Build Coastguard Worker 
521*5a6e8488SAndroid Build Coastguard Worker 	/// A string to store extra data for tokens. For example, the @a BC_LEX_STR
522*5a6e8488SAndroid Build Coastguard Worker 	/// token really needs to store the actual string, and numbers also need the
523*5a6e8488SAndroid Build Coastguard Worker 	/// string.
524*5a6e8488SAndroid Build Coastguard Worker 	BcVec str;
525*5a6e8488SAndroid Build Coastguard Worker 
526*5a6e8488SAndroid Build Coastguard Worker 	/// The mode the lexer is in.
527*5a6e8488SAndroid Build Coastguard Worker 	BcMode mode;
528*5a6e8488SAndroid Build Coastguard Worker 
529*5a6e8488SAndroid Build Coastguard Worker } BcLex;
530*5a6e8488SAndroid Build Coastguard Worker 
531*5a6e8488SAndroid Build Coastguard Worker /**
532*5a6e8488SAndroid Build Coastguard Worker  * Initializes a lexer.
533*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer to initialize.
534*5a6e8488SAndroid Build Coastguard Worker  */
535*5a6e8488SAndroid Build Coastguard Worker void
536*5a6e8488SAndroid Build Coastguard Worker bc_lex_init(BcLex* l);
537*5a6e8488SAndroid Build Coastguard Worker 
538*5a6e8488SAndroid Build Coastguard Worker /**
539*5a6e8488SAndroid Build Coastguard Worker  * Frees a lexer. This is not guarded by #if BC_DEBUG because a separate
540*5a6e8488SAndroid Build Coastguard Worker  * parser is created at runtime to parse read() expressions and dc strings, and
541*5a6e8488SAndroid Build Coastguard Worker  * that parser needs a lexer.
542*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer to free.
543*5a6e8488SAndroid Build Coastguard Worker  */
544*5a6e8488SAndroid Build Coastguard Worker void
545*5a6e8488SAndroid Build Coastguard Worker bc_lex_free(BcLex* l);
546*5a6e8488SAndroid Build Coastguard Worker 
547*5a6e8488SAndroid Build Coastguard Worker /**
548*5a6e8488SAndroid Build Coastguard Worker  * Sets the filename that the lexer will be lexing.
549*5a6e8488SAndroid Build Coastguard Worker  * @param l     The lexer.
550*5a6e8488SAndroid Build Coastguard Worker  * @param file  The filename that the lexer will lex.
551*5a6e8488SAndroid Build Coastguard Worker  */
552*5a6e8488SAndroid Build Coastguard Worker void
553*5a6e8488SAndroid Build Coastguard Worker bc_lex_file(BcLex* l, const char* file);
554*5a6e8488SAndroid Build Coastguard Worker 
555*5a6e8488SAndroid Build Coastguard Worker /**
556*5a6e8488SAndroid Build Coastguard Worker  * Sets the text the lexer will lex.
557*5a6e8488SAndroid Build Coastguard Worker  * @param l     The lexer.
558*5a6e8488SAndroid Build Coastguard Worker  * @param text  The text to lex.
559*5a6e8488SAndroid Build Coastguard Worker  * @param mode  The mode to lex in.
560*5a6e8488SAndroid Build Coastguard Worker  */
561*5a6e8488SAndroid Build Coastguard Worker void
562*5a6e8488SAndroid Build Coastguard Worker bc_lex_text(BcLex* l, const char* text, BcMode mode);
563*5a6e8488SAndroid Build Coastguard Worker 
564*5a6e8488SAndroid Build Coastguard Worker /**
565*5a6e8488SAndroid Build Coastguard Worker  * Generic next function for the parser to call. It takes care of calling the
566*5a6e8488SAndroid Build Coastguard Worker  * correct @a BcLexNext function and consuming whitespace.
567*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
568*5a6e8488SAndroid Build Coastguard Worker  */
569*5a6e8488SAndroid Build Coastguard Worker void
570*5a6e8488SAndroid Build Coastguard Worker bc_lex_next(BcLex* l);
571*5a6e8488SAndroid Build Coastguard Worker 
572*5a6e8488SAndroid Build Coastguard Worker /**
573*5a6e8488SAndroid Build Coastguard Worker  * Lexes a line comment (one beginning with '#' and going to a newline).
574*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
575*5a6e8488SAndroid Build Coastguard Worker  */
576*5a6e8488SAndroid Build Coastguard Worker void
577*5a6e8488SAndroid Build Coastguard Worker bc_lex_lineComment(BcLex* l);
578*5a6e8488SAndroid Build Coastguard Worker 
579*5a6e8488SAndroid Build Coastguard Worker /**
580*5a6e8488SAndroid Build Coastguard Worker  * Lexes a general comment (C-style comment).
581*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
582*5a6e8488SAndroid Build Coastguard Worker  */
583*5a6e8488SAndroid Build Coastguard Worker void
584*5a6e8488SAndroid Build Coastguard Worker bc_lex_comment(BcLex* l);
585*5a6e8488SAndroid Build Coastguard Worker 
586*5a6e8488SAndroid Build Coastguard Worker /**
587*5a6e8488SAndroid Build Coastguard Worker  * Lexes whitespace, finding as much as possible.
588*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
589*5a6e8488SAndroid Build Coastguard Worker  */
590*5a6e8488SAndroid Build Coastguard Worker void
591*5a6e8488SAndroid Build Coastguard Worker bc_lex_whitespace(BcLex* l);
592*5a6e8488SAndroid Build Coastguard Worker 
593*5a6e8488SAndroid Build Coastguard Worker /**
594*5a6e8488SAndroid Build Coastguard Worker  * Lexes a number that begins with char @a start. This takes care of parsing
595*5a6e8488SAndroid Build Coastguard Worker  * numbers in scientific and engineering notations.
596*5a6e8488SAndroid Build Coastguard Worker  * @param l      The lexer.
597*5a6e8488SAndroid Build Coastguard Worker  * @param start  The starting char of the number. To detect a number and call
598*5a6e8488SAndroid Build Coastguard Worker  *               this function, the lexer had to eat the first char. It fixes
599*5a6e8488SAndroid Build Coastguard Worker  *               that by passing it in.
600*5a6e8488SAndroid Build Coastguard Worker  */
601*5a6e8488SAndroid Build Coastguard Worker void
602*5a6e8488SAndroid Build Coastguard Worker bc_lex_number(BcLex* l, char start);
603*5a6e8488SAndroid Build Coastguard Worker 
604*5a6e8488SAndroid Build Coastguard Worker /**
605*5a6e8488SAndroid Build Coastguard Worker  * Lexes a name/identifier.
606*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
607*5a6e8488SAndroid Build Coastguard Worker  */
608*5a6e8488SAndroid Build Coastguard Worker void
609*5a6e8488SAndroid Build Coastguard Worker bc_lex_name(BcLex* l);
610*5a6e8488SAndroid Build Coastguard Worker 
611*5a6e8488SAndroid Build Coastguard Worker /**
612*5a6e8488SAndroid Build Coastguard Worker  * Lexes common whitespace characters.
613*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
614*5a6e8488SAndroid Build Coastguard Worker  * @param c  The character to lex.
615*5a6e8488SAndroid Build Coastguard Worker  */
616*5a6e8488SAndroid Build Coastguard Worker void
617*5a6e8488SAndroid Build Coastguard Worker bc_lex_commonTokens(BcLex* l, char c);
618*5a6e8488SAndroid Build Coastguard Worker 
619*5a6e8488SAndroid Build Coastguard Worker /**
620*5a6e8488SAndroid Build Coastguard Worker  * Throws a parse error because char @a c was invalid.
621*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
622*5a6e8488SAndroid Build Coastguard Worker  * @param c  The problem character.
623*5a6e8488SAndroid Build Coastguard Worker  */
624*5a6e8488SAndroid Build Coastguard Worker void
625*5a6e8488SAndroid Build Coastguard Worker bc_lex_invalidChar(BcLex* l, char c);
626*5a6e8488SAndroid Build Coastguard Worker 
627*5a6e8488SAndroid Build Coastguard Worker /**
628*5a6e8488SAndroid Build Coastguard Worker  * Reads a line from stdin and puts it into the lexer's buffer.
629*5a6e8488SAndroid Build Coastguard Worker  * @param l  The lexer.
630*5a6e8488SAndroid Build Coastguard Worker  */
631*5a6e8488SAndroid Build Coastguard Worker bool
632*5a6e8488SAndroid Build Coastguard Worker bc_lex_readLine(BcLex* l);
633*5a6e8488SAndroid Build Coastguard Worker 
634*5a6e8488SAndroid Build Coastguard Worker #endif // BC_LEX_H
635