syntax/parse: allow zero syntax-parse clauses and zero syntax-class variants
This commit is contained in:
parent
d0d2285c4c
commit
1353d40612
|
@ -124,6 +124,9 @@ Conventions:
|
|||
;; (parse:variants x cx relsattrs variants splicing? pr es success cp0) : expr[Ans]
|
||||
(define-syntax (parse:variants stx)
|
||||
(syntax-case stx ()
|
||||
[(parse:variants x cx relsattrs () splicing? pr es success cp0 commit?)
|
||||
;; Special case: no variants
|
||||
#'(fail (failure pr es))]
|
||||
[(parse:variants x cx relsattrs (variant ...) splicing? pr es success cp0 commit?)
|
||||
#'(try (parse:variant x cx relsattrs variant splicing? pr es success cp0 commit?) ...)]))
|
||||
|
||||
|
@ -208,11 +211,14 @@ Conventions:
|
|||
#`(let ()
|
||||
local-def ...
|
||||
(parse:S x cx pattern pr es (let () . rest)))))]))
|
||||
(unless (and (stx-list? clauses-stx) (stx-pair? clauses-stx))
|
||||
(raise-syntax-error #f "expected non-empty sequence of clauses" #'ctx))
|
||||
(unless (stx-list? clauses-stx)
|
||||
(raise-syntax-error #f "expected sequence of clauses" #'ctx))
|
||||
(define alternatives
|
||||
(if (stx-pair? clauses-stx)
|
||||
(map for-clause (stx->list clauses-stx))
|
||||
(list #`(fail (failure pr es)))))
|
||||
(with-syntax ([(def ...) (append (get-txlifts-as-definitions) defs)]
|
||||
[(alternative ...)
|
||||
(map for-clause (stx->list clauses-stx))])
|
||||
[(alternative ...) alternatives])
|
||||
#`(let* ([ctx0 #,context]
|
||||
[pr (ps-empty x ctx0)]
|
||||
[es null]
|
||||
|
@ -288,14 +294,14 @@ Conventions:
|
|||
#`(let ([d (if (syntax? x) (syntax-e x) x)])
|
||||
(if (equal? d (quote datum))
|
||||
k
|
||||
(fail (failure pr (cons(expect:atom 'datum) es)))))]
|
||||
(fail (failure pr (cons (expect:atom 'datum) es)))))]
|
||||
[#s(pat:literal attrs literal input-phase lit-phase)
|
||||
#`(if (and (identifier? x)
|
||||
(free-identifier=?/phases
|
||||
x input-phase
|
||||
(quote-syntax literal) lit-phase))
|
||||
k
|
||||
(fail (failure pr (cons(expect:literal (quote-syntax literal)) es))))]
|
||||
(fail (failure pr (cons (expect:literal (quote-syntax literal)) es))))]
|
||||
[#s(pat:action attrs action subpattern)
|
||||
#'(parse:A x cx action pr es (parse:S x cx subpattern pr es k))]
|
||||
[#s(pat:head attrs head tail)
|
||||
|
|
|
@ -168,8 +168,6 @@
|
|||
[auto-nested? 'try]
|
||||
[else 'no])))
|
||||
(parse-variants rest decls splicing? expected-attrs)))
|
||||
(when (null? variants)
|
||||
(wrong-syntax #f "expected at least one variant"))
|
||||
(let ([sattrs
|
||||
(or attributes
|
||||
(intersect-sattrss (map variant-attrs variants)))])
|
||||
|
|
Loading…
Reference in New Issue
Block a user