Add transpilation of strings to lua-compatible ones, and fix a comment
This commit is contained in:
parent
5d4be1039d
commit
1992e1d42b
@ -20,7 +20,6 @@ struct ParseComponent {
|
||||
};
|
||||
|
||||
namespace StandardComponents {
|
||||
struct [[deprecated]] Expression: ParseComponent {};
|
||||
struct NamedIdentifier: public ParseComponent {
|
||||
const string name;
|
||||
explicit NamedIdentifier(string_view nameText): name(nameText) {}
|
||||
@ -41,7 +40,7 @@ namespace StandardComponents {
|
||||
};
|
||||
namespace types {
|
||||
struct String: ParseComponent {
|
||||
const char* content;
|
||||
const string content;
|
||||
explicit String(const char* string): content(string) {}
|
||||
};
|
||||
}
|
||||
|
@ -15,7 +15,6 @@ namespace Parser {
|
||||
ParseTree parseTree;
|
||||
using namespace StandardComponents;
|
||||
using enum tok::type;
|
||||
if (lexed.size() > 1) {
|
||||
unsigned int i = 0;
|
||||
const auto nextAre = [&i, &lexed](convertible_to<unsigned int> auto nextValues,...) {
|
||||
va_list argumentsList;
|
||||
@ -29,8 +28,8 @@ namespace Parser {
|
||||
va_end(argumentsList);
|
||||
return true;
|
||||
};
|
||||
for (;i < lexed.size() - 1; ++i) {
|
||||
const auto& current = lexed[i], next = lexed[i + 1];
|
||||
for (;i < lexed.size(); ++i) {
|
||||
const tok& current = lexed[i], next = (i != lexed.size() - 1) ? lexed[i + 1] : tok(UNEXPECTED, string(), current.line);
|
||||
|
||||
switch (current.toktype) {
|
||||
case STRING: parseTree << types::String(current.toktext.data()); break;
|
||||
@ -54,7 +53,6 @@ namespace Parser {
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
} else throw ParsingException("At least 2 tokens must be provided");
|
||||
return parseTree;
|
||||
}
|
||||
}
|
||||
|
@ -5,9 +5,35 @@ struct LuaTarget: Target {
|
||||
void on(const StandardComponents::Define &parseComponent) override {
|
||||
if (parseComponent.final) output << "local ";
|
||||
output << parseComponent.name;
|
||||
if (parseComponent.final) output << " <const>"; // TODO Find an alternative to <const> for lua >5.4
|
||||
if (parseComponent.final) output << " <const>"; // TODO Find an alternative to <const> for lua <5.4
|
||||
output << " = ";
|
||||
}
|
||||
void on(const StandardComponents::types::String &parseComponent) override {
|
||||
const string_view view (parseComponent.content);
|
||||
vector<size_t> interpolationVector;
|
||||
const string interpolationString = "${";
|
||||
unsigned long occurence_position = view.find(interpolationString);
|
||||
while (occurence_position != string_view::npos) {
|
||||
interpolationVector.push_back(occurence_position);
|
||||
occurence_position = view.find(interpolationString, occurence_position + interpolationString.size());
|
||||
}
|
||||
const bool multiline = view.find('\n') != string_view::npos;
|
||||
const char* openCharacters = multiline ? "[[" : "\"";
|
||||
decltype(openCharacters) closeCharacters = multiline ? "]]" : "\"";
|
||||
if (not interpolationVector.empty()) {
|
||||
unsigned long closingBrace = 0;
|
||||
for (unsigned long i = 0; cmp_less(i, interpolationVector.size()); ++i) {
|
||||
const auto& occurence = interpolationVector[i];
|
||||
if (i > 0) output << "..";
|
||||
output << openCharacters << view.substr((i > 0) ? closingBrace + 1 : 0, occurence - (closingBrace + 1)) << closeCharacters;
|
||||
closingBrace = view.find_first_of('}', occurence);
|
||||
if (closingBrace == string_view::npos) {
|
||||
throw Yerbacon::Exception("Closing brace missing in a string");
|
||||
}
|
||||
output << ".." << view.substr(occurence + interpolationString.size(), (closingBrace - occurence) - interpolationString.size());
|
||||
}
|
||||
} else output << openCharacters << view << closeCharacters << '\n';
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
@ -31,7 +31,7 @@ int main(int argc, char* argv[]) {
|
||||
else if (currentArg.ends_with(".ybcon")) files.push_back(currentArg);
|
||||
}
|
||||
const auto compile = [&target](string_view name) {
|
||||
const string transpiledString = transpile(parseString(getFileContent(name.data())), target);
|
||||
string transpiledString = transpile(parseString(getFileContent(name.data())), target);
|
||||
name.remove_suffix(6);
|
||||
string outputFile;
|
||||
(outputFile = name).append(target);
|
||||
|
Loading…
Reference in New Issue
Block a user