]> gitweb.factorcode.org Git - factor.git/blob - basis/globs/globs.factor
Merge branch 'master' into regexp
[factor.git] / basis / globs / globs.factor
1 ! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: sequences kernel regexp.combinators regexp.matchers strings unicode.case
4 peg.ebnf regexp arrays ;
5 IN: globs
6
7 EBNF: <glob>
8
9 Character = "\\" .:c => [[ c 1string <literal> ]]
10           | !(","|"}") . => [[ 1string <literal> ]]
11
12 RangeCharacter = !("]") .
13
14 Range = RangeCharacter:a "-" RangeCharacter:b => [[ a b <char-range> ]]
15       | RangeCharacter => [[ 1string <literal> ]]
16
17 StartRange = .:a "-" RangeCharacter:b => [[ a b <char-range> ]]
18            | . => [[ 1string <literal> ]]
19
20 Ranges = StartRange:s Range*:r => [[ r s prefix ]]
21
22 CharClass = "^"?:n Ranges:e => [[ e <or> n [ <not> ] when ]]
23
24 AlternationBody = Concatenation:c "," AlternationBody:a => [[ a c prefix ]]
25                 | Concatenation => [[ 1array ]]
26
27 Element = "*" => [[ R/ .*/ ]]
28         | "?" => [[ R/ ./ ]]
29         | "[" CharClass:c "]" => [[ c ]]
30         | "{" AlternationBody:b "}" => [[ b <or> ]]
31         | Character
32
33 Concatenation = Element* => [[ <sequence> ]]
34
35 End = !(.)
36
37 Main = Concatenation End
38
39 ;EBNF
40
41 : glob-matches? ( input glob -- ? )
42     [ >case-fold ] bi@ <glob> matches? ;