From 48138d548a8b049be5a31729910476bc5bacadf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= <bjourne@gmail.com> Date: Mon, 8 Jun 2015 13:53:59 +0200 Subject: [PATCH] locals.parser: small refactorings and unit tests --- basis/locals/parser/parser-tests.factor | 63 +++++++++++++++++++++++++ basis/locals/parser/parser.factor | 19 ++++---- 2 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 basis/locals/parser/parser-tests.factor diff --git a/basis/locals/parser/parser-tests.factor b/basis/locals/parser/parser-tests.factor new file mode 100644 index 0000000000..fef17b7cd5 --- /dev/null +++ b/basis/locals/parser/parser-tests.factor @@ -0,0 +1,63 @@ +USING: accessors assocs compiler.units kernel lexer locals.backend +locals.parser parser prettyprint sequences tools.test ; +IN: locals.parser.tests + +SYMBOL: dobiedoo + +! (::) +{ + dobiedoo + [ 1 load-locals 1 drop-locals ] + ( x -- y ) +} [ + [ + { "dobiedoo ( x -- y ) ;" } <lexer> [ (::) ] with-lexer + ] with-compilation-unit +] unit-test + +! ((parse-lambda)) +{ + "V{ 99 :> kkk kkk }" +} [ + [ { "99 :> kkk kkk ;" } <lexer> [ + H{ } clone [ \ ; parse-until ] ((parse-lambda)) ] with-lexer + ] with-compilation-unit unparse +] unit-test + +! check-local-name +{ "hello" } [ + "hello" check-local-name +] unit-test + +! make-locals +{ { "a" "b" "c" } } [ + [ { "a" "b" "c" } make-locals ] with-compilation-unit + nip values [ name>> ] map +] unit-test + +! parse-def +{ "um" { "um" } } [ + [ "um" H{ } clone [ parse-def ] keep ] with-compilation-unit + [ local>> name>> ] [ keys ] bi* +] unit-test + +! parse-local-defs +{ { "tok1" "tok2" } } [ + [ + { "tok1 tok2 |" } <lexer> [ parse-local-defs ] with-lexer + ] with-compilation-unit + nip values [ name>> ] map +] unit-test + +! parse-multi-def +{ + { "v1" "tok1" "tok2" } + { "tok1" "tok2" } +} [ + [ + { "tok1 tok2 )" } <lexer> [ + H{ { "v1" t } } clone dup parse-multi-def + ] with-lexer + ] with-compilation-unit + [ keys ] [ locals>> [ name>> ] map ] bi* +] unit-test diff --git a/basis/locals/parser/parser.factor b/basis/locals/parser/parser.factor index e59b6a8fc5..ae096404b6 100644 --- a/basis/locals/parser/parser.factor +++ b/basis/locals/parser/parser.factor @@ -27,13 +27,13 @@ ERROR: invalid-local-name name ; [ [ make-local ] map ] H{ } make ; : parse-local-defs ( -- words assoc ) - [ "|" [ make-local ] map-tokens ] H{ } make ; + "|" parse-tokens make-locals ; SINGLETON: lambda-parser SYMBOL: locals -: ((parse-lambda)) ( assoc quot -- quot' ) +: ((parse-lambda)) ( assoc reader-quot -- quot ) '[ in-lambda? on lambda-parser quotation-parser set @@ -51,14 +51,13 @@ SYMBOL: locals ?rewrite-closures ; : parse-multi-def ( locals -- multi-def ) - [ [ ")" [ make-local ] map-tokens ] H{ } make ] dip - swap assoc-union! drop <multi-def> ; + ")" parse-tokens make-locals swapd assoc-union! drop <multi-def> ; + +: parse-single-def ( name locals -- def ) + swap [ make-local ] H{ } make swapd assoc-union! drop <def> ; : parse-def ( name/paren locals -- def ) - over "(" = - [ nip parse-multi-def ] - [ [ [ make-local ] H{ } make ] dip swap assoc-union! drop <def> ] - if ; + over "(" = [ nip parse-multi-def ] [ parse-single-def ] if ; M: lambda-parser parse-quotation ( -- quotation ) H{ } clone (parse-lambda) ; @@ -77,13 +76,13 @@ M: lambda-parser parse-quotation ( -- quotation ) dup in>> [ dup pair? [ first ] when ] map make-locals ; -: (parse-locals-definition) ( effect vars assoc reader -- word quot effect ) +: (parse-locals-definition) ( effect vars assoc reader-quot -- word quot effect ) ((parse-lambda)) <lambda> [ nip "lambda" set-word-prop ] [ nip rewrite-closures dup length 1 = [ first ] [ bad-rewrite ] if ] [ drop nip ] 3tri ; inline -: parse-locals-definition ( word reader -- word quot effect ) +: parse-locals-definition ( word reader-quot -- word quot effect ) [ parse-locals ] dip (parse-locals-definition) ; inline : parse-locals-method-definition ( word reader -- word quot effect )