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 ®ex, int *counter) const; 0058 };