正規表示式有三種基本的運算:
連線(concatenation), 例如 abc, 由a, b, c組成
聯合(union), 例如 a|b|c, 表示a或者b或者c
kleene閉包(kleene *), 例如 (ab)*, 表示ab串不出現,或者出現1次或一次以上
其它的運算如+, {}等都可以用以上三種基本運算或者運算的組合來表示。
2)例題3.26:為正規表示式r=(a|b)*abb構造乙個nfa
①對於(a|b)中的a構造nfa
②對於(a|b)中的b構造nfa
③而(a|b)構造nfa,將上面兩個圖合併
④(a|b)*構造nfa
⑤對於abb中的a構造nfa,對於abb中的兩個b構造nfa同④類似
⑥將④⑤合併之後
⑦最終的nfa是
nfa是捏著正則式去比文字,吃掉乙個字元,就把它跟正則式比較,匹配就記下來:「某年某月某日在某處匹配上了!」,然後接著往下幹。一旦不匹配,就把剛吃的這個字元吐出來,乙個個的吐,直到回到上一次匹配的地方。
1.正規表示式字尾化《逆波蘭表示式&字尾表示式》,並將其中操作符進行修改
public static enum operator
2.構造nfa原始碼
public class nfaalgorithm else }}
return regex;
}private static string e = "epsllon";
public static graph transformnfa(string suffixregex)
public static graph parse(object obj)
if(obj instanceof string)
return new graph((string)obj);
throw new illegalargumentexception("not support class["+obj.getclass()+"]");
}public void add(object obj)
if(obj instanceof graph)
throw new illegalargumentexception("not support class["+obj.getclass()+"]");
}public void divide(object obj)
if(obj instanceof graph)
throw new illegalargumentexception("not support class["+obj.getclass()+"]");
}public void multiply()
private void divide(graph graph)
private void add(string label)
private void add(graph graph));
this.edges.addall(graph.edges);
}@override
public string tostring()
return printstring;}}
//邊static class edge
@override
public string tostring()
}//節點
static class node
public int getid()
public static void reset()
@override
public string tostring() }}
正規表示式轉NFA
最近一直在忙著寫大作業,考試複習,複習演算法的時候寫了一些隨筆,現在忙起來都落下了部落格,這裡有乙個vc 寫的大作業,主要是正規表示式轉nfa並顯示。內容如下。介紹一下nfa在表示的結構設計,由於nfa本身是一種有向圖,所以這裡的儲存結構設計和鄰接表相似,圖中的每個節點後面是一些與其連線的節點的值,...
編譯原理 正規表示式轉NFA
從txt檔案中讀入正規表示式 include include include include include define max token 100 using namespace std 詞struct token int readtxt string filename,vector token...
正規表示式 轉
字元 描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如...