1 ! Copyright (C) 2005 Chris Double.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel lists lists.lazy tools.test strings math
4 sequences parser-combinators arrays math.parser unicode ;
7 { { T{ parse-result f { "a" "b" } T{ slice f 2 4 "abcd" } } } } [
8 "abcd" "a" token "b" token <&> parse list>array
11 { { T{ parse-result f { { "a" "b" } "c" } T{ slice f 3 4 "abcd" } } } } [
12 "abcd" "a" token "b" token <&> "c" token <&> parse list>array
15 { { T{ parse-result f { "a" { "b" "c" } } T{ slice f 3 4 "abcd" } } } } [
16 "abcd" "a" token "b" token "c" token <&> <&> parse list>array
20 "decd" "a" token "b" token <&> parse list>array
24 "dbcd" "a" token "b" token <&> parse list>array
28 "adcd" "a" token "b" token <&> parse list>array
32 { { T{ parse-result f "a" T{ slice f 1 4 "abcd" } } } } [
33 "abcd" "a" token "b" token <|> parse list>array
36 { { T{ parse-result f "b" T{ slice f 1 4 "bbcd" } } } } [
37 "bbcd" "a" token "b" token <|> parse list>array
41 "cbcd" "a" token "b" token <|> parse list>array
46 " abcd" "a" token parse list>array
49 { { T{ parse-result f "a" T{ slice f 3 6 " abcd" } } } } [
50 " abcd" "a" token sp parse list>array
54 { { T{ parse-result f "abcd" T{ slice f 4 4 "abcd" } } T{ parse-result f "abc" T{ slice f 3 4 "abcd" } } } } [
55 "abcd" "abcd" token "abc" token <|> parse list>array
58 { { T{ parse-result f "abcd" T{ slice f 4 4 "abcd" } } } } [
59 "abcd" "abcd" token "abc" token <|> just parse list>array
63 { { T{ parse-result f 48 T{ slice f 1 5 "01234" } } } } [
64 "01234" [ digit? ] satisfy parse list>array
67 { { T{ parse-result f 0 T{ slice f 1 5 "01234" } } } } [
68 "01234" [ digit? ] satisfy [ digit> ] <@ parse list>array
72 { { T{ parse-result f "begin" T{ slice f 5 6 "begin1" } } } } [
73 "begin1" "begin" token parse list>array
77 "begin1" "begin" token some parse
81 "begin" "begin" token some parse
84 ! <& parser and &> parser
85 { { T{ parse-result f { "a" "b" } T{ slice f 2 4 "abcd" } } } } [
86 "abcd" "a" token "b" token <&> parse list>array
89 { { T{ parse-result f "a" T{ slice f 2 4 "abcd" } } } } [
90 "abcd" "a" token "b" token <& parse list>array
93 { { T{ parse-result f "b" T{ slice f 2 4 "abcd" } } } } [
94 "abcd" "a" token "b" token &> parse list>array
97 ! Testing <*> and <:&>
98 { { T{ parse-result f { "1" } T{ slice f 1 4 "1234" } } T{ parse-result f { } "1234" } } } [
99 "1234" "1" token <*> parse list>array
104 T{ parse-result f { "1" "1" "1" "1" } T{ slice f 4 7 "1111234" } }
105 T{ parse-result f { "1" "1" "1" } T{ slice f 3 7 "1111234" } }
106 T{ parse-result f { "1" "1" } T{ slice f 2 7 "1111234" } }
107 T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
108 T{ parse-result f { } "1111234" }
112 "1111234" "1" token <*> parse list>array
117 T{ parse-result f { "1111" } T{ slice f 4 7 "1111234" } }
118 T{ parse-result f { "111" } T{ slice f 3 7 "1111234" } }
119 T{ parse-result f { "11" } T{ slice f 2 7 "1111234" } }
120 T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
121 T{ parse-result f { { } } "1111234" }
124 "1111234" "1" token <*> [ concat 1array ] <@ parse list>array
127 { { T{ parse-result f { } "234" } } } [
128 "234" "1" token <*> parse list>array
132 { { T{ parse-result f { "1" } T{ slice f 1 4 "1234" } } } } [
133 "1234" "1" token <+> parse list>array
138 T{ parse-result f { "1" "1" "1" "1" } T{ slice f 4 7 "1111234" } }
139 T{ parse-result f { "1" "1" "1" } T{ slice f 3 7 "1111234" } }
140 T{ parse-result f { "1" "1" } T{ slice f 2 7 "1111234" } }
141 T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
144 "1111234" "1" token <+> parse list>array
148 "234" "1" token <+> parse list>array