From e49d84ce97d4822b051367ebd04b4e2c7444d2ce Mon Sep 17 00:00:00 2001 From: Chris Double Date: Tue, 27 Nov 2007 16:16:21 +1300 Subject: [PATCH] Add 'delay' parser to peg --- extra/peg/peg-docs.factor | 10 ++++++++++ extra/peg/peg.factor | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/extra/peg/peg-docs.factor b/extra/peg/peg-docs.factor index 9034b1c8fd..63b9d44310 100644 --- a/extra/peg/peg-docs.factor +++ b/extra/peg/peg-docs.factor @@ -138,3 +138,13 @@ HELP: hide "Returns a parser that succeeds if the original parser succeeds, but does not " "put any result in the AST. Useful for ignoring 'syntax' in the AST." } { $example "\"[\" token hide number \"]\" token hide 3array seq" } ; + +HELP: delay +{ $values + { "quot" "a quotation with stack effect ( -- parser )" } + { "parser" "a parser" } +} +{ $description + "Delays the construction of a parser until it is actually required to parse. This " + "allows for calling a parser that results in a recursive call to itself. The quotation " + "should return the constructed parser." } ; \ No newline at end of file diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor index fe2b551f78..7cc5aec845 100644 --- a/extra/peg/peg.factor +++ b/extra/peg/peg.factor @@ -168,6 +168,11 @@ TUPLE: sp-parser p1 ; M: sp-parser parse ( state parser -- result ) [ left-trim-slice ] dip sp-parser-p1 parse ; +TUPLE: delay-parser quot ; + +M: delay-parser parse ( state parser -- result ) + delay-parser-quot call parse ; + PRIVATE> : token ( string -- parser ) @@ -208,3 +213,6 @@ PRIVATE> : hide ( parser -- parser ) [ drop ignore ] action ; + +: delay ( parser -- parser ) + delay-parser construct-boa init-parser ;