mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 13:30:26 +02:00
Comments in PEG
module/ice-9/peg/string-peg.scm: add comments explaining the format of some of the parsed PEG forms.
This commit is contained in:
parent
cdeb5a7826
commit
680f1dee0c
1 changed files with 16 additions and 5 deletions
|
@ -125,7 +125,10 @@ RB < ']'
|
||||||
(peg-parser (syntax->datum #'str) x)))))
|
(peg-parser (syntax->datum #'str) x)))))
|
||||||
(define define-grammar-f peg-parser)
|
(define define-grammar-f peg-parser)
|
||||||
|
|
||||||
;; Parse a nonterminal and pattern listed in LST.
|
;; lst has format (nonterm grabber pattern), where
|
||||||
|
;; nonterm is a symbol (the name of the nonterminal),
|
||||||
|
;; grabber is a string (either "<", "<-" or "<--"), and
|
||||||
|
;; pattern is the parse of a PEG pattern expressed as as string.
|
||||||
(define (peg-nonterm->defn lst for-syntax)
|
(define (peg-nonterm->defn lst for-syntax)
|
||||||
(let* ((nonterm (car lst))
|
(let* ((nonterm (car lst))
|
||||||
(grabber (cadr lst))
|
(grabber (cadr lst))
|
||||||
|
@ -139,20 +142,28 @@ RB < ']'
|
||||||
(else (datum->syntax for-syntax 'none)))
|
(else (datum->syntax for-syntax 'none)))
|
||||||
#,(compressor (peg-pattern->defn pattern for-syntax) for-syntax))))
|
#,(compressor (peg-pattern->defn pattern for-syntax) for-syntax))))
|
||||||
|
|
||||||
;; Parse a pattern.
|
;; lst has format ('peg-pattern ...).
|
||||||
|
;; After the context-flatten, (cdr lst) has format
|
||||||
|
;; (('peg-alternative ...) ...), where the outer list is a collection
|
||||||
|
;; of elements from a '/' alternative.
|
||||||
(define (peg-pattern->defn lst for-syntax)
|
(define (peg-pattern->defn lst for-syntax)
|
||||||
#`(or #,@(map (lambda (x) (peg-alternative->defn x for-syntax))
|
#`(or #,@(map (lambda (x) (peg-alternative->defn x for-syntax))
|
||||||
(context-flatten (lambda (x) (eq? (car x) 'peg-alternative))
|
(context-flatten (lambda (x) (eq? (car x) 'peg-alternative))
|
||||||
(cdr lst)))))
|
(cdr lst)))))
|
||||||
|
|
||||||
;; Parse an alternative.
|
;; lst has format ('peg-alternative ...).
|
||||||
|
;; After the context-flatten, (cdr lst) has the format
|
||||||
|
;; (item ...), where each item has format either ("!" ...), ("&" ...),
|
||||||
|
;; or ('peg-suffix ...).
|
||||||
(define (peg-alternative->defn lst for-syntax)
|
(define (peg-alternative->defn lst for-syntax)
|
||||||
#`(and #,@(map (lambda (x) (peg-body->defn x for-syntax))
|
#`(and #,@(map (lambda (x) (peg-body->defn x for-syntax))
|
||||||
(context-flatten (lambda (x) (or (string? (car x))
|
(context-flatten (lambda (x) (or (string? (car x))
|
||||||
(eq? (car x) 'peg-suffix)))
|
(eq? (car x) 'peg-suffix)))
|
||||||
(cdr lst)))))
|
(cdr lst)))))
|
||||||
|
|
||||||
;; Parse a body.
|
;; lst has the format either
|
||||||
|
;; ("!" ('peg-suffix ...)), ("&" ('peg-suffix ...)), or
|
||||||
|
;; ('peg-suffix ...).
|
||||||
(define (peg-body->defn lst for-syntax)
|
(define (peg-body->defn lst for-syntax)
|
||||||
(cond
|
(cond
|
||||||
((equal? (car lst) "&")
|
((equal? (car lst) "&")
|
||||||
|
@ -163,7 +174,7 @@ RB < ']'
|
||||||
(peg-suffix->defn lst for-syntax))
|
(peg-suffix->defn lst for-syntax))
|
||||||
(else `(peg-parse-body-fail ,lst))))
|
(else `(peg-parse-body-fail ,lst))))
|
||||||
|
|
||||||
;; Parse a suffix.
|
;; lst has format ('peg-suffix <peg-primary> (? (/ "*" "?" "+")))
|
||||||
(define (peg-suffix->defn lst for-syntax)
|
(define (peg-suffix->defn lst for-syntax)
|
||||||
(let ((inner-defn (peg-primary->defn (cadr lst) for-syntax)))
|
(let ((inner-defn (peg-primary->defn (cadr lst) for-syntax)))
|
||||||
(cond
|
(cond
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue