From c040050b52a066c763130b4c3e01f645c2d8e85e Mon Sep 17 00:00:00 2001 From: "chris.double" Date: Fri, 6 Oct 2006 02:43:56 +0000 Subject: [PATCH] parser-combinators: refactor <@ and some --- .../parser-combinators.factor | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/contrib/parser-combinators/parser-combinators.factor b/contrib/parser-combinators/parser-combinators.factor index a304b8628c..d28ac0461c 100644 --- a/contrib/parser-combinators/parser-combinators.factor +++ b/contrib/parser-combinators/parser-combinators.factor @@ -140,31 +140,35 @@ M: just-parser (parse) ( input parser -- result ) #! fully parsed input string. just-parser-p1 parse [ parse-result-unparsed empty? ] lsubset ; -: <@-parser ( input parser quot -- result ) +TUPLE: apply-parser p1 quot ; + +: <@ ( parser quot -- parser ) + ; + +M: apply-parser (parse) ( input parser -- result ) #! Calls the parser on the input. For each successfull #! parse the quot is call with the parse result on the stack. #! The result of that quotation then becomes the new parse result. #! This allows modification of parse tree results (like #! converting strings to integers, etc). - -rot call [ + [ apply-parser-p1 ] keep apply-parser-quot + -rot parse [ [ parse-result-parsed swap call ] keep parse-result-unparsed ] lmap-with ; -: <@ ( parser quot -- parser ) - #! Return an <@-parser. - [ <@-parser ] curry curry ; +TUPLE: some-parser p1 ; + +: some ( p1 -- parser ) + ; -: some-parser ( input parser -- result ) +M: some-parser (parse) ( input parser -- result ) #! Calls the parser on the input, guarantees #! the parse is complete (the remaining input is empty), #! picks the first solution and only returns the parse #! tree since the remaining input is empty. - just call car parse-result-parsed ; + some-parser-p1 just parse car parse-result-parsed ; -: some ( parser -- deterministic-parser ) - #! Creates a 'some-parser'. - [ some-parser ] curry ; : <& ( parser1 parser2 -- parser ) #! Same as <&> except discard the results of the second parser. -- 2.34.1