From a46354472ddc5fa3662f99bdeeb0273782751dee Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Tue, 13 Jan 2015 00:56:16 +0000 Subject: [PATCH] lolremez: add abs() function, implement full high-precision floating point parsing, add support for unary plus and minus. --- tools/lolremez/expression.h | 46 ++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/tools/lolremez/expression.h b/tools/lolremez/expression.h index 1ea1f4d0..7221870a 100644 --- a/tools/lolremez/expression.h +++ b/tools/lolremez/expression.h @@ -29,7 +29,7 @@ enum class op : uint8_t x, constant, /* Unary functions/operators */ - plus, minus, + plus, minus, abs, sqrt, cbrt, exp, exp2, log, log2, log10, sin, cos, tan, @@ -44,6 +44,7 @@ enum class op : uint8_t // Map operation enums to pegl::string<> rules template struct r_call_string {}; +template<> struct r_call_string : string<'a','b','s'> {}; template<> struct r_call_string : string<'s','q','r','t'> {}; template<> struct r_call_string : string<'c','b','r','t'> {}; template<> struct r_call_string : string<'e','x','p'> {}; @@ -78,7 +79,7 @@ struct expression basic_parse_string(str, this); } - + /* * Evaluate expression at x */ @@ -96,6 +97,9 @@ struct expression case op::minus: stack.Push(-stack.Pop()); break; + case op::abs: + stack.Push(fabs(stack.Pop())); + break; case op::sqrt: stack.Push(sqrt(stack.Pop())); break; @@ -216,14 +220,6 @@ private: } }; - struct do_success : action_base - { - static void apply(std::string const &ctx, expression *that) - { - UNUSED(ctx, that); - } - }; - struct r_expr; // r_ <- * @@ -255,14 +251,21 @@ private: one<')'>>, do_op> {}; - // r_constant <- + - struct r_constant : ifapply, do_constant> {}; + // r_constant <- + ( "." * ) ? ( [eE] [+-] ? + ) ? + struct r_constant : ifapply, + opt, + star>>, + opt, + opt>, + plus>>>, + do_constant> {}; // r_var <- "x" struct r_var : ifapply, do_op> {}; // r_call <- r_call_unary / r_call_binary - struct r_call : sor, + struct r_call : sor, + r_call_unary, r_call_unary, r_call_unary, r_call_unary, @@ -296,13 +299,20 @@ private: r_constant, r_parentheses> {}; - // r_exponent <- ( "^" | "**" ) r_terminal - // r_factor <- r_terminal ( r_exponent ) * + // r_signed <- "-" r_signed / "+" r_signed / r_terminal + struct r_signed : sor, _, r_signed>, + do_op>, + seq, _, r_signed>, + r_terminal> {}; + + // r_exponent <- ( "^" / "**" ) r_signed struct r_exponent : ifapply, string<'*', '*'>>, _, - r_terminal>, do_op> {}; - struct r_factor : seq, do_op> {}; + + // r_factor <- r_signed ( r_exponent ) * + struct r_factor : seq> {}; // r_mul <- "*" r_factor @@ -322,7 +332,7 @@ private: star>> {}; // stmt <- r_expr - struct r_stmt : ifapply, do_success> {}; + struct r_stmt : seq<_, r_expr, _, eof> {}; }; } /* namespace grammar */