PasteRack.org
Paste # 10495
2025-02-19 18:57:09

Fork as a new paste.

Paste viewed 62 times.


Embed:

#lang racket

(require (for-syntax syntax/parse)
         parser-tools/lex
         (prefix-in : parser-tools/lex-sre)
         megaparsack
         megaparsack/parser-tools/lex
         rackunit
         )

(define-syntax (check-parse stx)
  (syntax-parse stx
    [(_ parser str check-expr)
     (syntax/loc #'str
       (check-equal? (parse-result! (parse-tokens parser
                                      (lex str)
                                      ))
                     check-expr
                     ))]))

(define-tokens simple [IDENTIFIER])
(define-empty-tokens simple* [EOF])
(define-lex-abbrevs
  (lower-letter (:/ "a" "z"))
  (upper-letter (:/ #\A #\Z))
  (letter (:or lower-letter upper-letter ))
  (digit (:/ "0" "9"))
  )

(define syntax-lexer
  (lexer-src-pos
   [(eof) eof]
   [(:: letter
        (:* letter digit #\_ #\-))
    (token-IDENTIFIER (string->symbol lexeme))]
   ))

(define (lex str)
  (define in (open-input-string str))
  (port-count-lines! in)
  (let loop ([syntax-v (syntax-lexer in)])
    (let ([tok (position-token-token syntax-v)])
      (cond
        [(eof-object? tok) '()]
        [else
         (cons syntax-v
               (loop (syntax-lexer in)))]
        ))))



(define identifier/p (syntax/p (token/p 'IDENTIFIER)))

(check-parse identifier/p "asdf"
             (datum->syntax #f 'asdf))

=>

standard-module-name-resolver: collection not found
  for module path: megaparsack
  collection: "megaparsack"
  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"