summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-10-21 16:51:08 +0200
committerAndy Wingo <wingo@pobox.com>2019-10-21 17:21:47 +0200
commitf152d7cd961aa1637e6e71e99141ec0617e6f1ed (patch)
tree877b811a61a15d91846ae4cabd5bd128b8e20d53
parent2cca09126e8416e4b5d4be2b1edd0c9f15e0bffa (diff)
downloadguile-f152d7cd961aa1637e6e71e99141ec0617e6f1ed.tar.gz
Refactor PEG records
* module/ice-9/peg/using-parsers.scm (prec): Use SRFI-9 to define PEG record types. (peg:start, peg:end, peg:string, peg:tree, peg:substring): Implement in a more efficient way.
-rw-r--r--module/ice-9/peg/using-parsers.scm41
1 files changed, 20 insertions, 21 deletions
diff --git a/module/ice-9/peg/using-parsers.scm b/module/ice-9/peg/using-parsers.scm
index 076de2999..359527c57 100644
--- a/module/ice-9/peg/using-parsers.scm
+++ b/module/ice-9/peg/using-parsers.scm
@@ -21,10 +21,30 @@
#:use-module (ice-9 peg simplify-tree)
#:use-module (ice-9 peg codegen)
#:use-module (ice-9 peg cache)
+ #:use-module (srfi srfi-9)
#:export (match-pattern define-peg-pattern search-for-pattern
prec make-prec peg:start peg:end peg:string
peg:tree peg:substring peg-record?))
+(define-record-type prec
+ (make-prec start end string tree)
+ peg-record?
+ (start prec-start)
+ (end prec-end)
+ (string prec-string)
+ (tree prec-tree))
+
+(define (peg:start pm)
+ (and pm (prec-start pm)))
+(define (peg:end pm)
+ (and pm (prec-end pm)))
+(define (peg:string pm)
+ (and pm (prec-string pm)))
+(define (peg:tree pm)
+ (and pm (prec-tree pm)))
+(define (peg:substring pm)
+ (and pm (substring (prec-string pm) (prec-start pm) (prec-end pm))))
+
;;;
;;; Helper Macros
;;;
@@ -93,24 +113,3 @@ execute the STMTs and try again."
(make-prec
at end string
(string-collapse match))))))))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;; PMATCH STRUCTURE MUNGING
-;; Pretty self-explanatory.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(define prec
- (make-record-type "peg" '(start end string tree)))
-(define make-prec
- (record-constructor prec '(start end string tree)))
-(define (peg:start pm)
- (if pm ((record-accessor prec 'start) pm) #f))
-(define (peg:end pm)
- (if pm ((record-accessor prec 'end) pm) #f))
-(define (peg:string pm)
- (if pm ((record-accessor prec 'string) pm) #f))
-(define (peg:tree pm)
- (if pm ((record-accessor prec 'tree) pm) #f))
-(define (peg:substring pm)
- (if pm (substring (peg:string pm) (peg:start pm) (peg:end pm)) #f))
-(define peg-record? (record-predicate prec))