Skip to content

Commit 56566d0

Browse files
Fix commentaries breaking parentheses balancing
1 parent 00c9164 commit 56566d0

18 files changed

Lines changed: 180 additions & 86 deletions

riddle.py

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -325,15 +325,21 @@ def _visit_reassign(self, node):
325325

326326
def _visit_glosure_anon(self, node):
327327
self._indent += 1
328+
body_indent = self._indent
328329
params_str, body_str = self._make_function_body(node.children[0], node.children[1])
329330
self._indent -= 1
330-
return f"(glosure ({params_str}) (begin\n{body_str}))" if body_str else f"(glosure ({params_str}) (begin))"
331+
if body_str:
332+
return f"(glosure ({params_str}) (begin\n{body_str}\n{INDENT * body_indent}))"
333+
return f"(glosure ({params_str}) (begin))"
331334

332335
def _visit_lambda_anon(self, node):
333336
self._indent += 1
337+
body_indent = self._indent
334338
params_str, body_str = self._make_function_body(node.children[0], node.children[1])
335339
self._indent -= 1
336-
return f"(lambda ({params_str}) (begin\n{body_str}))" if body_str else f"(lambda ({params_str}) (begin))"
340+
if body_str:
341+
return f"(lambda ({params_str}) (begin\n{body_str}\n{INDENT * body_indent}))"
342+
return f"(lambda ({params_str}) (begin))"
337343

338344
def _visit_return_stmt(self, node):
339345
return self._visit(node.children[0])
@@ -359,7 +365,7 @@ def _make_function_body(self, param_node, block_node):
359365
body_str = "\n".join(body_lines)
360366
return params_str, body_str
361367

362-
def _make_method(self, keyword, dotted_name, params_str, body_str):
368+
def _make_method(self, keyword, dotted_name, params_str, body_str, body_indent=0):
363369
parts = dotted_name.split(".")
364370
method_name = parts[-1]
365371
obj_parts = parts[:-1]
@@ -371,7 +377,10 @@ def _make_method(self, keyword, dotted_name, params_str, body_str):
371377
target = f"(at {target} '{part}')"
372378
set_target = target
373379
func_name = f"__{method_name}"
374-
func_body = f"(begin\n{body_str})" if body_str else "(begin)"
380+
if body_str:
381+
func_body = f"(begin\n{body_str}\n{INDENT * body_indent})"
382+
else:
383+
func_body = "(begin)"
375384
func_def = f"({keyword} {func_name} ({params_str}) {func_body})"
376385
set_line = f"(set {set_target} '{method_name}' {func_name})"
377386
idt = INDENT * self._indent
@@ -384,11 +393,15 @@ def _visit_function_def(self, node):
384393
param_node = node.children[1]
385394
block_node = node.children[2]
386395
self._indent += 1
396+
body_indent = self._indent
387397
params_str, body_str = self._make_function_body(param_node, block_node)
388398
self._indent -= 1
389399
if "." in name:
390-
return self._make_method("defunction", name, params_str, body_str)
391-
func_body = f"(begin\n{body_str})" if body_str else "(begin)"
400+
return self._make_method("defunction", name, params_str, body_str, body_indent)
401+
if body_str:
402+
func_body = f"(begin\n{body_str}\n{INDENT * body_indent})"
403+
else:
404+
func_body = "(begin)"
392405
return f"(defunction {name} ({params_str}) {func_body})"
393406

394407
def _visit_defun_def(self, node):
@@ -398,11 +411,15 @@ def _visit_defun_def(self, node):
398411
param_node = node.children[1]
399412
block_node = node.children[2]
400413
self._indent += 1
414+
body_indent = self._indent
401415
params_str, body_str = self._make_function_body(param_node, block_node)
402416
self._indent -= 1
403417
if "." in name:
404-
return self._make_method("defun", name, params_str, body_str)
405-
func_body = f"(begin\n{body_str})" if body_str else "(begin)"
418+
return self._make_method("defun", name, params_str, body_str, body_indent)
419+
if body_str:
420+
func_body = f"(begin\n{body_str}\n{INDENT * body_indent})"
421+
else:
422+
func_body = "(begin)"
406423
return f"(defun {name} ({params_str}) {func_body})"
407424

408425
def _visit_param_list(self, node):
@@ -423,8 +440,9 @@ def _visit_for_stmt(self, node):
423440
cond_str = self._visit(cond)
424441
inc_str = self._visit(inc)
425442
self._indent += 1
443+
body_indent = self._indent
426444
body_str = self._visit(body)
427-
result = f"(for {init_str} {cond_str} {inc_str} (begin\n{INDENT * self._indent}{body_str}))"
445+
result = f"(for {init_str} {cond_str} {inc_str} (begin\n{INDENT * body_indent}{body_str}\n{INDENT * body_indent}))"
428446
self._indent -= 1
429447
return result
430448

@@ -433,25 +451,28 @@ def _visit_foreach_stmt(self, node):
433451
vl = node.children[1].value
434452
expr_str = self._visit(node.children[2])
435453
self._indent += 1
454+
body_indent = self._indent
436455
body_str = self._visit(node.children[3])
437-
result = f"(foreach {idx} {vl} {expr_str} (begin\n{INDENT * self._indent}{body_str}))"
456+
result = f"(foreach {idx} {vl} {expr_str} (begin\n{INDENT * body_indent}{body_str}\n{INDENT * body_indent}))"
438457
self._indent -= 1
439458
return result
440459

441460
def _visit_while_stmt(self, node):
442461
cond = self._visit(node.children[0])
443462
self._indent += 1
463+
body_indent = self._indent
444464
body = self._visit(node.children[1])
445-
result = f"(while {cond} (begin\n{INDENT * self._indent}{body}))"
465+
result = f"(while {cond} (begin\n{INDENT * body_indent}{body}\n{INDENT * body_indent}))"
446466
self._indent -= 1
447467
return result
448468

449469
def _visit_if_stmt(self, node):
450470
children = node.children
451471
cond = self._visit(children[0])
452472
self._indent += 1
473+
then_indent = self._indent
453474
then_block = self._visit(children[1])
454-
then_result = f"(if {cond} (begin\n{INDENT * self._indent}{then_block})"
475+
then_result = f"(if {cond} (begin\n{INDENT * then_indent}{then_block}\n{INDENT * then_indent})"
455476
self._indent -= 1
456477

457478
if len(children) == 2:
@@ -460,8 +481,9 @@ def _visit_if_stmt(self, node):
460481
remaining = children[2:]
461482
if len(remaining) % 2 == 1:
462483
self._indent += 1
484+
else_indent = self._indent
463485
last_block = self._visit(remaining[-1])
464-
rest = f"(begin\n{INDENT * self._indent}{last_block})"
486+
rest = f"(begin\n{INDENT * else_indent}{last_block}\n{INDENT * else_indent})"
465487
self._indent -= 1
466488
pairs = remaining[:-1]
467489
else:
@@ -471,8 +493,9 @@ def _visit_if_stmt(self, node):
471493
for i in range(len(pairs) - 2, -1, -2):
472494
else_cond = self._visit(pairs[i])
473495
self._indent += 1
496+
else_indent = self._indent
474497
else_block = self._visit(pairs[i + 1])
475-
else_part = f"(if {else_cond} (begin\n{INDENT * self._indent}{else_block})"
498+
else_part = f"(if {else_cond} (begin\n{INDENT * else_indent}{else_block}\n{INDENT * else_indent})"
476499
self._indent -= 1
477500
if rest:
478501
rest = f"{else_part}\n{INDENT * self._indent}{rest})"

tests/commentaries.riddle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
defun Test() {
2+
// Some comment
3+
}
4+
for i = 0; i < 10; ++i {
5+
// Some comment
6+
}

tests/correct/anonymous.gls

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
;; Host anonymous function
22
((at somelist 'apply') (glosure (a1 a2) (begin
33
(defaultvalue a2 0)
4-
(print a1))))
4+
(print a1)
5+
)))
56
;; Glosure anonymous function
67
((at somelist 'apply') (lambda (a1 a2) (begin
78
(defaultvalue a2 0)
8-
(print a1))))
9+
(print a1)
10+
)))

tests/correct/branching.gls

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
;; One branch
22
(if true (begin
3-
(print true)))
3+
(print true)
4+
))
45
;; Two branches
56
(if true (begin
6-
(print true))
7+
(print true)
8+
)
79
(begin
8-
(print false)))
10+
(print false)
11+
))
912
;; Multiple branches
1013
(if true (begin
11-
(print true))
14+
(print true)
15+
)
1216
(if false (begin
13-
(print false))
17+
(print false)
18+
)
1419
(if true (begin
15-
(print true))
20+
(print true)
21+
)
1622
(begin
17-
(print false)))))
23+
(print false)
24+
))))

tests/correct/commentaries.gls

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(defun Test () (begin
2+
;; Some comment
3+
))
4+
(for (def i 0) (< i 10) (++ i) (begin
5+
;; Some comment
6+
))

tests/correct/functions.gls

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
;; Host function with zero arguments
22
(defunction HostFZero () (begin
3-
(print 'Host function with zero arguments')))
3+
(print 'Host function with zero arguments')
4+
))
45
;; Glosure function with zero arguments
56
(defun GlosureFZero () (begin
6-
(print 'Glosure function with zero arguments')))
7+
(print 'Glosure function with zero arguments')
8+
))
79
;; Host function reference
810
(print (array 'HostFZero reference' HostFZero))
911
;; Glosure function referenece
@@ -14,22 +16,26 @@
1416
(GlosureFZero)
1517
;; Host function with one argument
1618
(defunction HostFOne (a) (begin
17-
(print (array 'Host function with one argument' a))))
19+
(print (array 'Host function with one argument' a))
20+
))
1821
;; Glosure function with one argument
1922
(defun GlosureFOne (a) (begin
20-
(print (array 'Glosure function with one argument' a))))
23+
(print (array 'Glosure function with one argument' a))
24+
))
2125
;; Host function call
2226
(HostFOne 1337)
2327
;; Glosure function call
2428
(GlosureFOne 1337)
2529
;; Host function with one default argument
2630
(defunction HostFOneDefault (a) (begin
2731
(defaultvalue a 0)
28-
(print (array 'Host function with one default argument' a))))
32+
(print (array 'Host function with one default argument' a))
33+
))
2934
;; Glosure function with one default argument
3035
(defun GlosureFOneDefault (a) (begin
3136
(defaultvalue a 0)
32-
(print (array 'Glosure function with one default argument' a))))
37+
(print (array 'Glosure function with one default argument' a))
38+
))
3339
;; Host function call
3440
(HostFOneDefault)
3541
;; Glosure function call
@@ -50,12 +56,14 @@
5056
;; Namespace builtin function
5157
(defunction __Host (a b) (begin
5258
(defaultvalue b 1)
53-
(+ a b)))
59+
(+ a b)
60+
))
5461
(set (at ns 'functions') 'Host' __Host)
5562
;; Namespace Glosure function
5663
(defunction __Glosure (a b) (begin
5764
(defaultvalue b 1)
58-
(+ a b)))
65+
(+ a b)
66+
))
5967
(set (at ns 'functions') 'Glosure' __Glosure)
6068
;; Namespace builtin function call
6169
((at (at ns 'functions') 'Host') 1 2)

tests/correct/glob_include.gls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
(isa a b)
88
(gl-break-silence 'Hiiii!')
99
(if empty? (begin
10+
1011
))
1112
(effectful! 'Effects!')
1213
(! condition?)

tests/correct/include_main.gls

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
(defun greet (name) (begin
2-
(print name)))
2+
(print name)
3+
))
34
(defun add (a b) (begin
4-
(+ a b)))
5+
(+ a b)
6+
))
57
(greet 'world')
68
(add 1 2)

tests/correct/indent.gls

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@
22
(foreach index value collection (begin
33
(if condition (begin
44
(if condition (begin
5-
body)
5+
body
6+
)
67
(begin
78
(defun name (params) (begin
89
(defunction name (params) (begin
910
(lambda (params) (begin
1011
(glosure (params) (begin
11-
body))))))))))))))))
12+
body
13+
))
14+
))
15+
))
16+
))
17+
))
18+
))
19+
))
20+
))

0 commit comments

Comments
 (0)