aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-07-06 03:57:37 +0200
committerMel <mel@rnrd.eu>2025-07-06 03:57:37 +0200
commit660808af50780dae5292c8064d5bddd77246c52b (patch)
treee8ee1f609977e116c0766b2344310f682bbe639a
parentebd176b8e7eb14060375a28d6ac50500d9d2c808 (diff)
downloadcatskill-660808af50780dae5292c8064d5bddd77246c52b.tar.zst
catskill-660808af50780dae5292c8064d5bddd77246c52b.zip
Correct handling of empty block nodes
Signed-off-by: Mel <mel@rnrd.eu>
-rw-r--r--boot/parse.c6
-rw-r--r--boot/tests/parse/empty_block.cskt33
-rw-r--r--boot/tests/parse/variadic_parameters.cskt3
-rw-r--r--boot/visit.c15
4 files changed, 48 insertions, 9 deletions
diff --git a/boot/parse.c b/boot/parse.c
index cd5f019..264cf45 100644
--- a/boot/parse.c
+++ b/boot/parse.c
@@ -223,7 +223,11 @@ parser_block_node(struct Parser* p, struct Parser_Error* error)
while (!parser_probe(p, TOKEN_CURLY_CLOSE)) {
struct Statement* statement = CHECK_RETURN(parser_statement(p, error), struct Block_Node);
- CHECK_RETURN(parser_end_statement(p, error), struct Block_Node);
+
+ // statement ending token isn't required when the block ends on the same line,
+ // as in e.g.: `if (true) { print("yes") }`
+ if (!parser_probe(p, TOKEN_CURLY_CLOSE))
+ CHECK_RETURN(parser_end_statement(p, error), struct Block_Node);
if (!head) {
head = statement;
diff --git a/boot/tests/parse/empty_block.cskt b/boot/tests/parse/empty_block.cskt
new file mode 100644
index 0000000..c3a203a
--- /dev/null
+++ b/boot/tests/parse/empty_block.cskt
@@ -0,0 +1,33 @@
+check for correct handling of empty blocks
+
+<<<
+
+{
+
+}
+
+{ {} }
+{{{}}}
+
+{
+{
+}
+}
+
+{}
+
+>>>
+
+(block)
+(block
+ (block)
+)
+(block
+ (block
+ (block)
+ )
+)
+(block
+ (block)
+)
+(block) \ No newline at end of file
diff --git a/boot/tests/parse/variadic_parameters.cskt b/boot/tests/parse/variadic_parameters.cskt
index 3b718a1..e002c93 100644
--- a/boot/tests/parse/variadic_parameters.cskt
+++ b/boot/tests/parse/variadic_parameters.cskt
@@ -9,5 +9,4 @@ printf = fun (format string, ...args any) {
>>>
-(expr (binary = (expr (name printf)) (expr (function (param format) (type name string) (param args) (type variadic name any) (block
-))))) \ No newline at end of file
+(expr (binary = (expr (name printf)) (expr (function (param format) (type name string) (param args) (type variadic name any) (block))))) \ No newline at end of file
diff --git a/boot/visit.c b/boot/visit.c
index 781c227..68e95bf 100644
--- a/boot/visit.c
+++ b/boot/visit.c
@@ -984,14 +984,17 @@ printer_visit_block_node(struct Visit* visit, struct Block_Node* node)
{
TREE_PRINTER_PREAMBLE
- PRINT("(block\n");
- printer->indentation_level++;
- FOR_EACH (struct Statement*, statement, node->statements) {
- VISIT(visit_statement, statement);
+ PRINT("(block");
+ if (node->statements) {
PRINT("\n");
+ printer->indentation_level++;
+ FOR_EACH (struct Statement*, statement, node->statements) {
+ VISIT(visit_statement, statement);
+ PRINT("\n");
+ }
+ printer->indentation_level--;
+ tree_printer_indent(printer);
}
- printer->indentation_level--;
- tree_printer_indent(printer);
PRINT(")");
}