1 /* 2 * ***************************************************************************** 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 * 6 * Copyright (c) 2018-2020 Gavin D. Howard and contributors. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * * Redistributions of source code must retain the above copyright notice, this 12 * list of conditions and the following disclaimer. 13 * 14 * * Redistributions in binary form must reproduce the above copyright notice, 15 * this list of conditions and the following disclaimer in the documentation 16 * and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 * 30 * ***************************************************************************** 31 * 32 * Definitions for bc's parser. 33 * 34 */ 35 36 #ifndef BC_PARSE_H 37 #define BC_PARSE_H 38 39 #include <limits.h> 40 #include <stdbool.h> 41 #include <stdint.h> 42 43 #include <status.h> 44 #include <vector.h> 45 #include <lex.h> 46 #include <lang.h> 47 48 #define BC_PARSE_REL (UINTMAX_C(1)<<0) 49 #define BC_PARSE_PRINT (UINTMAX_C(1)<<1) 50 #define BC_PARSE_NOCALL (UINTMAX_C(1)<<2) 51 #define BC_PARSE_NOREAD (UINTMAX_C(1)<<3) 52 #define BC_PARSE_ARRAY (UINTMAX_C(1)<<4) 53 #define BC_PARSE_NEEDVAL (UINTMAX_C(1)<<5) 54 55 #if BC_ENABLED 56 #define BC_PARSE_CAN_PARSE(p) \ 57 ((p).l.t != BC_LEX_EOF && (p).l.t != BC_LEX_KW_DEFINE) 58 #else // BC_ENABLED 59 #define BC_PARSE_CAN_PARSE(p) ((p).l.t != BC_LEX_EOF) 60 #endif // BC_ENABLED 61 62 #define bc_parse_push(p, i) (bc_vec_pushByte(&(p)->func->code, (uchar) (i))) 63 #define bc_parse_pushIndex(p, idx) (bc_vec_pushIndex(&(p)->func->code, (idx))) 64 65 #define bc_parse_err(p, e) (bc_vm_handleError((e), (p)->l.line)) 66 #define bc_parse_verr(p, e, ...) \ 67 (bc_vm_handleError((e), (p)->l.line, __VA_ARGS__)) 68 69 typedef struct BcParseNext { 70 uchar len; 71 uchar tokens[4]; 72 } BcParseNext; 73 74 #define BC_PARSE_NEXT_TOKENS(...) .tokens = { __VA_ARGS__ } 75 #define BC_PARSE_NEXT(a, ...) \ 76 { .len = (uchar) (a), BC_PARSE_NEXT_TOKENS(__VA_ARGS__) } 77 78 struct BcParse; 79 struct BcProgram; 80 81 typedef void (*BcParseParse)(struct BcParse*); 82 typedef void (*BcParseExpr)(struct BcParse*, uint8_t); 83 84 typedef struct BcParse { 85 86 BcLex l; 87 88 #if BC_ENABLED 89 BcVec flags; 90 BcVec exits; 91 BcVec conds; 92 BcVec ops; 93 BcVec buf; 94 #endif // BC_ENABLED 95 96 struct BcProgram *prog; 97 BcFunc *func; 98 size_t fidx; 99 100 bool auto_part; 101 102 } BcParse; 103 104 void bc_parse_init(BcParse *p, struct BcProgram *prog, size_t func); 105 void bc_parse_free(BcParse *p); 106 void bc_parse_reset(BcParse *p); 107 108 void bc_parse_addString(BcParse *p); 109 void bc_parse_number(BcParse *p); 110 void bc_parse_updateFunc(BcParse *p, size_t fidx); 111 void bc_parse_pushName(const BcParse* p, char *name, bool var); 112 void bc_parse_text(BcParse *p, const char *text); 113 114 extern const char bc_parse_zero[2]; 115 extern const char bc_parse_one[2]; 116 117 #endif // BC_PARSE_H 118