File indexing completed on 2024-05-12 03:47:44

0001 /*
0002     File             : ExpressionParser.h
0003     Project          : LabPlot
0004     Description      : c++ wrapper for the bison generated parser.
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2014 Alexander Semke <alexander.semke@web.de>
0007     SPDX-FileCopyrightText: 2020-2022 Stefan Gerlach <stefan.gerlach@uni.kn>
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #ifndef EXPRESSIONPARSER_H
0012 #define EXPRESSIONPARSER_H
0013 
0014 #include "backend/gsl/parser.h"
0015 #include "backend/lib/Range.h"
0016 #include "backend/worksheet/plots/cartesian/XYEquationCurve.h"
0017 #include <QVector>
0018 
0019 class ExpressionParser {
0020 public:
0021     static ExpressionParser* getInstance();
0022     static int functionArgumentCount(const QString& functionName);
0023     static QString parameters(const QString& functionName);
0024     static QString functionArgumentString(const QString& functionName, const XYEquationCurve::EquationType);
0025     QString functionDescription(const QString& function);
0026     QString constantDescription(const QString& constant);
0027     void setSpecialFunction1(const char* function_name, func_t1Payload funct, std::shared_ptr<Payload> payload);
0028     void setSpecialFunction2(const char* function_name, func_t2Payload funct, std::shared_ptr<Payload> payload);
0029 
0030     static bool isValid(const QString& expr, const QStringList& vars);
0031     QStringList getParameter(const QString& expr, const QStringList& vars);
0032     bool evaluateCartesian(const QString& expr,
0033                            Range<double> range,
0034                            int count,
0035                            QVector<double>* xVector,
0036                            QVector<double>* yVector,
0037                            const QStringList& paramNames,
0038                            const QVector<double>& paramValues);
0039     bool evaluateCartesian(const QString& expr,
0040                            const QString& min,
0041                            const QString& max,
0042                            int count,
0043                            QVector<double>* xVector,
0044                            QVector<double>* yVector,
0045                            const QStringList& paramNames,
0046                            const QVector<double>& paramValues);
0047     bool evaluateCartesian(const QString& expr, const QString& min, const QString& max, int count, QVector<double>* xVector, QVector<double>* yVector);
0048     bool evaluateCartesian(const QString& expr, QVector<double>* xVector, QVector<double>* yVector);
0049     bool evaluateCartesian(const QString& expr,
0050                            const QVector<double>* xVector,
0051                            QVector<double>* yVector,
0052                            const QStringList& paramNames,
0053                            const QVector<double>& paramValues);
0054     static bool evaluateCartesian(const QString& expr, const QStringList& vars, const QVector<QVector<double>*>& xVectors, QVector<double>* yVector);
0055     bool evaluatePolar(const QString& expr, const QString& min, const QString& max, int count, QVector<double>* xVector, QVector<double>* yVector);
0056     bool evaluateParametric(const QString& expr1,
0057                             const QString& expr2,
0058                             const QString& min,
0059                             const QString& max,
0060                             int count,
0061                             QVector<double>* xVector,
0062                             QVector<double>* yVector);
0063     QString errorMessage() const;
0064 
0065     const QStringList& functions();
0066     const QStringList& functionsGroups();
0067     const QStringList& functionsDescriptions();
0068     const QVector<FunctionGroups>& functionsGroupIndices();
0069 
0070     const QStringList& constants();
0071     const QStringList& constantsGroups();
0072     const QStringList& constantsNames();
0073     const QStringList& constantsValues();
0074     const QStringList& constantsUnits();
0075     const QVector<ConstantGroups>& constantsGroupIndices();
0076 
0077 private:
0078     ExpressionParser();
0079     ~ExpressionParser();
0080 
0081     void initFunctions();
0082     void initConstants();
0083 
0084     static ExpressionParser* m_instance;
0085 
0086     QStringList m_functions;
0087     QStringList m_functionsGroups;
0088     QStringList m_functionsDescription;
0089     QVector<FunctionGroups> m_functionsGroupIndex;
0090 
0091     QStringList m_constants;
0092     QStringList m_constantsGroups;
0093     QStringList m_constantsDescription;
0094     QStringList m_constantsValues;
0095     QStringList m_constantsUnits;
0096     QVector<ConstantGroups> m_constantsGroupIndex;
0097 };
0098 #endif