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 };