pa.rkt

#426
Raw
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))))