mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
PEG Renames
* module/ice-9/peg.scm: rename 'peg-parse' to 'match-pattern' * module/ice-9/peg/string-peg.scm: same * module/ice-9/peg/using-parsers.scm: same * doc/ref/api-peg.texi: same * test-suite/tests/peg.test: same * test-suite/tests/peg.bench: same
This commit is contained in:
parent
d7e2f5e3c2
commit
8022f5023e
6 changed files with 48 additions and 48 deletions
|
@ -23,7 +23,7 @@ can either be stored in variables at compile-time by the define macros
|
||||||
explicitly at runtime with the compile functions
|
explicitly at runtime with the compile functions
|
||||||
(@code{peg-sexp-compile} and @code{peg-string-compile}).
|
(@code{peg-sexp-compile} and @code{peg-string-compile}).
|
||||||
|
|
||||||
They can then be used for either parsing (@code{peg-parse}) or searching
|
They can then be used for either parsing (@code{match-pattern}) or searching
|
||||||
(@code{search-for-pattern}). For convenience, @code{search-for-pattern}
|
(@code{search-for-pattern}). For convenience, @code{search-for-pattern}
|
||||||
also takes pattern literals in case you want to inline a simple search
|
also takes pattern literals in case you want to inline a simple search
|
||||||
(people often use regular expressions this way).
|
(people often use regular expressions this way).
|
||||||
|
@ -200,7 +200,7 @@ and
|
||||||
The most straightforward way to define a PEG is by using one of the
|
The most straightforward way to define a PEG is by using one of the
|
||||||
define macros (both of these macroexpand into @code{define}
|
define macros (both of these macroexpand into @code{define}
|
||||||
expressions). These macros bind parsing functions to variables. These
|
expressions). These macros bind parsing functions to variables. These
|
||||||
parsing functions may be invoked by @code{peg-parse} or
|
parsing functions may be invoked by @code{match-pattern} or
|
||||||
@code{search-for-pattern}, which return a PEG match record. Raw data can be
|
@code{search-for-pattern}, which return a PEG match record. Raw data can be
|
||||||
retrieved from this record with the PEG match deconstructor functions.
|
retrieved from this record with the PEG match deconstructor functions.
|
||||||
More complicated (and perhaps enlightening) examples can be found in the
|
More complicated (and perhaps enlightening) examples can be found in the
|
||||||
|
@ -231,9 +231,9 @@ as-or-bs-tag <-- as-tag/bs-tag")
|
||||||
@end lisp
|
@end lisp
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(peg-parse as-or-bs "aabbcc") @result{}
|
(match-pattern as-or-bs "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
||||||
(peg-parse as-or-bs-tag "aabbcc") @result{}
|
(match-pattern as-or-bs-tag "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: (as-or-bs-tag (as-tag aa))>
|
#<peg start: 0 end: 2 string: aabbcc tree: (as-or-bs-tag (as-tag aa))>
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -270,9 +270,9 @@ For Example, if we:
|
||||||
@end lisp
|
@end lisp
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(peg-parse as-or-bs "aabbcc") @result{}
|
(match-pattern as-or-bs "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
||||||
(peg-parse as-or-bs-tag "aabbcc") @result{}
|
(match-pattern as-or-bs-tag "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: (as-or-bs-tag (as-tag aa))>
|
#<peg start: 0 end: 2 string: aabbcc tree: (as-or-bs-tag (as-tag aa))>
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -310,7 +310,7 @@ can do the following:
|
||||||
You can use this nonterminal with all of the regular PEG functions:
|
You can use this nonterminal with all of the regular PEG functions:
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(peg-parse as "aaaaa") @result{}
|
(match-pattern as "aaaaa") @result{}
|
||||||
#<peg start: 0 end: 5 string: bbbbb tree: bbbbb>
|
#<peg start: 0 end: 5 string: bbbbb tree: bbbbb>
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -319,14 +319,14 @@ You can use this nonterminal with all of the regular PEG functions:
|
||||||
For our purposes, ``parsing'' means parsing a string into a tree
|
For our purposes, ``parsing'' means parsing a string into a tree
|
||||||
starting from the first character, while ``matching'' means searching
|
starting from the first character, while ``matching'' means searching
|
||||||
through the string for a substring. In practice, the only difference
|
through the string for a substring. In practice, the only difference
|
||||||
between the two functions is that @code{peg-parse} gives up if it can't
|
between the two functions is that @code{match-pattern} gives up if it can't
|
||||||
find a valid substring starting at index 0 and @code{search-for-pattern} keeps
|
find a valid substring starting at index 0 and @code{search-for-pattern} keeps
|
||||||
looking. They are both equally capable of ``parsing'' and ``matching''
|
looking. They are both equally capable of ``parsing'' and ``matching''
|
||||||
given those constraints.
|
given those constraints.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} peg-parse nonterm string
|
@deffn {Scheme Procedure} match-pattern nonterm string
|
||||||
Parses @var{string} using the PEG stored in @var{nonterm}. If no match
|
Parses @var{string} using the PEG stored in @var{nonterm}. If no match
|
||||||
was found, @code{peg-parse} returns false. If a match was found, a PEG
|
was found, @code{match-pattern} returns false. If a match was found, a PEG
|
||||||
match record is returned.
|
match record is returned.
|
||||||
|
|
||||||
The @code{capture-type} argument to @code{define-nonterm} allows you to
|
The @code{capture-type} argument to @code{define-nonterm} allows you to
|
||||||
|
@ -343,19 +343,19 @@ nothing
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(define-nonterm as all (+ "a"))
|
(define-nonterm as all (+ "a"))
|
||||||
(peg-parse as "aabbcc") @result{}
|
(match-pattern as "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: (as aa)>
|
#<peg start: 0 end: 2 string: aabbcc tree: (as aa)>
|
||||||
|
|
||||||
(define-nonterm as body (+ "a"))
|
(define-nonterm as body (+ "a"))
|
||||||
(peg-parse as "aabbcc") @result{}
|
(match-pattern as "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
#<peg start: 0 end: 2 string: aabbcc tree: aa>
|
||||||
|
|
||||||
(define-nonterm as none (+ "a"))
|
(define-nonterm as none (+ "a"))
|
||||||
(peg-parse as "aabbcc") @result{}
|
(match-pattern as "aabbcc") @result{}
|
||||||
#<peg start: 0 end: 2 string: aabbcc tree: ()>
|
#<peg start: 0 end: 2 string: aabbcc tree: ()>
|
||||||
|
|
||||||
(define-nonterm bs body (+ "b"))
|
(define-nonterm bs body (+ "b"))
|
||||||
(peg-parse bs "aabbcc") @result{}
|
(match-pattern bs "aabbcc") @result{}
|
||||||
#f
|
#f
|
||||||
@end lisp
|
@end lisp
|
||||||
@end deffn
|
@end deffn
|
||||||
|
@ -400,7 +400,7 @@ was found, a PEG match record is returned.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@subsubheading PEG Match Records
|
@subsubheading PEG Match Records
|
||||||
The @code{peg-parse} and @code{search-for-pattern} functions both return PEG
|
The @code{match-pattern} and @code{search-for-pattern} functions both return PEG
|
||||||
match records. Actual information can be extracted from these with the
|
match records. Actual information can be extracted from these with the
|
||||||
following functions.
|
following functions.
|
||||||
|
|
||||||
|
@ -559,7 +559,7 @@ However we define it, parsing @code{*etc-passwd*} with the @code{passwd}
|
||||||
nonterminal yields the same results:
|
nonterminal yields the same results:
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(peg:tree (peg-parse passwd *etc-passwd*)) @result{}
|
(peg:tree (match-pattern passwd *etc-passwd*)) @result{}
|
||||||
((entry "root:x:0:0:root:/root:/bin/bash")
|
((entry "root:x:0:0:root:/root:/bin/bash")
|
||||||
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
||||||
(entry "bin:x:2:2:bin:/bin:/bin/sh")
|
(entry "bin:x:2:2:bin:/bin:/bin/sh")
|
||||||
|
@ -571,7 +571,7 @@ nonterminal yields the same results:
|
||||||
However, here is something to be wary of:
|
However, here is something to be wary of:
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(peg:tree (peg-parse passwd "one entry")) @result{}
|
(peg:tree (match-pattern passwd "one entry")) @result{}
|
||||||
(entry "one entry")
|
(entry "one entry")
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -596,14 +596,14 @@ predicate that should indicate whether a given sublist is good enough
|
||||||
|
|
||||||
What we want here is @code{keyword-flatten}.
|
What we want here is @code{keyword-flatten}.
|
||||||
@lisp
|
@lisp
|
||||||
(keyword-flatten '(entry) (peg:tree (peg-parse passwd *etc-passwd*))) @result{}
|
(keyword-flatten '(entry) (peg:tree (match-pattern passwd *etc-passwd*))) @result{}
|
||||||
((entry "root:x:0:0:root:/root:/bin/bash")
|
((entry "root:x:0:0:root:/root:/bin/bash")
|
||||||
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
||||||
(entry "bin:x:2:2:bin:/bin:/bin/sh")
|
(entry "bin:x:2:2:bin:/bin:/bin/sh")
|
||||||
(entry "sys:x:3:3:sys:/dev:/bin/sh")
|
(entry "sys:x:3:3:sys:/dev:/bin/sh")
|
||||||
(entry "nobody:x:65534:65534:nobody:/nonexistent:/bin/sh")
|
(entry "nobody:x:65534:65534:nobody:/nonexistent:/bin/sh")
|
||||||
(entry "messagebus:x:103:107::/var/run/dbus:/bin/false"))
|
(entry "messagebus:x:103:107::/var/run/dbus:/bin/false"))
|
||||||
(keyword-flatten '(entry) (peg:tree (peg-parse passwd "one entry"))) @result{}
|
(keyword-flatten '(entry) (peg:tree (match-pattern passwd "one entry"))) @result{}
|
||||||
((entry "one entry"))
|
((entry "one entry"))
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ symbol for strings)..
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(define-nonterm tag-passwd all (peg "entry* !."))
|
(define-nonterm tag-passwd all (peg "entry* !."))
|
||||||
(peg:tree (peg-parse tag-passwd *etc-passwd*)) @result{}
|
(peg:tree (match-pattern tag-passwd *etc-passwd*)) @result{}
|
||||||
(tag-passwd
|
(tag-passwd
|
||||||
(entry "root:x:0:0:root:/root:/bin/bash")
|
(entry "root:x:0:0:root:/root:/bin/bash")
|
||||||
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
(entry "daemon:x:1:1:daemon:/usr/sbin:/bin/sh")
|
||||||
|
@ -622,7 +622,7 @@ symbol for strings)..
|
||||||
(entry "sys:x:3:3:sys:/dev:/bin/sh")
|
(entry "sys:x:3:3:sys:/dev:/bin/sh")
|
||||||
(entry "nobody:x:65534:65534:nobody:/nonexistent:/bin/sh")
|
(entry "nobody:x:65534:65534:nobody:/nonexistent:/bin/sh")
|
||||||
(entry "messagebus:x:103:107::/var/run/dbus:/bin/false"))
|
(entry "messagebus:x:103:107::/var/run/dbus:/bin/false"))
|
||||||
(peg:tree (peg-parse tag-passwd "one entry"))
|
(peg:tree (match-pattern tag-passwd "one entry"))
|
||||||
(tag-passwd
|
(tag-passwd
|
||||||
(entry "one entry"))
|
(entry "one entry"))
|
||||||
@end lisp
|
@end lisp
|
||||||
|
@ -742,7 +742,7 @@ number <-- [0-9]+")
|
||||||
|
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(peg:tree (peg-parse expr "1+1/2*3+(1+1)/2")) @result{}
|
(peg:tree (match-pattern expr "1+1/2*3+(1+1)/2")) @result{}
|
||||||
(sum (product (value (number "1")))
|
(sum (product (value (number "1")))
|
||||||
"+"
|
"+"
|
||||||
(sum (product
|
(sum (product
|
||||||
|
@ -799,7 +799,7 @@ PEG, it would be worth abstracting.)
|
||||||
|
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(apply parse-expr (peg:tree (peg-parse expr "1+1/2*3+(1+1)/2"))) @result{}
|
(apply parse-expr (peg:tree (match-pattern expr "1+1/2*3+(1+1)/2"))) @result{}
|
||||||
(+ 1 (+ (/ 1 (* 2 3)) (/ (+ 1 1) 2)))
|
(+ 1 (+ (/ 1 (* 2 3)) (/ (+ 1 1) 2)))
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -865,7 +865,7 @@ number <-- [0-9]+")
|
||||||
|
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(apply parse-expr (peg:tree (peg-parse expr "1+1/2*3+(1+1)/2"))) @result{}
|
(apply parse-expr (peg:tree (match-pattern expr "1+1/2*3+(1+1)/2"))) @result{}
|
||||||
(+ (+ 1 (* (/ 1 2) 3)) (/ (+ 1 1) 2))
|
(+ (+ 1 (* (/ 1 2) 3)) (/ (+ 1 1) 2))
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
@ -901,7 +901,7 @@ cSP < [ \t\n]*")
|
||||||
|
|
||||||
Then:
|
Then:
|
||||||
@lisp
|
@lisp
|
||||||
(peg-parse cfunc "int square(int a) @{ return a*a;@}") @result{}
|
(match-pattern cfunc "int square(int a) @{ return a*a;@}") @result{}
|
||||||
(32
|
(32
|
||||||
(cfunc (ctype "int")
|
(cfunc (ctype "int")
|
||||||
(cname "square")
|
(cname "square")
|
||||||
|
@ -911,7 +911,7 @@ Then:
|
||||||
|
|
||||||
And:
|
And:
|
||||||
@lisp
|
@lisp
|
||||||
(peg-parse cfunc "int mod(int a, int b) @{ int c = a/b;return a-b*c; @}") @result{}
|
(match-pattern cfunc "int mod(int a, int b) @{ int c = a/b;return a-b*c; @}") @result{}
|
||||||
(52
|
(52
|
||||||
(cfunc (ctype "int")
|
(cfunc (ctype "int")
|
||||||
(cname "mod")
|
(cname "mod")
|
||||||
|
@ -924,7 +924,7 @@ And:
|
||||||
By wrapping all the @code{carg} nonterminals in a @code{cargs}
|
By wrapping all the @code{carg} nonterminals in a @code{cargs}
|
||||||
nonterminal, we were able to remove any ambiguity in the parsing
|
nonterminal, we were able to remove any ambiguity in the parsing
|
||||||
structure and avoid having to call @code{context-flatten} on the output
|
structure and avoid having to call @code{context-flatten} on the output
|
||||||
of @code{peg-parse}. We used the same trick with the @code{cstatement}
|
of @code{match-pattern}. We used the same trick with the @code{cstatement}
|
||||||
nonterminals, wrapping them in a @code{cbody} nonterminal.
|
nonterminals, wrapping them in a @code{cbody} nonterminal.
|
||||||
|
|
||||||
The whitespace nonterminal @code{cSP} used here is a (very) useful
|
The whitespace nonterminal @code{cSP} used here is a (very) useful
|
||||||
|
@ -986,9 +986,9 @@ can be any other data the function wishes to return, or '() if it
|
||||||
doesn't have any more data.
|
doesn't have any more data.
|
||||||
|
|
||||||
The one caveat is that if the extra data it returns is a list, any
|
The one caveat is that if the extra data it returns is a list, any
|
||||||
adjacent strings in that list will be appended by @code{peg-parse}. For
|
adjacent strings in that list will be appended by @code{match-pattern}. For
|
||||||
instance, if a parsing function returns @code{(13 ("a" "b" "c"))},
|
instance, if a parsing function returns @code{(13 ("a" "b" "c"))},
|
||||||
@code{peg-parse} will take @code{(13 ("abc"))} as its value.
|
@code{match-pattern} will take @code{(13 ("abc"))} as its value.
|
||||||
|
|
||||||
For example, here is a function to match ``ab'' using the actual
|
For example, here is a function to match ``ab'' using the actual
|
||||||
interface.
|
interface.
|
||||||
|
@ -1001,7 +1001,7 @@ interface.
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
The above function can be used to match a string by running
|
The above function can be used to match a string by running
|
||||||
@code{(peg-parse match-a-b "ab")}.
|
@code{(match-pattern match-a-b "ab")}.
|
||||||
|
|
||||||
@subsubheading Code Generators and Extensible Syntax
|
@subsubheading Code Generators and Extensible Syntax
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#:use-module (ice-9 peg simplify-tree)
|
#:use-module (ice-9 peg simplify-tree)
|
||||||
#:use-module (ice-9 peg using-parsers)
|
#:use-module (ice-9 peg using-parsers)
|
||||||
#:use-module (ice-9 peg cache)
|
#:use-module (ice-9 peg cache)
|
||||||
#:re-export (peg-parse
|
#:re-export (match-pattern
|
||||||
define-nonterm
|
define-nonterm
|
||||||
search-for-pattern
|
search-for-pattern
|
||||||
peg-sexp-compile
|
peg-sexp-compile
|
||||||
|
|
|
@ -101,7 +101,7 @@ RB < ']'
|
||||||
;; Pakes a string representing a PEG grammar and defines all the nonterminals in
|
;; Pakes a string representing a PEG grammar and defines all the nonterminals in
|
||||||
;; it as the associated PEGs.
|
;; it as the associated PEGs.
|
||||||
(define (peg-parser str for-syntax)
|
(define (peg-parser str for-syntax)
|
||||||
(let ((parsed (peg-parse peg-grammar str)))
|
(let ((parsed (match-pattern peg-grammar str)))
|
||||||
(if (not parsed)
|
(if (not parsed)
|
||||||
(begin
|
(begin
|
||||||
;; (display "Invalid PEG grammar!\n")
|
;; (display "Invalid PEG grammar!\n")
|
||||||
|
@ -265,7 +265,7 @@ RB < ']'
|
||||||
(peg-sexp-compile
|
(peg-sexp-compile
|
||||||
(compressor
|
(compressor
|
||||||
(peg-pattern->defn
|
(peg-pattern->defn
|
||||||
(peg:tree (peg-parse peg-pattern string)) #'str-stx)
|
(peg:tree (match-pattern peg-pattern string)) #'str-stx)
|
||||||
#'str-stx)
|
#'str-stx)
|
||||||
(if (eq? accum 'all) 'body accum))))
|
(if (eq? accum 'all) 'body accum))))
|
||||||
(else (error "Bad embedded PEG string" args))))
|
(else (error "Bad embedded PEG string" args))))
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#:use-module (ice-9 peg simplify-tree)
|
#:use-module (ice-9 peg simplify-tree)
|
||||||
#:use-module (ice-9 peg codegen)
|
#:use-module (ice-9 peg codegen)
|
||||||
#:use-module (ice-9 peg cache)
|
#:use-module (ice-9 peg cache)
|
||||||
#:export (peg-parse define-nonterm search-for-pattern
|
#:export (match-pattern define-nonterm search-for-pattern
|
||||||
prec make-prec peg:start peg:end peg:string
|
prec make-prec peg:start peg:end peg:string
|
||||||
peg:tree peg:substring peg-record?))
|
peg:tree peg:substring peg-record?))
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ execute the STMTs and try again."
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
;; Parses STRING using NONTERM
|
;; Parses STRING using NONTERM
|
||||||
(define (peg-parse nonterm string)
|
(define (match-pattern nonterm string)
|
||||||
;; We copy the string before using it because it might have been modified
|
;; We copy the string before using it because it might have been modified
|
||||||
;; in-place since the last time it was parsed, which would invalidate the
|
;; in-place since the last time it was parsed, which would invalidate the
|
||||||
;; cache. Guile uses copy-on-write for strings, so this is fast.
|
;; cache. Guile uses copy-on-write for strings, so this is fast.
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
(define parse-product (make-left-parser parse-value))
|
(define parse-product (make-left-parser parse-value))
|
||||||
(define parse-sum (make-left-parser parse-product))
|
(define parse-sum (make-left-parser parse-product))
|
||||||
(define parse-expr parse-sum)
|
(define parse-expr parse-sum)
|
||||||
(define (eq-parse str) (apply parse-expr (peg:tree (peg-parse expr str))))
|
(define (eq-parse str) (apply parse-expr (peg:tree (match-pattern expr str))))
|
||||||
|
|
||||||
;; PEG for parsing equations (see tutorial).
|
;; PEG for parsing equations (see tutorial).
|
||||||
(define-grammar
|
(define-grammar
|
||||||
|
@ -141,7 +141,7 @@ sp < [ \t\n]*")
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(let* ((mstr (string-n tst1 x))
|
(let* ((mstr (string-n tst1 x))
|
||||||
(strlen (string-length mstr)))
|
(strlen (string-length mstr)))
|
||||||
(let ((func (lambda () (begin (peg-parse expr mstr)
|
(let ((func (lambda () (begin (match-pattern expr mstr)
|
||||||
'done))))
|
'done))))
|
||||||
`(((string of length ,strlen first pass)
|
`(((string of length ,strlen first pass)
|
||||||
,(time-ret-func func))
|
,(time-ret-func func))
|
||||||
|
@ -170,4 +170,4 @@ sp < [ \t\n]*")
|
||||||
(define (lisp-calc str)
|
(define (lisp-calc str)
|
||||||
(+ (eval (eq-parse str) (interaction-environment)) 0.0))
|
(+ (eval (eq-parse str) (interaction-environment)) 0.0))
|
||||||
|
|
||||||
;; (pretty-print `(,(sys-calc tst1) ,(lisp-calc tst1)))
|
;; (pretty-print `(,(sys-calc tst1) ,(lisp-calc tst1)))
|
||||||
|
|
|
@ -66,10 +66,10 @@
|
||||||
(pass-if
|
(pass-if
|
||||||
"equivalence of definitions"
|
"equivalence of definitions"
|
||||||
(equal?
|
(equal?
|
||||||
(peg:tree (peg-parse (@@ (ice-9 peg) peg-grammar) (@@ (ice-9 peg) peg-as-peg)))
|
(peg:tree (match-pattern (@@ (ice-9 peg) peg-grammar) (@@ (ice-9 peg) peg-as-peg)))
|
||||||
(tree-map
|
(tree-map
|
||||||
grammar-transform
|
grammar-transform
|
||||||
(peg:tree (peg-parse grammar (@@ (ice-9 peg) peg-as-peg)))))))
|
(peg:tree (match-pattern grammar (@@ (ice-9 peg) peg-as-peg)))))))
|
||||||
|
|
||||||
;; A grammar for pascal-style comments from Wikipedia.
|
;; A grammar for pascal-style comments from Wikipedia.
|
||||||
(define comment-grammar
|
(define comment-grammar
|
||||||
|
@ -114,32 +114,32 @@ SLASH < '/'")
|
||||||
;; Pascal-style comment parsing
|
;; Pascal-style comment parsing
|
||||||
"simple comment"
|
"simple comment"
|
||||||
(equal?
|
(equal?
|
||||||
(peg-parse C "(*blah*)")
|
(match-pattern C "(*blah*)")
|
||||||
(make-prec 0 8 "(*blah*)"
|
(make-prec 0 8 "(*blah*)"
|
||||||
'((Begin "(*") "blah" (End "*)")))))
|
'((Begin "(*") "blah" (End "*)")))))
|
||||||
(pass-if
|
(pass-if
|
||||||
"simple comment padded"
|
"simple comment padded"
|
||||||
(equal?
|
(equal?
|
||||||
(peg-parse C "(*blah*)abc")
|
(match-pattern C "(*blah*)abc")
|
||||||
(make-prec 0 8 "(*blah*)abc"
|
(make-prec 0 8 "(*blah*)abc"
|
||||||
'((Begin "(*") "blah" (End "*)")))))
|
'((Begin "(*") "blah" (End "*)")))))
|
||||||
(pass-if
|
(pass-if
|
||||||
"nested comment"
|
"nested comment"
|
||||||
(equal?
|
(equal?
|
||||||
(peg-parse C "(*1(*2*)*)")
|
(match-pattern C "(*1(*2*)*)")
|
||||||
(make-prec 0 10 "(*1(*2*)*)"
|
(make-prec 0 10 "(*1(*2*)*)"
|
||||||
'((Begin "(*") ("1" ((Begin "(*") "2" (End "*)"))) (End "*)")))))
|
'((Begin "(*") ("1" ((Begin "(*") "2" (End "*)"))) (End "*)")))))
|
||||||
(pass-if
|
(pass-if
|
||||||
"early termination"
|
"early termination"
|
||||||
(not (peg-parse C "(*blah")))
|
(not (match-pattern C "(*blah")))
|
||||||
(pass-if
|
(pass-if
|
||||||
"never starts"
|
"never starts"
|
||||||
(not (peg-parse C "blah")))
|
(not (match-pattern C "blah")))
|
||||||
;; /etc/passwd parsing
|
;; /etc/passwd parsing
|
||||||
(pass-if
|
(pass-if
|
||||||
"/etc/passwd"
|
"/etc/passwd"
|
||||||
(equal?
|
(equal?
|
||||||
(peg-parse passwd *etc-passwd*)
|
(match-pattern passwd *etc-passwd*)
|
||||||
(make-prec 0 220 *etc-passwd*
|
(make-prec 0 220 *etc-passwd*
|
||||||
'(passwd (entry (login "root") (pass "x") (uid "0") (gid "0") (nameORcomment "root") (homedir (path (pathELEMENT "root"))) (shell (path (pathELEMENT "bin") (pathELEMENT "bash")))) (entry (login "daemon") (pass "x") (uid "1") (gid "1") (nameORcomment "daemon") (homedir (path (pathELEMENT "usr") (pathELEMENT "sbin"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "bin") (pass "x") (uid "2") (gid "2") (nameORcomment "bin") (homedir (path (pathELEMENT "bin"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "sys") (pass "x") (uid "3") (gid "3") (nameORcomment "sys") (homedir (path (pathELEMENT "dev"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "nobody") (pass "x") (uid "65534") (gid "65534") (nameORcomment "nobody") (homedir (path (pathELEMENT "nonexistent"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "messagebus") (pass "x") (uid "103") (gid "107") nameORcomment (homedir (path (pathELEMENT "var") (pathELEMENT "run") (pathELEMENT "dbus"))) (shell (path (pathELEMENT "bin") (pathELEMENT "false")))))))))
|
'(passwd (entry (login "root") (pass "x") (uid "0") (gid "0") (nameORcomment "root") (homedir (path (pathELEMENT "root"))) (shell (path (pathELEMENT "bin") (pathELEMENT "bash")))) (entry (login "daemon") (pass "x") (uid "1") (gid "1") (nameORcomment "daemon") (homedir (path (pathELEMENT "usr") (pathELEMENT "sbin"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "bin") (pass "x") (uid "2") (gid "2") (nameORcomment "bin") (homedir (path (pathELEMENT "bin"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "sys") (pass "x") (uid "3") (gid "3") (nameORcomment "sys") (homedir (path (pathELEMENT "dev"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "nobody") (pass "x") (uid "65534") (gid "65534") (nameORcomment "nobody") (homedir (path (pathELEMENT "nonexistent"))) (shell (path (pathELEMENT "bin") (pathELEMENT "sh")))) (entry (login "messagebus") (pass "x") (uid "103") (gid "107") nameORcomment (homedir (path (pathELEMENT "var") (pathELEMENT "run") (pathELEMENT "dbus"))) (shell (path (pathELEMENT "bin") (pathELEMENT "false")))))))))
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ number <-- [0-9]+")
|
||||||
(apply parse-sum (car rest))))
|
(apply parse-sum (car rest))))
|
||||||
|
|
||||||
(define parse-expr parse-sum)
|
(define parse-expr parse-sum)
|
||||||
(define (eq-parse str) (apply parse-expr (peg:tree (peg-parse expr str))))
|
(define (eq-parse str) (apply parse-expr (peg:tree (match-pattern expr str))))
|
||||||
|
|
||||||
(with-test-prefix "Parsing right-associative equations"
|
(with-test-prefix "Parsing right-associative equations"
|
||||||
(pass-if
|
(pass-if
|
||||||
|
@ -252,7 +252,7 @@ number <-- [0-9]+")
|
||||||
(define parse-product (make-left-parser parse-value))
|
(define parse-product (make-left-parser parse-value))
|
||||||
(define parse-sum (make-left-parser parse-product))
|
(define parse-sum (make-left-parser parse-product))
|
||||||
(define parse-expr parse-sum)
|
(define parse-expr parse-sum)
|
||||||
(define (eq-parse str) (apply parse-expr (peg:tree (peg-parse expr str))))
|
(define (eq-parse str) (apply parse-expr (peg:tree (match-pattern expr str))))
|
||||||
|
|
||||||
(with-test-prefix "Parsing left-associative equations"
|
(with-test-prefix "Parsing left-associative equations"
|
||||||
(pass-if
|
(pass-if
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue