From d4897fa007bd12dd2bd56dd7dd11cf4eeb7e885f Mon Sep 17 00:00:00 2001 From: Chris Double Date: Sat, 5 Apr 2008 18:01:18 +1300 Subject: [PATCH] Refactor repeat0 and repeat1 peg parsers --- extra/peg/peg.factor | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor index 465e0dd757..8c427d5e27 100755 --- a/extra/peg/peg.factor +++ b/extra/peg/peg.factor @@ -351,48 +351,36 @@ M: choice-parser (compile) ( parser -- quot ) TUPLE: repeat0-parser p1 ; -MATCH-VARS: ?quot ; - -: (repeat0) ( quot result -- result ) +: (repeat) ( quot result -- result ) over call [ [ remaining>> swap (>>remaining) ] 2keep ast>> swap [ ast>> push ] keep - (repeat0) - ] [ + (repeat) + ] [ nip ] if* ; inline -: repeat0-pattern ( -- quot ) - [ - [ ?quot ] swap (repeat0) - ] ; - M: repeat0-parser (compile) ( parser -- quot ) - [ - [ input-slice V{ } clone ] % - p1>> compiled-parser \ ?quot repeat0-pattern match-replace % - ] [ ] make ; + p1>> compiled-parser 1quotation '[ + input-slice V{ } clone , swap (repeat) + ] ; TUPLE: repeat1-parser p1 ; -: repeat1-pattern ( -- quot ) +: repeat1-empty-check ( result -- result ) [ - [ ?quot ] swap (repeat0) [ - dup ast>> empty? [ - drop f - ] when - ] [ - f - ] if* - ] ; + dup ast>> empty? [ drop f ] when + ] [ + f + ] if* ; M: repeat1-parser (compile) ( parser -- quot ) - [ - [ input-slice V{ } clone ] % - p1>> compiled-parser \ ?quot repeat1-pattern match-replace % - ] [ ] make ; + p1>> compiled-parser 1quotation '[ + input-slice V{ } clone , swap (repeat) repeat1-empty-check + ] ; TUPLE: optional-parser p1 ; +MATCH-VARS: ?quot ; : optional-pattern ( -- quot ) [