1*7c356e86SAndroid Build Coastguard Worker /*- 2*7c356e86SAndroid Build Coastguard Worker * Copyright (c) 2016, 2020 3*7c356e86SAndroid Build Coastguard Worker * mirabilos <[email protected]> 4*7c356e86SAndroid Build Coastguard Worker * 5*7c356e86SAndroid Build Coastguard Worker * Provided that these terms and disclaimer and all copyright notices 6*7c356e86SAndroid Build Coastguard Worker * are retained or reproduced in an accompanying document, permission 7*7c356e86SAndroid Build Coastguard Worker * is granted to deal in this work without restriction, including un- 8*7c356e86SAndroid Build Coastguard Worker * limited rights to use, publicly perform, distribute, sell, modify, 9*7c356e86SAndroid Build Coastguard Worker * merge, give away, or sublicence. 10*7c356e86SAndroid Build Coastguard Worker * 11*7c356e86SAndroid Build Coastguard Worker * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to 12*7c356e86SAndroid Build Coastguard Worker * the utmost extent permitted by applicable law, neither express nor 13*7c356e86SAndroid Build Coastguard Worker * implied; without malicious intent or gross negligence. In no event 14*7c356e86SAndroid Build Coastguard Worker * may a licensor, author or contributor be held liable for indirect, 15*7c356e86SAndroid Build Coastguard Worker * direct, other damage, loss, or other issues arising in any way out 16*7c356e86SAndroid Build Coastguard Worker * of dealing in the work, even if advised of the possibility of such 17*7c356e86SAndroid Build Coastguard Worker * damage or existence of a defect, except proven that it results out 18*7c356e86SAndroid Build Coastguard Worker * of said person's immediate fault when using the work as intended. 19*7c356e86SAndroid Build Coastguard Worker */ 20*7c356e86SAndroid Build Coastguard Worker 21*7c356e86SAndroid Build Coastguard Worker #if defined(EXPRTOK_DEFNS) 22*7c356e86SAndroid Build Coastguard Worker __RCSID("$MirOS: src/bin/mksh/exprtok.h,v 1.4 2020/04/07 11:56:46 tg Exp $"); 23*7c356e86SAndroid Build Coastguard Worker /* see range comment below */ 24*7c356e86SAndroid Build Coastguard Worker #define IS_ASSIGNOP(op) ((int)(op) >= (int)O_ASN && (int)(op) <= (int)O_BORASN) 25*7c356e86SAndroid Build Coastguard Worker #define FN(name,len,prec,enum) /* nothing */ 26*7c356e86SAndroid Build Coastguard Worker #define F1(enum) /* nothing */ 27*7c356e86SAndroid Build Coastguard Worker #elif defined(EXPRTOK_ENUM) 28*7c356e86SAndroid Build Coastguard Worker #define F0(name,len,prec,enum) enum = 0, 29*7c356e86SAndroid Build Coastguard Worker #define FN(name,len,prec,enum) enum, 30*7c356e86SAndroid Build Coastguard Worker #define F1(enum) enum, 31*7c356e86SAndroid Build Coastguard Worker #define F2(enum) enum, 32*7c356e86SAndroid Build Coastguard Worker #define F9(enum) enum 33*7c356e86SAndroid Build Coastguard Worker #elif defined(EXPRTOK_NAME) 34*7c356e86SAndroid Build Coastguard Worker #define FN(name,len,prec,enum) name, 35*7c356e86SAndroid Build Coastguard Worker #define F1(enum) "" 36*7c356e86SAndroid Build Coastguard Worker #elif defined(EXPRTOK_LEN) 37*7c356e86SAndroid Build Coastguard Worker #define FN(name,len,prec,enum) len, 38*7c356e86SAndroid Build Coastguard Worker #define F1(enum) 0 39*7c356e86SAndroid Build Coastguard Worker #elif defined(EXPRTOK_PREC) 40*7c356e86SAndroid Build Coastguard Worker #define FN(name,len,prec,enum) prec, 41*7c356e86SAndroid Build Coastguard Worker #define F1(enum) P_PRIMARY 42*7c356e86SAndroid Build Coastguard Worker #endif 43*7c356e86SAndroid Build Coastguard Worker 44*7c356e86SAndroid Build Coastguard Worker #ifndef F0 45*7c356e86SAndroid Build Coastguard Worker #define F0 FN 46*7c356e86SAndroid Build Coastguard Worker #endif 47*7c356e86SAndroid Build Coastguard Worker 48*7c356e86SAndroid Build Coastguard Worker #ifndef F2 49*7c356e86SAndroid Build Coastguard Worker #define F2(enum) /* nothing */ 50*7c356e86SAndroid Build Coastguard Worker #define F9(enum) /* nothing */ 51*7c356e86SAndroid Build Coastguard Worker #endif 52*7c356e86SAndroid Build Coastguard Worker 53*7c356e86SAndroid Build Coastguard Worker /* tokens must be ordered so the longest are first (e.g. += before +) */ 54*7c356e86SAndroid Build Coastguard Worker 55*7c356e86SAndroid Build Coastguard Worker /* some (long) unary operators */ 56*7c356e86SAndroid Build Coastguard Worker F0("++", 2, P_PRIMARY, O_PLUSPLUS) /* before + */ 57*7c356e86SAndroid Build Coastguard Worker FN("--", 2, P_PRIMARY, O_MINUSMINUS) /* before - */ 58*7c356e86SAndroid Build Coastguard Worker /* binary operators */ 59*7c356e86SAndroid Build Coastguard Worker FN("==", 2, P_EQUALITY, O_EQ) /* before = */ 60*7c356e86SAndroid Build Coastguard Worker FN("!=", 2, P_EQUALITY, O_NE) /* before ! */ 61*7c356e86SAndroid Build Coastguard Worker /* assignments are assumed to be in range O_ASN .. O_BORASN */ 62*7c356e86SAndroid Build Coastguard Worker FN("=", 1, P_ASSIGN, O_ASN) 63*7c356e86SAndroid Build Coastguard Worker FN("*=", 2, P_ASSIGN, O_TIMESASN) 64*7c356e86SAndroid Build Coastguard Worker FN("/=", 2, P_ASSIGN, O_DIVASN) 65*7c356e86SAndroid Build Coastguard Worker FN("%=", 2, P_ASSIGN, O_MODASN) 66*7c356e86SAndroid Build Coastguard Worker FN("+=", 2, P_ASSIGN, O_PLUSASN) 67*7c356e86SAndroid Build Coastguard Worker FN("-=", 2, P_ASSIGN, O_MINUSASN) 68*7c356e86SAndroid Build Coastguard Worker #ifndef MKSH_LEGACY_MODE 69*7c356e86SAndroid Build Coastguard Worker FN("^<=", 3, P_ASSIGN, O_ROLASN) /* before ^< */ 70*7c356e86SAndroid Build Coastguard Worker FN("^>=", 3, P_ASSIGN, O_RORASN) /* before ^> */ 71*7c356e86SAndroid Build Coastguard Worker #endif 72*7c356e86SAndroid Build Coastguard Worker FN("<<=", 3, P_ASSIGN, O_LSHIFTASN) 73*7c356e86SAndroid Build Coastguard Worker FN(">>=", 3, P_ASSIGN, O_RSHIFTASN) 74*7c356e86SAndroid Build Coastguard Worker FN("&=", 2, P_ASSIGN, O_BANDASN) 75*7c356e86SAndroid Build Coastguard Worker FN("^=", 2, P_ASSIGN, O_BXORASN) 76*7c356e86SAndroid Build Coastguard Worker FN("|=", 2, P_ASSIGN, O_BORASN) 77*7c356e86SAndroid Build Coastguard Worker /* binary non-assignment operators */ 78*7c356e86SAndroid Build Coastguard Worker #ifndef MKSH_LEGACY_MODE 79*7c356e86SAndroid Build Coastguard Worker FN("^<", 2, P_SHIFT, O_ROL) /* before ^ */ 80*7c356e86SAndroid Build Coastguard Worker FN("^>", 2, P_SHIFT, O_ROR) /* before ^ */ 81*7c356e86SAndroid Build Coastguard Worker #endif 82*7c356e86SAndroid Build Coastguard Worker FN("<<", 2, P_SHIFT, O_LSHIFT) 83*7c356e86SAndroid Build Coastguard Worker FN(">>", 2, P_SHIFT, O_RSHIFT) 84*7c356e86SAndroid Build Coastguard Worker FN("<=", 2, P_RELATION, O_LE) 85*7c356e86SAndroid Build Coastguard Worker FN(">=", 2, P_RELATION, O_GE) 86*7c356e86SAndroid Build Coastguard Worker FN("<", 1, P_RELATION, O_LT) 87*7c356e86SAndroid Build Coastguard Worker FN(">", 1, P_RELATION, O_GT) 88*7c356e86SAndroid Build Coastguard Worker FN("&&", 2, P_LAND, O_LAND) 89*7c356e86SAndroid Build Coastguard Worker FN("||", 2, P_LOR, O_LOR) 90*7c356e86SAndroid Build Coastguard Worker FN("*", 1, P_MULT, O_TIMES) 91*7c356e86SAndroid Build Coastguard Worker FN("/", 1, P_MULT, O_DIV) 92*7c356e86SAndroid Build Coastguard Worker FN("%", 1, P_MULT, O_MOD) 93*7c356e86SAndroid Build Coastguard Worker FN("+", 1, P_ADD, O_PLUS) 94*7c356e86SAndroid Build Coastguard Worker FN("-", 1, P_ADD, O_MINUS) 95*7c356e86SAndroid Build Coastguard Worker FN("&", 1, P_BAND, O_BAND) 96*7c356e86SAndroid Build Coastguard Worker FN("^", 1, P_BXOR, O_BXOR) 97*7c356e86SAndroid Build Coastguard Worker FN("|", 1, P_BOR, O_BOR) 98*7c356e86SAndroid Build Coastguard Worker FN("?", 1, P_TERN, O_TERN) 99*7c356e86SAndroid Build Coastguard Worker FN(",", 1, P_COMMA, O_COMMA) 100*7c356e86SAndroid Build Coastguard Worker /* things after this aren't used as binary operators */ 101*7c356e86SAndroid Build Coastguard Worker /* unary that are not also binaries */ 102*7c356e86SAndroid Build Coastguard Worker FN("~", 1, P_PRIMARY, O_BNOT) 103*7c356e86SAndroid Build Coastguard Worker FN("!", 1, P_PRIMARY, O_LNOT) 104*7c356e86SAndroid Build Coastguard Worker /* misc */ 105*7c356e86SAndroid Build Coastguard Worker FN("(", 1, P_PRIMARY, OPEN_PAREN) 106*7c356e86SAndroid Build Coastguard Worker FN(")", 1, P_PRIMARY, CLOSE_PAREN) 107*7c356e86SAndroid Build Coastguard Worker FN(":", 1, P_PRIMARY, CTERN) 108*7c356e86SAndroid Build Coastguard Worker /* things that don't appear in the opinfo[] table */ 109*7c356e86SAndroid Build Coastguard Worker F1(VAR) /*XXX should be F2 */ 110*7c356e86SAndroid Build Coastguard Worker F2(LIT) 111*7c356e86SAndroid Build Coastguard Worker F2(END) 112*7c356e86SAndroid Build Coastguard Worker F9(BAD) 113*7c356e86SAndroid Build Coastguard Worker 114*7c356e86SAndroid Build Coastguard Worker #undef FN 115*7c356e86SAndroid Build Coastguard Worker #undef F0 116*7c356e86SAndroid Build Coastguard Worker #undef F1 117*7c356e86SAndroid Build Coastguard Worker #undef F2 118*7c356e86SAndroid Build Coastguard Worker #undef F9 119*7c356e86SAndroid Build Coastguard Worker #undef EXPRTOK_DEFNS 120*7c356e86SAndroid Build Coastguard Worker #undef EXPRTOK_ENUM 121*7c356e86SAndroid Build Coastguard Worker #undef EXPRTOK_NAME 122*7c356e86SAndroid Build Coastguard Worker #undef EXPRTOK_LEN 123*7c356e86SAndroid Build Coastguard Worker #undef EXPRTOK_PREC 124