Index: class/System/Test/System.Text.RegularExpressions/CILRegexTrials.cs
===================================================================
--- class/System/Test/System.Text.RegularExpressions/CILRegexTrials.cs	(revision 0)
+++ class/System/Test/System.Text.RegularExpressions/CILRegexTrials.cs	(revision 0)
@@ -0,0 +1,492 @@
+//
+// assembly:	System_test
+// namespace:	MonoTests.System.Text.RegularExpressions
+// file:	CILRegexTrials.cs
+//
+// Authors:	
+//   Francois Poirier-Beauchemiin (beauche@softhome.net)
+//   Eric Durand-Tremblay (eric.durand-tremblay.1@ulaval.ca)
+
+using System.Text.RegularExpressions;
+
+namespace MonoTests.System.Text.RegularExpressions {
+
+	class CILRegexTrials {
+
+		public static RegexTrial[] trials = new RegexTrial[] {
+			
+			new RegexTrial (@"\Ac", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\Ac", RegexOptions.Compiled, "cajsdlfljafskdjlasdfj;--", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\Ac", RegexOptions.Compiled, "bc", "Fail."),
+			new RegexTrial (@"\Ac", RegexOptions.Compiled, "b\nc", "Fail."),
+			new RegexTrial (@"\Ac", RegexOptions.Compiled, "bcb", "Fail."),
+			new RegexTrial (@"\Ac$", RegexOptions.Compiled, "cac", "Fail."),
+			new RegexTrial (@"\Ac$", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+	
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "cajsdlfljafskdjlasdfj;--", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "bc", "Fail."),
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "b\nc", "Pass. Group[0]=(2,1)"),
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "bcb", "Fail."),
+			new RegexTrial (@"^c", RegexOptions.Compiled | RegexOptions.Multiline, "bc\nb", "Fail."),
+			new RegexTrial (@"^c$", RegexOptions.Compiled | RegexOptions.Multiline, "cac", "Fail."),
+			new RegexTrial (@"^c$", RegexOptions.Compiled | RegexOptions.Multiline, "c", "Pass. Group[0]=(0,1)"),
+
+			new RegexTrial (@"\Gc", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\Gc", RegexOptions.Compiled, "cajsdlfljafskdjlasdfj;--", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\Gc", RegexOptions.Compiled, "bc", "Fail."),
+			new RegexTrial (@"\Gc", RegexOptions.Compiled, "cac", "Pass. Group[0]=(0,1)"),
+	
+			new RegexTrial (@"c", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"c", RegexOptions.Compiled, "ac", "Pass. Group[0]=(1,1)"),
+			new RegexTrial (@"c", RegexOptions.Compiled, "aca", "Pass. Group[0]=(1,1)"),
+				
+			
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaa c aaa", "Pass. Group[0]=(4,1)"),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaa c", "Pass. Group[0]=(4,1)"),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaa ac", "Fail."),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "c aaa", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaacaaa", "Fail."),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaac aaa", "Fail."),
+			new RegexTrial (@"\bc", RegexOptions.Compiled, "aaa caaa", "Pass. Group[0]=(4,1)"),
+					
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "aaa ac", "Pass. Group[0]=(5,1)"),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "aaa c", "Fail."),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "ca aaa", "Fail."),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "aaa c aaa", "Fail."),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, " acaa ", "Pass. Group[0]=(2,1)"),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "aaac aaa", "Pass. Group[0]=(3,1)"),
+			new RegexTrial (@"\Bc", RegexOptions.Compiled, "aaa caaa", "Fail."),
+
+			new RegexTrial (@"hello", RegexOptions.Compiled, "hello", "Pass. Group[0]=(0,5)"),
+			new RegexTrial (@"hello", RegexOptions.Compiled, "aahelloaa", "Pass. Group[0]=(2,5)"),
+			new RegexTrial (@"hello", RegexOptions.Compiled, "ahello", "Pass. Group[0]=(1,5)"),
+			new RegexTrial (@"hello", RegexOptions.Compiled, "ahelXlo", "Fail."),
+			new RegexTrial (@"toto", RegexOptions.Compiled, "bozo toto", "Pass. Group[0]=(5,4)"),
+			
+			new RegexTrial (@"^hello$", RegexOptions.Compiled, "hello", "Pass. Group[0]=(0,5)"),
+			new RegexTrial (@"^hello$", RegexOptions.Compiled, "Xhello", "Fail."),
+			new RegexTrial (@"^hello$", RegexOptions.Compiled, "helloX", "Fail."),
+
+			
+			new RegexTrial (@"aaa(hello)a", RegexOptions.Compiled, "baaahelloab", "Pass. Group[0]=(1,9) Group[1]=(4,5)"),
+			new RegexTrial (@"aaa(he(((ll)))o)a", RegexOptions.Compiled, "baaahelloab", "Pass. Group[0]=(1,9) Group[1]=(4,5) Group[2]=(6,2) Group[3]=(6,2) Group[4]=(6,2)"),
+			new RegexTrial (@"(hello|bonjour)", RegexOptions.Compiled, "hello", "Pass. Group[0]=(0,5) Group[1]=(0,5)"),
+			new RegexTrial (@"(hello|bonjour)", RegexOptions.Compiled, "bonjour", "Pass. Group[0]=(0,7) Group[1]=(0,7)"),
+			new RegexTrial (@"(hello|bonjour)", RegexOptions.Compiled, "duh", "Fail."),
+			new RegexTrial (@"(hello|bonjour)buenosdia", RegexOptions.Compiled, "XXhellXbonjourbuenosdiaXX", "Pass. Group[0]=(7,16) Group[1]=(7,7)"),
+			new RegexTrial (@"(a|b(c|d|e)|(x|yz))", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]=(0,1) Group[2]= Group[3]="),
+			new RegexTrial (@"(a|b(c|d|e)|(x|yz))", RegexOptions.Compiled, "bd", "Pass. Group[0]=(0,2) Group[1]=(0,2) Group[2]=(1,1) Group[3]="),
+			new RegexTrial (@"(a|b(c|d|e)|(x|yz))", RegexOptions.Compiled, "yz", "Pass. Group[0]=(0,2) Group[1]=(0,2) Group[2]= Group[3]=(0,2)"),
+			new RegexTrial (@"^(a|b(c|d|e)|(x|yz))$", RegexOptions.Compiled, "ac", "Fail."),
+			new RegexTrial (@"^(a|b(c|d|e)|(x|yz))$", RegexOptions.Compiled, "ax", "Fail."),
+			new RegexTrial (@"a|b|hello|c", RegexOptions.Compiled, "hello", "Pass. Group[0]=(0,5)"),
+			new RegexTrial (@"a|b|hello|c", RegexOptions.Compiled, "h", "Fail."),
+			new RegexTrial (@"a|b|hello|c", RegexOptions.Compiled, "bozo", "Pass. Group[0]=(0,1)"),
+
+			new RegexTrial (@"[az]", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[az]", RegexOptions.Compiled, "z", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[az]", RegexOptions.Compiled, "c", "Fail."),
+
+			new RegexTrial (@".", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@".", RegexOptions.Compiled, "%", "Pass. Group[0]=(0,1)"),
+			
+			new RegexTrial (@"\w", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\w", RegexOptions.Compiled, "?", "Fail."),
+			new RegexTrial (@"\W", RegexOptions.Compiled, "$", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\W", RegexOptions.Compiled, "c", "Fail."),
+
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "d", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "e", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "f", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "a", "Fail."),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "b", "Fail."),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "g", "Fail."),
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "z", "Fail."),
+
+			new RegexTrial (@"[c-f]", RegexOptions.Compiled, "xxxxdxxxx", "Pass. Group[0]=(4,1)"),
+
+			new RegexTrial (@"^[c-f]", RegexOptions.Compiled | RegexOptions.Multiline, "xx\nc", "Pass. Group[0]=(3,1)"),
+			new RegexTrial (@"^[c-f]", RegexOptions.Compiled | RegexOptions.Multiline, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[c-f]", RegexOptions.Compiled | RegexOptions.Multiline, "xxc", "Fail."),
+		
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "b", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "c", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "d", "Fail."),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "e", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "f", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "g", "Fail."),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "w", "Fail."),
+			new RegexTrial (@"^[a-ce-f]", RegexOptions.Compiled, "$", "Fail."),
+			new RegexTrial (@"^[a-ce-fg-wz]", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-fg-wz]", RegexOptions.Compiled, "j", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-fg-wz]", RegexOptions.Compiled, "z", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^[a-ce-fg-wz]", RegexOptions.Compiled, "y", "Fail."),
+			new RegexTrial (@"^[a-ce-fg-wz]", RegexOptions.Compiled, "d", "Fail."),
+
+			new RegexTrial (@"^[a-cd-e][wz][B-D]|(foo)|(bar)$", RegexOptions.Compiled, "bwC", "Pass. Group[0]=(0,3) Group[1]= Group[2]="),
+			new RegexTrial (@"^[a-cd-e][wz][B-D]|(foo)|(bar)$", RegexOptions.Compiled, "foo", "Pass. Group[0]=(0,3) Group[1]=(0,3) Group[2]="),
+			new RegexTrial (@"^[a-cd-e][wz][B-D]|(foo)|(bar)$", RegexOptions.Compiled, "bar", "Pass. Group[0]=(0,3) Group[1]= Group[2]=(0,3)"),
+			new RegexTrial (@"^[a-cd-e][wz][B-D]|(foo)|(bar)$", RegexOptions.Compiled, "dzB", "Pass. Group[0]=(0,3) Group[1]= Group[2]="),
+
+			new RegexTrial (@"^[a-cw-z].\W|(foo)|(bar)$", RegexOptions.Compiled, "cd$", "Pass. Group[0]=(0,3) Group[1]= Group[2]="),
+			new RegexTrial (@"^[a-cw-z].\W|(foo)|(bar)$", RegexOptions.Compiled, "gd$", "Fail."),
+			new RegexTrial (@"^([a-cw-z].\W|foo|bar)$", RegexOptions.Compiled, "foobar", "Fail."),
+
+			new RegexTrial (@"a", RegexOptions.Compiled | RegexOptions.IgnoreCase, "A", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"^A", RegexOptions.Compiled | RegexOptions.IgnoreCase, "a", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[a-ce-f]", RegexOptions.Compiled | RegexOptions.IgnoreCase, "A", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[A-Ce-f]", RegexOptions.Compiled | RegexOptions.IgnoreCase, "a", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"HeLlO", RegexOptions.Compiled | RegexOptions.IgnoreCase, "hello", "Pass. Group[0]=(0,5)"),
+			new RegexTrial (@"hello", RegexOptions.Compiled | RegexOptions.IgnoreCase, "HELLO", "Pass. Group[0]=(0,5)"),
+			
+			new RegexTrial (@"^(foo)+?$", RegexOptions.Compiled, "foo", "Pass. Group[0]=(0,3) Group[1]=(0,3)"),
+			new RegexTrial (@"^(foo)+?$", RegexOptions.Compiled, "foofoo", "Pass. Group[0]=(0,6) Group[1]=(0,3)(3,3)"),
+			new RegexTrial (@"^(foo)+?$", RegexOptions.Compiled, "foofoofoo", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)(6,3)"),
+			new RegexTrial (@"^(foo)+?bar$", RegexOptions.Compiled, "foobar", "Pass. Group[0]=(0,6) Group[1]=(0,3)"),
+			new RegexTrial (@"^(foo)+?bar$", RegexOptions.Compiled, "foofoobar", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)"),
+			new RegexTrial (@"^(foo)+?$", RegexOptions.Compiled, "", "Fail."),
+			new RegexTrial (@"^(foo)+?bar$", RegexOptions.Compiled, "bar", "Fail."),
+
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foofoofoo", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)(6,3)"),
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foofoofoofoo", "Pass. Group[0]=(0,12) Group[1]=(0,3)(3,3)(6,3)(9,3)"),
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foofoofoofoofoo", "Pass. Group[0]=(0,15) Group[1]=(0,3)(3,3)(6,3)(9,3)(12,3)"),
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foo", "Fail."),
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foofoo", "Fail."),
+			// This test pass in .NET but I Think it should fail!													
+			new RegexTrial (@"^(foo){3,5}?$", RegexOptions.Compiled, "foofoofoofoofoofoo", "Fail."),
+			new RegexTrial (@"^(foo){3,5}$", RegexOptions.Compiled, "foofoofoofoofoofoo", "Fail."),
+	
+			new RegexTrial (@"(foo)+?", RegexOptions.Compiled, "foo", "Pass. Group[0]=(0,3) Group[1]=(0,3)"),
+			new RegexTrial (@"(foo)+?", RegexOptions.Compiled, "foofoo", "Pass. Group[0]=(0,3) Group[1]=(0,3)"),
+			new RegexTrial (@"(foo)+?", RegexOptions.Compiled, "foofoofoo", "Pass. Group[0]=(0,3) Group[1]=(0,3)"),
+			new RegexTrial (@"(foo)+?", RegexOptions.Compiled, "", "Fail."),
+			
+			new RegexTrial (@"^(foo)+", RegexOptions.Compiled, "foo", "Pass. Group[0]=(0,3) Group[1]=(0,3)"),
+			new RegexTrial (@"^(foo)+", RegexOptions.Compiled, "foofoo", "Pass. Group[0]=(0,6) Group[1]=(0,3)(3,3)"),
+			new RegexTrial (@"^(foo)+", RegexOptions.Compiled, "foofoofoo", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)(6,3)"),
+			new RegexTrial (@"^(foo)+bar", RegexOptions.Compiled, "foobar", "Pass. Group[0]=(0,6) Group[1]=(0,3)"),
+			new RegexTrial (@"^(foo)+bar", RegexOptions.Compiled, "foofoobar", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)"),
+			new RegexTrial (@"^(foo)+", RegexOptions.Compiled, "", "Fail."),
+			new RegexTrial (@"^(foo)+bar", RegexOptions.Compiled, "bar", "Fail."),
+
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foofoofoo", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)(6,3)"),
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foofoofoofoo", "Pass. Group[0]=(0,12) Group[1]=(0,3)(3,3)(6,3)(9,3)"),
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foofoofoofoofoo", "Pass. Group[0]=(0,15) Group[1]=(0,3)(3,3)(6,3)(9,3)(12,3)"),
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foo", "Fail."),
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foofoo", "Fail."),
+			new RegexTrial (@"^(foo){3,5}$", RegexOptions.Compiled, "foofoofoofoofoofoo", "Fail."),
+			new RegexTrial (@"^(foo){3,5}", RegexOptions.Compiled, "foofoofoofoofoofoo", "Pass. Group[0]=(0,15) Group[1]=(0,3)(3,3)(6,3)(9,3)(12,3)"),
+
+			new RegexTrial (@"^(a|aa)a$", RegexOptions.Compiled, "aaa", "Pass. Group[0]=(0,3) Group[1]=(0,2)"),
+			//new RegexTrial (@"^(a*|aa)a$", RegexOptions.Compiled, "aaa", "Pass. Group[0]=(0,3) Group[1]=(0,2)"),
+			//new RegexTrial (@"^(b|a*)*b+$", RegexOptions.Compiled, "aaa", "Fail."),
+			//new RegexTrial (@"^(b|a*)*b+$", RegexOptions.Compiled, "aaab", "Pass. Group[0]=(0,4) Group[1]=(0,3)(3,0)"),
+			//new RegexTrial (@"^(b*|a*a)*$", RegexOptions.Compiled, "aaa", "Pass. Group[0]=(0,3) Group[1]=(0,3)(3,0)"),
+			//new RegexTrial (@"^(((((b|a*)*)*?)+)+?){1,5}$", RegexOptions.None, "aaa", ""),
+			
+
+			new RegexTrial (@"(\w){3,5}", RegexOptions.Compiled, "&& foo bar", "Pass. Group[0]=(3,3) Group[1]=(3,1)(4,1)(5,1)"),
+
+
+			new RegexTrial (@"[a-d]+", RegexOptions.Compiled, "d", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"[a-d]{4,6}", RegexOptions.Compiled, "abcd", "Pass. Group[0]=(0,4)"),
+			new RegexTrial (@"\w{4,6}", RegexOptions.Compiled, "abcde  fghi", "Pass. Group[0]=(0,5)"),
+			new RegexTrial (@"\w+", RegexOptions.Compiled, "%? & & ", "Fail."),
+			new RegexTrial (@".*", RegexOptions.Compiled, "!/$%?&*()a", "Pass. Group[0]=(0,10)"),
+			new RegexTrial (@"a*?aab", RegexOptions.Compiled, "aaaaaab", "Pass. Group[0]=(0,7)"),
+			new RegexTrial (@"a*?aa", RegexOptions.Compiled, "aaaa", "Pass. Group[0]=(0,2)"),
+			new RegexTrial (@"[a-d]+", RegexOptions.Compiled, "z", "Fail."),
+
+			new RegexTrial (@"(aa[b-d]+aa)*", RegexOptions.Compiled, "aabcdcdaaaadaa", "Pass. Group[0]=(0,14) Group[1]=(0,9)(9,5)"),
+			new RegexTrial (@"(a(b)*a)+", RegexOptions.Compiled, "aa", "Pass. Group[0]=(0,2) Group[1]=(0,2) Group[2]="),
+			new RegexTrial (@"(a(b)*a)+", RegexOptions.Compiled, "aba", "Pass. Group[0]=(0,3) Group[1]=(0,3) Group[2]=(1,1)"),
+			new RegexTrial (@"(a(b)*a)+", RegexOptions.Compiled, "aaaba", "Pass. Group[0]=(0,5) Group[1]=(0,2)(2,3) Group[2]=(3,1)"),
+			new RegexTrial (@"(a(b)*a)+", RegexOptions.Compiled, "a", "Fail."),
+			new RegexTrial (@"(a(b)*a)+", RegexOptions.Compiled, "abaabbbbb", "Pass. Group[0]=(0,3) Group[1]=(0,3) Group[2]=(1,1)"),
+
+			new RegexTrial (@"a+b+", RegexOptions.Compiled, "c", "Fail."),
+			new RegexTrial (@"a+b+", RegexOptions.Compiled, "aab", "Pass. Group[0]=(0,3)"),
+
+			new RegexTrial (@"^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?", RegexOptions.Compiled , "012cxx0190", "Pass. Group[0]=(0,10) Group[1]=(0,4) Group[2]= Group[3]=(6,4)"),
+ 			//new RegexTrial (@"^(b+?|a){1,2}c", RegexOptions.Compiled , "bbbac", "Pass. Group[0]=(0,5) Group[1]=(3,1)(0,3)"),
+
+			new RegexTrial (@"()?", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,0) Group[1]=(0,0)"),
+			new RegexTrial (@"(x)?(?(1)a|b)", RegexOptions.Compiled, "a", "Fail."),
+			new RegexTrial (@"(x)?(?(1)b|a)", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]="),
+			new RegexTrial (@"(x)(?(1)a)", RegexOptions.Compiled, "a", "Fail."),
+			new RegexTrial (@"()?(?(1)a)", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]=(0,0)"),
+
+			new RegexTrial (@"()?(?(1)b|a)", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]="),
+			new RegexTrial (@"()(?(1)b|a)", RegexOptions.Compiled, "a", "Fail."),
+			new RegexTrial (@"()?(?(1)a|b)", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]=(0,0)"),
+
+
+			new RegexTrial (@"\1", RegexOptions.Compiled, "-", "Error."),
+			new RegexTrial (@"\2", RegexOptions.Compiled, "-", "Error."),
+			new RegexTrial (@"(a)|\1", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]=(0,1)"),
+			new RegexTrial (@"(a)|\1", RegexOptions.Compiled, "x", "Fail."),
+			new RegexTrial (@"(a)|\2", RegexOptions.Compiled, "-", "Error."),
+			new RegexTrial (@"(([a-c])b*?\2)*", RegexOptions.Compiled, "ababbbcbc", "Pass. Group[0]=(0,5) Group[1]=(0,3)(3,2) Group[2]=(0,1)(3,1)"),
+			//new RegexTrial (@"(([a-c])b*?\2){3}", RegexOptions.Compiled, "ababbbcbc", "Pass. Group[0]=(0,9) Group[1]=(0,3)(3,3)(6,3) Group[2]=(0,1)(3,1)(6,1)"),
+			new RegexTrial (@"((\3|b)\2(a)x)+", RegexOptions.Compiled, "aaxabxbaxbbx", "Fail."),
+			new RegexTrial (@"((\3|b)\2(a)x)+", RegexOptions.Compiled, "aaaxabaxbaaxbbax", "Pass. Group[0]=(12,4) Group[1]=(12,4) Group[2]=(12,1) Group[3]=(14,1)"),
+			new RegexTrial (@"((\3|b)\2(a)){2,}", RegexOptions.Compiled, "bbaababbabaaaaabbaaaabba", "Pass. Group[0]=(15,9) Group[1]=(15,3)(18,3)(21,3) Group[2]=(15,1)(18,1)(21,1) Group[3]=(17,1)(20,1)(23,1)"),
+			new RegexTrial (@"((((((((((a))))))))))\10", RegexOptions.Compiled | RegexOptions.IgnoreCase, "AA", "Pass. Group[0]=(0,2) Group[1]=(0,1) Group[2]=(0,1) Group[3]=(0,1) Group[4]=(0,1) Group[5]=(0,1) Group[6]=(0,1) Group[7]=(0,1) Group[8]=(0,1) Group[9]=(0,1) Group[10]=(0,1)"),
+
+			new RegexTrial (@"^(foo)|(bar)$", RegexOptions.Compiled, "foobar", "Pass. Group[0]=(0,3) Group[1]=(0,3) Group[2]="),
+			new RegexTrial (@"^(foo)|(bar)$", RegexOptions.Compiled | RegexOptions.RightToLeft, "foobar", "Pass. Group[0]=(3,3) Group[1]= Group[2]=(3,3)"),
+
+
+			new RegexTrial (@"[a-z]{3,5}s", RegexOptions.Compiled, "nous", "Pass. Group[0]=(0,4)"),
+			new RegexTrial (@"(a)*a", RegexOptions.Compiled, "a", "Pass. Group[0]=(0,1) Group[1]="),
+			new RegexTrial (@"(a)*a", RegexOptions.Compiled, "aa", "Pass. Group[0]=(0,2) Group[1]=(0,1)"),
+			new RegexTrial (@"(a)*a", RegexOptions.Compiled, "aaa", "Pass. Group[0]=(0,3) Group[1]=(0,1)(1,1)"),
+			new RegexTrial (@"(a)*a", RegexOptions.Compiled, "", "Fail."),
+
+			new RegexTrial (@"(a)*aaa", RegexOptions.Compiled, "aaaa", "Pass. Group[0]=(0,4) Group[1]=(0,1)"),
+			new RegexTrial (@"(a)*aaa", RegexOptions.Compiled, "aaa", "Pass. Group[0]=(0,3) Group[1]="),
+			new RegexTrial (@"(a)+aaa", RegexOptions.Compiled, "aaaa", "Pass. Group[0]=(0,4) Group[1]=(0,1)"),
+			new RegexTrial (@"(a)+aaa", RegexOptions.Compiled, "aaa", "Fail."),
+
+
+			new RegexTrial (@"b", RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaa", "Pass. Group[0]=(2,1)"),
+ 			new RegexTrial (@"bab", RegexOptions.Compiled | RegexOptions.RightToLeft, "babababaa", "Pass. Group[0]=(4,3)"),
+			new RegexTrial (@"abb", RegexOptions.Compiled | RegexOptions.RightToLeft , "abb", "Pass. Group[0]=(0,3)"),
+
+           		new RegexTrial (@"b$", RegexOptions.Compiled | RegexOptions.RightToLeft | RegexOptions.Multiline, "aab\naab", "Pass. Group[0]=(6,1)"),
+			new RegexTrial (@"bb$", RegexOptions.Compiled | RegexOptions.RightToLeft | RegexOptions.Multiline, "abb\naab", "Pass. Group[0]=(1,2)"),
+            		new RegexTrial (@"^a", RegexOptions.Compiled | RegexOptions.RightToLeft | RegexOptions.Multiline, "aab\naab", "Pass. Group[0]=(4,1)"),
+            		new RegexTrial (@"^aaab", RegexOptions.Compiled | RegexOptions.RightToLeft | RegexOptions.Multiline, "aaab\naab", "Pass. Group[0]=(0,4)"),
+
+
+  			new RegexTrial (@"\Ab",  RegexOptions.Compiled | RegexOptions.RightToLeft, "bab\naaa", "Pass. Group[0]=(0,1)"),
+            		new RegexTrial (@"\Abab$",  RegexOptions.Compiled | RegexOptions.RightToLeft, "bab", "Pass. Group[0]=(0,3)"),
+            		new RegexTrial (@"b\Z",  RegexOptions.Compiled | RegexOptions.RightToLeft, "bab\naaa", "Fail."),
+		        new RegexTrial (@"b\Z",  RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaab", "Pass. Group[0]=(6,1)"),
+            		new RegexTrial (@"b\z",  RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaa", "Fail."),
+            		new RegexTrial (@"b\z",  RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaab", "Pass. Group[0]=(6,1)"),
+			new RegexTrial (@"a\G",  RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaa", "Pass. Group[0]=(5,1)"),
+			new RegexTrial (@"\Abaaa\G",  RegexOptions.Compiled | RegexOptions.RightToLeft, "baaa", "Pass. Group[0]=(0,4)"),
+
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa c aaa c a", "Pass. Group[0]=(10,1)"),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "c aaa c", "Pass. Group[0]=(6,1)"),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa ac", "Fail."),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "c aaa", "Pass. Group[0]=(0,1)"),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaacaaa", "Fail."),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaac aaa", "Fail."),
+			new RegexTrial (@"\bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa ca caaa", "Pass. Group[0]=(7,1)"),
+
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "ac aaa ac", "Pass. Group[0]=(8,1)"),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa c", "Fail."),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "ca aaa", "Fail."),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa c aaa", "Fail."),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, " acaca ", "Pass. Group[0]=(4,1)"),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaac aaac", "Pass. Group[0]=(8,1)"),
+			new RegexTrial (@"\Bc",  RegexOptions.Compiled | RegexOptions.RightToLeft, "aaa caaa", "Fail."),
+
+			new RegexTrial (@"b(a?)b", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabababbaaababa", "Pass. Group[0]=(11,3) Group[1]=(12,1)"),
+			new RegexTrial (@"b{4}", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbbaabbbbaabbb", "Pass. Group[0]=(7,4)"),
+			new RegexTrial (@"b\1aa(.)", RegexOptions.Compiled | RegexOptions.RightToLeft, "bBaaB", "Pass. Group[0]=(0,5) Group[1]=(4,1)"),
+			new RegexTrial (@"b(.)aa\1", RegexOptions.Compiled | RegexOptions.RightToLeft, "bBaaB", "Fail."),
+
+ 			//new RegexTrial (@"^(a\1?){4}$", RegexOptions.Compiled | RegexOptions.RightToLeft, "aaaaaa", "Pass. Group[0]=(0,6) Group[1]=(5,1)(3,2)(2,1)(0,2)"),
+ 			new RegexTrial (@"^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?", RegexOptions.Compiled | RegexOptions.RightToLeft, "012cxx0190", "Pass. Group[0]=(0,10) Group[1]=(0,4) Group[2]= Group[3]=(6,4)"),
+// 			new RegexTrial (@"^(b+?|a){1,2}c", RegexOptions.Compiled | RegexOptions.RightToLeft, "bbbac", "Pass. Group[0]=(0,5) Group[1]=(3,1)(0,3)"),
+ 			new RegexTrial (@"\((\w\. \w+)\)", RegexOptions.Compiled | RegexOptions.RightToLeft, "cd. (A. Tw)", "Pass. Group[0]=(4,7) Group[1]=(5,5)"),
+ 			new RegexTrial (@"((?:aaaa|bbbb)cccc)?", RegexOptions.Compiled | RegexOptions.RightToLeft, "aaaacccc", "Pass. Group[0]=(0,8) Group[1]=(0,8)"),
+ 			new RegexTrial (@"((?:aaaa|bbbb)cccc)?", RegexOptions.Compiled | RegexOptions.RightToLeft, "bbbbcccc", "Pass. Group[0]=(0,8) Group[1]=(0,8)"),
+
+// 			new RegexTrial (@"(?<=a)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(1,1)"),
+// 			new RegexTrial (@"(?<=a)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "cb", "Fail."),
+// 			new RegexTrial (@"(?<=a)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "b", "Fail."),
+// 			new RegexTrial (@"(?<!c)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(1,1)"),
+// 			new RegexTrial (@"(?<!c)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "cb", "Fail."),
+// 			new RegexTrial (@"(?<!c)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "b", "Pass. Group[0]=(0,1)"),
+// 			new RegexTrial (@"(?<!c)b", RegexOptions.Compiled |RegexOptions.RightToLeft, "b", "Pass. Group[0]=(0,1)"),
+// 			new RegexTrial (@"a(?=d).", RegexOptions.Compiled |RegexOptions.RightToLeft, "adabad", "Pass. Group[0]=(4,2)"),
+// 			new RegexTrial (@"a(?=c|d).",RegexOptions.Compiled | RegexOptions.RightToLeft, "adabad", "Pass. Group[0]=(4,2)"),
+
+ 			new RegexTrial (@"ab*c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"ab*bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"ab*bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbc", "Pass. Group[0]=(0,4)"),
+ 			new RegexTrial (@"ab*bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@".{1}",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(5,1)"),
+ 			new RegexTrial (@".{3,4}",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(2,4)"),
+ 			new RegexTrial (@"ab{0,}bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@"ab+bc",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbc", "Pass. Group[0]=(0,4)"),
+ 			new RegexTrial (@"ab+bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Fail."),
+ 			new RegexTrial (@"ab+bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abq", "Fail."),
+ 			new RegexTrial (@"ab{1,}bc", RegexOptions.Compiled |RegexOptions.RightToLeft, "abq", "Fail."),
+ 			new RegexTrial (@"ab+bc",RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@"ab{1,}bc",  RegexOptions.Compiled |RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@"ab{1,3}bc",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@"ab{3,4}bc",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbbbc", "Pass. Group[0]=(0,6)"),
+ 			new RegexTrial (@"ab{4,5}bc",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abbbbc", "Fail."),
+ 			new RegexTrial (@"ab?bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbc", "Pass. Group[0]=(0,4)"),
+ 			new RegexTrial (@"ab?bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"ab{0,1}bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"ab?bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbbc", "Fail."),
+ 			new RegexTrial (@"ab?c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"ab{0,1}c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"^abc$", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"^abc$", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcc", "Fail."),
+ 			new RegexTrial (@"^abc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"^abc$", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabc", "Fail."),
+ 			new RegexTrial (@"abc$", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabc", "Pass. Group[0]=(1,3)"),
+ 			new RegexTrial (@"abc$", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabcd", "Fail."),
+ 			new RegexTrial (@"^", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,0)"),
+ 			new RegexTrial (@"$", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(3,0)"),
+ 			new RegexTrial (@"a.c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a.c", RegexOptions.Compiled | RegexOptions.RightToLeft, "axc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a.*c", RegexOptions.Compiled | RegexOptions.RightToLeft, "axyzc", "Pass. Group[0]=(0,5)"),
+ 			new RegexTrial (@"a.*c", RegexOptions.Compiled | RegexOptions.RightToLeft, "axyzd", "Fail."),
+ 			new RegexTrial (@"a[bc]d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Fail."),
+ 			new RegexTrial (@"a[bc]d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abd", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a[b-d]e", RegexOptions.Compiled | RegexOptions.RightToLeft, "abd", "Fail."),
+ 			new RegexTrial (@"a[b-d]e", RegexOptions.Compiled |RegexOptions.RightToLeft, "ace", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a[b-d]", RegexOptions.Compiled | RegexOptions.RightToLeft, "aac", "Pass. Group[0]=(1,2)"),
+ 			new RegexTrial (@"a[-b]", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"a[b-]", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"a[b-a]", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"a[]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"a[", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"a]", RegexOptions.Compiled | RegexOptions.RightToLeft, "a]", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"a[]]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a]b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a[^bc]d",RegexOptions.Compiled |  RegexOptions.RightToLeft, "aed", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a[^bc]d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abd", "Fail."),
+ 			new RegexTrial (@"a[^-b]c", RegexOptions.Compiled | RegexOptions.RightToLeft, "adc", "Pass. Group[0]=(0,3)"),
+ 			//new RegexTrial (@"a[^-b]c", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-c", "Fail."),
+ 			//new RegexTrial (@"a[^]b]c", RegexOptions.Compiled | RegexOptions.RightToLeft, "a]c", "Fail."),
+ 			new RegexTrial (@"a[^]b]c", RegexOptions.Compiled | RegexOptions.RightToLeft, "adc", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"\ba\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"\ba\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "-a", "Pass. Group[0]=(1,1)"),
+ 			new RegexTrial (@"\ba\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "-a-", "Pass. Group[0]=(1,1)"),
+ 			new RegexTrial (@"\by\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "xy", "Fail."),
+ 			new RegexTrial (@"\by\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "yz", "Fail."),
+ 			new RegexTrial (@"\by\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "xyz", "Fail."),
+ 			new RegexTrial (@"\Ba\B", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-", "Fail."),
+ 			new RegexTrial (@"\Ba\B", RegexOptions.Compiled | RegexOptions.RightToLeft, "-a", "Fail."),
+ 			new RegexTrial (@"\Ba\B", RegexOptions.Compiled | RegexOptions.RightToLeft, "-a-", "Fail."),
+ 			new RegexTrial (@"\By\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "xy", "Pass. Group[0]=(1,1)"),
+ 			new RegexTrial (@"\by\B", RegexOptions.Compiled | RegexOptions.RightToLeft, "yz", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"\By\B", RegexOptions.Compiled | RegexOptions.RightToLeft, "xyz", "Pass. Group[0]=(1,1)"),
+ 			new RegexTrial (@"\w", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"\w", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Fail."),
+ 			new RegexTrial (@"\W", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Fail."),
+ 			new RegexTrial (@"\W", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"a\sb", RegexOptions.Compiled | RegexOptions.RightToLeft, "a b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a\sb", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-b", "Fail."),
+ 			new RegexTrial (@"a\Sb", RegexOptions.Compiled | RegexOptions.RightToLeft, "a b", "Fail."),
+ 			new RegexTrial (@"a\Sb", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"\d", RegexOptions.Compiled | RegexOptions.RightToLeft, "1", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"\d", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Fail."),
+ 			new RegexTrial (@"\D", RegexOptions.Compiled | RegexOptions.RightToLeft, "1", "Fail."),
+ 			new RegexTrial (@"\D", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"[\w]", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"[\w]", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Fail."),
+ 			new RegexTrial (@"[\W]", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Fail."),
+ 			new RegexTrial (@"[\W]", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"a[\s]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a[\s]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-b", "Fail."),
+ 			new RegexTrial (@"a[\S]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a b", "Fail."),
+ 			new RegexTrial (@"a[\S]b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a-b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"[\d]", RegexOptions.Compiled | RegexOptions.RightToLeft, "1", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"[\d]", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Fail."),
+ 			new RegexTrial (@"[\D]", RegexOptions.Compiled | RegexOptions.RightToLeft, "1", "Fail."),
+ 			new RegexTrial (@"[\D]", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"ab|cd", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"ab|cd", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(2,2)"),
+ 			new RegexTrial (@"()ef", RegexOptions.Compiled | RegexOptions.RightToLeft, "def", "Pass. Group[0]=(1,2) Group[1]=(1,0)"),
+ 			new RegexTrial (@"*a", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"(*)b", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"$b", RegexOptions.Compiled | RegexOptions.RightToLeft, "b", "Fail."),
+ 			new RegexTrial (@"a\", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"a\(b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a(b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"a\(*b", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"a\(*b", RegexOptions.Compiled |RegexOptions.RightToLeft, "a((b", "Pass. Group[0]=(0,4)"),
+ 			new RegexTrial (@"a\\b", RegexOptions.Compiled | RegexOptions.RightToLeft, "a\\b", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"abc)", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"(abc", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"((a))", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,1) Group[1]=(0,1) Group[2]=(0,1)"),
+ 			new RegexTrial (@"(a)b(c)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3) Group[1]=(0,1) Group[2]=(2,1)"),
+ 			new RegexTrial (@"a+b+c", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabbabc", "Pass. Group[0]=(4,3)"),
+ 			new RegexTrial (@"a{1,}b{1,}c", RegexOptions.Compiled | RegexOptions.RightToLeft, "aabbabc", "Pass. Group[0]=(4,3)"),
+ 			new RegexTrial (@"a**", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"a.+?c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcabc", "Pass. Group[0]=(3,3)"),
+//  			new RegexTrial (@"(a+|b)*", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(0,2) Group[1]=(1,1)(0,1)"),
+//  			new RegexTrial (@"(a+|b){0,}", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(0,2) Group[1]=(1,1)(0,1)"),
+//  			new RegexTrial (@"(a+|b)+", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(0,2) Group[1]=(1,1)(0,1)"),
+//  			new RegexTrial (@"(a+|b){1,}", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(0,2) Group[1]=(1,1)(0,1)"),
+//  			new RegexTrial (@"(a+|b)?", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(1,1) Group[1]=(1,1)"),
+//  			new RegexTrial (@"(a+|b){0,1}", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Pass. Group[0]=(1,1) Group[1]=(1,1)"),
+ 			new RegexTrial (@")(", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"[^ab]*", RegexOptions.Compiled | RegexOptions.RightToLeft, "cde", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"abc", RegexOptions.Compiled | RegexOptions.RightToLeft, "", "Fail."),
+ 			new RegexTrial (@"a*", RegexOptions.Compiled | RegexOptions.RightToLeft, "", "Pass. Group[0]=(0,0)"),
+ 			new RegexTrial (@"([abc])*d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abbbcd", "Pass. Group[0]=(0,6) Group[1]=(4,1)(3,1)(2,1)(1,1)(0,1)"),
+ 			new RegexTrial (@"([abc])*bcd", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(0,1)"),
+ 			new RegexTrial (@"a|b|c|d|e",RegexOptions.Compiled | RegexOptions.RightToLeft, "e", "Pass. Group[0]=(0,1)"),
+ 			new RegexTrial (@"(a|b|c|d|e)f", RegexOptions.Compiled | RegexOptions.RightToLeft, "ef", "Pass. Group[0]=(0,2) Group[1]=(0,1)"),
+ 			new RegexTrial (@"abcd*efg", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcdefg", "Pass. Group[0]=(0,7)"),
+ 			new RegexTrial (@"ab*", RegexOptions.Compiled | RegexOptions.RightToLeft, "xabyabbbz", "Pass. Group[0]=(4,4)"),
+ 			new RegexTrial (@"ab*", RegexOptions.Compiled | RegexOptions.RightToLeft, "xayabbbz", "Pass. Group[0]=(3,4)"),
+ 			new RegexTrial (@"(ab|cd)e", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcde", "Pass. Group[0]=(2,3) Group[1]=(2,2)"),
+ 			new RegexTrial (@"[abhgefdc]ij", RegexOptions.Compiled | RegexOptions.RightToLeft, "hij", "Pass. Group[0]=(0,3)"),
+ 			new RegexTrial (@"^(ab|cd)e", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcde", "Fail."),
+ 			new RegexTrial (@"(abc|)ef", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcdef", "Pass. Group[0]=(4,2) Group[1]=(4,0)"),
+ 			new RegexTrial (@"(a|b)c*d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(1,3) Group[1]=(1,1)"),
+// 			new RegexTrial (@"(ab|ab*)bc", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3) Group[1]=(0,1)"),
+ 			new RegexTrial (@"a([bc]*)c*", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3) Group[1]=(1,1)"),
+ 			new RegexTrial (@"a([bc]*)(c*d)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(1,1) Group[2]=(2,2)"),
+ 			new RegexTrial (@"a([bc]+)(c*d)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(1,1) Group[2]=(2,2)"),
+ 			new RegexTrial (@"a([bc]*)(c+d)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(1,1) Group[2]=(2,2)"),
+ 			new RegexTrial (@"a[bcd]*dcdcde", RegexOptions.Compiled | RegexOptions.RightToLeft, "adcdcde", "Pass. Group[0]=(0,7)"),
+ 			new RegexTrial (@"a[bcd]+dcdcde", RegexOptions.Compiled | RegexOptions.RightToLeft, "adcdcde", "Fail."),
+ 			new RegexTrial (@"(ab|a)b*c", RegexOptions.Compiled | RegexOptions.RightToLeft, "abc", "Pass. Group[0]=(0,3) Group[1]=(0,1)"),
+ 			new RegexTrial (@"((a)(b)c)(d)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(0,3) Group[2]=(0,1) Group[3]=(1,1) Group[4]=(3,1)"),
+ 			new RegexTrial (@"[a-zA-Z_][a-zA-Z0-9_]*", RegexOptions.Compiled | RegexOptions.RightToLeft, "alpha", "Pass. Group[0]=(0,5)"),
+ 			new RegexTrial (@"^a(bc+|b[eh])g|.h$", RegexOptions.Compiled | RegexOptions.RightToLeft, "abh", "Pass. Group[0]=(1,2) Group[1]="),
+// 			new RegexTrial (@"(bc+d$|ef*g.|h?i(j|k))", RegexOptions.Compiled | RegexOptions.RightToLeft, "effgz", "Pass. Group[0]=(0,5) Group[1]=(0,5) Group[2]="),
+// 			new RegexTrial (@"(bc+d$|ef*g.|h?i(j|k))", RegexOptions.Compiled | RegexOptions.RightToLeft, "ij", "Pass. Group[0]=(0,2) Group[1]=(0,2) Group[2]=(1,1)"),
+// 			new RegexTrial (@"(bc+d$|ef*g.|h?i(j|k))", RegexOptions.Compiled | RegexOptions.RightToLeft, "effg", "Fail."),
+// 			new RegexTrial (@"(bc+d$|ef*g.|h?i(j|k))", RegexOptions.Compiled | RegexOptions.RightToLeft, "bcdd", "Fail."),
+// 			new RegexTrial (@"(bc+d$|ef*g.|h?i(j|k))", RegexOptions.Compiled | RegexOptions.RightToLeft, "reffgz", "Pass. Group[0]=(1,5) Group[1]=(1,5) Group[2]="),
+			new RegexTrial (@"((((((((((a))))))))))", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Pass. Group[0]=(0,1) Group[1]=(0,1) Group[2]=(0,1) Group[3]=(0,1) Group[4]=(0,1) Group[5]=(0,1) Group[6]=(0,1) Group[7]=(0,1) Group[8]=(0,1) Group[9]=(0,1) Group[10]=(0,1)"),
+ 			new RegexTrial (@"((((((((((a))))))))))\10", RegexOptions.RightToLeft, "aa", "Fail."),
+ 			new RegexTrial (@"\10((((((((((a))))))))))", RegexOptions.RightToLeft, "aa", "Pass. Group[0]=(0,2) Group[1]=(1,1) Group[2]=(1,1) Group[3]=(1,1) Group[4]=(1,1) Group[5]=(1,1) Group[6]=(1,1) Group[7]=(1,1) Group[8]=(1,1) Group[9]=(1,1) Group[10]=(1,1)"),
+ 			new RegexTrial (@"((((((((((a))))))))))!", RegexOptions.Compiled | RegexOptions.RightToLeft, "aa", "Fail."),
+ 			new RegexTrial (@"((((((((((a))))))))))!", RegexOptions.Compiled | RegexOptions.RightToLeft, "a!", "Pass. Group[0]=(0,2) Group[1]=(0,1) Group[2]=(0,1) Group[3]=(0,1) Group[4]=(0,1) Group[5]=(0,1) Group[6]=(0,1) Group[7]=(0,1) Group[8]=(0,1) Group[9]=(0,1) Group[10]=(0,1)"),
+ 			new RegexTrial (@"(((((((((a)))))))))", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Pass. Group[0]=(0,1) Group[1]=(0,1) Group[2]=(0,1) Group[3]=(0,1) Group[4]=(0,1) Group[5]=(0,1) Group[6]=(0,1) Group[7]=(0,1) Group[8]=(0,1) Group[9]=(0,1)"),
+ 			new RegexTrial (@"multiple words of text", RegexOptions.Compiled | RegexOptions.RightToLeft, "uh-uh", "Fail."),
+ 			new RegexTrial (@"multiple words", RegexOptions.Compiled | RegexOptions.RightToLeft, "multiple words, yeah", "Pass. Group[0]=(0,14)"),
+ 			new RegexTrial (@"(.*)c(.*)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcde", "Pass. Group[0]=(0,5) Group[1]=(0,2) Group[2]=(3,2)"),
+ 			new RegexTrial (@"\((.*), (.*)\)", RegexOptions.Compiled | RegexOptions.RightToLeft, "(a, b)", "Pass. Group[0]=(0,6) Group[1]=(1,1) Group[2]=(4,1)"),
+ 			new RegexTrial (@"[k]", RegexOptions.Compiled | RegexOptions.RightToLeft, "ab", "Fail."),
+ 			new RegexTrial (@"abcd", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4)"),
+ 			new RegexTrial (@"a(bc)d", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcd", "Pass. Group[0]=(0,4) Group[1]=(1,2)"),
+ 			new RegexTrial (@"a[-]?c", RegexOptions.Compiled | RegexOptions.RightToLeft, "ac", "Pass. Group[0]=(0,2)"),
+ 			new RegexTrial (@"(abc)\1", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcabc", "Fail."),
+ 			new RegexTrial (@"\1(abc)",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abcabc", "Pass. Group[0]=(0,6) Group[1]=(3,3)"),
+ 			new RegexTrial (@"([a-c]*)\1",RegexOptions.Compiled |  RegexOptions.RightToLeft, "abcabc", "Fail."),
+ 			new RegexTrial (@"\1([a-c]*)", RegexOptions.Compiled | RegexOptions.RightToLeft, "abcabc", "Pass. Group[0]=(0,6) Group[1]=(3,3)"),
+ 			new RegexTrial (@"\1",RegexOptions.Compiled |  RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"\2",RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			new RegexTrial (@"(a)|\1", RegexOptions.Compiled | RegexOptions.RightToLeft, "a", "Pass. Group[0]=(0,1) Group[1]=(0,1)"),
+ 			new RegexTrial (@"(a)|\1", RegexOptions.Compiled |  RegexOptions.RightToLeft, "x", "Fail."),
+ 			new RegexTrial (@"(a)|\2", RegexOptions.Compiled | RegexOptions.RightToLeft, "-", "Error."),
+ 			//new RegexTrial (@"(([a-c])b*?\2)*", RegexOptions.Compiled | RegexOptions.RightToLeft, "ababbbcbc", "Pass. Group[0]=(9,0) Group[1]= Group[2]="),
+ 			//new RegexTrial (@"(([a-c])b*?\2){3}", RegexOptions.Compiled | RegexOptions.RightToLeft, "ababbbcbc", "Fail."),
+ 			//new RegexTrial (@"((\3|b)\2(a)x)+", RegexOptions.Compiled | RegexOptions.RightToLeft, "aaxabxbaxbbx", "Fail."),
+ 			//new RegexTrial (@"((\3|b)\2(a)x)+", RegexOptions.Compiled | RegexOptions.RightToLeft, "aaaxabaxbaaxbbax", "Fail."),
+ 			//new RegexTrial (@"((\3|b)\2(a)){2,}", RegexOptions.Compiled | RegexOptions.RightToLeft, "bbaababbabaaaaabbaaaabba", "Fail."),
+
+
+
+
+new RegexTrial (@"b", RegexOptions.Compiled | RegexOptions.RightToLeft, "babaaa", "Pass. Group[0]=(2,1)")
+		};
+	}
+}
Index: class/System/Test/System.Text.RegularExpressions/CILRegexTest.cs
===================================================================
--- class/System/Test/System.Text.RegularExpressions/CILRegexTest.cs	(revision 0)
+++ class/System/Test/System.Text.RegularExpressions/CILRegexTest.cs	(revision 0)
@@ -0,0 +1,46 @@
+//
+// assembly:	System_test
+// namespace:	MonoTests.System.Text.RegularExpressions
+// file:	CILRegexTest.cs
+//
+// Authors:	
+//   Francois Poirier-Beauchemiin (beauche@softhome.net)
+//
+// Inspired by PerlTest.cs
+// (c) 2002 Dan Lewis
+// (c) 2003 Martin Willemoes Hansen
+
+using System;
+using System.Text.RegularExpressions;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Text.RegularExpressions {
+	
+	[TestFixture]
+	public class CILRegexTest {
+
+		[Test]
+		public void Trials () {
+
+			string msg = "";
+			foreach (RegexTrial trial in CILRegexTrials.trials) {
+				string actual = trial.Execute ();
+				if (actual != trial.Expected) {
+					msg += "\t" + trial.ToString () +
+						"Expected " + trial.Expected
+ +
+						" but got " + actual + "\n";
+						
+					if ( trial.Error != "" ) 
+						msg += "\n" + trial.Error;
+				
+				}
+
+			}
+
+			if (msg != "" ) 
+				Assertion.Fail("\n" + msg);
+		}
+	}
+}
Index: class/System/System.dll.sources
===================================================================
--- class/System/System.dll.sources	(revision 60098)
+++ class/System/System.dll.sources	(working copy)
@@ -874,3 +874,6 @@
 System.Net/UploadValuesCompletedEventHandler.cs
 System.Net/UploadStringCompletedEventHandler.cs
 System.Net/DownloadStringCompletedEventHandler.cs
+System.Text.RegularExpressions/CILCompiler.cs
+System.Text.RegularExpressions/quicksearch_unsafe.cs
+System.Text.RegularExpressions/Checkpoint.cs
Index: class/System/System.Text.RegularExpressions/arch.cs
===================================================================
--- class/System/System.Text.RegularExpressions/arch.cs	(revision 60098)
+++ class/System/System.Text.RegularExpressions/arch.cs	(working copy)
@@ -72,7 +72,9 @@
 
 		// miscellaneous
 		
-		Info			// pattern information
+		Info,			// pattern information
+		Undefined,               // used by CILCompiler
+		Orphan	
 	}
 
 	[Flags]
Index: class/System/System.Text.RegularExpressions/syntax.cs
===================================================================
--- class/System/System.Text.RegularExpressions/syntax.cs	(revision 60098)
+++ class/System/System.Text.RegularExpressions/syntax.cs	(working copy)
@@ -407,7 +407,9 @@
 		}
 
 		public override void Compile (ICompiler cmp, bool reverse) {
-			if (Expression.IsComplex ()) {
+
+			//TODO : Enhance the IL Compiler with some tricks of the FastRepeat
+			if (Expression.IsComplex () || typeof(CILCompiler).IsInstanceOfType(cmp)) {
 				LinkRef until = cmp.NewLink ();
 
 				cmp.EmitRepeat (min, max, lazy, until);
@@ -641,20 +643,54 @@
 
 		public override void Compile (ICompiler cmp, bool reverse) {
 			//			LinkRef next = cmp.NewLink ();
-			LinkRef tail = cmp.NewLink ();
+			if ( typeof(CILCompiler).IsInstanceOfType(cmp)) {
+				CILCompiler CILcmp = (CILCompiler)cmp;
+				LinkRef tail = cmp.NewLink();
+				
+				LinkRef[] branch = new LinkRef[Alternatives.Count];
+				CILcmp.EmitAlternationStart();				
+				int j = 0;
+				foreach (Expression e in Alternatives) {
+					//Expression e = Alternatives[j];
+					LinkRef next = cmp.NewLink ();
+					branch[j] = cmp.NewLink();	
+				
+					cmp.ResolveLink(branch[j]);
 
-			foreach (Expression e in Alternatives) {
-				LinkRef next = cmp.NewLink ();
-				cmp.EmitBranch (next);
-				e.Compile (cmp, reverse);
-				cmp.EmitJump (tail);
-				cmp.ResolveLink (next);
-				cmp.EmitBranchEnd();
+					CILcmp.EmitBranch(next, j);
+					e.Compile(cmp, reverse);				
+					cmp.EmitJump(tail);
+
+					cmp.ResolveLink(next);
+					CILcmp.EmitBranchEnd();	
+					j++;
+				}
+
+
+				
+				CILcmp.EmitAlternationEnd(branch, tail);
+				cmp.ResolveLink (tail);				
+			
+
+				
+ 			}
+			else {
+				
+				LinkRef tail = cmp.NewLink ();
+				
+
+				foreach (Expression e in Alternatives) {
+					LinkRef next = cmp.NewLink ();
+					cmp.EmitBranch (next);
+					e.Compile (cmp, reverse);				
+					cmp.EmitJump (tail);
+					cmp.ResolveLink (next);				
+				}
+				
+				cmp.EmitFalse ();
+				cmp.ResolveLink (tail);
+
 			}
-
-			cmp.EmitFalse ();
-			cmp.ResolveLink (tail);
-			cmp.EmitAlternationEnd();
 		}
 
 		public override void GetWidth (out int min, out int max) {
Index: class/System/System.Text.RegularExpressions/Checkpoint.cs
===================================================================
--- class/System/System.Text.RegularExpressions/Checkpoint.cs	(revision 0)
+++ class/System/System.Text.RegularExpressions/Checkpoint.cs	(revision 0)
@@ -0,0 +1,139 @@
+//
+// assembly:	System
+// namespace:	System.Text.RegularExpressions
+// file:	Checkpoint.cs
+//
+// Authors:	Eric Durand-Tremblay (eric.durand-tremblay.1@ulaval.ca
+//
+// (c) 2004 Eric Durand-Tremblay
+//
+
+using System;
+using System.Collections;
+using System.Diagnostics;
+
+namespace System.Text.RegularExpressions {
+	[CLSCompliantAttribute(false)]
+	internal interface ICheckpointStack {	    
+		Checkpoint pop();
+		Checkpoint peek();
+		void clear();
+		void delete();
+		void push(Checkpoint cp);
+	}
+       
+	internal unsafe class ArrayCheckpointStack : ICheckpointStack {
+		private const int STEP = 8;
+
+		public ArrayCheckpointStack () 
+		{
+			checkpoints = new Checkpoint[STEP];
+			nb = -1;
+		}
+	    
+		public Checkpoint pop() {
+			Debug.Assert(nb != -1, "Regex", "Empty Checkpoint Stack" );		
+			
+			return checkpoints[nb--];
+		}
+
+		public Checkpoint peek() {
+			Debug.Assert(nb != -1, "Regex", "Empty Checkpoint Stack" );		
+			return checkpoints[nb];
+		}
+
+		public void push(Checkpoint cp) {
+
+			if(++nb == checkpoints.Length) {
+				Checkpoint[] tmp = new Checkpoint[nb + STEP];
+				checkpoints.CopyTo(tmp, 0);
+				checkpoints = tmp;
+			}
+
+			checkpoints[nb] = cp;
+		}
+
+		public void clear() {
+			nb = 0;
+		}
+
+		public void delete() {
+			nb--;
+		}
+
+		private Checkpoint[] checkpoints; //Storage
+		private int nb; //Number of checkpoint stored
+	}
+
+
+	internal unsafe class StaticCheckpointStack : ICheckpointStack {
+		
+		public StaticCheckpointStack () 
+		{
+		}
+	    
+		public Checkpoint pop() {
+			return checkpoint;
+		}
+
+		public Checkpoint peek() {
+			return checkpoint;
+		}
+
+		public void push(Checkpoint cp) {
+			checkpoint = cp;
+		}
+
+		public void clear() {			
+		}
+
+		public void delete() {
+		}
+		
+		private Checkpoint checkpoint; //Storage
+	}
+	
+	internal unsafe class StackCheckpointStack : ICheckpointStack {
+		
+		public StackCheckpointStack () 
+		{
+			checkpoints = new Stack();
+		}
+	    
+		public Checkpoint pop() {
+			return (Checkpoint)checkpoints.Pop();
+		}
+
+		public Checkpoint peek() {
+			return (Checkpoint)checkpoints.Peek();
+		}
+
+		public void push(Checkpoint cp) {
+			checkpoints.Push(cp);
+		}
+
+		public void clear() {		
+			checkpoints.Clear();
+		}
+
+		public void delete() {
+			checkpoints.Pop();
+		}
+		
+		private Stack checkpoints; //Storage
+	}
+
+	[CLSCompliantAttribute(false)]
+	internal unsafe struct Checkpoint {
+		[CLSCompliantAttribute(false)]
+		public Checkpoint(int mark_start, char* scan_ptr) {
+			this.mark_start = mark_start;
+			this.scan_ptr = scan_ptr;
+		}
+		
+		public int mark_start;
+		
+		[CLSCompliantAttribute(false)]
+		public char* scan_ptr;
+	}
+}
Index: class/System/System.Text.RegularExpressions/CILCompiler.cs
===================================================================
--- class/System/System.Text.RegularExpressions/CILCompiler.cs	(revision 0)
+++ class/System/System.Text.RegularExpressions/CILCompiler.cs	(revision 0)
@@ -0,0 +1,2842 @@
+//
+// assembly:	System
+// namespace:	System.Text.RegularExpressions
+// file:	CILCompiler.cs
+//
+// author:      Francois Beauchemin ( beauche@softhome.net ) 
+//              Eric Durand ( eric.durand-tremblay.1@ulaval.ca ) 
+// 		(c) 2004
+
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Collections;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace System.Text.RegularExpressions {
+
+	internal class CILFactory : IMachineFactory {
+		public CILFactory (Type typeMachine, int group_count ) {
+			this.typeMachine = typeMachine;
+			this.group_count = group_count;
+		}
+
+		public IMachine NewInstance () {
+			return (IMachine) Activator.CreateInstance (this.typeMachine);
+		}
+
+		public int GroupCount {
+			get { return group_count; }
+		}
+		
+		public IDictionary Mapping {
+			get { return mapping; }
+			set { mapping = value; }
+		}
+
+		private IDictionary mapping;
+		private Type typeMachine;
+		private int group_count;
+	}
+
+	
+	public enum  ComplexRegexStatus {
+			NotFinished =0, 
+			Finished, 
+			NotBegan,
+			Maybe
+		}
+       
+
+	//Provide property and utility method for CILMachinesCallerType
+	[CLSCompliantAttribute(false)]
+	internal abstract class CILMachineBase : IMachine{
+		
+		protected CILMachineBase(int nbCheckpoint, int nbRepeatCounter, 
+		                         int nbAlternation, int nbComplexRegex, CallerType []types) {
+
+			cpStack = new ICheckpointStack[nbCheckpoint];
+			for(int i =  0; i<nbCheckpoint; i++) {
+				switch(types[i]) {
+				case CallerType.BRANCH: case CallerType.LAZYREPEAT:
+					cpStack[i] = new StaticCheckpointStack();
+					break;
+			        case CallerType.REPEAT:
+					cpStack[i] = new ArrayCheckpointStack();
+					break;
+				}
+			}
+
+			rpCountStack = new int[nbRepeatCounter];
+			altLastBranch = new int[nbAlternation];
+		                         	
+			complexRegexStatus = new ComplexRegexStatus[nbComplexRegex];                         	
+			for ( int i = 0; i < nbComplexRegex; i++)
+				complexRegexStatus[i] = ComplexRegexStatus.NotBegan;
+				
+					                         	
+			                         	
+		}
+
+		abstract public Match Scan (Regex regex, string text, int start, int end);
+		
+		protected int CreateMark (int previous) {
+			if (mark_end == marks.Length) {
+				Mark [] dest = new Mark [marks.Length * 2];
+				marks.CopyTo (dest, 0);
+				marks = dest;
+			}
+			
+			int m = mark_end ++;
+			marks [m].Start = marks [m].End = -1;
+			marks [m].Previous = previous;
+			
+			return m;
+		}
+		
+		protected void Open (int gid, int ptr) {
+			int m = groups [gid];
+			if (m < mark_start || marks [m].IsDefined) {
+				m = CreateMark (m);
+				groups [gid] = m;
+			}
+			
+			marks [m].Start = ptr;
+		}
+
+		protected void Close (int gid, int ptr) {
+			marks [groups [gid]].End = ptr;
+		}
+
+		protected void Reset () {
+			ResetGroups ();
+			//fast = repeat = null;
+		}
+
+		protected void ResetGroups () {
+			int n = groups.Length;
+			if (marks == null)
+				marks = new Mark [n * 10];
+			
+
+			for (int i = 0; i < n; ++ i) {
+				groups [i] = i;
+				marks [i].Start = -1;
+				marks [i].End = -1;
+				marks [i].Previous = -1;
+			}
+			
+			mark_start = 0;
+			mark_end = n;
+			
+		
+		}
+		
+		[CLSCompliantAttribute(false)]
+		protected unsafe void Checkpoint (int idCp, char* scan_ptr) {
+			mark_start = mark_end; 			
+			cpStack[idCp].push(new Checkpoint(mark_start, scan_ptr));
+		}
+
+		[CLSCompliantAttribute(false)]
+		protected unsafe char* Backtrack (int idCp) {
+			Checkpoint cp = cpStack[idCp].pop();
+
+			Debug.Assert (cp.mark_start > mark_start, "Regex", "Attempt to backtrack forwards");
+
+			for (int i = 0; i < groups.Length; ++ i) {
+				int m = groups [i];
+				while (cp.mark_start <= m)
+					m = marks [m].Previous;
+
+				groups [i] = m;
+			}
+
+			return cp.scan_ptr;
+		}
+
+
+		protected int GetLastDefined (int gid) {
+			int m = groups [gid];
+
+			while (m >= 0 && !marks [m].IsDefined)
+				m = marks [m].Previous;
+			return m;
+		}
+
+
+	        protected void ClearCheckpoints() {
+			for(int i = 0; i<cpStack.Length; i++) {
+				cpStack[i].clear();
+			}
+		}
+
+		
+		protected Match GenerateMatch(Regex regex)
+		{
+			int[][] grps = new int[groups.Length][];
+			ArrayList caps = new ArrayList ();
+
+			for (int gid = 0; gid < groups.Length; ++ gid) {
+				caps.Clear ();
+				for (int m = groups[gid]; m >= 0; m = marks[m].Previous) {
+					if (!marks[m].IsDefined)
+						continue;
+					caps.Add (marks[m].Index);
+					caps.Add (marks[m].Length);
+				}
+
+				grps[gid] = (int[])caps.ToArray (typeof (int));
+			}
+
+			return new Match (regex, this, text, text_end, groups.Length, 0, 0, 0);
+		}
+
+		protected bool IsWordChar (char c) {
+			return CategoryUtils.IsCategory (Category.Word, c);
+		}
+
+		//Repeat Count  Stack
+
+		protected void InitRepeatCount(int idRp) {
+			rpCountStack[idRp] = -1;
+		}
+
+		protected void IncRepeatCount(int idRp) {
+			(rpCountStack[idRp])++; 
+		}
+
+		protected int GetCurRepeatCount(int idRp) {
+			return rpCountStack[idRp];
+		}
+		
+		protected void DecRepeatCount(int idRp) {
+			(rpCountStack[idRp])--; 
+		}
+
+		// Protected Members
+		protected string text;		// input text
+		protected int text_end;		// end of input text (last character + 1)
+		protected int scan_ptr;         // Current position of scan.
+	
+		protected Mark[] marks = null;	// mark stack
+		protected int mark_start;	// start of current checkpoint
+		protected int mark_end;	        // end of checkpoint/next free mark
+		
+		protected ComplexRegexStatus[] complexRegexStatus; // keep track if complex regex has finished
+
+	
+
+		protected int[] groups;	        // current group definitions
+
+		protected int group_count;
+
+		internal QuickSearch qs;       // fast substring matcher
+		
+		// Keep track of check points.
+		internal ICheckpointStack[] cpStack;
+
+		// Keep track of the counts in Repeat construct.
+		protected int[] rpCountStack;
+		
+		// Keep track of the latest branch tested
+		protected int[] altLastBranch;
+
+
+	}
+
+	internal class CILCompiler : ICompiler {
+
+	     static CILCompiler() {
+			inst_count = 0;
+
+			// Get the current application domain for the current thread.
+			AppDomain currentDomain = AppDomain.CurrentDomain;
+		       
+			asmName = new AssemblyName();
+			asmName.Name = "InnerRegexAssembly";
+
+
+			// Define a dynamic assembly in the current application domain.			
+			asmBuilder = currentDomain.DefineDynamicAssembly (asmName, AssemblyBuilderAccess.Run);
+
+			// Define a dynamic module in this assembly.			
+			modBuilder = asmBuilder.DefineDynamicModule("InnerRegexModule");
+	     	
+			unsafe{
+				sizeofchar = sizeof(char);
+			}
+			
+		}
+
+		public CILCompiler () : this(modBuilder, ++inst_count) {
+			
+		}
+
+		public CILCompiler(ModuleBuilder moduleBuilder, int machineNumber)
+		{		
+			// Define a runtime class with specified name and attributes.
+			builder = moduleBuilder.DefineType("IMachine" + machineNumber.ToString() ,
+							   TypeAttributes.Public, 
+							   typeof(CILMachineBase), 
+							   new Type[]{typeof(IMachine)});
+			
+
+			//Define default constructor
+			ConstructorBuilder ctorBuilder = builder.DefineConstructor(MethodAttributes.Public,
+										   CallingConventions.Standard,
+										   new Type[] {});
+
+			ctorILGen = ctorBuilder.GetILGenerator();
+
+
+			//Define Scan Method
+			MethodBuilder scanMethodBuilder = builder.DefineMethod("Scan", MethodAttributes.Public | MethodAttributes.Virtual ,
+									       typeof(Match), 
+									       new Type[]{typeof(Regex), 
+											  typeof(string), 
+											  typeof(int), 
+											  typeof(int)}); 
+		    
+			builder.DefineMethodOverride(scanMethodBuilder, typeof(IMachine).GetMethod("Scan"));
+			scanILGen = scanMethodBuilder.GetILGenerator();
+			
+			//Define Eval Method (For recursion)
+			MethodBuilder evalMethodBuilder = builder.DefineMethod("Eval", 
+									       MethodAttributes.Private,
+									       typeof(bool), 
+									       new Type[]{});			  
+											  
+		
+			evalILGen = evalMethodBuilder.GetILGenerator();
+	
+
+			//Declare Locals
+
+			Var_ptr = evalILGen.DeclareLocal(CharPtr);			
+			Var_scan_ptr = evalILGen.DeclareLocal(CharPtr);
+			Var_initial_ptr = evalILGen.DeclareLocal(CharPtr);
+			
+			Var_text_end_ptr = evalILGen.DeclareLocal(CharPtr);
+			Var_anch_ptr = evalILGen.DeclareLocal(CharPtr);
+			Var_anch_end = evalILGen.DeclareLocal(CharPtr);
+
+			//Var_test = evalILGen.DeclareLocal(typeof(int));
+
+
+			//Initialize fields
+			scanILGen.Emit(OpCodes.Ldarg_0);
+			scanILGen.Emit(OpCodes.Ldarg_2);
+			scanILGen.Emit(OpCodes.Stfld, cText); 
+				       
+			scanILGen.Emit(OpCodes.Ldarg_0);
+			scanILGen.Emit(OpCodes.Ldarg_3);
+			scanILGen.Emit(OpCodes.Stfld, cScanPtr);
+
+			scanILGen.Emit(OpCodes.Ldarg_0);
+			scanILGen.Emit(OpCodes.Ldarg_S, (byte)4);
+			scanILGen.Emit(OpCodes.Stfld, cTextEnd);
+
+			// call eval method.
+			scanILGen.Emit(OpCodes.Ldarg_0);
+  			scanILGen.Emit(OpCodes.Call, evalMethodBuilder);
+
+			//Initialize initial_ptr
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cText);
+			evalILGen.Emit(OpCodes.Conv_I);
+			evalILGen.Emit(OpCodes.Call, cmRuntimeHelpers_getOffsetToStringData);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc, Var_initial_ptr);
+
+			//Initialize ptr
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cScanPtr);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Conv_I);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr); 
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+			//Initialze scan_ptr
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Stloc, Var_scan_ptr);
+
+			//Initialize text_end_ptr
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cTextEnd);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Conv_I);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr); 
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc, Var_text_end_ptr);
+		}
+
+		// Do some close code for the generated method.
+		public Type Close() {
+			ctorILGen.Emit(OpCodes.Ldarg_0);
+			ctorILGen.Emit(OpCodes.Ldc_I4, nbDefinedCheckpoint);
+			ctorILGen.Emit(OpCodes.Ldc_I4, nbDefinedCounterId);
+			ctorILGen.Emit(OpCodes.Ldc_I4, nbDefinedAlternation);
+			ctorILGen.Emit(OpCodes.Ldc_I4, nbDefinedComplexRegex);
+			
+			ctorILGen.Emit(OpCodes.Ldc_I4, nbDefinedCheckpoint);
+			ctorILGen.Emit(OpCodes.Newarr,  Type.GetType("System.Text.RegularExpressions.CallerType[]"));
+			
+			if(CheckpointsCallerTypes != null) {
+				int i = 0;
+				foreach(CallerType type in CheckpointsCallerTypes) {
+					ctorILGen.Emit(OpCodes.Dup);
+					ctorILGen.Emit(OpCodes.Ldc_I4, i);
+					ctorILGen.Emit(OpCodes.Ldc_I4, (int)type);
+					ctorILGen.Emit(OpCodes.Stelem_I4);
+					i++;
+				}
+			}
+	
+			ctorILGen.Emit(OpCodes.Call, 
+				       typeof(CILMachineBase).GetConstructor(BindingFlags.Instance | 
+									     BindingFlags.NonPublic, 
+				       null, 
+				       new Type[]{typeof(int), typeof(int), typeof(int), typeof(int), 
+				       			  Type.GetType("System.Text.RegularExpressions.CallerType[]")},
+				       null));
+			
+			//Close the constructor
+			ctorILGen.Emit(OpCodes.Ldarg_0);
+			ctorILGen.Emit(OpCodes.Ldc_I4, group_count);
+			ctorILGen.Emit(OpCodes.Stfld, cGroupCount);
+
+			ctorILGen.Emit(OpCodes.Ldarg_0);
+			ctorILGen.Emit(OpCodes.Ldc_I4, group_count);
+			ctorILGen.Emit(OpCodes.Newarr, typeof(int));
+			ctorILGen.Emit(OpCodes.Stfld, cGroups);
+
+			ctorILGen.Emit(OpCodes.Ret);
+
+			//Close the Scan method
+
+			Label lblELSE =  scanILGen.DefineLabel();
+			Label lblEND_IF =  scanILGen.DefineLabel();
+			// Assertion : The last operation emitted for scan is the call to eval.
+			scanILGen.Emit(OpCodes.Brfalse, lblELSE);
+
+
+
+			// if eval returned true		
+			scanILGen.Emit(OpCodes.Ldarg_0);
+			scanILGen.Emit(OpCodes.Ldarg_1); //Put a ref to  regex passed to scan on the stack
+  			scanILGen.Emit(OpCodes.Call, cmCILMachineBase_GenerateMatch);
+			scanILGen.Emit(OpCodes.Br, lblEND_IF);
+
+			// else
+			scanILGen.MarkLabel(lblELSE);
+
+			scanILGen.Emit(OpCodes.Call, cpMatchEmpty.GetGetMethod());
+
+			scanILGen.MarkLabel(lblEND_IF);
+
+			//Clear checkpoints.
+			scanILGen.Emit(OpCodes.Ldarg_0);
+			scanILGen.Emit(OpCodes.Call, cmCILMachineBase_ClearCheckpoints);
+
+			scanILGen.Emit(OpCodes.Ret);
+
+
+			//Close Eval method
+			//Close Group 0
+			//marks [groups [0]].End = ptr;
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cMarks);
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cGroups);
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Ldelem_I4);
+			evalILGen.Emit(OpCodes.Ldelema, typeof(Mark));
+		
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+			evalILGen.Emit(OpCodes.Sub);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Div);
+			evalILGen.Emit(OpCodes.Conv_I4);
+
+			evalILGen.Emit(OpCodes.Stfld, cfMark_End);
+
+			evalILGen.Emit(OpCodes.Ldc_I4_1); // return true when the eval method had finish.
+			evalILGen.Emit(OpCodes.Ret);
+			
+			return builder.CreateType();
+		}
+
+		// ICompiler implementation
+
+		public void Reset () {
+
+		}
+
+		public IMachineFactory GetMachineFactory () {
+			Debug.Assert (group_count != -1 , "Regex", "group_count uninitialize");			
+		
+			return new CILFactory(Close(), this.group_count) ;
+
+		}
+
+		// instruction emission
+
+		public void EmitFalse () {
+			ContextNode curContext = (ContextNode)context.Peek();
+			
+			switch (curContext.op) {
+			case OpCode.In:
+				// If an In construct pass here, it is a Failure.
+				EmitFail(curContext);
+				
+				context.Pop();  // In construct finished.. kill context
+				break;
+			default:
+				EmitFail(curContext);
+				break;
+			}
+			
+		}
+
+		public void EmitTrue() {
+			ContextNode curContext = (ContextNode)context.Pop();
+			
+			switch (curContext.op) {
+			case OpCode.Position: case OpCode.String:
+				if (IsAnchorMode) {
+					// Do not pop yet.
+					context.Push(curContext);
+				}
+				else {
+					EmitPass(curContext);
+				}
+								
+				break;
+			case OpCode.Anchor:
+				if (IsAnchorMode) {
+					//No Anchor
+					Label lblWHILE = evalILGen.DefineLabel();
+					Label lblFAIL = evalILGen.DefineLabel();
+					Label lblTOP = evalILGen.DefineLabel();
+					
+					//**Inverted WHILE***
+
+					evalILGen.Emit(OpCodes.Br, lblWHILE);
+					evalILGen.MarkLabel(lblTOP);
+					
+					//ptr = anch_ptr;
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+					//TryMatch
+					EmitTryMatch(anchorTail);
+					
+					evalILGen.MarkLabel(lblFAIL);
+
+					// anch_reverse ? anch_ptr-- : anch_ptr++
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					if ( curContext.reverse ) 
+						evalILGen.Emit(OpCodes.Sub);
+					else
+						evalILGen.Emit(OpCodes.Add);
+					evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+
+
+					evalILGen.MarkLabel(lblWHILE);
+					if ( curContext.reverse ) {
+						//while (anch_ptr >= 0 ) {
+						evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);	
+						
+						evalILGen.Emit(OpCodes.Bge, lblTOP);
+						
+					}
+					else {												
+						//while (anch_ptr <= anch_end) {
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_end);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Bge, lblTOP);
+					}		
+
+					//Return false
+					evalILGen.Emit(OpCodes.Ldc_I4_0);
+					evalILGen.Emit(OpCodes.Ret);
+
+					//Set context to come back to FAIL on failure
+					context.Push(new ContextNode(OpCode.Position, new CILLinkRef(), new CILLinkRef(lblFAIL)));
+					break;
+
+				}
+
+				//EmitPass(curContext);
+				break;
+
+			case OpCode.In:
+				// If an In construct pass here, it is a Failure.
+				EmitFail(curContext);
+					
+				break;
+				
+			default:
+				break;
+			}
+
+			IsAnchorMode = false;
+		}
+
+		// character matching
+
+		public void EmitCharacter (char c, bool negate, bool ignore, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+ 			
+			//Declare local
+			if(EmitEvalChar_c == null)
+				EmitEvalChar_c = evalILGen.DeclareLocal(typeof(char));
+
+			Label lblPASS = evalILGen.DefineLabel();
+			Label lblFAIL = evalILGen.DefineLabel();
+			
+			if(curContext.op == OpCode.In) {
+				//In construct
+				if(!InConsumed) {
+					EmitConsumeCharacter(reverse, lblFAIL);
+					InConsumed = true;
+				}
+			}
+			//Regular construct
+			else if( !curContext.fail.IsEmpty() )
+				EmitConsumeCharacter(reverse, curContext.fail.ToLabel());
+			else
+				EmitConsumeCharacter(reverse, lblFAIL);
+
+			evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+		  
+			if (ignore) {
+			        c = Char.ToLower(c);
+				evalILGen.Emit(OpCodes.Call, cmChar_ToLower);	
+			}
+			
+			// c2 = c
+			evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)c);
+			
+			if (!negate) {
+				//if c1 == c2 pass
+
+				if( !curContext.pass.IsEmpty())
+					evalILGen.Emit(OpCodes.Beq,  curContext.pass.ToLabel());
+				else
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+			}
+			else {
+				//if c1 != c2 pass
+				if( !curContext.pass.IsEmpty()) {
+					evalILGen.Emit(OpCodes.Ceq);				
+					evalILGen.Emit(OpCodes.Brfalse, curContext.pass.ToLabel());				
+				}
+				else {
+					evalILGen.Emit(OpCodes.Ceq);				
+					evalILGen.Emit(OpCodes.Brfalse, lblPASS);
+				}
+			}
+			
+			if(curContext.op == OpCode.In) {
+				//Try next case.
+				evalILGen.Emit(OpCodes.Br, lblPASS);
+			}
+			
+			// FAIL
+			evalILGen.MarkLabel(lblFAIL);
+			EmitFail(curContext);
+			
+			// PASS
+			evalILGen.MarkLabel(lblPASS);
+		}	       
+		
+
+		public void EmitCategory (Category cat, bool negate, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+ 			
+			//Declare local
+			if(EmitEvalChar_c == null)
+				EmitEvalChar_c = evalILGen.DeclareLocal(typeof(char));
+
+			Label lblPASS = evalILGen.DefineLabel();
+			Label lblFAIL = evalILGen.DefineLabel();
+			
+			if(curContext.op == OpCode.In) {
+				//In construct
+				if(!InConsumed) {
+					EmitConsumeCharacter(reverse, lblFAIL);
+					InConsumed = true;
+				}
+			}
+			//Regular construct
+			else if( !curContext.fail.IsEmpty() )
+				EmitConsumeCharacter(reverse, curContext.fail.ToLabel());
+			else
+				EmitConsumeCharacter(reverse, lblFAIL);
+			
+			
+			//isCategory(cat, c);
+			evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)cat);
+			evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+
+			evalILGen.Emit(OpCodes.Call, CategoryUtils_IsCategory);
+			
+			if (!negate) {
+				//if c isCategory cat  pass
+				if( !curContext.pass.IsEmpty()) 	
+					evalILGen.Emit(OpCodes.Brtrue,  curContext.pass.ToLabel());				
+				else
+					evalILGen.Emit(OpCodes.Brtrue, lblPASS);
+			}
+			else {
+				//if c !isCategory cat pass
+				if( !curContext.pass.IsEmpty()) {				
+					evalILGen.Emit(OpCodes.Brfalse, curContext.pass.ToLabel());				
+				}
+				else {				
+					evalILGen.Emit(OpCodes.Brfalse, lblPASS);
+				}
+			}
+			
+			if(curContext.op == OpCode.In) {
+				//Try next case.
+				evalILGen.Emit(OpCodes.Br, lblPASS);
+			}
+			
+			// FAIL
+			evalILGen.MarkLabel(lblFAIL);
+			EmitFail(curContext);
+			
+			// PASS
+			evalILGen.MarkLabel(lblPASS);
+		}
+
+		public void EmitRange (char lo, char hi, bool negate, bool ignore, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+ 			
+			//Declare local
+			if(EmitEvalChar_c == null)
+				EmitEvalChar_c = evalILGen.DeclareLocal(typeof(char));
+
+			Label lblPASS = evalILGen.DefineLabel();
+			Label lblPREFAIL = evalILGen.DefineLabel();
+			Label lblFAIL = evalILGen.DefineLabel();
+			
+			if(curContext.op == OpCode.In) {
+				//In construct
+				if(!InConsumed) {
+					EmitConsumeCharacter(reverse, lblFAIL);
+					InConsumed = true;
+				}
+			}
+			//Regular construct
+			else if( !curContext.fail.IsEmpty() )
+				EmitConsumeCharacter(reverse, curContext.fail.ToLabel());
+			else
+				EmitConsumeCharacter(reverse, lblFAIL);
+			
+			evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+			
+			if (ignore) {
+				evalILGen.Emit(OpCodes.Call, cmChar_ToLower);
+				evalILGen.Emit(OpCodes.Stloc, EmitEvalChar_c);
+				evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+			}
+			
+
+		        //  low <= c1 <= hi
+			
+			evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)lo);
+			
+			if (!negate) {
+				//if c1 < low : fail
+				evalILGen.Emit(OpCodes.Blt, lblPREFAIL);
+				
+				//if c1 <= hi : pass
+				evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+				evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)hi);
+				if( !curContext.pass.IsEmpty()) 	
+					evalILGen.Emit(OpCodes.Ble,  curContext.pass.ToLabel());				
+				else
+					evalILGen.Emit(OpCodes.Ble, lblPASS);
+				
+				
+			}
+			else {
+				if( !curContext.pass.IsEmpty()) {
+					//if c1 < lo pass
+					evalILGen.Emit(OpCodes.Blt, curContext.pass.ToLabel());
+
+					//if c1 > hi pass
+					evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+					evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)hi);
+					evalILGen.Emit(OpCodes.Bgt, curContext.pass.ToLabel());
+					
+				}
+				else {			
+					//if c1 < lo pass
+					evalILGen.Emit(OpCodes.Blt, lblPASS);
+					
+					//if c1 > hi pass
+					evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+					evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)hi);
+					evalILGen.Emit(OpCodes.Bgt, lblPASS);
+				}
+
+				
+			}
+				       
+			evalILGen.MarkLabel(lblPREFAIL);
+							   
+			if(curContext.op == OpCode.In) {
+				//Try next case.
+				evalILGen.Emit(OpCodes.Br, lblPASS);
+			}
+			
+			// FAIL
+			evalILGen.MarkLabel(lblFAIL);
+			EmitFail(curContext);
+			
+			// PASS
+			evalILGen.MarkLabel(lblPASS);
+		}
+
+		public void EmitSet (char lo, BitArray set, bool negate, bool ignore, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+			
+			//Declare local
+			if(EmitEvalChar_c == null)
+				EmitEvalChar_c = evalILGen.DeclareLocal(typeof(char));
+
+			if(EmitSet_bytes_ptr == null) {
+				EmitSet_bytes_ptr = evalILGen.DeclareLocal(BytePtr);
+				EmitSet_bytes_cur_ptr = evalILGen.DeclareLocal(BytePtr);
+				EmitSet_i = evalILGen.DeclareLocal(typeof(int));
+			}
+
+			Label lblPASS = evalILGen.DefineLabel();
+			Label lblPREFAIL = evalILGen.DefineLabel();
+			Label lblFAIL = evalILGen.DefineLabel();
+			
+			
+			if(curContext.op == OpCode.In) {
+				//In construct
+				if(!InConsumed) {
+					EmitConsumeCharacter(reverse, lblFAIL);
+					InConsumed = true;
+				}
+			}
+			//Regular construct
+			else if( !curContext.fail.IsEmpty() )
+				EmitConsumeCharacter(reverse, curContext.fail.ToLabel());
+			else
+				EmitConsumeCharacter(reverse, lblFAIL);
+			
+			evalILGen.Emit(OpCodes.Ldloc, EmitEvalChar_c);
+			
+			if (ignore) {
+				evalILGen.Emit(OpCodes.Call, cmChar_ToLower);	
+			}
+			
+			//int i = (int)c - lo;
+			evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)lo);
+			evalILGen.Emit(OpCodes.Sub);
+			evalILGen.Emit(OpCodes.Conv_I4);
+			evalILGen.Emit(OpCodes.Stloc, EmitSet_i);
+			
+			// if (i < 0 ) : fail
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_i);
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Blt, lblPREFAIL);
+
+			// if(i> len before shift) : fail
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_i);
+			evalILGen.Emit(OpCodes.Ldc_I4, (int) set.Length + 0xf);
+			evalILGen.Emit(OpCodes.Bgt, lblPREFAIL);
+
+			
+
+			//We are in the range, now test with the bitmask
+
+		        //  load bytes to test.
+			int len = (set.Length + 0xf) >> 4;
+
+			evalILGen.Emit(OpCodes.Ldc_I4, len);
+			evalILGen.Emit(OpCodes.Localloc);
+			evalILGen.Emit(OpCodes.Stloc, EmitSet_bytes_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_bytes_ptr);
+			evalILGen.Emit(OpCodes.Stloc, EmitSet_bytes_cur_ptr);
+
+			int b = 0;
+			while (len -- != 0) {
+				ushort word = 0;
+				for (int i = 0; i < 16; ++ i) {
+					if (b >= set.Length)
+						break;
+				
+					if (set[b ++])
+						word |= (ushort)(1 << i);
+				}
+
+			        evalILGen.Emit(OpCodes.Ldloc, EmitSet_bytes_cur_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, word);
+				evalILGen.Emit(OpCodes.Stind_I2);
+				evalILGen.Emit(OpCodes.Ldloc, EmitSet_bytes_cur_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, Marshal.SizeOf(typeof(ushort)));
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Stloc, EmitSet_bytes_cur_ptr);
+			}
+
+			//arg1 = *(bytes_ptr + (i >> 4)* sizeof(ushort))
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_bytes_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_i);
+			evalILGen.Emit(OpCodes.Ldc_I4_4);
+			evalILGen.Emit(OpCodes.Shr);
+			evalILGen.Emit(OpCodes.Ldc_I4, Marshal.SizeOf(typeof(ushort)));
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Ldind_U2);
+
+			//arg2 =  (1 << (i & 0xf)))
+			evalILGen.Emit(OpCodes.Ldc_I4_1);
+			evalILGen.Emit(OpCodes.Ldloc, EmitSet_i);
+			evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)0xf);
+			evalILGen.Emit(OpCodes.And);
+			evalILGen.Emit(OpCodes.Shl);
+
+			// arg1 & arg2
+			evalILGen.Emit(OpCodes.And);
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+
+			if (!negate) {
+				//If arg1&arg2 != 0 : pass
+				if( !curContext.pass.IsEmpty()) {
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse,  curContext.pass.ToLabel());
+				}
+				else {
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblPASS);
+				}
+			}
+			else {
+				//If arg1&arg2 == 0 : pass
+				if( !curContext.pass.IsEmpty())
+					evalILGen.Emit(OpCodes.Beq, curContext.pass.ToLabel());
+				else 			
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+			}
+				       
+			evalILGen.MarkLabel(lblPREFAIL);
+							   
+			if(curContext.op == OpCode.In) {
+				//Try next case.
+				evalILGen.Emit(OpCodes.Br, lblPASS);
+			}
+			
+			// FAIL
+			evalILGen.MarkLabel(lblFAIL);
+			EmitFail(curContext);
+			
+			// PASS
+			evalILGen.MarkLabel(lblPASS);
+		}
+
+		// other operators
+
+		public void EmitString (string str, bool ignore, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+			
+			//Position Anchor			
+			if(curContext.op == OpCode.Anchor) {
+				//String anchor
+									
+				Label lblWHILE = evalILGen.DefineLabel();
+				Label lblFAIL = evalILGen.DefineLabel();
+				Label lblEND = evalILGen.DefineLabel();
+
+				//if (qs == null) {
+				evalILGen.Emit(OpCodes.Ldnull);
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cQS);
+				evalILGen.Emit(OpCodes.Ceq);
+				evalILGen.Emit(OpCodes.Brfalse, lblWHILE);
+				
+				//qs = new QuickSearch (substring, ignore, reverse);
+				
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldstr, str);
+
+				if( ignore )
+					evalILGen.Emit(OpCodes.Ldc_I4_1);
+				else
+					evalILGen.Emit(OpCodes.Ldc_I4_0);
+
+				if ( reverse ) 
+					evalILGen.Emit(OpCodes.Ldc_I4_1);
+				else
+					evalILGen.Emit(OpCodes.Ldc_I4_0);
+					
+				evalILGen.Emit(OpCodes.Newobj, cmQuickSearch_Ctor);
+				evalILGen.Emit(OpCodes.Stfld, cQS);	
+
+				evalILGen.MarkLabel(lblWHILE);					
+
+
+				if(reverse) {					
+					//while (anch_ptr >= 0 ) {
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4_0);	
+
+					evalILGen.Emit(OpCodes.Blt, lblEND);
+
+					//anch_ptr = qs.reverseSearch (text, anch_ptr, 0);
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cQS);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_initial_ptr);
+					//					evalILGen.Emit(OpCodes.Ldc_I4_0);
+
+					evalILGen.Emit(OpCodes.Call, cmQuickSearch_Search);
+					evalILGen.Emit(OpCodes.Stloc, Var_anch_ptr);
+
+					//	evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);	
+
+					// if (anch_ptr == null) 
+					//    break;
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Brfalse, lblEND);
+
+					//  anch_ptr += str.Length
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, str.Length *  sizeofchar );
+					evalILGen.Emit(OpCodes.Add);
+
+					evalILGen.Emit(OpCodes.Stloc, Var_anch_ptr);
+
+				}
+				else {
+					//while (anch_ptr <= anch_end) {
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_end);
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Blt, lblEND);				
+
+					//anch_ptr = qs.Search (text, anch_ptr, anch_end);
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cQS);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_end);
+
+					evalILGen.Emit(OpCodes.Call, cmQuickSearch_Search);
+					evalILGen.Emit(OpCodes.Stloc, Var_anch_ptr);
+					
+					//if (anch_ptr == null)
+					//  break;
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldnull);
+					evalILGen.Emit(OpCodes.Beq, lblEND);
+					
+				}
+			
+				//ptr = anch_ptr - anch_offset;
+				evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+				if ( anchor_offset > 0 ) {					
+					
+					evalILGen.Emit(OpCodes.Ldc_I4, anchor_offset * sizeofchar);
+					if ( reverse ) 
+						evalILGen.Emit(OpCodes.Add);
+					else
+						evalILGen.Emit(OpCodes.Sub);
+				}
+				evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+						  
+
+				//TryMatch
+				EmitTryMatch(anchorTail);	
+
+				//Final failure
+				evalILGen.MarkLabel(lblEND);
+				evalILGen.Emit(OpCodes.Ldc_I4_0);
+				evalILGen.Emit(OpCodes.Ret);		
+
+				//FAIL Handling
+				evalILGen.MarkLabel(lblFAIL);
+
+				//reverse ? anch_ptr -= 2 : anch_ptr++, 
+				if ( reverse ) 	{
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, 2 * sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+				}
+				else {
+					evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Add);
+					evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+				}
+						
+				//goto WHILE
+				evalILGen.Emit(OpCodes.Br, lblWHILE);
+
+				
+
+				//Keep track of Failure
+				context.Push(new ContextNode(OpCode.Position, new CILLinkRef(), new CILLinkRef(lblFAIL)));
+			}
+			else {
+				//Define Locals
+				if(EmitString_str_ptr == null)
+					EmitString_str_ptr = evalILGen.DeclareLocal(CharPtr);
+				
+				if(EmitString_str_end_ptr == null)
+					EmitString_str_end_ptr = evalILGen.DeclareLocal(CharPtr);
+
+				//Regular string match
+				Label lblFAIL = evalILGen.DefineLabel();
+				Label lblNEXT = evalILGen.DefineLabel();
+				Label lblEND = evalILGen.DefineLabel();
+				
+				if(ignore) {
+					str = str.ToLower();
+				}
+
+				int len = str.Length;
+				if(reverse) {
+					
+					//ptr -= len;			
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, len * sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Stloc, Var_ptr);				
+
+					//if (ptr < 0)
+					//	goto Fail;
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					
+					evalILGen.Emit(OpCodes.Blt, lblFAIL);
+					
+				}
+				else {
+					//if (ptr + len > text_end_ptr)
+					//    goto Fail;
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, len);
+					evalILGen.Emit(OpCodes.Add);
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Bgt, lblFAIL);
+				}
+
+				//Load the string to match and get a pointer to it
+				evalILGen.Emit(OpCodes.Ldstr, str);
+				evalILGen.Emit(OpCodes.Conv_I);
+				evalILGen.Emit(OpCodes.Call, cmRuntimeHelpers_getOffsetToStringData);
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Stloc, EmitString_str_ptr);				
+
+				// str_end_ptr = str_ptr + len
+				evalILGen.Emit(OpCodes.Ldloc, EmitString_str_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, len* sizeofchar);
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Stloc, EmitString_str_end_ptr);
+
+				evalILGen.MarkLabel(lblNEXT);
+				
+				// If str_ptr >= str_end_ptr
+				//   goto END
+				evalILGen.Emit(OpCodes.Ldloc, EmitString_str_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, EmitString_str_end_ptr);
+				evalILGen.Emit(OpCodes.Bge, lblEND);
+				
+
+				//Load char
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldind_U2);
+
+				if (ignore) {
+					evalILGen.Emit(OpCodes.Call, cmChar_ToLower);
+				}
+				
+				// if *ptr != *str_ptr
+				//    goto Fail;
+				evalILGen.Emit(OpCodes.Ldloc, EmitString_str_ptr);
+				evalILGen.Emit(OpCodes.Ldind_U2);
+				
+
+				evalILGen.Emit(OpCodes.Ceq);
+				evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+				
+				// str_ptr ++
+				evalILGen.Emit(OpCodes.Ldloc, EmitString_str_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+				evalILGen.Emit(OpCodes.Add);
+			    evalILGen.Emit(OpCodes.Stloc, EmitString_str_ptr);
+				
+				// ptr++
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+				evalILGen.Emit(OpCodes.Add);
+			        evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+				//Loop
+				evalILGen.Emit(OpCodes.Br, lblNEXT);
+				
+				//We fail
+				evalILGen.MarkLabel(lblFAIL);				
+				EmitFail(curContext);
+
+				//We pass
+				evalILGen.MarkLabel(lblEND);
+
+				if (reverse) {
+					//ptr -= len;								       
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);	
+
+					evalILGen.Emit(OpCodes.Ldc_I4, len * sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Stloc, Var_ptr);				       
+				}
+				
+				EmitPass(curContext);
+			}
+		}		
+
+		public void EmitPosition (Position pos) {
+			ContextNode curContext = (ContextNode)context.Peek();
+
+			//Position Anchor			
+			if(curContext.op == OpCode.Anchor) {
+				switch (pos) {
+				case Position.StartOfString:
+				{
+
+					Label lblELSE = evalILGen.DefineLabel();
+
+					
+					if ( curContext.reverse ) {
+						evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+						//ptr = anchor_offset;
+						if (anchor_offset > 0 ) {
+							evalILGen.Emit(OpCodes.Ldc_I4, anchor_offset * sizeofchar);
+							evalILGen.Emit(OpCodes.Add);
+						}
+
+						evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+					}
+					else {
+							
+						//if (anch_ptr == 0) {
+						evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+						evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ceq);
+						evalILGen.Emit(OpCodes.Brfalse, lblELSE); 
+						
+						//ptr = 0;
+						evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+						evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+					}
+
+					//TryMatch
+					EmitTryMatch(anchorTail);
+
+					if ( !curContext.reverse ) {
+						//Else
+						evalILGen.MarkLabel(lblELSE);
+						
+						//Return false
+						evalILGen.Emit(OpCodes.Ldc_I4_0);
+						evalILGen.Emit(OpCodes.Ret);
+					}
+    
+					//Set context
+					context.Push(new ContextNode(OpCode.Position, new CILLinkRef(), new CILLinkRef()));
+					break;
+				
+				}
+				case Position.StartOfLine:
+				{	
+      					Label lblFAIL = evalILGen.DefineLabel();
+					Label lblWHILE = evalILGen.DefineLabel();
+					Label lblTOP = evalILGen.DefineLabel();
+
+					//if (anch_ptr == 0) {
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblWHILE); 
+
+					//ptr = initial_ptr;	
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+				
+					//TryMatch
+					EmitTryMatch(anchorTail);
+
+					if ( curContext.reverse ) {
+						
+
+						//** inverted while **
+						evalILGen.Emit(OpCodes.Br, lblWHILE);
+						evalILGen.MarkLabel(lblTOP);
+
+						//if (anch_ptr == Var_initial_ptr || *(anchor_ptr - 1) == '\n') {
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_initial_ptr);
+						evalILGen.Emit(OpCodes.Ceq);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+						evalILGen.Emit(OpCodes.Sub);
+						evalILGen.Emit(OpCodes.Ldind_U2);
+						evalILGen.Emit(OpCodes.Ldc_I4_S, (int)'\n');
+						evalILGen.Emit(OpCodes.Ceq);
+						evalILGen.Emit(OpCodes.Or);
+						evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+						
+						//ptr = anch_offset > 0 ? anch_ptr + anch_offset: anch_ptr;
+						if ( anchor_offset > 0 ) {	
+							Label lblELSE = evalILGen.DefineLabel();
+							Label lblENDIF = evalILGen.DefineLabel();
+							// if anch_ptr == anch_end
+							evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+							evalILGen.Emit(OpCodes.Ldloc, Var_anch_end);
+							evalILGen.Emit(OpCodes.Ceq);
+							evalILGen.Emit(OpCodes.Brfalse, lblELSE);
+							
+							evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+							evalILGen.Emit(OpCodes.Brfalse, lblENDIF);
+							evalILGen.MarkLabel(lblELSE);
+
+							evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+							evalILGen.Emit(OpCodes.Ldc_I4, anchor_offset * sizeofchar);
+							evalILGen.Emit(OpCodes.Add);
+							
+							evalILGen.MarkLabel(lblENDIF);
+						}
+						else {
+							evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+						}
+														
+						evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+						//TryMatch
+						EmitTryMatch(anchorTail);
+						
+						//FAIL Section.
+						evalILGen.MarkLabel(lblFAIL);
+			
+						// else anch_ptr--, goto WHILE
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+						evalILGen.Emit(OpCodes.Sub);
+						evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+
+
+						//while (anch_ptr >= 0) {
+						evalILGen.MarkLabel(lblWHILE);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldc_I4_0);
+						evalILGen.Emit(OpCodes.Bge, lblTOP);
+
+						//Return false
+						evalILGen.Emit(OpCodes.Ldc_I4_0);
+						evalILGen.Emit(OpCodes.Ret);
+					} 
+					else {
+						//** Inverted While***
+					      
+						evalILGen.Emit(OpCodes.Br, lblWHILE);
+						evalILGen.MarkLabel(lblTOP);
+
+						//if (*(anchor_ptr - 1) == '\n') {
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+						evalILGen.Emit(OpCodes.Sub);
+						evalILGen.Emit(OpCodes.Ldind_U2);
+						evalILGen.Emit(OpCodes.Ldc_I4_S, (int)'\n');
+						evalILGen.Emit(OpCodes.Ceq);
+						evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+						
+						//ptr = anch_ptr - anch_offset;
+						evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Ldc_I4, anchor_offset * sizeofchar);
+						evalILGen.Emit(OpCodes.Sub);
+						
+						evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+						//TryMatch
+						EmitTryMatch(anchorTail);
+						
+						//FAIL Section.
+						evalILGen.MarkLabel(lblFAIL);
+			
+						// else anch_ptr++
+						evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Add);
+						evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+						
+						//while (anch_ptr <= anch_end) {
+						evalILGen.MarkLabel(lblWHILE);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_end);
+						evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+						evalILGen.Emit(OpCodes.Bge, lblTOP);
+
+						//Return false
+						evalILGen.Emit(OpCodes.Ldc_I4_0);
+						evalILGen.Emit(OpCodes.Ret);
+					}
+
+					//Keep track of Failure
+					context.Push(new ContextNode(OpCode.Position, new CILLinkRef(), new CILLinkRef(lblFAIL)));
+					break;
+				}	
+				case Position.StartOfScan:
+			        {
+					/*
+					if (anch_ptr == scan_ptr) {
+						ptr = scan_ptr - anch_offset;
+						if (TryMatch (ref ptr, pc + skip))
+							goto Pass;
+					}
+					*/
+
+					Label lblELSE = evalILGen.DefineLabel();
+					
+					//if (anch_ptr == scan_ptr) {
+					evalILGen.Emit(OpCodes.Ldloc, Var_anch_ptr);
+					//					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_scan_ptr );
+					
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblELSE); 
+
+
+
+						
+					//ptr = anch_reverse ? anch_ptr + anch_offset : anch_ptr - anch_offset;				
+					evalILGen.Emit(OpCodes.Ldloc_S, Var_anch_ptr);
+					
+					if ( anchor_offset > 0 ) {
+						evalILGen.Emit(OpCodes.Ldc_I4, anchor_offset * sizeofchar);
+						if ( curContext.reverse ) 
+							evalILGen.Emit(OpCodes.Add);
+						else
+							evalILGen.Emit(OpCodes.Sub);
+					}
+				
+					evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+					//TryMatch
+					EmitTryMatch(anchorTail);
+
+					//Else
+					evalILGen.MarkLabel(lblELSE);
+					
+					//Return false
+					evalILGen.Emit(OpCodes.Ldc_I4_0);
+					evalILGen.Emit(OpCodes.Ret);
+
+					//Set context
+					context.Push(new ContextNode(OpCode.Position, new CILLinkRef(), new CILLinkRef()));
+					break;
+				}	
+				default:
+					Debug.Assert(false, "Regex", "Invalid Position. This should not appen.");
+					break;
+				}
+			}
+
+			//Regular Position Test
+			else {
+				Label lblPASS = evalILGen.DefineLabel();
+				Label lblFAIL = evalILGen.DefineLabel();
+				
+				switch (pos) {
+				case Position.Start: case Position.StartOfString:
+					//return ptr == initial_ptr;
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					break;
+				case Position.StartOfLine:
+					//return ptr == initial_ptr || *(ptr -1) == '\n';
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)'\n');
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					break;
+				case Position.StartOfScan:
+					//return ptr == scan_ptr;
+					evalILGen.Emit(OpCodes.Ldloc, Var_scan_ptr);		
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					break;
+				case Position.End:
+					//return ptr == text_end ||
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					
+					//(ptr == text_end - 1 && 
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+					
+					//text[ptr] == '\n');
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)'\n');
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					
+					break;
+				case Position.EndOfLine:
+					//return ptr == text_end || 
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					
+					//text[ptr] == '\n';
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Ldc_I4_S, (byte)'\n');
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+
+					break;
+				case Position.EndOfString:
+					//return ptr == text_end;
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					break;
+				case Position.Boundary:
+				{
+					Label lblELSEIF = evalILGen.DefineLabel();
+					Label lblELSE = evalILGen.DefineLabel();
+									
+					//if (text_end_ptr == initial_ptr)
+					//  return false;
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblFAIL);
+
+					
+					//if (ptr == initial_ptr)
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblELSEIF);
+
+				        //  return IsWordChar (*ptr);
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Callvirt, cmCILMachineBase_IsWordChar);
+					evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+					evalILGen.Emit(OpCodes.Br, lblPASS);
+					
+					evalILGen.MarkLabel(lblELSEIF);
+					
+					// else if (ptr == text_end
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblELSE);
+					
+					//return IsWordChar (*(ptr -1));
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				        evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					evalILGen.Emit(OpCodes.Brfalse, lblFAIL);
+					evalILGen.Emit(OpCodes.Br, lblPASS);
+
+					evalILGen.MarkLabel(lblELSE);
+					//return IsWordChar (*ptr) != IsWordChar (*(ptr -1));
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				        evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					
+					evalILGen.Emit(OpCodes.Beq, lblFAIL);
+					evalILGen.Emit(OpCodes.Br, lblPASS);
+
+					break;
+				}
+				case Position.NonBoundary:
+			        {
+					Label lblELSEIF = evalILGen.DefineLabel();
+					Label lblELSE = evalILGen.DefineLabel();
+
+					//if (text_end == 0)
+					//  return false;
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Beq, lblFAIL);
+
+					//if (ptr == initial_ptr)
+					evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblELSEIF);
+
+				        //  return !IsWordChar (*ptr);
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					evalILGen.Emit(OpCodes.Brtrue, lblFAIL);
+					evalILGen.Emit(OpCodes.Br, lblPASS);
+					
+					evalILGen.MarkLabel(lblELSEIF);
+					
+					// else if (ptr == text_end
+					evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblELSE);
+					
+					//return !IsWordChar (*(ptr -1));
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				        evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					evalILGen.Emit(OpCodes.Brtrue, lblFAIL);
+					evalILGen.Emit(OpCodes.Br, lblPASS);
+
+					evalILGen.MarkLabel(lblELSE);
+					//return IsWordChar (*ptr) == IsWordChar (*(ptr -1));
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+					
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				        evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+					evalILGen.Emit(OpCodes.Sub);
+					evalILGen.Emit(OpCodes.Ldind_U2);
+					evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IsWordChar);
+
+					evalILGen.Emit(OpCodes.Beq, lblPASS);
+					evalILGen.Emit(OpCodes.Br, lblFAIL);
+				
+
+					break;
+				}
+
+				default:
+					//return false;
+					break;
+				}
+			
+				evalILGen.MarkLabel(lblFAIL);				
+				EmitFail(curContext);
+
+				evalILGen.MarkLabel(lblPASS);
+				EmitPass(curContext);
+			}
+		}
+
+		public void EmitOpen (int gid) {
+
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, gid);
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+			evalILGen.Emit(OpCodes.Sub);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Div);
+			evalILGen.Emit(OpCodes.Callvirt, cmCILMachineBase_Open);	
+		}
+
+		public void EmitClose (int gid) {
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, gid);
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+			evalILGen.Emit(OpCodes.Sub);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Div);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_Close);
+		}
+
+		public void EmitBalanceStart (int gid, int balance, bool capture, LinkRef tail) {
+
+		}
+
+		public void EmitBalance () {
+
+		}
+		
+		public void EmitReference (int gid, bool ignore, bool reverse) {
+			ContextNode curContext = (ContextNode)context.Peek();
+
+			if ( EmitReference_str == null) 
+				EmitReference_str = evalILGen.DeclareLocal(CharPtr);
+
+			if ( EmitReference_len == null) 
+				EmitReference_len = evalILGen.DeclareLocal(typeof(int));
+
+			if ( EmitReference_m == null) 
+				EmitReference_m = evalILGen.DeclareLocal(typeof(int));
+
+			if ( EmitReference_i == null) 
+				EmitReference_i = evalILGen.DeclareLocal(typeof(int));
+
+			// m = GetLastDefined(gid)
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, gid);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_GetLastDefined);
+			evalILGen.Emit(OpCodes.Stloc, EmitReference_m);
+
+
+			//if ( m < 0 ) 
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_m);
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Blt, curContext.fail.ToLabel());
+			
+			//int str = marks [m].Index;
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cMarks);
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_m);
+			evalILGen.Emit(OpCodes.Ldelema, typeof(Mark));			
+
+
+			evalILGen.Emit(OpCodes.Call, cpMark_Index.GetGetMethod());
+		
+			evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc, EmitReference_str);
+
+
+			//int len = marks [m].Length;
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cMarks);
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_m);
+			evalILGen.Emit(OpCodes.Ldelema, typeof(Mark));		       
+			evalILGen.Emit(OpCodes.Call, cpMark_Length.GetGetMethod());
+			evalILGen.Emit(OpCodes.Stloc, EmitReference_len);
+
+
+
+			if (reverse) {
+				// ptr -= len
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, EmitReference_len);
+				evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);
+				evalILGen.Emit(OpCodes.Mul);
+				evalILGen.Emit(OpCodes.Sub);
+				evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+
+				//if ( ptr < 0 ) goto fail;
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+				evalILGen.Emit(OpCodes.Blt, curContext.fail.ToLabel());						
+			} else {
+				//if ( ptr + len > text_end  ) goto fail;				
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, EmitReference_len);
+				evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);
+				evalILGen.Emit(OpCodes.Mul);
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+				evalILGen.Emit(OpCodes.Bgt, curContext.fail.ToLabel());	
+			}
+
+		
+			// **** for(i=0; i<len; i++);
+			Label lblFOR_TOP = evalILGen.DefineLabel();
+			Label lblFOR_TEST = evalILGen.DefineLabel();
+
+			// i = 0;
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Stloc, EmitReference_i);
+			
+			evalILGen.Emit(OpCodes.Br, lblFOR_TEST);
+			evalILGen.MarkLabel(lblFOR_TOP);
+
+			//if (text[ptr + i] != text[str + i])
+			//	goto Fail;
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_i);
+			evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Ldind_U2);
+			if ( ignore) {
+				evalILGen.Emit(OpCodes.Call, cmChar_ToLower);
+			}
+
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_str);
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_i);
+			evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);
+			evalILGen.Emit(OpCodes.Mul);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Ldind_U2);
+			if ( ignore) {
+				evalILGen.Emit(OpCodes.Call, cmChar_ToLower);
+			}
+		
+			evalILGen.Emit(OpCodes.Ceq);
+			evalILGen.Emit(OpCodes.Brfalse, curContext.fail.ToLabel());
+
+			//i++
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_i);
+			evalILGen.Emit(OpCodes.Ldc_I4_1);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc, EmitReference_i);
+			
+			evalILGen.MarkLabel(lblFOR_TEST);
+			// i<len
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_i);
+			evalILGen.Emit(OpCodes.Ldloc, EmitReference_len);
+			evalILGen.Emit(OpCodes.Blt, lblFOR_TOP);
+
+
+			if ( !reverse ) {
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, EmitReference_len);
+				evalILGen.Emit(OpCodes.Ldc_I4,  sizeofchar);				
+				evalILGen.Emit(OpCodes.Mul);
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Stloc, Var_ptr);	
+			}
+			
+			EmitPass(curContext);
+
+			
+
+		}		
+
+		// constructs
+
+		public void EmitIfDefined (int gid, LinkRef tail) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(tail), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+
+
+			// GetLastDefined(gid)
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, gid);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_GetLastDefined);
+
+			//if ( GetLastDefined(gid) < 0 ) 
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Blt, ((CILLinkRef)tail).ToLabel());
+			
+			
+			
+
+		}
+
+		public void EmitSub (LinkRef tail) {
+			ContextNode curContext = (ContextNode)context.Peek();
+
+			context.Push(new ContextNode(OpCode.Sub, (CILLinkRef)tail, curContext.fail));
+
+		}
+
+		public void EmitTest (LinkRef yes, LinkRef tail) {
+			
+
+		}
+
+		public void EmitAlternationStart() {
+			AlternationContext altContext = new AlternationContext(nbDefinedAlternation++, nbDefinedComplexRegex++);
+		
+			if (alternationContext == null)
+				alternationContext = new Stack();
+			alternationContext.Push(altContext);
+		
+			//nbDefinedAlternation++;
+			//AlternationBranch.Add(new ArrayList());
+			if(brachCheckpointStack == null)
+				brachCheckpointStack = new Stack();
+			
+			brachCheckpointStack.Push(EmitCheckpoint(CallerType.BRANCH));
+			
+			
+			
+			// ComplexsRegexFinished[id of this alternation] = false
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+			evalILGen.Emit(OpCodes.Ldc_I4, altContext.idComplexRegex);
+			evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.NotFinished);
+			evalILGen.Emit(OpCodes.Stelem_I4);
+			
+		}
+		
+		public void EmitBranch(LinkRef next) {}
+
+		public void EmitBranch (LinkRef next, int idBranch) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(next), "Regex", "Invalid LinkRef. Expected CILLinkRef");		
+			AlternationContext altContext = (AlternationContext)alternationContext.Peek();
+	    			
+			//Catch the failure of a branch
+			context.Push(new ContextNode(OpCode.Branch, new CILLinkRef(), (CILLinkRef)next));
+
+			evalILGen.Emit(OpCodes.Ldarg_0);	
+			evalILGen.Emit(OpCodes.Ldfld, cfAltLastBranch);
+			evalILGen.Emit(OpCodes.Ldc_I4, altContext.idAlt);
+			evalILGen.Emit(OpCodes.Ldc_I4, idBranch);
+	  		evalILGen.Emit(OpCodes.Stelem_I4);  	
+		
+
+		}
+		
+		public void EmitBranchEnd()
+		{
+			AlternationContext altContext = (AlternationContext)alternationContext.Peek();
+					
+			ContextNode lastContext = (ContextNode)context.Pop();
+			if (lastContext.op != OpCode.Branch)							
+			        while(((ContextNode)context.Pop()).op != OpCode.Branch);
+			       		
+				
+
+			altContext.branchContext.Add(lastContext);					
+		       
+			//Bactrack
+			int idCp = (int)brachCheckpointStack.Peek();
+			EmitBacktrack(idCp);
+
+			
+		}
+
+		public void EmitAlternationEnd(LinkRef[] branchs, LinkRef tail)
+		{
+			
+			ContextNode curContext = (ContextNode)context.Peek();
+			AlternationContext altContext = (AlternationContext)alternationContext.Pop();
+
+			Label tailFail = evalILGen.DefineLabel();
+			
+			
+			evalILGen.MarkLabel(tailFail);
+			ArrayList branchsContext = altContext.branchContext;
+			int idCp = (int)brachCheckpointStack.Pop();
+
+			for(int i = 0; i < branchs.Length; i++) {
+				ContextNode lastContext = ((ContextNode)branchsContext[i]);
+											
+				Label nextBranchTest = evalILGen.DefineLabel();
+				if ( lastContext.op == OpCode.Branch ) {
+					if (i + 1 < branchs.Length) {
+						evalILGen.Emit(OpCodes.Ldarg_0);
+						evalILGen.Emit(OpCodes.Ldfld, cfAltLastBranch);
+						evalILGen.Emit(OpCodes.Ldc_I4, altContext.idAlt);
+						evalILGen.Emit(OpCodes.Ldelem_I4);
+
+						evalILGen.Emit(OpCodes.Ldc_I4, i);	
+						evalILGen.Emit(OpCodes.Ceq);
+						evalILGen.Emit(OpCodes.Brfalse, nextBranchTest);
+
+						EmitBacktrack(idCp);
+						evalILGen.Emit(OpCodes.Br, ((CILLinkRef)branchs[i + 1]).ToLabel());
+					}
+											
+				} else {
+					Debug.Assert(lastContext.idComplexRegex >= 0, "Regex", "An Orphan does not have an valid idComplexRegex");
+					Label lblCONTINUE = evalILGen.DefineLabel();
+					
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfAltLastBranch);
+					evalILGen.Emit(OpCodes.Ldc_I4, altContext.idAlt);
+					evalILGen.Emit(OpCodes.Ldelem_I4);					
+
+					// if lastBranch == branch[i]
+					// if ComplexRegexFinished jump curContext.Fail
+					evalILGen.Emit(OpCodes.Ldc_I4, i);										
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, nextBranchTest);
+					
+					//evalILGen.Emit(OpCodes.Ldloc, ComplexRegexFinished);
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+					evalILGen.Emit(OpCodes.Ldc_I4, lastContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldelem_I4);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+					evalILGen.Emit(OpCodes.Beq, lblCONTINUE);
+					
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);	
+					evalILGen.Emit(OpCodes.Ldc_I4, altContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+					evalILGen.Emit(OpCodes.Stelem_I4);
+
+					evalILGen.Emit(OpCodes.Br, lastContext.fail.ToLabel());
+
+					evalILGen.MarkLabel(lblCONTINUE);
+					if ( i + 1 < branchs.Length ) {
+						EmitBacktrack(idCp);
+						evalILGen.Emit(OpCodes.Br, ((CILLinkRef)branchs[i]).ToLabel());						
+					}
+					
+
+				}
+
+				evalILGen.MarkLabel(nextBranchTest);	
+			}
+			
+
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);	
+			evalILGen.Emit(OpCodes.Ldc_I4, altContext.idComplexRegex);
+			evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+			evalILGen.Emit(OpCodes.Stelem_I4);
+
+
+			EmitFail(curContext);
+
+			context.Push(new ContextNode(OpCode.Orphan, 
+			                             curContext.pass, 
+			                             new CILLinkRef(tailFail), 
+			                             curContext.reverse, 
+			                             altContext.idComplexRegex));
+		}
+
+		public void EmitJump (LinkRef target) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(target), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+			
+			evalILGen.Emit(OpCodes.Br, ((CILLinkRef)target).ToLabel());
+		}
+
+		public void EmitRepeat (int min, int max, bool lazy, LinkRef until) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(until), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+
+
+			ContextNode curContext = (ContextNode)context.Peek();
+			
+			Label lblHANDLEFAIL = evalILGen.DefineLabel();
+			Label lblSUBREGEX = evalILGen.DefineLabel();
+			Label lblUNTIL = ((CILLinkRef)until).ToLabel();
+			RepeatContext newRepeatContext = new RepeatContext(min, max, lazy, lblUNTIL,
+			                                                   lblSUBREGEX, 
+			                                                   nbDefinedCounterId++, 
+			                                                   nbDefinedComplexRegex++);
+
+			if(repeatContext == null) {
+				//Alloc
+				repeatContext = new Stack();
+			}
+					
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, newRepeatContext.counterId);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_InitRepeatCount);
+
+			// ComplexsRegexFinished[id of this repeat] = false
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+			evalILGen.Emit(OpCodes.Ldc_I4, newRepeatContext.complexRegexId);
+			evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.NotFinished);
+			evalILGen.Emit(OpCodes.Stelem_I4);
+
+			evalILGen.Emit(OpCodes.Br, lblUNTIL);
+			evalILGen.MarkLabel(lblSUBREGEX);
+			
+			//Set context			
+			repeatContext.Push(newRepeatContext);
+			context.Push(new ContextNode(OpCode.Repeat, new CILLinkRef(), new CILLinkRef(lblHANDLEFAIL),
+						     false,newRepeatContext.complexRegexId )); 
+			
+		}
+
+		public void EmitUntil (LinkRef repeat) {
+
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(repeat), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+			
+			Label lblEND = evalILGen.DefineLabel();
+			Label lblREPEAT = ((CILLinkRef)repeat).ToLabel();
+			Label lblGOTMAX = evalILGen.DefineLabel();
+			Label lblENDBACKTRACK = evalILGen.DefineLabel();
+
+	
+			//Store the contex put by repeat
+			ContextNode byRepeatContext = (ContextNode)context.Pop();
+			
+			//Store the contexted orphaned by a sub regex (nested alternation or repetion)
+			ContextNode nestedContext = new ContextNode(OpCode.Undefined, new CILLinkRef(), new CILLinkRef());
+			
+			while( byRepeatContext.op != OpCode.Repeat) {
+				nestedContext =  byRepeatContext;
+				byRepeatContext = (ContextNode)context.Pop();
+			}
+
+			//Context that existed before the repetition.
+			ContextNode curContext = (ContextNode)context.Peek();
+			
+			//Containt the min max lazy infos.
+			RepeatContext curRepeatContext = (RepeatContext)repeatContext.Pop();
+	
+			//Jump to nested regex
+			evalILGen.Emit(OpCodes.Br, lblREPEAT);
+
+			//Handle Failures
+			evalILGen.MarkLabel(byRepeatContext.fail.ToLabel());
+	
+
+			if(!curRepeatContext.lazy) {
+				//If we have enough, match tail.
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+				evalILGen.Emit(OpCodes.Call,  cmCILMachineBase_GetCurRepeatCount);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.min);
+				evalILGen.Emit(OpCodes.Bge,  lblENDBACKTRACK);
+			}
+
+			if(nestedContext.op == OpCode.Undefined) {
+
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.complexRegexId);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+				evalILGen.Emit(OpCodes.Stelem_I4);
+				EmitFail(curContext);
+			}
+			else {
+				//If there is a nested complex regex
+				//evalILGen.Emit(OpCodes.Ldloc,  ComplexRegexFinished);
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, nestedContext.idComplexRegex);
+				evalILGen.Emit(OpCodes.Ldelem_I4);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+				evalILGen.Emit(OpCodes.Ceq);
+				if(!curContext.fail.IsEmpty()) {
+					evalILGen.Emit(OpCodes.Brtrue, curContext.fail.ToLabel());
+				}
+				else {
+					
+					Label lblJUMP = evalILGen.DefineLabel();
+					evalILGen.Emit(OpCodes.Brfalse, lblJUMP);
+					evalILGen.Emit(OpCodes.Ldnull);
+					evalILGen.Emit(OpCodes.Ret);
+					evalILGen.MarkLabel(lblJUMP);
+				}
+										
+				evalILGen.Emit(OpCodes.Br, nestedContext.fail.ToLabel());
+			}
+
+
+		
+
+			//Mark the repeat label
+			evalILGen.MarkLabel(lblREPEAT);
+		
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_IncRepeatCount);
+
+			Label lblMINPASSED = evalILGen.DefineLabel();
+			//Check if we attained the minimum number of match. Match more if not enough.
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+			evalILGen.Emit(OpCodes.Call,  cmCILMachineBase_GetCurRepeatCount);
+			evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.min);
+			evalILGen.Emit(OpCodes.Blt, curRepeatContext.subRegex);
+
+			if(curRepeatContext.lazy) {
+				Label lblFAIL = evalILGen.DefineLabel();
+				Label lblTOTALFAIL = evalILGen.DefineLabel();
+
+				//Checkpoint
+				int idCp = EmitCheckpoint(CallerType.LAZYREPEAT);
+				
+
+				//Match Tail first
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.complexRegexId);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Maybe);
+				evalILGen.Emit(OpCodes.Stelem_I4);
+				evalILGen.Emit(OpCodes.Br, lblEND);
+
+				evalILGen.MarkLabel(lblFAIL);
+			
+				//Backtrack
+
+				if ( nestedContext.op != OpCode.Undefined ) {
+				
+					Label lblCONTINUE = evalILGen.DefineLabel();
+
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+					evalILGen.Emit(OpCodes.Ldc_I4, nestedContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldelem_I4);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+					evalILGen.Emit(OpCodes.Beq, lblCONTINUE);
+					
+					EmitCheckpoint(idCp);
+
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+					evalILGen.Emit(OpCodes.Ldc_I4, nestedContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldelem_I4);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.NotBegan);
+					evalILGen.Emit(OpCodes.Beq, curRepeatContext.subRegex);
+					
+					evalILGen.Emit(OpCodes.Br, nestedContext.fail.ToLabel());
+
+					evalILGen.MarkLabel(lblCONTINUE);
+				}
+
+			
+				EmitBacktrack(idCp);
+
+				if ( nestedContext.op != OpCode.Undefined ) {
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+					evalILGen.Emit(OpCodes.Ldc_I4, nestedContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldelem_I4);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+					evalILGen.Emit(OpCodes.Beq, lblTOTALFAIL);				
+				}
+
+				//if (!current.IsMaximum) : Match subRegex one more Time
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+				evalILGen.Emit(OpCodes.Call,  cmCILMachineBase_GetCurRepeatCount);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.max);
+				evalILGen.Emit(OpCodes.Blt, curRepeatContext.subRegex);
+				
+			
+
+				evalILGen.MarkLabel(lblTOTALFAIL);
+
+				//else total failure
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.complexRegexId);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+				evalILGen.Emit(OpCodes.Stelem_I4);
+				EmitFail(curContext);
+
+				evalILGen.MarkLabel(lblEND);
+
+				//Set context
+				context.Push(new ContextNode(OpCode.Until, curContext.pass, new CILLinkRef(lblFAIL),
+							     false, curRepeatContext.complexRegexId)); 
+			}
+			else {
+				Label lblFAIL = evalILGen.DefineLabel();
+				
+				//if (!current.IsMaximum) : Match subRegex one more Time
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+				evalILGen.Emit(OpCodes.Call,  cmCILMachineBase_GetCurRepeatCount);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.max);
+				evalILGen.Emit(OpCodes.Bge, lblEND);
+
+				//Checkpoint
+
+				int idCp = EmitCheckpoint(CallerType.REPEAT);
+			
+				//Matche one more time
+				evalILGen.Emit(OpCodes.Br, curRepeatContext.subRegex);
+
+				//Tail failure
+				evalILGen.MarkLabel(lblFAIL);
+
+				if ( nestedContext.op != OpCode.Undefined ) {
+
+					Label lblCONTINUE = evalILGen.DefineLabel();
+					evalILGen.Emit(OpCodes.Ldarg_0);
+					evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+					evalILGen.Emit(OpCodes.Ldc_I4, nestedContext.idComplexRegex);
+					evalILGen.Emit(OpCodes.Ldelem_I4);
+					evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Maybe);
+					evalILGen.Emit(OpCodes.Ceq);
+					evalILGen.Emit(OpCodes.Brfalse, lblCONTINUE);
+
+					EmitCheckpoint(idCp);
+
+					evalILGen.Emit(OpCodes.Br, nestedContext.fail.ToLabel());
+
+					evalILGen.MarkLabel(lblCONTINUE);
+
+				}				
+
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+				evalILGen.Emit(OpCodes.Call, cmCILMachineBase_DecRepeatCount);
+
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldc_I4,  curRepeatContext.counterId);
+				evalILGen.Emit(OpCodes.Call,  cmCILMachineBase_GetCurRepeatCount);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.min);
+				evalILGen.Emit(OpCodes.Bge, lblENDBACKTRACK);
+
+				//Total failure
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.complexRegexId);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+				evalILGen.Emit(OpCodes.Stelem_I4);
+				EmitFail(curContext);
+
+				//Backtrack				
+				evalILGen.MarkLabel(lblENDBACKTRACK);
+				evalILGen.Emit(OpCodes.Ldarg_0);
+				evalILGen.Emit(OpCodes.Ldfld, cfComplexRegexStatus);
+				evalILGen.Emit(OpCodes.Ldc_I4, curRepeatContext.complexRegexId);
+				evalILGen.Emit(OpCodes.Ldc_I4, (int)ComplexRegexStatus.Finished);
+				evalILGen.Emit(OpCodes.Stelem_I4);
+
+				EmitBacktrack(idCp);
+			
+				// match tail.
+				evalILGen.MarkLabel(lblEND);
+
+				context.Push(new ContextNode(OpCode.Until, curContext.pass, new CILLinkRef(lblFAIL),
+							     false,curRepeatContext.complexRegexId )); 
+
+			}	
+		}
+
+		public void EmitIn (LinkRef tail) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(tail), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+			
+		        ContextNode curContext = (ContextNode)context.Peek();
+			InConsumed = false;
+			
+			//Set Context
+			if(!curContext.pass.IsEmpty())
+				context.Push(new ContextNode(OpCode.In, curContext.pass, curContext.fail));
+			else
+				context.Push(new ContextNode(OpCode.In, (CILLinkRef)(tail), curContext.fail));
+		}
+
+
+		public void EmitInfo (int count, int min, int max) {
+			group_count = count + 1;
+			match_min = min;
+			match_max = max;
+		}
+
+		public void EmitFastRepeat (int min, int max, bool lazy, LinkRef tail) {
+
+		}
+
+		public void EmitAnchor (bool reverse, int offset, LinkRef tail) {
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(tail), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+
+			IsAnchorMode = true;
+
+			anchor_offset = offset;
+			
+			Label lblPASS = evalILGen.DefineLabel();
+			Label lblCONTINUE = evalILGen.DefineLabel();
+
+			
+			// int anch_ptr = reverse ? ptr - anch_offset : ptr + anch_offset;			
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			if ( offset > 0 ) {
+				evalILGen.Emit(OpCodes.Ldc_I4, offset * sizeofchar);
+				if ( reverse ) 
+					evalILGen.Emit(OpCodes.Sub);
+				else
+					evalILGen.Emit(OpCodes.Add);
+			}
+			evalILGen.Emit(OpCodes.Stloc_S, Var_anch_ptr);
+
+			// int anch_end = text_end_ptr - match_min + anch_offset;
+			evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+			evalILGen.Emit(OpCodes.Ldc_I4, (offset - match_min) * sizeofchar);
+			evalILGen.Emit(OpCodes.Add);
+			evalILGen.Emit(OpCodes.Stloc_S, Var_anch_end);		
+					
+			//Set Context
+			anchorTail = ((CILLinkRef)tail).ToLabel();
+			context.Push(new ContextNode(OpCode.Anchor, new CILLinkRef(lblPASS), new CILLinkRef(), reverse));
+		}
+
+		public LinkRef NewLink () {
+			return new CILLinkRef(evalILGen.DefineLabel());
+		}
+
+		public void ResolveLink (LinkRef link) {		
+			Debug.Assert(typeof(CILLinkRef).IsInstanceOfType(link), "Regex", "Invalid LinkRef. Expected CILLinkRef");
+			
+			evalILGen.MarkLabel(((CILLinkRef)link).ToLabel());
+		}
+	
+		private void EmitPass(ContextNode context)
+		{
+			if( !context.pass.IsEmpty() ) {
+				evalILGen.Emit(OpCodes.Br, context.pass.ToLabel());				
+			}
+		}
+		
+		private void EmitFail(ContextNode context)
+		{
+			if( !context.fail.IsEmpty() ) {
+				evalILGen.Emit(OpCodes.Br, context.fail.ToLabel());				
+			}
+			else {
+				//Return false
+				evalILGen.Emit(OpCodes.Ldc_I4_0);
+				evalILGen.Emit(OpCodes.Ret);
+			}
+
+		}
+
+		private void EmitTryMatch(Label lblTOMATCH)
+		{
+			//Reset ();
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_Reset);
+
+			//marks [groups [0]].Start = ptr;
+		
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cMarks);
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldfld, cGroups);
+			evalILGen.Emit(OpCodes.Ldc_I4_0);
+			evalILGen.Emit(OpCodes.Ldelem_I4);
+			evalILGen.Emit(OpCodes.Ldelema, typeof(Mark));		
+			
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+			evalILGen.Emit(OpCodes.Sub);
+			evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+			evalILGen.Emit(OpCodes.Div);
+			evalILGen.Emit(OpCodes.Conv_I4);
+
+			evalILGen.Emit(OpCodes.Stfld, cfMark_Start);
+
+			//Go to the regex
+			evalILGen.Emit(OpCodes.Br , lblTOMATCH);
+		}
+		
+		//Result is stored in EmitEvalChar_c
+		private void EmitConsumeCharacter(bool reverse, Label lblFAIL)
+		{
+			// Consume character
+			if ( reverse ) {
+				// Right to left 	
+				
+				// if (ptrtr == initial_ptr)
+				//  FAIL
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, Var_initial_ptr);
+				evalILGen.Emit(OpCodes.Beq, lblFAIL);
+				
+				// --scanPtr
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+				evalILGen.Emit(OpCodes.Sub);
+				evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+				
+				// c1= *ptr;
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldind_U2);
+				evalILGen.Emit(OpCodes.Stloc, EmitEvalChar_c);
+			}
+			else {
+				// if (ptr >= text_end_ptr)
+				//   FAIL
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldloc, Var_text_end_ptr);
+				evalILGen.Emit(OpCodes.Bge, lblFAIL);
+				
+				// c1 = *ptr;
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+				evalILGen.Emit(OpCodes.Ldind_U2);
+				evalILGen.Emit(OpCodes.Stloc, EmitEvalChar_c);
+				
+				//scanPtr ++;
+				evalILGen.Emit(OpCodes.Ldloc, Var_ptr);			
+				evalILGen.Emit(OpCodes.Ldc_I4, sizeofchar);
+				evalILGen.Emit(OpCodes.Add);
+				evalILGen.Emit(OpCodes.Stloc, Var_ptr);
+			}			
+		}
+		
+		private int EmitCheckpoint(CallerType type) {
+			evalILGen.Emit(OpCodes.Ldarg_0);
+			evalILGen.Emit(OpCodes.Ldc_I4, nbDefinedCheckpoint);
+			evalILGen.Emit(OpCodes.Ldloc, Var_ptr);
+			evalILGen.Emit(OpCodes.Call, cmCILMachineBase_Checkpoint);
+			
+			if(CheckpointsCallerTypes == null)
+				CheckpointsCallerTypes = new ArrayList();
+
+			CheckpointsCallerTypes.Add(type);
+
+			return nbDefinedCheckpoint++;
+		}
+
+		private int EmitCheckpoint(int idCp) {
+			evalILGen.Emit(OpCo