Make Parser::parseVector a function template
Signed-off-by: Username404 <w.iron.zombie@gmail.com>
This commit is contained in:
parent
c4f75a3b04
commit
68dc7ea1a1
|
@ -107,7 +107,7 @@ namespace StandardComponents {
|
||||||
explicit String(const char* string): content(string) {}
|
explicit String(const char* string): content(string) {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
struct Call: ParseTree { inline explicit Call(ParseTree&& tree) noexcept: ParseTree(move(tree)) {} };
|
struct Call: ParseTree {};
|
||||||
|
|
||||||
struct Class: NamedIdentifier {
|
struct Class: NamedIdentifier {
|
||||||
using NamedIdentifier::NamedIdentifier;
|
using NamedIdentifier::NamedIdentifier;
|
||||||
|
|
|
@ -15,14 +15,15 @@ namespace Parser {
|
||||||
const tok& token, const string& text,
|
const tok& token, const string& text,
|
||||||
const bool& quoteTokenText = false
|
const bool& quoteTokenText = false
|
||||||
) { error(token, text, token.line, quoteTokenText); }
|
) { error(token, text, token.line, quoteTokenText); }
|
||||||
ParseTree parseVector(const vector<tok>& lexed) {
|
IS(ParseTree)
|
||||||
ParseTree parseTree;
|
T parseVector(const vector<tok>& lexed) {
|
||||||
|
T parseTree;
|
||||||
using namespace StandardComponents;
|
using namespace StandardComponents;
|
||||||
using enum tok::type;
|
using enum tok::type;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
const auto nextAre = [&i, &lexed]<convertible_to<tok::type> T>(const initializer_list<T>& nextValues) -> bool {
|
const auto nextAre = [&i, &lexed]<convertible_to<tok::type> Y>(const initializer_list<Y>& nextValues) -> bool {
|
||||||
unsigned int j = 1;
|
unsigned int j = 1;
|
||||||
for (const T& nextValue: nextValues) {
|
for (const Y& nextValue: nextValues) {
|
||||||
if (!cmp_greater(lexed.size() - i, nextValues.size()) || lexed[i + j].toktype != nextValue) {
|
if (!cmp_greater(lexed.size() - i, nextValues.size()) || lexed[i + j].toktype != nextValue) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +47,7 @@ namespace Parser {
|
||||||
} else {
|
} else {
|
||||||
bool isFinalDefine = nextAre({TAG, DEFINE});
|
bool isFinalDefine = nextAre({TAG, DEFINE});
|
||||||
if (isFinalDefine || next.toktype == DEFINE) {
|
if (isFinalDefine || next.toktype == DEFINE) {
|
||||||
const optional previousDefinition = parseTree.findReferenceByName<Define>(current.toktext);
|
const optional previousDefinition = parseTree.template findReferenceByName<Define>(current.toktext);
|
||||||
if (previousDefinition.has_value()) {
|
if (previousDefinition.has_value()) {
|
||||||
if (previousDefinition.value().get().final || isFinalDefine) {
|
if (previousDefinition.value().get().final || isFinalDefine) {
|
||||||
parsingError(current, previousDefinition->get().final ? " cannot be redefined as it is final" : " cannot be made final after it has been declared", true);
|
parsingError(current, previousDefinition->get().final ? " cannot be redefined as it is final" : " cannot be made final after it has been declared", true);
|
||||||
|
@ -80,7 +81,7 @@ namespace Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (current.toktype) {
|
switch (current.toktype) {
|
||||||
case LPAR: parseTree << Call(parseVector(subTokens)); break;
|
case LPAR: parseTree << parseVector<Call>(subTokens); break;
|
||||||
case LBRACE: // TODO Add structures for class/function bodies
|
case LBRACE: // TODO Add structures for class/function bodies
|
||||||
case LBRACKET:
|
case LBRACKET:
|
||||||
default: parseTree << parseVector(subTokens); break;
|
default: parseTree << parseVector(subTokens); break;
|
||||||
|
|
Loading…
Reference in New Issue