pa.rkt
#426
- Author
- winny
- Created
- Feb. 8, 2022, 5:35 p.m.
- Expires
- Never
- Size
- 1.6Â KB
- Hits
- 205
- Syntax
- Racket
- Private
- â No
#lang racket
(require megaparsack
megaparsack/text
data/monad
data/applicative
data/either)
(define letters+maybe-digit/p
(do [xs <- (many/p letter/p)]
[t <- (or/p (try/p letter/p) digit/p)]
(pure (list->string (append xs (list t))))))
(module+ test
(require rackunit)
(test-equal? "With digit"
(parse-string letters+maybe-digit/p "abc3")
(success "abc3"))
(test-equal? "Withuot digit"
(parse-string letters+maybe-digit/p "abc")
(success "abc")))
(define (reversed-paren-group/p p)
(do (char/p #\))
(many/p space/p)
[ret <- (many/p p #:sep (many/p space/p #:min 1))]
(many/p space/p)
(char/p #\()
(pure ret)))
(module+ test
(test-equal? "Empty group"
(parse-string (reversed-paren-group/p letter/p) ")(")
(success empty))
(test-equal? "Empty group with whitespace"
(parse-string (reversed-paren-group/p letter/p) ") (")
(success empty))
(test-equal? "Group with contents"
(parse-string (reversed-paren-group/p letter/p) ")a b(")
(success (list #\a #\b)))
(test-equal? "Group with contents and prefix space"
(parse-string (reversed-paren-group/p letter/p) ") a b(")
(success (list #\a #\b)))
;; This test fails with (failure (message (srcloc 'string 1 7 8 1) #\( '("whitespace" "letter")))
(test-equal? "Group with contents and suffix space"
(parse-string (reversed-paren-group/p letter/p) ")a b (")
(success (list #\a #\b))))