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