diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index f7d6c155e..fe0935c49 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -38,11 +38,10 @@ bool TextFieldDelegateApp::textFieldShouldFinishEditing(TextField * textField, I bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { if (textField->textFieldShouldFinishEditing(event) && textField->isEditing()) { Expression * exp = Expression::parse(textField->text()); - bool invalidText = (exp == nullptr || !exp->hasValidNumberOfArguments()); if (exp != nullptr) { delete exp; } - if (invalidText) { + if (exp == nullptr) { textField->app()->displayWarning(I18n::Message::SyntaxError); return true; } diff --git a/poincare/include/poincare/bounded_static_hierarchy.h b/poincare/include/poincare/bounded_static_hierarchy.h index e2140bc28..058a8dec6 100644 --- a/poincare/include/poincare/bounded_static_hierarchy.h +++ b/poincare/include/poincare/bounded_static_hierarchy.h @@ -11,7 +11,7 @@ public: BoundedStaticHierarchy(); BoundedStaticHierarchy(Expression * const * operands, int numberOfOperands, bool cloneOperands = true); int numberOfOperands() const override { return m_numberOfOperands; } - bool hasValidNumberOfArguments() const override; + bool hasValidNumberOfOperands(int numberOfOperands) const override; private: int m_numberOfOperands; }; diff --git a/poincare/include/poincare/complex.h b/poincare/include/poincare/complex.h index 47ad7e3ca..e5c0c21ec 100644 --- a/poincare/include/poincare/complex.h +++ b/poincare/include/poincare/complex.h @@ -43,7 +43,6 @@ public: Expression::Type type() const override; Complex * clone() const override; bool isCommutative() const override; - bool hasValidNumberOfArguments() const override; void replaceOperand(const Expression * oldOperand, Expression * newOperand, bool deleteOldOperand) override { assert(false); } diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 3e8f68c50..f47a0f26b 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -98,7 +98,6 @@ public: static bool shouldStopProcessing(); /* Hierarchy */ - virtual bool hasValidNumberOfArguments() const; // FIXME: Remove? virtual const Expression * operand(int i) const = 0; virtual int numberOfOperands() const = 0; virtual Expression * clone() const = 0; diff --git a/poincare/include/poincare/static_hierarchy.h b/poincare/include/poincare/static_hierarchy.h index db9cb1d5c..98881944f 100644 --- a/poincare/include/poincare/static_hierarchy.h +++ b/poincare/include/poincare/static_hierarchy.h @@ -20,8 +20,8 @@ public: virtual void setArgument(ListData * listData, int numberOfEntries, bool clone); int numberOfOperands() const override { return T; } - bool hasValidNumberOfArguments() const override; Expression * const * operands() const override { return m_operands; } + virtual bool hasValidNumberOfOperands(int numberOfOperands) const; protected: void build(Expression * const * operands, int numberOfOperands, bool cloneOperands); Expression * m_operands[T]; diff --git a/poincare/src/bounded_static_hierarchy.cpp b/poincare/src/bounded_static_hierarchy.cpp index 8b7b7b9e8..729b9631f 100644 --- a/poincare/src/bounded_static_hierarchy.cpp +++ b/poincare/src/bounded_static_hierarchy.cpp @@ -20,8 +20,8 @@ BoundedStaticHierarchy::BoundedStaticHierarchy(Expression * const * operands, } template -bool BoundedStaticHierarchy::hasValidNumberOfArguments() const { - return true; +bool BoundedStaticHierarchy::hasValidNumberOfOperands(int numberOfOperands) const { + return numberOfOperands >= 1 && numberOfOperands <= T; } template class Poincare::BoundedStaticHierarchy<2>; diff --git a/poincare/src/complex.cpp b/poincare/src/complex.cpp index b4e03cb34..30eb1943d 100644 --- a/poincare/src/complex.cpp +++ b/poincare/src/complex.cpp @@ -156,11 +156,6 @@ bool Complex::isCommutative() const { return false; } -template -bool Complex:: hasValidNumberOfArguments() const { - return true; -} - template T Complex::toScalar() const { if (m_b != 0) { diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index f1c152277..2af22816f 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -54,15 +54,6 @@ bool Expression::shouldStopProcessing() { return sCircuitBreaker(); } -bool Expression::hasValidNumberOfArguments() const { - for (int i = 0; i < numberOfOperands(); i++) { - if (!operand(i)->hasValidNumberOfArguments()) { - return false; - } - } - return true; -} - ExpressionLayout * Expression::createLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { switch (floatDisplayMode) { case FloatDisplayMode::Default: diff --git a/poincare/src/expression_parser.y b/poincare/src/expression_parser.y index a00811935..fce55d8ae 100644 --- a/poincare/src/expression_parser.y +++ b/poincare/src/expression_parser.y @@ -181,7 +181,7 @@ exp: | LEFT_PARENTHESIS exp RIGHT_PARENTHESIS { Poincare::Expression * terms[1] = {$2}; $$ = new Poincare::Parenthesis(terms, false); } /* MATRICES_ARE_DEFINED */ | LEFT_BRACKET mtxData RIGHT_BRACKET { $$ = new Poincare::ExpressionMatrix($2); } - | FUNCTION LEFT_PARENTHESIS lstData RIGHT_PARENTHESIS { $$ = $1; $1->setArgument($3, $3->numberOfOperands(), true); delete $3; } + | FUNCTION LEFT_PARENTHESIS lstData RIGHT_PARENTHESIS { $$ = $1; if (!$1->hasValidNumberOfOperands($3->numberOfOperands())) { delete $1; delete $3; YYERROR; } ; $1->setArgument($3, $3->numberOfOperands(), true); delete $3; } final_exp: exp { $$ = $1; } @@ -190,4 +190,5 @@ final_exp: void poincare_expression_yyerror(Poincare::Expression ** expressionOutput, const char * msg) { // Handle the error! + // TODO: handle explicitely different type of errors (division by 0, missing parenthesis). This should call back the container to display a pop up with a message corresponding to the error? } diff --git a/poincare/src/static_hierarchy.cpp b/poincare/src/static_hierarchy.cpp index 1c0064b9b..b2ab76c82 100644 --- a/poincare/src/static_hierarchy.cpp +++ b/poincare/src/static_hierarchy.cpp @@ -32,16 +32,15 @@ void StaticHierarchy::setArgument(ListData * listData, int numberOfOperands, } template -bool StaticHierarchy::hasValidNumberOfArguments() const { - //return Hierarchy::hasValidNumberOfArguments(); - return true; +bool StaticHierarchy::hasValidNumberOfOperands(int numberOfOperands) const { + return numberOfOperands == T; } template void StaticHierarchy::build(Expression * const * operands, int numberOfOperands, bool cloneOperands) { assert(operands != nullptr); - int clippedNumberOfOperands = numberOfOperands > T ? T : numberOfOperands; - for (int i=0; iclone();