+(define (statements->clauses statements)
+ (let loop ((statements statements) (clauses '()))
+ (if (null? statements) clauses
+ (let ((s (car statements)))
+ (pmatch s
+ ((case ,test (compd-stmt (block-item-list . _)))
+ (loop (cdr statements) (append clauses (list s))))
+ ((case ,test (break))
+ (loop (cdr statements) (append clauses (list s))))
+ ((case ,test) (loop (cdr statements) (append clauses (list s))))
+
+ ((case ,test ,statement)
+ (let loop2 ((statement statement) (heads `((case ,test))))
+ (define (heads->case heads statement)
+ (if (null? heads) statement
+ (append (car heads) (list (heads->case (cdr heads) statement)))))
+ (pmatch statement
+ ((case ,t2 ,s2) (loop2 s2 (append heads `((case ,t2)))))
+ ((default ,s2) (loop2 s2 (append heads `((default)))))
+ ((compd-stmt (block-item-list . _)) (loop (cdr statements) (append clauses (list (heads->case heads statement)))))
+ (_ (let loop3 ((statements (cdr statements)) (c (list statement)))
+ (if (null? statements) (loop statements (append clauses (list (heads->case heads `(compd-stmt (block-item-list ,@c))))))
+ (let ((s (car statements)))
+ (pmatch s
+ ((case . _) (loop statements (append clauses (list (heads->case heads `(compd-stmt (block-item-list ,@c)))))))
+ ((default _) (loop statements (append clauses (list (heads->case heads `(compd-stmt (block-item-list ,@c)))))))
+ ((break) (loop (cdr statements) (append clauses (list (heads->case heads `(compd-stmt (block-item-list ,@(append c (list s)))))))))
+ (_ (loop3 (cdr statements) (append c (list s))))))))))))
+ ((default (compd-stmt (block-item-list _)))
+ (loop (cdr statements) (append clauses (list s))))
+ ((default . ,statement)
+ (let loop2 ((statements (cdr statements)) (c statement))
+ (if (null? statements) (loop statements (append clauses (list `(default ,@c))))
+ (let ((s (car statements)))
+ (pmatch s
+ ((compd-stmt (block-item-list . _)) (loop (cdr statements) (append clauses (list `(default ,s)))))
+ ((case . _) (loop statements (append clauses (list `(default (compd-stmt (block-item-list ,@c)))))))
+ ((default _) (loop statements (append clauses (list `(default (compd-stmt (block-item-list ,@c)))))))
+ ((break) (loop (cdr statements) (append clauses (list `(default (compd-stmt (block-item-list ,@(append c (list s)))))))))
+
+ (_ (loop2 (cdr statements) (append c (list s)))))))))
+ (_ (error "statements->clauses: unsupported:" s)))))))
+