diff --git a/poincare/src/parsing/parser.cpp b/poincare/src/parsing/parser.cpp index ac81e1b14..41ca04994 100644 --- a/poincare/src/parsing/parser.cpp +++ b/poincare/src/parsing/parser.cpp @@ -168,14 +168,18 @@ void Parser::parseEqual(Expression & leftHandSide) { m_status = Status::Error; // Equal must have a left operand return; } - if (leftHandSide.type() == ExpressionNode::Type::Equal) { - m_status = Status::Error; // Equal is not associative - return; - } Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::Equal)) { + if (rightHandSide.type() == ExpressionNode::Type::Store) { + m_status = Status::Error; // Equal cannot have a Store on the right + return; + } leftHandSide = Equal(leftHandSide, rightHandSide); } + if (!m_nextToken.is(Token::EndOfStream)) { + m_status = Status::Error; // Equal should be top-most expression in Tree + return; + } } void Parser::parseStore(Expression & leftHandSide) { diff --git a/poincare/test/parser.cpp b/poincare/test/parser.cpp index 7977edcde..0d284cf5c 100644 --- a/poincare/test/parser.cpp +++ b/poincare/test/parser.cpp @@ -195,6 +195,9 @@ QUIZ_CASE(poincare_parser_parse) { assert_raises_parsing_error("^1"); assert_raises_parsing_error("t0000000"); assert_raises_parsing_error("[[t0000000["); + assert_parsed_expression_is("0=0", Equal(Rational(0), Rational(0))); + assert_raises_parsing_error("0>x=0"); + assert_raises_parsing_error("0=0>x"); } Matrix BuildMatrix(int rows, int columns, Expression entries[]) { @@ -335,6 +338,7 @@ QUIZ_CASE(poincare_parser_parse_store) { assert_parsed_expression_is("1>f(x)", Store(Rational(1),Function("f",1,Symbol("x",1)))); assert_parsed_expression_is("x>f(x)", Store(Symbol("x",1),Function("f",1,Symbol("x",1)))); assert_parsed_expression_is("n>f(x)", Store(Symbol("n",1),Function("f",1,Symbol("x",1)))); + assert_raises_parsing_error("a>b>c"); assert_raises_parsing_error("1>2"); assert_raises_parsing_error("1>"); assert_raises_parsing_error(">2");