14 #include "expression_parser.hpp" 15 #include "expression_lexer.hpp" 29 YY_BUFFER_STATE buf = poincare_expression_yy_scan_string(
string);
33 if (expression !=
nullptr) {
38 poincare_expression_yy_delete_buffer(buf);
45 root.
editableOperand(0)->replaceSymbolWithExpression(symbol, expression);
59 static bool sSimplificationHasBeenInterrupted =
false;
66 if (sCircuitBreaker ==
nullptr) {
69 if (sCircuitBreaker()) {
70 sSimplificationHasBeenInterrupted =
true;
86 assert(m_parent !=
nullptr);
92 assert(newOperand !=
nullptr);
99 if (op[i] == oldOperand) {
100 if (oldOperand !=
nullptr && oldOperand->
parent() ==
this) {
103 if (deleteOldOperand) {
106 if (newOperand !=
nullptr) {
133 if (op[i] !=
nullptr && op[i]->
parent() ==
this) {
153 if (m_parent ==
nullptr) {
162 if (test(
this, context)) {
191 }
else if (range < opRange) {
211 bool Expression::isOfType(Type * types,
int length)
const {
212 for (
int i = 0; i < length; i++) {
213 if (
type() == types[i]) {
220 bool Expression::needParenthesisWithParent(
const Expression * e)
const {
231 return -(e2->simplificationOrderGreaterType(e1, canBeInterrupted));
232 }
else if (e1->
type() == e2->
type()) {
233 return e1->simplificationOrderSameType(e2, canBeInterrupted);
238 return e1->simplificationOrderGreaterType(e2, canBeInterrupted);
245 switch (floatDisplayMode) {
247 switch (complexFormat) {
254 switch (complexFormat) {
258 return privateCreateLayout(floatDisplayMode, complexFormat);
267 if (
exp ==
nullptr) {
271 if (
exp ==
nullptr) {
278 sSimplificationHasBeenInterrupted =
false;
282 #if MATRIX_EXACT_REDUCING 284 if ((*expressionAddress)->recursivelyMatches(
IsMatrix, context)) {
292 if (sSimplificationHasBeenInterrupted) {
294 delete *expressionAddress;
295 *expressionAddress =
nullptr;
300 void Expression::Reduce(
Expression ** expressionAddress,
Context & context, AngleUnit angleUnit,
bool recursively) {
303 root.editableOperand(0)->deepReduce(context, angleUnit);
305 root.editableOperand(0)->shallowReduce(context,angleUnit);
310 Expression * Expression::deepReduce(Context & context, AngleUnit angleUnit) {
315 return shallowReduce(context, angleUnit);
318 Expression * Expression::shallowReduce(Context & context, AngleUnit angleUnit) {
327 Expression * Expression::deepBeautify(Context & context, AngleUnit angleUnit) {
329 Expression * e = shallowBeautify(context, angleUnit);
330 for (
int i = 0; i < e->numberOfOperands(); i++) {
331 e->editableOperand(i)->deepBeautify(context, angleUnit);
343 return privateApproximate(
T(), context, angleUnit);
348 Expression * evaluation = approximate<T>(context, angleUnit);
352 result =
static_cast<const Complex<T> *
>(evaluation)->toScalar();
365 T result =
exp->approximateToScalar<
T>(context, angleUnit);
371 static T epsilon =
sizeof(
T) ==
sizeof(
double) ? 1E-15 : 1E-7f;
377 template Poincare::Expression * Poincare::Expression::approximate<double>(Context& context, AngleUnit angleUnit)
const;
378 template Poincare::Expression * Poincare::Expression::approximate<float>(Context& context, AngleUnit angleUnit)
const;
383 template double Poincare::Expression::epsilon<double>();
384 template float Poincare::Expression::epsilon<float>();
static bool shouldStopProcessing()
Expression * parent() const
static Preferences * sharedPreferences()
Expression * replaceWith(Expression *newOperand, bool deleteAfterReplace=true)
Expression * approximate(Context &context, AngleUnit angleUnit=AngleUnit::Default) const
Expression::AngleUnit angleUnit() const
static bool IsMatrix(const Expression *e, Context &context)
bool recursivelyMatches(ExpressionTest test, Context &context) const
bool hasAncestor(const Expression *e) const
virtual const Expression *const * operands() const =0
static Expression * parse(char const *string)
static void setCircuitBreaker(CircuitBreaker cb)
Expression * editableOperand(int i)
static int SimplificationOrder(const Expression *e1, const Expression *e2, bool canBeInterrupted=false)
void detachOperandAtIndex(int i)
virtual int numberOfOperands() const =0
ExpressionLayout * createLayout(PrintFloat::Mode floatDisplayMode=PrintFloat::Mode::Default, ComplexFormat complexFormat=ComplexFormat::Default) const
int poincare_expression_yyparse(Poincare::Expression **expressionOutput)
bool isApproximate(Context &context) const
static void ReplaceSymbolWithExpression(Expression **expressionAddress, char symbol, Expression *expression)
virtual float characteristicXRange(Context &context, AngleUnit angleUnit=AngleUnit::Default) const
void setParent(Expression *parent)
void swapOperands(int i, int j)
static void Simplify(Expression **expressionAddress, Context &context, AngleUnit angleUnit=AngleUnit::Default)
void detachOperand(const Expression *e)
T approximateToScalar(Context &context, AngleUnit angleUnit=AngleUnit::Default) const
const Expression * operand(int i) const
virtual int polynomialDegree(char symbolName) const
virtual Type type() const =0
void replaceOperand(const Expression *oldOperand, Expression *newOperand, bool deleteOldOperand=true)
static Expression * ParseAndSimplify(const char *text, Context &context, AngleUnit angleUnit=AngleUnit::Default)