1 ! Copyright (C) 2005 Chris Double.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: kernel lazy-lists test errors strings parser math sequences parser-combinators arrays ;
8 [ { T{ parse-result f { "a" "b" } T{ slice f "abcd" 2 4 } } } ] [
9 "abcd" "a" token "b" token <&> parse list>array
12 [ { T{ parse-result f { { "a" "b" } "c" } T{ slice f "abcd" 3 4 } } } ] [
13 "abcd" "a" token "b" token <&> "c" token <&> parse list>array
16 [ { T{ parse-result f { "a" { "b" "c" } } T{ slice f "abcd" 3 4 } } } ] [
17 "abcd" "a" token "b" token "c" token <&> <&> parse list>array
21 "decd" "a" token "b" token <&> parse list>array
25 "dbcd" "a" token "b" token <&> parse list>array
29 "adcd" "a" token "b" token <&> parse list>array
33 [ { T{ parse-result f "a" T{ slice f "abcd" 1 4 } } } ] [
34 "abcd" "a" token "b" token <|> parse list>array
37 [ { T{ parse-result f "b" T{ slice f "bbcd" 1 4 } } } ] [
38 "bbcd" "a" token "b" token <|> parse list>array
42 "cbcd" "a" token "b" token <|> parse list>array
47 " abcd" "a" token parse list>array
50 [ { T{ parse-result f "a" T{ slice f " abcd" 3 6 } } } ] [
51 " abcd" "a" token sp parse list>array
55 [ { T{ parse-result f "abcd" T{ slice f "abcd" 4 4 } } T{ parse-result f "abc" T{ slice f "abcd" 3 4 } } } ] [
56 "abcd" "abcd" token "abc" token <|> parse list>array
59 [ { T{ parse-result f "abcd" T{ slice f "abcd" 4 4 } } } ] [
60 "abcd" "abcd" token "abc" token <|> just parse list>array
64 [ { T{ parse-result f 48 T{ slice f "01234" 1 5 } } } ] [
65 "01234" [ digit? ] satisfy parse list>array
68 [ { T{ parse-result f 0 T{ slice f "01234" 1 5 } } } ] [
69 "01234" [ digit? ] satisfy [ digit> ] <@ parse list>array
73 [ { T{ parse-result f "begin" T{ slice f "begin1" 5 6 } } } ] [
74 "begin1" "begin" token parse list>array
78 "begin1" "begin" token some parse
82 "begin" "begin" token some parse
85 ! <& parser and &> parser
86 [ { T{ parse-result f { "a" "b" } T{ slice f "abcd" 2 4 } } } ] [
87 "abcd" "a" token "b" token <&> parse list>array
90 [ { T{ parse-result f "a" T{ slice f "abcd" 2 4 } } } ] [
91 "abcd" "a" token "b" token <& parse list>array
94 [ { T{ parse-result f "b" T{ slice f "abcd" 2 4 } } } ] [
95 "abcd" "a" token "b" token &> parse list>array
98 ! Testing <*> and <:&>
99 [ { T{ parse-result f { "1" } T{ slice f "1234" 1 4 } } T{ parse-result f [ ] "1234" } } } ] [
100 "1234" "1" token <*> parse list>array
105 T{ parse-result f { "1" "1" "1" "1" } "234" }
106 T{ parse-result f { "1" "1" "1" } "1234" }
107 T{ parse-result f { "1" "1" } "11234" }
108 T{ parse-result f { "1" } "111234" }
109 T{ parse-result f [ ] "1111234" }
113 "1111234" "1" token <*> parse list>array
118 T{ parse-result f { "1111" } "234" }
119 T{ parse-result f { "111" } "1234" }
120 T{ parse-result f { "11" } "11234" }
121 T{ parse-result f { "1" } "111234" }
122 T{ parse-result f { [ ] } "1111234" }
125 "1111234" "1" token <*> [ concat 1array ] <@ parse list>array
128 [ { T{ parse-result f [ ] "234" } } ] [
129 "234" "1" token <*> parse list>array
133 [ { T{ parse-result f { "1" } "234" } } ] [
134 "1234" "1" token <+> parse list>array
139 T{ parse-result f { "1" "1" "1" "1" } "234" }
140 T{ parse-result f { "1" "1" "1" } "1234" }
141 T{ parse-result f { "1" "1" } "11234" }
142 T{ parse-result f { "1" } "111234" }
145 "1111234" "1" token <+> parse list>array
149 "234" "1" token <+> parse list>array