mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-03 18:50:19 +02:00
peg: split define-nonterm into two functions for better readability.
* module/ice-9/peg.scm (define-nonterm): Split for readability.
This commit is contained in:
parent
add20d35be
commit
f4576d8161
1 changed files with 29 additions and 27 deletions
|
@ -365,18 +365,7 @@
|
||||||
;; the point of diminishing returns on my box.
|
;; the point of diminishing returns on my box.
|
||||||
(define *cache-size* 512)
|
(define *cache-size* 512)
|
||||||
|
|
||||||
;; Defines a new nonterminal symbol accumulating with ACCUM.
|
(define (code-for-non-cache-case matchf accumsym symsym)
|
||||||
(define-syntax define-nonterm
|
|
||||||
(lambda (x)
|
|
||||||
(syntax-case x ()
|
|
||||||
((_ sym accum match)
|
|
||||||
(let ((matchf (peg-sexp-compile (syntax->datum #'match)
|
|
||||||
(syntax->datum #'accum)))
|
|
||||||
(symsym (syntax->datum #'sym))
|
|
||||||
(accumsym (syntax->datum #'accum))
|
|
||||||
(c (datum->syntax x (gensym))));; the cache
|
|
||||||
;; CODE is the code to parse the string if the result isn't cached.
|
|
||||||
(let ((code
|
|
||||||
(safe-bind
|
(safe-bind
|
||||||
(str strlen at res body)
|
(str strlen at res body)
|
||||||
`(lambda (,str ,strlen ,at)
|
`(lambda (,str ,strlen ,at)
|
||||||
|
@ -402,7 +391,20 @@
|
||||||
((eq? accumsym 'none) `(list (car ,res) '()))
|
((eq? accumsym 'none) `(list (car ,res) '()))
|
||||||
(#t (begin res))))
|
(#t (begin res))))
|
||||||
;; If we didn't match, just return false.
|
;; If we didn't match, just return false.
|
||||||
#f))))))
|
#f)))))
|
||||||
|
|
||||||
|
;; Defines a new nonterminal symbol accumulating with ACCUM.
|
||||||
|
(define-syntax define-nonterm
|
||||||
|
(lambda (x)
|
||||||
|
(syntax-case x ()
|
||||||
|
((_ sym accum match)
|
||||||
|
(let ((matchf (peg-sexp-compile (syntax->datum #'match)
|
||||||
|
(syntax->datum #'accum)))
|
||||||
|
(symsym (syntax->datum #'sym))
|
||||||
|
(accumsym (syntax->datum #'accum))
|
||||||
|
(c (datum->syntax x (gensym))));; the cache
|
||||||
|
;; CODE is the code to parse the string if the result isn't cached.
|
||||||
|
(let ((code (code-for-non-cache-case matchf accumsym symsym)))
|
||||||
#`(begin
|
#`(begin
|
||||||
(define #,c (make-vector *cache-size* #f));; the cache
|
(define #,c (make-vector *cache-size* #f));; the cache
|
||||||
(define (sym str strlen at)
|
(define (sym str strlen at)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue