From 10c7a96debec0528fd8652a9135a87b55ed0ac3e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 31 Oct 2020 16:27:42 +0100 Subject: [PATCH] evalexpr: parse: prepare for multi-char operators --- src/parse/climbing_parse.c | 4 ++-- src/parse/operators.inc | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/parse/climbing_parse.c b/src/parse/climbing_parse.c index 584e0af..b1f7898 100644 --- a/src/parse/climbing_parse.c +++ b/src/parse/climbing_parse.c @@ -17,8 +17,8 @@ static const struct { const enum { ASSOC_LEFT, ASSOC_RIGHT, ASSOC_NONE } assoc; const enum { OP_INFIX, OP_PREFIX, OP_POSTFIX } fix; } ops[] = { -# define OP(Op, Kind, Prio, Assoc, Fix) \ - [Kind] = { #Op, Kind, Prio, Assoc, Fix }, +# define OP(Kind, Prio, Assoc, Fix, /* Operator string */ ...) \ + [Kind] = { (const char[]){__VA_ARGS__}, Kind, Prio, Assoc, Fix, }, #include "operators.inc" }; diff --git a/src/parse/operators.inc b/src/parse/operators.inc index 3eb417a..be0fa2e 100644 --- a/src/parse/operators.inc +++ b/src/parse/operators.inc @@ -11,29 +11,29 @@ */ #ifndef OP -# define OP(Op, Kind, Prio, Assoc, Fix) +# define OP(Kind, Prio, Assoc, Fix, /* Operator string */ ...) #endif #ifndef BINOP -# define BINOP(Op, Kind, Prio, Assoc) \ - OP(Op, Kind, Prio, Assoc, OP_INFIX) +# define BINOP(Kind, Prio, Assoc, ...) \ + OP(Kind, Prio, Assoc, OP_INFIX, __VA_ARGS__) #endif #ifndef PREOP -# define PREOP(Op, Kind, Prio, Assoc) \ - OP(Op, Kind, Prio, Assoc, OP_PREFIX) +# define PREOP(Kind, Prio, Assoc, ...) \ + OP(Kind, Prio, Assoc, OP_PREFIX, __VA_ARGS__) #endif #ifndef POSTOP -# define POSTOP(Op, Kind, Prio, Assoc) \ - OP(Op, Kind, Prio, Assoc, OP_POSTFIX) +# define POSTOP(Kind, Prio, Assoc, ...) \ + OP(Kind, Prio, Assoc, OP_POSTFIX, __VA_ARGS__) #endif -BINOP(+, BINOP_PLUS, 1, ASSOC_LEFT) -BINOP(-, BINOP_MINUS, 1, ASSOC_LEFT) -BINOP(*, BINOP_TIMES, 2, ASSOC_LEFT) -BINOP(/, BINOP_DIVIDES, 2, ASSOC_LEFT) -BINOP(^, BINOP_POW, 4, ASSOC_RIGHT) -PREOP(-, UNOP_NEGATE, 3, ASSOC_RIGHT) -PREOP(+, UNOP_IDENTITY, 3, ASSOC_RIGHT) -POSTOP(!, UNOP_FACT, 5, ASSOC_NONE) +BINOP (BINOP_PLUS, 1, ASSOC_LEFT, '+', 0) +BINOP (BINOP_MINUS, 1, ASSOC_LEFT, '-', 0) +BINOP (BINOP_TIMES, 2, ASSOC_LEFT, '*', 0) +BINOP (BINOP_DIVIDES, 2, ASSOC_LEFT, '/', 0) +BINOP (BINOP_POW, 4, ASSOC_RIGHT, '^', 0) +PREOP (UNOP_NEGATE, 3, ASSOC_RIGHT, '-', 0) +PREOP (UNOP_IDENTITY, 3, ASSOC_RIGHT, '+', 0) +POSTOP(UNOP_FACT, 5, ASSOC_NONE, '!', 0) #undef BINOP #undef PREOP