diff --git a/src/codegen/codegen.c b/src/codegen/codegen.c index ce8f95d..842a2d5 100644 --- a/src/codegen/codegen.c +++ b/src/codegen/codegen.c @@ -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); } diff --git a/src/parser/parser.c b/src/parser/parser.c index 5892327..4e6ebf6 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -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) { diff --git a/test.sols b/test.sols index b18490b..1e7b0c0 100644 --- a/test.sols +++ b/test.sols @@ -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!" +}