2021-05-21 19:44:05 +00:00
|
|
|
#lang racket/base
|
|
|
|
|
2021-05-25 09:06:30 +00:00
|
|
|
(provide parse-sequence
|
|
|
|
parse-success-or-error)
|
2021-05-21 19:44:05 +00:00
|
|
|
|
|
|
|
(require racket/match)
|
|
|
|
|
|
|
|
(define-match-expander parse-sequence
|
|
|
|
(syntax-rules ()
|
|
|
|
[(_ predicate? to-list item-pat item-expr from-list target-pat)
|
|
|
|
(? predicate? (app (lambda (v)
|
|
|
|
(let loop ((inputs (to-list v)) (acc-rev '()))
|
|
|
|
(match inputs
|
|
|
|
['() (values #t (from-list (reverse acc-rev)))]
|
|
|
|
[(cons untransformed remainder)
|
|
|
|
(match untransformed
|
|
|
|
[item-pat (loop remainder (cons item-expr acc-rev))]
|
|
|
|
[_ (values #f #f)])])))
|
|
|
|
#t target-pat))]))
|
2021-05-25 09:06:30 +00:00
|
|
|
|
|
|
|
(define (parse-success-or-error parser-name parser)
|
|
|
|
(lambda (input)
|
|
|
|
(match (parser input)
|
|
|
|
[(? eof-object?) (error parser-name "Invalid input")]
|
|
|
|
[v v])))
|