File indexing completed on 2024-04-28 05:49:44

0001 /*
0002     SPDX-FileCopyrightText: 2023 Gabriel Barrantes <gabriel.barrantes.dev@outlook.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #pragma once
0007 
0008 #include "kcalc_token.h"
0009 #include "knumber/knumber.h"
0010 
0011 #include <QChar>
0012 #include <QDebug>
0013 #include <QDomDocument>
0014 #include <QList>
0015 #include <QLocale>
0016 #include <QQueue>
0017 #include <QString>
0018 
0019 class KCalcParser
0020 {
0021 public:
0022     KCalcParser();
0023     ~KCalcParser();
0024 
0025     enum ParsingResult { SUCCESS, INVALID_TOKEN, EMPTY };
0026 
0027     enum TrigonometricMode { DEGREES, RADIANS, GRADIANS };
0028 
0029     int loadConstants(const QDomDocument &doc);
0030 
0031     void setTrigonometricMode(int mode);
0032     int getTrigonometricMode();
0033 
0034     ParsingResult getParsingResult();
0035 
0036     int stringToTokenQueue(const QString &buffer, int base, QQueue<KCalcToken> &tokenQueue, int &errorIndex);
0037     /*TODO: int stringToHTMLString(const QString& buffer, QString& htmlText);*/
0038 
0039     const QString TokenToString(KCalcToken::TokenCode tokenCode);
0040 
0041 private:
0042     KCalcToken::TokenCode stringToToken(const QString &string, int &index, int base = 10);
0043 
0044     static const inline QString SPACE_STR = QStringLiteral(" ");
0045     static const inline QString THIN_SPACE_STR = QStringLiteral(" ");
0046 
0047     static const inline QString ZERO_STR = QStringLiteral("0");
0048     static const inline QString NINE_STR = QStringLiteral("9");
0049     static const inline QString DECIMAL_POINT_STR = QLocale().decimalPoint();
0050     static const inline QString COMMA_STR = QLatin1String(",");
0051     static const inline QString POINT_STR = QLatin1String(".");
0052 
0053     static const inline QString A_STR = QStringLiteral("A");
0054     static const inline QString F_STR = QStringLiteral("F");
0055     static const inline QString B_STR = QStringLiteral("b");
0056     static const inline QString X_STR = QStringLiteral("x");
0057 
0058     static const inline QString BINARY_NUMBER_PREFIX_STR = QStringLiteral("0b");
0059     static const inline QString OCTAL_NUMBER_PREFIX_STR = QStringLiteral("0");
0060     static const inline QString HEX_NUMBER_PREFIX_STR = QStringLiteral("0x");
0061 
0062     static const inline QString E_STR = QStringLiteral("e");
0063     static const inline QString PI_STR = QStringLiteral("π");
0064     static const inline QString PHI_STR = QStringLiteral("ϕ");
0065     static const inline QString I_STR = QStringLiteral("i");
0066     static const inline QString POS_INFINITY_STR = QStringLiteral("∞");
0067     static const inline QString NEG_INFINITY_STR = QStringLiteral("-∞");
0068 
0069     static const inline QString VACUUM_PERMITIVITY_STR = QStringLiteral("ε₀");
0070     static const inline QString VACUUM_PERMEABILITY_STR = QStringLiteral("μ₀");
0071     static const inline QString VACUUM_IMPEDANCE_STR = QStringLiteral("Z₀");
0072 
0073     static const inline QString PLANCK_S_CONSTANT_STR = QStringLiteral("ℎ");
0074     static const inline QString PLANCK_S_OVER_2PI_STR = QStringLiteral("ℏ");
0075 
0076     static const inline QString PLUS_STR = QStringLiteral("+");
0077     static const inline QString HYPHEN_MINUS_STR = QStringLiteral("-");
0078     static const inline QString MINUS_SIGN_STR = QStringLiteral("−");
0079     static const inline QString MULTIPLICATION_STR = QStringLiteral("×");
0080     static const inline QString DIVISION_STR = QStringLiteral("÷");
0081     static const inline QString DIVISION_SLASH_STR = QStringLiteral("∕");
0082     static const inline QString SLASH_STR = QStringLiteral("/");
0083     static const inline QString DOT_STR = QStringLiteral("⋅");
0084     static const inline QString ASTERISK_STR = QStringLiteral("*");
0085     static const inline QString PERCENTAGE_STR = QStringLiteral("%");
0086     static const inline QString PERMILLE_STR = QStringLiteral("‰");
0087 
0088     static const inline QString BINOMIAL_STR = QStringLiteral("nCm");
0089     static const inline QString MODULO_STR = QStringLiteral("mod");
0090     static const inline QString INTEGER_DIVISION_STR = QStringLiteral("div");
0091 
0092     static const inline QString OPENING_PARENTHESIS_STR = QStringLiteral("(");
0093     static const inline QString CLOSING_PARENTHESIS_STR = QStringLiteral(")");
0094 
0095     static const inline QString SQUARE_STR = QStringLiteral("²");
0096     static const inline QString CUBE_STR = QStringLiteral("³");
0097     static const inline QString RECIPROCAL_STR = QStringLiteral("⁻¹");
0098 
0099     static const inline QString LOG_10_STR = QStringLiteral("log");
0100     static const inline QString LN_STR = QStringLiteral("ln");
0101     static const inline QString EXP_STR = QStringLiteral("exp");
0102     static const inline QString EXP_10_STR = QStringLiteral("⏨");
0103     static const inline QString POWER_STR = QStringLiteral("^");
0104     static const inline QString POWER_ROOT_STR = QStringLiteral("⌄");
0105     static const inline QString SQUARE_ROOT_STR = QStringLiteral("√");
0106     static const inline QString CUBIC_ROOT_STR = QStringLiteral("∛");
0107 
0108     static const inline QString FACTORIAL_STR = QStringLiteral("!");
0109     static const inline QString DOUBLE_FACTORIAL_STR = QStringLiteral("‼");
0110     static const inline QString GAMMA_STR = QStringLiteral("Γ");
0111     static const inline QString INVERT_SIGN_STR = QStringLiteral("–");
0112 
0113     static const inline QString DEGREE_STR = QStringLiteral("°");
0114     static const inline QString GRADIAN_STR = QStringLiteral("gon");
0115     static const inline QString RADIAN_STR = QStringLiteral("rad");
0116     static const inline QString SIN_STR = QStringLiteral("sin");
0117     static const inline QString COS_STR = QStringLiteral("cos");
0118     static const inline QString TAN_STR = QStringLiteral("tan");
0119     static const inline QString ASIN_STR = QStringLiteral("asin");
0120     static const inline QString ACOS_STR = QStringLiteral("acos");
0121     static const inline QString ATAN_STR = QStringLiteral("atan");
0122 
0123     static const inline QString SINH_STR = QStringLiteral("sinh");
0124     static const inline QString COSH_STR = QStringLiteral("cosh");
0125     static const inline QString TANH_STR = QStringLiteral("tanh");
0126     static const inline QString ASINH_STR = QStringLiteral("asinh");
0127     static const inline QString ACOSH_STR = QStringLiteral("acosh");
0128     static const inline QString ATANH_STR = QStringLiteral("atanh");
0129 
0130     static const inline QString AND_STR = QStringLiteral("&");
0131     static const inline QString OR_STR = QStringLiteral("|");
0132     static const inline QString XOR_STR = QStringLiteral("⊕");
0133     static const inline QString RSH_STR = QStringLiteral(">>");
0134     static const inline QString LSH_STR = QStringLiteral("<<");
0135     static const inline QString ONE_S_COMP_STR = QStringLiteral("~");
0136     static const inline QString TWO_S_COMP_STR = QStringLiteral("~₂");
0137 
0138     static const inline QString EQUAL_STR = QStringLiteral("=");
0139     static const inline QString ANS_STR = QStringLiteral("ans");
0140 
0141     static const inline QString ERROR_STR = QStringLiteral("error");
0142 
0143 private:
0144     typedef struct {
0145         QString symbol;
0146         QString value;
0147     } constant_;
0148 
0149     QList<constant_> constants_;
0150     bool constantSymbolToValue_(const QString &constantSymbol);
0151 
0152     QString token_KNumber_;
0153     int trigonometric_Mode_ = DEGREES;
0154     ParsingResult parsing_Result_ = EMPTY;
0155 };