File indexing completed on 2024-05-12 17:21:07

0001 /*
0002  * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com>
0003  * SPDX-FileCopyrightText: 2021-2022 Rohan Asokan
0004  * <rohan.asokan@students.iiit.ac.in>
0005  *
0006  * SPDX-License-Identifier: GPL-3.0-or-later
0007  */
0008 
0009 #pragma once
0010 
0011 #include "mathengine/driver.hh"
0012 #include <QObject>
0013 #include <QRegularExpression>
0014 #include <QStringList>
0015 #include <knumber.h>
0016 
0017 class MathEngine : public QObject {
0018   Q_OBJECT
0019   Q_PROPERTY(KNumber result READ result NOTIFY resultChanged)
0020   Q_PROPERTY(bool error READ error NOTIFY resultChanged)
0021 
0022 public:
0023     static MathEngine *inst() {
0024         static MathEngine singleton;
0025         return &singleton;
0026     }
0027     Q_INVOKABLE void parse(QString expr);
0028     Q_INVOKABLE void parseBinaryExpression(QString expr);
0029     KNumber result() { return m_result; };
0030     bool error() { return m_error; };
0031 
0032 Q_SIGNALS:
0033     void resultChanged();
0034 
0035 private:
0036     MathEngine(){};
0037     driver m_driver;
0038     KNumber m_result;
0039     bool m_error;
0040 
0041     const QString bitRegex = QStringLiteral("[01]+");
0042     const QString binaryOperatorRegex = QStringLiteral("[\\+\\-\\*\\/&\\|\\^]|<{2}|>{2}");
0043         
0044     QRegularExpression expressionSyntaxRegex1 = QRegularExpression(QStringLiteral("([01]+)([\\+\\-\\*\\/&\\|~\\^]|<{2}|>{2})([01]+)"));
0045     QStringList operatorsList = {
0046         QStringLiteral("+"), 
0047         QStringLiteral("-"), 
0048         QStringLiteral("*"), 
0049         QStringLiteral("/"), 
0050         QStringLiteral("&"), 
0051         QStringLiteral("|"), 
0052         QStringLiteral("^"), 
0053         QStringLiteral("<<"), 
0054         QStringLiteral(">>")
0055     };
0056     
0057     QStringList getRegexMatches(const QString &expr, const QString &regex, int *counter) const;
0058 };