]> gitweb.factorcode.org Git - factor.git/commitdiff
Negation almost complete in regexp
authorDaniel Ehrenberg <littledan@Macintosh-103.local>
Fri, 20 Feb 2009 00:28:54 +0000 (18:28 -0600)
committerDaniel Ehrenberg <littledan@Macintosh-103.local>
Fri, 20 Feb 2009 00:28:54 +0000 (18:28 -0600)
basis/regexp/ast/ast.factor
basis/regexp/classes/classes.factor
basis/regexp/negation/negation.factor
basis/regexp/nfa/nfa.factor
basis/regexp/parser/parser.factor

index ad67d76d12501005fc4617d30336997f69f353c3..e1308f0855b4a74f4c36bddfafe7701300a21a1d 100644 (file)
@@ -1,12 +1,9 @@
 ! Copyright (C) 2008, 2009 Doug Coleman, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel arrays accessors fry sequences ;
+USING: kernel arrays accessors fry sequences regexp.classes ;
 FROM: math.ranges => [a,b] ;
 IN: regexp.ast
 
-TUPLE: primitive-class class ;
-C: <primitive-class> primitive-class
-
 TUPLE: negation term ;
 C: <negation> negation
 
@@ -56,4 +53,4 @@ M: from-to <times>
     [ n>> ] [ m>> ] bi [a,b] swap '[ _ repetition ] map <alternation> ;
 
 : char-class ( ranges ? -- term )
-    [ <alternation> ] dip [ <negation> ] when ;
+    [ <or-class> ] dip [ <not-class> ] when ;
index 44f33f9fcf1271506616e2e4a404cd2d3e968cd3..aaa650726cc4aeff0e75915256d16941e85c6dbc 100644 (file)
@@ -119,8 +119,14 @@ C: <or-class> or-class
 TUPLE: not-class class ;
 C: <not-class> not-class
 
+TUPLE: primitive-class class ;
+C: <primitive-class> primitive-class
+
 M: or-class class-member?
     seq>> [ class-member? ] with any? ;
 
 M: not-class class-member?
     class>> class-member? not ;
+
+M: primitive-class class-member?
+    class>> class-member? ;
index 5a9f77258109bb5998a37f574254f99101b1a1af..6b0e6b519eec128239337a5c0f3fb337c591918b 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: regexp.nfa regexp.dfa regexp.minimize kernel sequences
-assocs regexp.classes hashtables accessors ;
+assocs regexp.classes hashtables accessors fry vectors
+regexp.ast regexp.transition-tables ;
 IN: regexp.negation
 
 : ast>dfa ( parse-tree -- minimal-dfa )
@@ -32,5 +33,29 @@ CONSTANT: fail-state -1
         [ add-fail-state ] change-transitions
         dup inverse-final-states >>final-states ;
 
-! M: negation nfa-node ( node -- )
-!     ast>dfa negate-table adjoin-dfa ;
+: renumber-transitions ( transitions numbering -- new-transitions )
+    dup '[
+        [ _ at ]
+        [ [ [ _ at ] map ] assoc-map ] bi*
+    ] assoc-map ;
+
+: renumber-states ( transition-table -- transition-table )
+    dup transitions>> keys [ next-state ] H{ } map>assoc
+    [ renumber-transitions ] rewrite-transitions ;
+
+: box-transitions ( transition-table -- transition-table )
+    [ [ [ 1vector ] assoc-map ] assoc-map ] change-transitions ;
+
+: unify-final-state ( transition-table -- transition-table )
+    dup [ final-states>> keys ] keep
+    '[ -1 eps <literal-transition> _ add-transition ] each
+    H{ { -1 -1 } } >>final-states ;
+
+: adjoin-dfa ( transition-table -- start end )
+    box-transitions unify-final-state renumber-states
+    [ start-state>> ]
+    [ final-states>> keys first ]
+    [ table [ transitions>> ] bi@ swap update ] tri ;
+
+M: negation nfa-node ( node -- start end )
+    term>> ast>dfa negate-table adjoin-dfa ;
index c759ffdf98d7be84730fd9c0ce97ae9a7bf1d3ae..6775124e60485f9d37eaf9affb46d38b3054b078 100644 (file)
@@ -102,9 +102,7 @@ M: integer nfa-node ( node -- start end )
             [ literal-transition add-simple-entry ] bi@
             alternate-nodes [ nip ] dip
         ] if
-    ] [
-        literal-transition add-simple-entry
-    ] if ;
+    ] [ literal-transition add-simple-entry ] if ;
 
 M: primitive-class nfa-node ( node -- start end )
     class>> dup
@@ -112,12 +110,15 @@ M: primitive-class nfa-node ( node -- start end )
     [ drop Letter-class ] when
     class-transition add-simple-entry ;
 
+M: or-class nfa-node class-transition add-simple-entry ;
+M: not-class nfa-node class-transition add-simple-entry ;
+
 M: any-char nfa-node ( node -- start end )
     [ dotall option? ] dip any-char-no-nl ?
     class-transition add-simple-entry ;
 
-M: negation nfa-node ( node -- start end )
-    negate term>> nfa-node negate ;
+M: negation nfa-node ( node -- start end )
+    negate term>> nfa-node negate ;
 
 M: range nfa-node ( node -- start end )
     case-insensitive option? [
index 6b2f28dbf6899982e0fadd1c3877be7521eccb0e..3a7ba12552593170c33e9daf34d09835b089ee24 100644 (file)
@@ -47,11 +47,11 @@ ERROR: bad-class name ;
         { CHAR: \\ [ CHAR: \\ ] }
 
         { CHAR: w [ c-identifier-class <primitive-class> ] }
-        { CHAR: W [ c-identifier-class <primitive-class> <negation> ] }
+        { CHAR: W [ c-identifier-class <primitive-class> <not-class> ] }
         { CHAR: s [ java-blank-class <primitive-class> ] }
-        { CHAR: S [ java-blank-class <primitive-class> <negation> ] }
+        { CHAR: S [ java-blank-class <primitive-class> <not-class> ] }
         { CHAR: d [ digit-class <primitive-class> ] }
-        { CHAR: D [ digit-class <primitive-class> <negation> ] }
+        { CHAR: D [ digit-class <primitive-class> <not-class> ] }
 
         [ ]
     } case ;