Time of Update: 2017-02-27
現在最核心的 DFA 已經成功構造出來了,最後一步就是根據 DFA 得到完整的詞法分析器。由於目前還不能像 Flex 那樣支援詞法定義檔案,所以仍然需要在程式中定義規則,而且也不能非常靈活的自訂詞法分析器,不過基本的東西完全夠用了。一、詞法規則的定義詞法分析器用到的所有規則都在 Grammar<T> 類中定義,這裡的泛型參數 T 表示詞法分析器的標識符的類型(必須是一個枚舉類型)。定義規則方法包括:定義內容相關的 DefineContext 方法、定義Regex的
Time of Update: 2017-02-27
在上一篇文章中,已經得到了與Regex等價的 NFA,本篇文章會說明如何從 NFA 轉換為 DFA,以及對 DFA 和字元類進行化簡。一、DFA 的表示DFA 的表示與 NFA 比較類似,不過要簡單的多,只需要一個添加新狀態的方法即可。Dfa 類的代碼如下所示:namespace Cyjb.Compilers.Lexers { class Dfa : IList<DfaState> { // 在當前 DFA 中建立一個新狀態。
Time of Update: 2017-02-27
有了上一節中得到的Regex,那麼就可以用來構造 NFA 了。NFA 可以很容易的從Regex轉換而來,也有助於理解Regex表示的模式。一、NFA 的表示方法在這裡,一個 NFA 至少具有兩個狀態:首狀態和尾狀態,如圖 1 所示,Regex t 對應的 NFA 是 N(t),它的首狀態是 H,尾狀態是 T。圖中僅僅畫出了首尾兩個狀態,其它的狀態和狀態間的轉移都沒有表示出來,這是因為在下面介紹的遞迴演算法中,僅需要知道 NFA 的首尾狀態,其它的資訊並不需要關心。圖 1 NFA
Time of Update: 2017-02-27
Regex是一種描述詞素的重要表示方法。雖然Regex並不能表達出所有可能的模式(例如“由等數量的 a 和 b 組成的字串”),但是它可以非常高效的描述處理詞法單元時要用到的模式類型。一、Regex的定義Regex可以由較小的Regex按照規則遞迴地構建。每個Regex r 表示一個語言 L(r),而語言可以認為是一個字串的集合。Regex有以下兩個基本要素:是一個Regex, L()=,即該語言只包含空串(長度為 0 的字串)。如果 a 是一個字元,那麼 a
Time of Update: 2017-02-27
雖然文章的標題是詞法分析,但首先還是要從編譯原理說開來。編譯原理應該很多人都聽說過,雖 然不一定會有多麼瞭解。簡單的說,編譯原理就是研究如何進行編譯——也就如何從代碼(*.cs 檔案)轉換為計 算機可以執行的程式(*.exe 檔)。當然也有些語言如 JavaScript 是解釋執行的,它的代碼是直接 被執行的,不需要產生可執行程式。編譯過程是很複雜的,它涉及到很多步驟,直接拿《編譯原理》(Compilers: Principles, Techniques and
Time of Update: 2017-02-27
放心,這次不是說設計模式中的代理模式,說的是C#的RealProxy的用法,主要用於:通過給class 貼標籤,讓class做更多的工作,比如判斷是否存在緩衝,有則直接返回緩衝object,沒有則儲存為緩 存,等待下次請求是可以更快的擷取資料(當然這隻是其中一種常用用途,MVC的Action就是採用這種 方式)下面是順序圖表:.Net Object Generation interceptor屬於.NET自身行為,不需要額外寫代碼。Code
Time of Update: 2017-02-27
使用OUTLOOK, 你有沒有遇到過上圖的問題? 多達18419封郵件! 太多了, 每次想找一個郵件都非常 耗時, 想辦法解決這個問題成了一件非常緊迫的事情. 利用MS Search當然可以, 但是它太heavy了, 而 且不支援如邏輯搜尋運算式等複雜尋找功能, 怎麼辦? 幸運的是我有WEBUS2.0 SDK, 於是我決定自己開 發一個名為Outlook Searcher (Outlook搜尋精靈) 的小工具.Outlook搜尋精靈主要包含兩個功能:1.
Time of Update: 2017-02-27
在最近的資料擷取研究中, 發現很多頁面的內容都是在iframe中的, 這位採集帶來了不少困難. 經 過一番思考之後, 我想到了C#的解決辦法:1. 運行Spider Studio, 載入頁面 http://www.w3school.com.cn/tiy/t.asp?f=html_iframe2. 編輯代碼, 將iframe指向 http://www.w3school.com.cn3. 這個頁面具備如下結構:Page > IFrame1 -> IFrame2
Time of Update: 2017-02-27
最近在一個POC的項目中要用到JSON和XML的相互轉換, 雖然我知道很多類庫如JSON.NET具備這種功 能, 但是我還是另闢蹊徑的使用Spider Studio結合一個線上工具網站快速實現了這個功能.線上工具網站: http://www.utilities-online.info/xmltojson必備工具: Spider Studio (採集工作站): http://www.gdtsearch.com/products.spiderstudio.htm1. 開啟Spider Studio,
Time of Update: 2017-02-27
對象池服務可以減少從頭建立每個對象的系統開銷。在啟用物件時,它從池中提取。在停用對象時 ,它放回池中,等待下一個請求。我們來看下主線程中,如何與對象池打交道:static void Main(string[] args) { InstancePoolResolver.Register<OrderQueryServiceInterface, OrderQueryService>(); while (true)
Time of Update: 2017-02-27
最近遇到的一個需求是如何讓程式自動登入淘寶, 擷取使用者名稱稱等資訊. 其實這個利用SS (SpiderStudio的簡稱) 實現起來非常簡單. 十數行代碼就可以做到非常完善:1. 運行SS (下載地址), 編寫指令碼開啟淘寶登陸頁面:Default.Navigate("https://login.taobao.com/member/login.jhtml");Default.Ready();2. 找到使用者名稱, 密碼的輸入框, 輸入資訊, 點擊登入按鈕:var user
Time of Update: 2017-02-27
最近研究一個如何在網頁定位驗證碼並截圖的問題時, 用SS寫了一段C#小指令碼可以輕鬆擷取頁面任 意元素的布局資訊 (top, left, width, height). 10行功能代碼, 覺得有點用, 現分享給大家:public dynamic GetRect(JQueryContext node){ node.Attr("pos_top", "0"); node.Attr("pos_left", "0"
Time of Update: 2017-02-27
前幾天看到一段代碼int i = GetCount(para1 | para2);咋一看有些莫名奇妙,怎麼傳參的時候帶了個或運算,其實這裡面是有講究的,查閱了各方資料, QQ群裡賴著大牛問,才搞明白。這個運算可以用來進行多項組合。舉個例子,在設計許可權的時候,你肯定會這樣設計,許可權A,做什麼,許可權B,做什麼,許可權C,做什 麼...如此定義許可權,在調用處理函數時,我們直接傳對應的許可權Id就行,假設使用者甲有A許可權,我很明
Time of Update: 2017-02-27
一:C# 串連SQL資料庫Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User
Time of Update: 2017-02-27
簡單,是因為只有一個類輕量,是因為整個類代碼只有300行靈活,是因為擴充方式只需 要繼承重寫某個方法即可首先我將這個類稱之為JsonBuilder,我希望它以StringBuilder的方式 來實現Json字串的轉換public class JsonBuilder{ protected StringBuilder Buff = new StringBuilder(4096);//字元緩衝區 public string ToJsonString(object obj) {
Time of Update: 2017-02-27
規約模式的使用情境就是規則,商務規則的片段化。商務規則的組合是不固定的,需要做成很容易組合,也很容易拆散的方式,規約模式是一個選擇。下面的例子是一個書店中,使用者租書的情境。需要判斷使用者的最大租書數和使用者的狀態,需要同時滿足這兩個要求,才可以繼續租書。最大租書數和狀態這兩個規則拆散開來,在需要的時候再進行組合。不需要組合的地方,就單獨使用這些規則。針對一個實體有不同的規則,把這些規則片段化,隨意組合和拆散,這樣就構成了規約模式。using System; using
Time of Update: 2017-02-27
在進行檔案儲存體或者資料轉送時,為了節省空間的流量,需要對資料或檔案進行壓縮。在這裡我們講述 通過C#實現資料壓縮。一、GZipStream壓縮微軟提供用於壓縮和解壓縮流的方法。此類表示 GZip 資料格式,它使用無損壓縮和解壓縮檔案的行業標準演算法。 這種格式包括一個檢測 資料損毀的迴圈冗餘校正值。 GZip 資料格式使用的演算法與 DeflateStream 類的演算法相同,但它可以擴 展以使用其他壓縮格式。
Time of Update: 2017-02-27
我們經常使用下載工具,如bit精靈、迅雷、FlashGet,這些軟體都支援斷點續傳。斷點續傳即下載任務暫停後可以繼續,而無需重新下載,即下載時需要通知伺服器的起始位置。如果 允許多線程進行分區下載,必須提供起始-截止位置。說到底就是可以選擇下載某個片段,整個檔案的字 節流,可以截取流的片段,也能實現流的累積,最終完成檔案下載。一、原理在 HTTP/1.1裡新增的一個頭屬性:Range,也是現在眾多號稱多線程下載工具(如 FlashGet、迅雷
Time of Update: 2017-02-27
1、什麼是非同步?非同步作業通常用於執行完成時間可能較長的任務,如開啟大檔案、串連遠程 電腦或查詢資料庫。非同步作業在主應用程式線程以外的線程中執行。應用程式調用方法非同步執行某個 操作時,應用程式可在非同步方法呼叫執行其任務時繼續執行。2、同步與非同步區別同步 (Synchronous):在執行某個操作時,應用程式必須等待該操作執行完成後才能繼續執行。異 步(Asynchronous):在執行某個操作時,應用程式可在非同步作業執行時繼續執行。實質:非同步作業,
Time of Update: 2017-02-27
這裡來講述數位憑證的概念、作用、工作原理以及具體應用。希望能夠給大家一個清晰的認識。一、概念數位憑證就是互連網通訊中標誌通訊各方身份資訊的一串數字,提供了一種在Internet上驗證通訊實 體身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證。它是由一個由權威機構-----CA機 構,又稱為認證授權(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份。 數位憑證是一種數位識別碼,提供使用者在互連網上的身份認證,它是一個經認證授權中心數位簽章的包含