Add functions to parse all global event scripts labels in the project
This commit is contained in:
parent
776aac56bc
commit
d2386fac9b
2 changed files with 56 additions and 3 deletions
|
@ -60,6 +60,9 @@ public:
|
||||||
static int getScriptLineNumber(const QString &filePath, const QString &scriptLabel);
|
static int getScriptLineNumber(const QString &filePath, const QString &scriptLabel);
|
||||||
static int getRawScriptLineNumber(QString text, const QString &scriptLabel);
|
static int getRawScriptLineNumber(QString text, const QString &scriptLabel);
|
||||||
static int getPoryScriptLineNumber(QString text, const QString &scriptLabel);
|
static int getPoryScriptLineNumber(QString text, const QString &scriptLabel);
|
||||||
|
static QStringList getGlobalScriptLabels(const QString &filePath);
|
||||||
|
static QStringList getGlobalRawScriptLabels(QString text);
|
||||||
|
static QStringList getGlobalPoryScriptLabels(QString text);
|
||||||
static QString &removeStringLiterals(QString &text);
|
static QString &removeStringLiterals(QString &text);
|
||||||
static QString &removeLineComments(QString &text, const QString &commentSymbol);
|
static QString &removeLineComments(QString &text, const QString &commentSymbol);
|
||||||
static QString &removeLineComments(QString &text, const QStringList &commentSymbols);
|
static QString &removeLineComments(QString &text, const QStringList &commentSymbols);
|
||||||
|
@ -74,6 +77,12 @@ private:
|
||||||
QList<Token> generatePostfix(QList<Token> tokens);
|
QList<Token> generatePostfix(QList<Token> tokens);
|
||||||
int evaluatePostfix(QList<Token> postfix);
|
int evaluatePostfix(QList<Token> postfix);
|
||||||
void error(QString message, QString expression);
|
void error(QString message, QString expression);
|
||||||
|
|
||||||
|
static const QRegularExpression re_incScriptLabel;
|
||||||
|
static const QRegularExpression re_globalIncScriptLabel;
|
||||||
|
static const QRegularExpression re_poryScriptLabel;
|
||||||
|
static const QRegularExpression re_globalPoryScriptLabel;
|
||||||
|
static const QRegularExpression re_poryRawSection;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PARSEUTIL_H
|
#endif // PARSEUTIL_H
|
||||||
|
|
|
@ -6,6 +6,12 @@
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QStack>
|
#include <QStack>
|
||||||
|
|
||||||
|
const QRegularExpression ParseUtil::re_incScriptLabel("\\b(?<label>[\\w_][\\w\\d_]*):{1,2}");
|
||||||
|
const QRegularExpression ParseUtil::re_globalIncScriptLabel("\\b(?<label>[\\w_][\\w\\d_]*)::");
|
||||||
|
const QRegularExpression ParseUtil::re_poryScriptLabel("\\b(script)(\\((global|local)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
||||||
|
const QRegularExpression ParseUtil::re_globalPoryScriptLabel("\\b(script)(\\((global)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
||||||
|
const QRegularExpression ParseUtil::re_poryRawSection("\\b(raw)\\s*`(?<raw_script>[^`]*)");
|
||||||
|
|
||||||
ParseUtil::ParseUtil()
|
ParseUtil::ParseUtil()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -437,7 +443,6 @@ int ParseUtil::getRawScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
removeStringLiterals(text);
|
removeStringLiterals(text);
|
||||||
removeLineComments(text, "@");
|
removeLineComments(text, "@");
|
||||||
|
|
||||||
static const QRegularExpression re_incScriptLabel("\\b(?<label>[\\w_][\\w\\d_]*):{1,2}");
|
|
||||||
QRegularExpressionMatchIterator it = re_incScriptLabel.globalMatch(text);
|
QRegularExpressionMatchIterator it = re_incScriptLabel.globalMatch(text);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
const QRegularExpressionMatch match = it.next();
|
const QRegularExpressionMatch match = it.next();
|
||||||
|
@ -452,7 +457,6 @@ int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
removeStringLiterals(text);
|
removeStringLiterals(text);
|
||||||
removeLineComments(text, {"//", "#"});
|
removeLineComments(text, {"//", "#"});
|
||||||
|
|
||||||
static const QRegularExpression re_poryScriptLabel("\\b(script)(\\((global|local)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
|
||||||
QRegularExpressionMatchIterator it = re_poryScriptLabel.globalMatch(text);
|
QRegularExpressionMatchIterator it = re_poryScriptLabel.globalMatch(text);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
const QRegularExpressionMatch match = it.next();
|
const QRegularExpressionMatch match = it.next();
|
||||||
|
@ -460,7 +464,6 @@ int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
return text.left(match.capturedStart("label")).count('\n') + 1;
|
return text.left(match.capturedStart("label")).count('\n') + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const QRegularExpression re_poryRawSection("\\b(raw)\\s*`(?<raw_script>[^`]*)");
|
|
||||||
QRegularExpressionMatchIterator raw_it = re_poryRawSection.globalMatch(text);
|
QRegularExpressionMatchIterator raw_it = re_poryRawSection.globalMatch(text);
|
||||||
while (raw_it.hasNext()) {
|
while (raw_it.hasNext()) {
|
||||||
const QRegularExpressionMatch match = raw_it.next();
|
const QRegularExpressionMatch match = raw_it.next();
|
||||||
|
@ -472,6 +475,47 @@ int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList ParseUtil::getGlobalScriptLabels(const QString &filePath) {
|
||||||
|
if (filePath.endsWith(".inc") || filePath.endsWith(".s"))
|
||||||
|
return getGlobalRawScriptLabels(readTextFile(filePath));
|
||||||
|
else if (filePath.endsWith(".pory"))
|
||||||
|
return getGlobalPoryScriptLabels(readTextFile(filePath));
|
||||||
|
|
||||||
|
return { };
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ParseUtil::getGlobalRawScriptLabels(QString text) {
|
||||||
|
removeStringLiterals(text);
|
||||||
|
removeLineComments(text, "@");
|
||||||
|
|
||||||
|
auto rawScriptLabels = QStringList();
|
||||||
|
|
||||||
|
QRegularExpressionMatchIterator it = re_globalIncScriptLabel.globalMatch(text);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
const QRegularExpressionMatch match = it.next();
|
||||||
|
rawScriptLabels << match.captured("label");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rawScriptLabels;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ParseUtil::getGlobalPoryScriptLabels(QString text) {
|
||||||
|
removeStringLiterals(text);
|
||||||
|
removeLineComments(text, {"//", "#"});
|
||||||
|
|
||||||
|
auto poryScriptLabels = QStringList();
|
||||||
|
|
||||||
|
QRegularExpressionMatchIterator it = re_globalPoryScriptLabel.globalMatch(text);
|
||||||
|
while (it.hasNext())
|
||||||
|
poryScriptLabels << it.next().captured("label");
|
||||||
|
|
||||||
|
QRegularExpressionMatchIterator raw_it = re_poryRawSection.globalMatch(text);
|
||||||
|
while (raw_it.hasNext())
|
||||||
|
poryScriptLabels << getGlobalRawScriptLabels(raw_it.next().captured("raw_script"));
|
||||||
|
|
||||||
|
return poryScriptLabels;
|
||||||
|
}
|
||||||
|
|
||||||
QString &ParseUtil::removeStringLiterals(QString &text) {
|
QString &ParseUtil::removeStringLiterals(QString &text) {
|
||||||
static const QRegularExpression re_string("\".*\"");
|
static const QRegularExpression re_string("\".*\"");
|
||||||
return text.remove(re_string);
|
return text.remove(re_string);
|
||||||
|
|
Loading…
Reference in a new issue