[poincare] Store and Equal must be topmost expressions

This commit is contained in:
Léa Saviot
2018-11-09 15:50:03 +01:00
committed by Émilie Feral
parent e4c3589829
commit 44963179c7
2 changed files with 12 additions and 4 deletions

View File

@@ -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) {

View File

@@ -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");