base functional unit tests for transpiler

This commit is contained in:
jorenchik
2024-11-10 11:03:09 +02:00
parent 084f6afb13
commit f7f3ac5d4c
8 changed files with 481 additions and 32 deletions

View File

@@ -23,14 +23,14 @@ bool sof;
/*
* TODO
*/
void trimString(std::string &str, std::string trimChars) {
void trimString(std::string *str, std::string trimChars) {
// Noņem kreisās puses simbolus.
int padSize = 0;
bool pad = false;
for (size_t i = 0; i < str.size(); ++i) {
for (size_t i = 0; i < str->size(); ++i) {
for (size_t k = 0; k < trimChars.size(); ++k) {
if (str[i] == trimChars[k]) {
if ((*str)[i] == trimChars[k]) {
padSize++;
pad = true;
break;
@@ -42,15 +42,15 @@ void trimString(std::string &str, std::string trimChars) {
pad = false;
}
if (padSize > 0) {
str.erase(0, padSize);
str->erase(0, padSize);
}
// Noņem labās puses simbolus.
padSize = 0;
pad = false;
for (size_t i = str.size(); i-- > 0;) {
for (size_t i = str->size(); i-- > 0;) {
for (size_t k = 0; k < trimChars.size(); ++k) {
if (str[i] == trimChars[k]) {
if ((*str)[i] == trimChars[k]) {
padSize++;
pad = true;
break;
@@ -62,7 +62,7 @@ void trimString(std::string &str, std::string trimChars) {
pad = false;
}
if (padSize > 0) {
str.erase(str.end() - padSize, str.end());
str->erase(str->end() - padSize, str->end());
}
}
@@ -79,7 +79,7 @@ void tokenWithBuffer(
std::string token(buffer.end() - tokenLen, buffer.end());
if (buffer.size() > tokenLen) {
std::string prevFragment(buffer.begin(), buffer.end() - tokenLen);
trimString(prevFragment, " \n\t");
trimString(&prevFragment, " \n\t");
if (prevFragment.length() > 0) {
tokens.push_back(Token{
textType,

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>clang_version</key>
<string>clang version 18.1.8</string>
<key>diagnostics</key>
<array>
</array>
<key>files</key>
<array>
</array>
</dict>
</plist>

14
src/transpiler/main.plist Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>clang_version</key>
<string>clang version 18.1.8</string>
<key>diagnostics</key>
<array>
</array>
<key>files</key>
<array>
</array>
</dict>
</plist>

View File

@@ -144,25 +144,18 @@ Result<ParseInfo> parseQuestions(const std::vector<Token>& tokens) {
};
if (isInBounds(i) && tokens[i].tokenType == TokenType::TextFragment) {
try {
auto parseToUTCTime = [](const std::string datetime, std::string format) {
std::tm tm = {};
std::istringstream ss(datetime);
ss >> std::get_time(&tm, format.c_str());
if (ss.fail()) {
throw std::runtime_error("Neizdevās nolasīt datuma un laiku");
}
std::time_t time = timegm(&tm);
return time;
};
time = parseToUTCTime(tokens[i].content.c_str(), "%d.%m.%Y %H:%M");
} catch (std::exception e) {
const std::string format = "%d.%m.%Y %H:%M";
const std::string datetime = tokens[i].content.c_str();
std::tm tm = {};
std::istringstream ss(datetime);
ss >> std::get_time(&tm, format.c_str());
if (ss.fail()) {
return makeResult(
e.what(),
"Neizdevās nolasīt datuma un laiku",
tokens[i]
);
}
time = timegm(&tm);
i++;
}
@@ -171,17 +164,17 @@ Result<ParseInfo> parseQuestions(const std::vector<Token>& tokens) {
std::string questionText;
std::vector<QuestionElement> questionElements;
double cooldown;
bool isOrderQuestion = false;
bool isGroupQuestion = false;
bool isPlusQuestion = false;
bool isOrderQuestion = false;
bool isGroupQuestion = false;
bool isPlusQuestion = false;
bool hasGroupEncountered = false;
Token questionStartToken;
// Start element parsing & add to the offset.
if (isInBounds(i + 1) && tokens[i + 1].tokenType == TokenType::ElementOrderModifier) {
return makeResult(
"Nevar izmantot secības modifikatoru ('^') jautājuma sākumā",
tokens[i + 1]
);
tokens[i + 1]);
}
questionStartToken = tokens[i];
@@ -235,6 +228,18 @@ Result<ParseInfo> parseQuestions(const std::vector<Token>& tokens) {
} else {
isDash = false;
isPlusQuestion = true;
if (isGroupQuestion) {
return makeResult(
"jautājumos ar grupām nevar būt secības elementu ('+' and ':')",
tokens[i]
);
}
if (isOrderQuestion) {
return makeResult(
"secības jautājumos nevar būt izvēles elementu ('-^' and '+')",
tokens[i]
);
}
}
if (isInBounds(i+1) && tokens[i + 1].tokenType == TokenType::ElementOrderModifier) {
isOrder = true;
@@ -247,7 +252,13 @@ Result<ParseInfo> parseQuestions(const std::vector<Token>& tokens) {
}
if (isGroupQuestion) {
return makeResult(
"jautājumos ar grupām nevar būt secības elementu ('-^' and ':')",
"jautājumos ar grupām nevar būt secības elementu ('-^' and ':')",
tokens[i]
);
}
if (isPlusQuestion) {
return makeResult(
"izvēles jautājumos nevar būt secības elementu ('+' and '-^')",
tokens[i]
);
}
@@ -259,14 +270,23 @@ Result<ParseInfo> parseQuestions(const std::vector<Token>& tokens) {
}
}
if (isInBounds(i + 2) && tokens[i + 2].tokenType == TokenType::MatchGroupEnd) {
isGroup = true;
isGroupQuestion = true;
isGroup = true;
isGroupQuestion = true;
if (!isDash) {
return makeResult(
"grupas jautājumus var definēt tikai ar svītru elementiem ('-')",
tokens[i]
);
}
if (!hasGroupEncountered) {
if (questionElements.size() > 0) {
return makeResult(
"elementi grupas jautājumā nevar eksistēt bez grupas",
tokens[i]
);
}
}
hasGroupEncountered = true;
}
QuestionElement questionElement;

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>clang_version</key>
<string>clang version 18.1.8</string>
<key>diagnostics</key>
<array>
</array>
<key>files</key>
<array>
</array>
</dict>
</plist>