PasteRack.org
Paste # 12889
2025-01-23 22:55:03

Fork as a new paste.

Paste viewed 359 times.


Embed:

#lang racket

(require parsack)

(module+ test
  (require
    (for-syntax syntax/parse)
    rackunit)
  
  (define-syntax (check-parse stx)
    (syntax-parse stx
      [(_ (_ p inp) expected)
       (syntax/loc #'p
         (check-equal? (parse-result p inp) expected))]))
  )

(define $p_number
  (λ (in)
    (define-values (r c pos) (port-next-location in))
    (define byte-pos (file-position in))
    (define n (read in))
    (cond
      [(number? n) (Consumed (Ok n))]
      [else (file-position in byte-pos) ; backtrack
            (set-port-next-location! in r c pos)
            (Empty (Error))])))

(define $p_arithmetic-operator
  (oneOf "+-/*")
  )

(define $p_binary-numeric
  (parser-seq
   $p_binary-numeric (~ $spaces)
   $p_arithmetic-operator (~ $spaces)
   $p_binary-numeric
   ))

(define $p_numeric
  (parser-compose
   (<or>
    (try $p_binary-numeric)
    $p_number))
  )

(module+ test
  (check-parse (parse $p_numeric "1")
               (list 1))
  )

=>

standard-module-name-resolver: collection not found
  for module path: parsack
  collection: "parsack"
  in collection directories:
   /home/pasterack/.local/share/racket/8.8/collects
   /home/pasterack/racket88/collects/
   ... [179 additional linked and package directories]
  context...:
   /home/pasterack/racket88/collects/racket/require-transform.rkt:266:2: expand-import
   /home/pasterack/racket88/collects/racket/private/reqprov.rkt:648:16
   /home/pasterack/racket88/collects/racket/private/reqprov.rkt:646:2: filter-by-mode
   /home/pasterack/racket88/collects/racket/require-transform.rkt:266:2: expand-import
   /home/pasterack/racket88/collects/racket/private/reqprov.rkt:287:21: try-next
   /home/pasterack/racket88/collects/racket/private/reqprov.rkt:401:21: try-next
   /home/pasterack/racket88/collects/racket/private/reqprov.rkt:258:2
   /home/pasterack/racket88/collects/syntax/wrap-modbeg.rkt:46:4
   /home/pasterack/racket88/share/pkgs/scribble-lib/scribble/run.rkt:175:26: go
   .../private/map.rkt:40:19: loop
   .../racket/cmdline.rkt:191:51
   body of "/home/pasterack/racket88/share/pkgs/scribble-lib/scribble/run.rkt"