124 lines
3.8 KiB
C
124 lines
3.8 KiB
C
/*-
|
|
* Copyright (c) 2016
|
|
* mirabilos <m@mirbsd.org>
|
|
*
|
|
* Provided that these terms and disclaimer and all copyright notices
|
|
* are retained or reproduced in an accompanying document, permission
|
|
* is granted to deal in this work without restriction, including un-
|
|
* limited rights to use, publicly perform, distribute, sell, modify,
|
|
* merge, give away, or sublicence.
|
|
*
|
|
* This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
|
|
* the utmost extent permitted by applicable law, neither express nor
|
|
* implied; without malicious intent or gross negligence. In no event
|
|
* may a licensor, author or contributor be held liable for indirect,
|
|
* direct, other damage, loss, or other issues arising in any way out
|
|
* of dealing in the work, even if advised of the possibility of such
|
|
* damage or existence of a defect, except proven that it results out
|
|
* of said person's immediate fault when using the work as intended.
|
|
*/
|
|
|
|
#if defined(EXPRTOK_DEFNS)
|
|
__RCSID("$MirOS: src/bin/mksh/exprtok.h,v 1.2 2016/08/12 16:48:05 tg Exp $");
|
|
/* see range comment below */
|
|
#define IS_ASSIGNOP(op) ((int)(op) >= (int)O_ASN && (int)(op) <= (int)O_BORASN)
|
|
#define FN(name, len, prec, enum) /* nothing */
|
|
#define F1(enum) /* nothing */
|
|
#elif defined(EXPRTOK_ENUM)
|
|
#define F0(name, len, prec, enum) enum = 0,
|
|
#define FN(name, len, prec, enum) enum,
|
|
#define F1(enum) enum,
|
|
#define F2(enum) enum,
|
|
#define F9(enum) enum
|
|
#elif defined(EXPRTOK_NAME)
|
|
#define FN(name, len, prec, enum) name,
|
|
#define F1(enum) ""
|
|
#elif defined(EXPRTOK_LEN)
|
|
#define FN(name, len, prec, enum) len,
|
|
#define F1(enum) 0
|
|
#elif defined(EXPRTOK_PREC)
|
|
#define FN(name, len, prec, enum) prec,
|
|
#define F1(enum) P_PRIMARY
|
|
#endif
|
|
|
|
#ifndef F0
|
|
#define F0 FN
|
|
#endif
|
|
|
|
#ifndef F2
|
|
#define F2(enum) /* nothing */
|
|
#define F9(enum) /* nothing */
|
|
#endif
|
|
|
|
/* tokens must be ordered so the longest are first (e.g. += before +) */
|
|
|
|
/* some (long) unary operators */
|
|
FN("++", 2, P_PRIMARY, O_PLUSPLUS = 0) /* before + */
|
|
FN("--", 2, P_PRIMARY, O_MINUSMINUS) /* before - */
|
|
/* binary operators */
|
|
FN("==", 2, P_EQUALITY, O_EQ) /* before = */
|
|
FN("!=", 2, P_EQUALITY, O_NE) /* before ! */
|
|
/* assignments are assumed to be in range O_ASN .. O_BORASN */
|
|
FN("=", 1, P_ASSIGN, O_ASN)
|
|
FN("*=", 2, P_ASSIGN, O_TIMESASN)
|
|
FN("/=", 2, P_ASSIGN, O_DIVASN)
|
|
FN("%=", 2, P_ASSIGN, O_MODASN)
|
|
FN("+=", 2, P_ASSIGN, O_PLUSASN)
|
|
FN("-=", 2, P_ASSIGN, O_MINUSASN)
|
|
#ifndef MKSH_LEGACY_MODE
|
|
FN("^<=", 3, P_ASSIGN, O_ROLASN) /* before ^< */
|
|
FN("^>=", 3, P_ASSIGN, O_RORASN) /* before ^> */
|
|
#endif
|
|
FN("<<=", 3, P_ASSIGN, O_LSHIFTASN)
|
|
FN(">>=", 3, P_ASSIGN, O_RSHIFTASN)
|
|
FN("&=", 2, P_ASSIGN, O_BANDASN)
|
|
FN("^=", 2, P_ASSIGN, O_BXORASN)
|
|
FN("|=", 2, P_ASSIGN, O_BORASN)
|
|
/* binary non-assignment operators */
|
|
#ifndef MKSH_LEGACY_MODE
|
|
FN("^<", 2, P_SHIFT, O_ROL) /* before ^ */
|
|
FN("^>", 2, P_SHIFT, O_ROR) /* before ^ */
|
|
#endif
|
|
FN("<<", 2, P_SHIFT, O_LSHIFT)
|
|
FN(">>", 2, P_SHIFT, O_RSHIFT)
|
|
FN("<=", 2, P_RELATION, O_LE)
|
|
FN(">=", 2, P_RELATION, O_GE)
|
|
FN("<", 1, P_RELATION, O_LT)
|
|
FN(">", 1, P_RELATION, O_GT)
|
|
FN("&&", 2, P_LAND, O_LAND)
|
|
FN("||", 2, P_LOR, O_LOR)
|
|
FN("*", 1, P_MULT, O_TIMES)
|
|
FN("/", 1, P_MULT, O_DIV)
|
|
FN("%", 1, P_MULT, O_MOD)
|
|
FN("+", 1, P_ADD, O_PLUS)
|
|
FN("-", 1, P_ADD, O_MINUS)
|
|
FN("&", 1, P_BAND, O_BAND)
|
|
FN("^", 1, P_BXOR, O_BXOR)
|
|
FN("|", 1, P_BOR, O_BOR)
|
|
FN("?", 1, P_TERN, O_TERN)
|
|
FN(",", 1, P_COMMA, O_COMMA)
|
|
/* things after this aren't used as binary operators */
|
|
/* unary that are not also binaries */
|
|
FN("~", 1, P_PRIMARY, O_BNOT)
|
|
FN("!", 1, P_PRIMARY, O_LNOT)
|
|
/* misc */
|
|
FN("(", 1, P_PRIMARY, OPEN_PAREN)
|
|
FN(")", 1, P_PRIMARY, CLOSE_PAREN)
|
|
FN(":", 1, P_PRIMARY, CTERN)
|
|
/* things that don't appear in the opinfo[] table */
|
|
F1(VAR) /*XXX should be F2 */
|
|
F2(LIT)
|
|
F2(END)
|
|
F9(BAD)
|
|
|
|
#undef FN
|
|
#undef F0
|
|
#undef F1
|
|
#undef F2
|
|
#undef F9
|
|
#undef EXPRTOK_DEFNS
|
|
#undef EXPRTOK_ENUM
|
|
#undef EXPRTOK_NAME
|
|
#undef EXPRTOK_LEN
|
|
#undef EXPRTOK_PREC
|