factor/basis/globs/globs.factor

43 lines
1.1 KiB
Factor
Raw Normal View History

! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
2007-11-28 02:12:42 -05:00
! See http://factorcode.org/license.txt for BSD license.
2009-03-10 19:27:33 -04:00
USING: sequences kernel regexp.combinators strings unicode.case
peg.ebnf regexp arrays ;
2007-11-28 02:12:42 -05:00
IN: globs
EBNF: <glob>
2007-11-28 02:12:42 -05:00
Character = "\\" .:c => [[ c 1string <literal> ]]
| !(","|"}") . => [[ 1string <literal> ]]
2007-11-28 02:12:42 -05:00
RangeCharacter = !("]") .
2007-11-28 02:12:42 -05:00
Range = RangeCharacter:a "-" RangeCharacter:b => [[ a b <char-range> ]]
| RangeCharacter => [[ 1string <literal> ]]
2007-11-28 02:12:42 -05:00
StartRange = .:a "-" RangeCharacter:b => [[ a b <char-range> ]]
| . => [[ 1string <literal> ]]
2007-11-28 02:12:42 -05:00
Ranges = StartRange:s Range*:r => [[ r s prefix ]]
2007-11-28 02:12:42 -05:00
CharClass = "^"?:n Ranges:e => [[ e <or> n [ <not> ] when ]]
2007-11-28 02:12:42 -05:00
AlternationBody = Concatenation:c "," AlternationBody:a => [[ a c prefix ]]
| Concatenation => [[ 1array ]]
2007-11-28 02:12:42 -05:00
Element = "*" => [[ R/ .*/ ]]
| "?" => [[ R/ ./ ]]
| "[" CharClass:c "]" => [[ c ]]
| "{" AlternationBody:b "}" => [[ b <or> ]]
| Character
2007-11-28 02:12:42 -05:00
Concatenation = Element* => [[ <sequence> ]]
2007-11-28 02:12:42 -05:00
End = !(.)
Main = Concatenation End
;EBNF
2007-11-28 02:12:42 -05:00
: glob-matches? ( input glob -- ? )
[ >case-fold ] bi@ <glob> matches? ;