From f58970f590dfe7818be6ca98644ea3fc06f65846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 8 Mar 2017 15:56:54 +0100 Subject: [PATCH] [poincare] Parse arg(2+i) Change-Id: I4e7736e419398be9b7b252d30ac5c9d14ec0c892 --- poincare/Makefile | 1 + poincare/include/poincare.h | 1 + poincare/include/poincare/complex_argument.h | 21 ++++++++++ poincare/include/poincare/expression.h | 1 + poincare/src/complex_argument.cpp | 44 ++++++++++++++++++++ poincare/src/expression_lexer.l | 1 + 6 files changed, 69 insertions(+) create mode 100644 poincare/include/poincare/complex_argument.h create mode 100644 poincare/src/complex_argument.cpp diff --git a/poincare/Makefile b/poincare/Makefile index a2bf8149d..5ec966c4c 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -8,6 +8,7 @@ objs += $(addprefix poincare/src/,\ binary_operation.o\ cosine.o\ complex.o\ + complex_argument.o\ derivative.o\ determinant.o\ expression.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index d30e12f4f..aa4193a5c 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/poincare/include/poincare/complex_argument.h b/poincare/include/poincare/complex_argument.h new file mode 100644 index 000000000..ad0651f67 --- /dev/null +++ b/poincare/include/poincare/complex_argument.h @@ -0,0 +1,21 @@ +#ifndef POINCARE_COMPLEX_ARGUMENT_H +#define POINCARE_COMPLEX_ARGUMENT_H + +#include + +namespace Poincare { + +class ComplexArgument : public Function { +public: + ComplexArgument(); + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +private: + float privateApproximate(Context & context, AngleUnit angleUnit) const override; +}; + +} + +#endif + diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index c32f87997..056c1053d 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -14,6 +14,7 @@ public: AbsoluteValue, Addition, Complex, + ComplexArgument, Cosine, Derivative, Determinant, diff --git a/poincare/src/complex_argument.cpp b/poincare/src/complex_argument.cpp new file mode 100644 index 000000000..901c86f75 --- /dev/null +++ b/poincare/src/complex_argument.cpp @@ -0,0 +1,44 @@ +#include +#include + +extern "C" { +#include +#include +} + +namespace Poincare { + +ComplexArgument::ComplexArgument() : + Function("arg") +{ +} + +Expression::Type ComplexArgument::type() const { + return Type::ComplexArgument; +} + +Expression * ComplexArgument::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + ComplexArgument * ca = new ComplexArgument(); + ca->setArgument(newOperands, numberOfOperands, cloneOperands); + return ca; +} + +float ComplexArgument::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + Expression * evaluation = m_args[0]->evaluate(context, angleUnit); + assert(evaluation->type() == Type::Matrix || evaluation->type() == Type::Complex); + float result = 0.0f; + if (evaluation->type() == Type::Matrix) { + result = NAN; + } else { + result = ((Complex *)evaluation)->th(); + } + delete evaluation; + return result; +} + +} + diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index 521626263..08836615e 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -92,6 +92,7 @@ w\(n\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::wn; retu w\(n\+1\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::wn1; return SYMBOL; } abs { poincare_expression_yylval.expression = new AbsoluteValue(); return FUNCTION; } ans { poincare_expression_yylval.character = Symbol::SpecialSymbols::Ans; return SYMBOL; } +arg { poincare_expression_yylval.expression = new ComplexArgument(); return FUNCTION; } diff { poincare_expression_yylval.expression = new Derivative(); return FUNCTION; } det { poincare_expression_yylval.expression = new Determinant(); return FUNCTION; } cos { poincare_expression_yylval.expression = new Cosine(); return FUNCTION; }