This repository has been archived by the owner on Oct 26, 2023. It is now read-only.
forked from michaelballantyne/racket-peg-ee
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.rkt
81 lines (65 loc) · 2 KB
/
main.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#lang racket/base
(require
"core.rkt"
syntax/srcloc
(for-syntax racket/base syntax/parse))
(provide
(except-out (all-from-out "core.rkt") seq alt)
(struct-out parse-result)
define-peg-syntax-parser
(rename-out
[seq* seq]
[alt* alt])
?
any-char
char-range
symbol-token
string-token
predicate-token
syntax-token
use-literal-token-interpretation)
(define-syntax-rule
(define-peg-syntax-parser name clause ...)
(define-syntax name
(peg-macro
(syntax-parser
clause ...))))
(define-peg-syntax-parser seq*
[(_ p:peg) #'p]
[(_ p1:peg p+:peg ...+)
#'(seq p1 (seq* p+ ...))])
(define-peg-syntax-parser alt*
[(_ p:peg) #'p]
[(_ p1:peg p+:peg ...+)
#'(alt p1 (alt* p+ ...))])
(define-peg-syntax-parser ?
[(_ p:peg) #'(alt p eps)])
(define-peg-syntax-parser any-char
[_:id #'(char (lambda (x) #t))])
(define-peg-syntax-parser char-range
[(_ lower:character upper:character)
#'(char (lambda (c) (and (>= lower c) (<= c upper))))])
(define-peg-syntax-parser symbol-token
[(_ (~or v:string v:id))
(define/syntax-parse s (if (symbol? (syntax-e #'v))
#'v
(datum->syntax #'v (string->symbol (syntax-e #'v)))))
#'(token (lambda (t) (values (and (eq? t 's) t) #f)))])
(define-peg-syntax-parser string-token
[(_ s:string)
#'(token (lambda (t) (values (and (eq? t 's) t) #f)))])
(define-peg-syntax-parser syntax-token
[(_ x:string)
(define/syntax-parse x-sym (string->symbol (syntax->datum #'x)))
#'(token (lambda (s)
(if (equal? 'x-sym (syntax-e s))
(values s (build-source-location s))
(values #f #f))))])
(define-peg-syntax-parser predicate-token
[(_ e:expr)
#'(token (lambda (t) (values (and (e t) t) #f)))])
(define-syntax use-literal-token-interpretation
(syntax-parser
[(_ id)
(define/syntax-parse this-#%peg-datum (datum->syntax this-syntax '#%peg-datum))
#'(define-syntax this-#%peg-datum (make-rename-transformer #'id))]))