Add code block
This commit is contained in:
@@ -554,6 +554,12 @@ static inline ResultType(GroundProgram, charptr) generateEqLesserNode(SolsNode*
|
||||
return Success(GroundProgram, charptr, gp);
|
||||
}
|
||||
|
||||
ResultType(GroundProgram, charptr) generateCodeBlockNode(SolsNode* node, SolsScope* scope) {
|
||||
// Nothing needs to be done, as children are handled by the generateCode function
|
||||
(void)node; (void)scope;
|
||||
return Success(GroundProgram, charptr, groundCreateProgram());
|
||||
}
|
||||
|
||||
ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope) {
|
||||
|
||||
GroundProgram program = groundCreateProgram();
|
||||
@@ -584,6 +590,7 @@ ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope
|
||||
case SNT_OP_EQGREATER: generate(EqGreater);
|
||||
case SNT_OP_LESSER: generate(Lesser);
|
||||
case SNT_OP_EQLESSER: generate(EqLesser);
|
||||
case SNT_CODE_BLOCK: generate(CodeBlock);
|
||||
}
|
||||
return Success(GroundProgram, charptr, program);
|
||||
}
|
||||
|
||||
@@ -941,6 +941,68 @@ static inline ResultType(Nothing, charptr) parsePuts(SolsParser* parser) {
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
static inline ResultType(Nothing, charptr) parseCodeBlock(SolsParser* parser) {
|
||||
|
||||
// Collect tokens for node
|
||||
ResultType(SolsTokens, charptr) tokens = createSolsTokens();
|
||||
if (tokens.error) {
|
||||
return Error(Nothing, charptr, tokens.as.error);
|
||||
}
|
||||
|
||||
ResultType(SolsToken, Nothing) peek = parserPeek(parser, 0);
|
||||
if (peek.error) return Error(Nothing, charptr, "ruh roh");
|
||||
|
||||
size_t bracketCount = 1;
|
||||
for (;;) {
|
||||
ResultType(SolsToken, Nothing) peek = parserPeek(parser, 1);
|
||||
if (peek.error) return Error(Nothing, charptr, "Expecting closing curly brace (})");
|
||||
if (peek.as.success.type == STT_OPEN_CURLY) {
|
||||
bracketCount++;
|
||||
}
|
||||
if (peek.as.success.type == STT_CLOSE_CURLY) {
|
||||
bracketCount--;
|
||||
if (bracketCount < 1) {
|
||||
parserConsume(parser);
|
||||
break;
|
||||
}
|
||||
}
|
||||
parserConsume(parser);
|
||||
addTokenToSolsTokens(&tokens.as.success, peek.as.success);
|
||||
}
|
||||
|
||||
// Create node
|
||||
ResultType(SolsNode, charptr) node = createSolsNode(SNT_CODE_BLOCK);
|
||||
if (node.error) return Error(Nothing, charptr, node.as.error);
|
||||
node.as.success.line = peek.as.success.line;
|
||||
|
||||
// Parse selected tokens
|
||||
ResultType(SolsParser, charptr) codeBlockParser = createSolsParser(&tokens.as.success);
|
||||
if (codeBlockParser.error) {
|
||||
return Error(Nothing, charptr, codeBlockParser.as.error);
|
||||
}
|
||||
codeBlockParser.as.success.currentParent = &codeBlockParser.as.success.output;
|
||||
ResultType(Nothing, charptr) parsed = parse(&codeBlockParser.as.success);
|
||||
|
||||
// Add any error messages from parsing
|
||||
if (parsed.error) {
|
||||
addToParserErrors(parser, parsed.as.error);
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
// Copy nodes into the sols node
|
||||
for (size_t i = 0; i < codeBlockParser.as.success.output.children.count; i++) {
|
||||
addChildToSolsNode(&node.as.success, codeBlockParser.as.success.output.children.at[i]);
|
||||
}
|
||||
addChildToSolsNode(parser->currentParent, node.as.success);
|
||||
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
static inline ResultType(Nothing, charptr) parseCloseCurly(SolsParser* parser) {
|
||||
(void)parser;
|
||||
return Error(Nothing, charptr, "Extra closing curly brace");
|
||||
}
|
||||
|
||||
ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
parser->currentParent = &parser->output;
|
||||
for (;;) {
|
||||
@@ -963,6 +1025,8 @@ ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
case STT_OP_LESSER: PARSER_HANDLE(Lesser);
|
||||
case STT_OP_EQGREATER: PARSER_HANDLE(EqGreater);
|
||||
case STT_OP_EQLESSER: PARSER_HANDLE(EqLesser);
|
||||
case STT_OPEN_CURLY: PARSER_HANDLE(CodeBlock);
|
||||
case STT_CLOSE_CURLY: PARSER_HANDLE(CloseCurly);
|
||||
}
|
||||
}
|
||||
if (parser->errors.count > 0) {
|
||||
|
||||
Reference in New Issue
Block a user