44 lines
1.4 KiB
C
44 lines
1.4 KiB
C
#include "parser.h"
|
|
#include "SolsNode.h"
|
|
|
|
#include "../include/estr.h"
|
|
|
|
ResultType(SolsParser, charptr) createSolsParser(SolsTokens* input) {
|
|
ResultType(SolsNode, charptr) node = createSolsNode(SNT_ROOT);
|
|
if (node.error) {
|
|
Estr str = CREATE_ESTR(node.as.error);
|
|
APPEND_ESTR(str, " (in createSolsParser() function)");
|
|
}
|
|
SolsParser parser = {
|
|
.input = input,
|
|
.current = 0,
|
|
.output = node.as.success
|
|
};
|
|
parser.currentParent = &parser.output;
|
|
return Success(SolsParser, charptr, parser);
|
|
}
|
|
|
|
ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
|
return Error(Nothing, charptr, "Work in progress");
|
|
}
|
|
|
|
ResultType(SolsToken, Nothing) parserPeek(SolsParser* parser, size_t ahead) {
|
|
if (parser->input == NULL) {
|
|
return Error(SolsToken, Nothing, {});
|
|
}
|
|
if (parser->current + ahead - 1 >= parser->input->count) {
|
|
return Error(SolsToken, Nothing, {});
|
|
}
|
|
return Success(SolsToken, Nothing, parser->input->at[parser->current + ahead - 1]);
|
|
}
|
|
|
|
ResultType(SolsToken, Nothing) parserConsume(SolsParser* parser) {
|
|
if (parser->input == NULL) {
|
|
return Error(SolsToken, Nothing, {});
|
|
}
|
|
if (parser->current + 1 >= parser->input->count) {
|
|
return Error(SolsToken, Nothing, {});
|
|
}
|
|
return Success(SolsToken, Nothing, parser->input->at[parser->current ++]);
|
|
}
|