diff --git a/poincare/src/parsing/parser.cpp b/poincare/src/parsing/parser.cpp index 135082316..55090711e 100644 --- a/poincare/src/parsing/parser.cpp +++ b/poincare/src/parsing/parser.cpp @@ -71,7 +71,8 @@ Expression Parser::parseUntil(Token::Type stoppingType) { &Parser::parseTimes, // Token::Times &Parser::parseSlash, // Token::Slash &Parser::parseImplicitTimes, // Token::ImplicitTimes - &Parser::parseCaret, // Token::Power + &Parser::parseCaret, // Token::Power, + &Parser::parseSingleQuote, // Token::SingleQuote &Parser::parseBang, // Token::Bang &Parser::parseCaretWithParenthesis, // Token::CaretWithParenthesis &Parser::parseMatrix, // Token::LeftBracket @@ -333,6 +334,15 @@ void Parser::parseLeftSystemParenthesis(Expression & leftHandSide, Token::Type s defaultParseLeftParenthesis(true, leftHandSide, stoppingType); } +void Parser::parseSingleQuote(Expression & leftHandSide, Token::Type stoppingType) { + if (leftHandSide.isUninitialized()) { + m_status = Status::Error; // Left-hand side missing + } else { + leftHandSide = Derivative::Builder(leftHandSide, Symbol::Builder('x'), Symbol::Builder('x')); + } + isThereImplicitMultiplication(); +} + void Parser::parseBang(Expression & leftHandSide, Token::Type stoppingType) { if (leftHandSide.isUninitialized()) { m_status = Status::Error; // Left-hand side missing diff --git a/poincare/src/parsing/parser.h b/poincare/src/parsing/parser.h index e6fe72f58..1674d2e25 100644 --- a/poincare/src/parsing/parser.h +++ b/poincare/src/parsing/parser.h @@ -56,6 +56,7 @@ private: void parseMatrix(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); void parseLeftParenthesis(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); void parseLeftSystemParenthesis(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); + void parseSingleQuote(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); void parseBang(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); void parsePlus(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); void parseMinus(Expression & leftHandSide, Token::Type stoppingType = (Token::Type)0); diff --git a/poincare/src/parsing/token.h b/poincare/src/parsing/token.h index 932730041..162c12cd8 100644 --- a/poincare/src/parsing/token.h +++ b/poincare/src/parsing/token.h @@ -39,6 +39,7 @@ public: * the ImplicitTimes Token Type is defined here with the desired precedence, * in order to allow the Parser to insert such Tokens where needed. */ Caret, + SingleQuote, Bang, CaretWithParenthesis, LeftBracket, diff --git a/poincare/src/parsing/tokenizer.cpp b/poincare/src/parsing/tokenizer.cpp index c1c66a184..eca290fb8 100644 --- a/poincare/src/parsing/tokenizer.cpp +++ b/poincare/src/parsing/tokenizer.cpp @@ -206,6 +206,9 @@ Token Tokenizer::popToken() { } return Token(Token::Caret); } + if (c == '\'') { + return Token(Token::SingleQuote); + } if (c == '!') { return Token(Token::Bang); }