Add code block

This commit is contained in:
2026-02-28 10:56:00 +11:00
parent fbddd9a199
commit 82a127f34c
3 changed files with 76 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -26,3 +26,8 @@ puts 3 < 5
puts 10 != 3
puts 3 >= 2
puts 3 >= 3
// Put stuff inside a code block, what could possibly go wrong
{
puts "Hi from the code block!"
}