VL++3.0開發紀事
自己設計的具有非C++傳統味道的C++庫
美帝出差最后一天
posted @
2010-05-06 22:56 陳梓瀚(vczh) 閱讀(3183) |
評論 (9) 編輯
Vczh Library++ 3.0之可配置語法分析器(FpMacro及代碼)
摘要: 上一篇文章基本上把分析的過程都講完了,于是這次就把FpMacro作為一個Demo拿了出來。不第一次就發的原因主要是那個時候FpMacro剛剛寫完,當然寫完就要用的,于是后來就在Vczh Library++ 3.0的庫里面大量使用了FpMacro作為代碼生成的一個工具,用來代替一部分的宏的功能。當然最后我并沒有寫個插件安裝到VC++里,而是寫了一個批處理文件去調用FpMacro.exe。
代碼內詳
閱讀全文
posted @
2009-12-12 22:19 陳梓瀚(vczh) 閱讀(4936) |
評論 (0) 編輯
Vczh Library++3.0之可配置語法分析器(分析器內核)
摘要: 在上一篇文章中,我們已經實現了在C++中直接寫文法并轉換成文法樹的工作,現在要開始實現三個組合文法了。
閱讀全文
posted @
2009-12-11 22:49 陳梓瀚(vczh) 閱讀(2990) |
評論 (1) 編輯
Vczh Library++ 3.0之可配置語法分析器(設計文法表達式)
摘要: 上一篇文章中我們看到了可配置語法分析器使用起來的樣子,在這篇文章中我將告訴大家如何通過重載操作符的方法構造文法表達式樹,從而使用遞歸向下法進行語法分析的工作。
閱讀全文
posted @
2009-12-04 23:43 陳梓瀚(vczh) 閱讀(3205) |
評論 (1) 編輯
Vczh Library++3.0之可配置語法分析器(分析Demo:函數式宏)
摘要: 上一篇文章提到了我開發了可配置語法分析器之后做了一個FpMacro用來生成C++有規律的代碼。這一篇文章就從FpMacro入手,分析可配置語法分析器所需要具備的功能。首先讓我們來了解一下什么是FpMacro。
閱讀全文
posted @
2009-11-27 21:21 陳梓瀚(vczh) 閱讀(3246) |
評論 (3) 編輯
Vczh Library++3.0之可配置語法分析器(前言)
摘要: 花了差不多兩個星期的時間將一個可配置語法分析器寫好了。這個語法分析器被設計來完成以下任務:
1、易于使用,并且在運行時可更改
2、提供對分析字符串和容器的支持
3、可使用正則表達式輔助定義分析器
4、如果覺得預定義的設備不滿意,用戶可以自行提供新的文法元素(譬如說增加一種使用通配符進行語法分析的元素)
5、提供可配置錯誤恢復策略,提供合理的錯誤發生位置信息,用戶可根據自己的意愿來決定錯誤信息的內容。
閱讀全文
posted @
2009-11-27 10:01 陳梓瀚(vczh) 閱讀(3123) |
評論 (2) 編輯
Vczh Library++3.0之正則表達式引擎(DFA與捕獲、預查結合的匹配)
摘要: DFA與捕獲和預查結合起來的話很麻煩,不能用一張表來迭代,而是要用回溯,然后在回溯的時候記下狀態。至此正則表達式的所有算法都完成了,接下來是詳細介紹。
閱讀全文
posted @
2009-11-14 19:13 陳梓瀚(vczh) 閱讀(2469) |
評論 (1) 編輯
Vczh Library++3.0之正則表達式引擎(從NFA到DFA)
摘要: 今天花了一個晚上完成并測試了從NFA到DFA的代碼。NFA到DFA的主要過程就是構造出一個等價于NFA的狀態機,使得從任何一個狀態出去的狀態轉換都不具有相同的條件。這個約束就是“確定性”的含義,給定一個狀態和一個輸入,最多只能跳轉到一個目標狀態。于是知道了這個過程,代碼就很好寫了:
閱讀全文
posted @
2009-11-03 08:34 陳梓瀚(vczh) 閱讀(2728) |
評論 (8) 編輯
Vczh Library++3.0之正則表達式引擎(Epsilon-NFA到NFA)
摘要: 這篇文章的代碼所描述的算法在這里有詳細的說明。
Epsilon-NFA到NFA的目標主要是產生一個沒有Epsilon邊的,跟原狀態圖等價的新狀態圖。過程不復雜,首先從起始狀態開始,尋找所有Epsilons邊到達的對象的集合,然后復制這個集合的所有狀態包含的非Epsilon狀態。其實狀態做完之后,尋找所有能夠產生非Epsilon邊的狀態然后重復這個過程,最后NFA就出來了。代碼如下:
閱讀全文
posted @
2009-10-28 04:34 陳梓瀚(vczh) 閱讀(2381) |
評論 (7) 編輯
Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA)
摘要: 不知道什么是epsilon-NFA的話先看這里。
從正則表達式生成epsilon-NFA其實跟將一棵樹變換成另一棵樹是類似的。epsilon轉換提供了一種工具讓我們可以把一個圖表達成漂亮的形式,看起來就有典型的遞歸結構。因此這個工作依然可以用RegexExpressionAlgorithm這個visitor模式的產物來解決:
閱讀全文
posted @
2009-10-24 00:23 陳梓瀚(vczh) 閱讀(2273) |
評論 (5) 編輯
Vczh Library++3.0之正則表達式引擎(解引用)
摘要: 解引用指的是對命名表達式的處理。這跟C++的宏差不多,留個名字在那里,然后就擴展它。舉個例子,我們寫一個正則表達式判斷一個字符串是否ip地址。判斷一個字符串是否小于256的數字還是很麻煩的:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]。但是如果要判斷是否X.X.X.X就要將這個表達式復制四次(至少兩次),這會導致正則表達式很長。如何解決呢?
閱讀全文
posted @
2009-10-20 06:36 陳梓瀚(vczh) 閱讀(2041) |
評論 (2) 編輯
Vczh Library++3.0之正則表達式引擎(字符集正規化)
摘要: 字符集的正規化指的是讓正則表達式的表達式樹的所有節點中記錄的字符集合的最小單元都是互不交叉的。舉個例子,[a-g][h-n]沒有交叉,但是[a-g][g-n]就交叉了。所以對[a-g][g-n]做字符集正規化的結果就是將表達式修改為([a-f]|g)(g|[h-n])。這樣表達式里面出現的字符集合的最小單元[a-f]、g和[h-n]就沒有交叉了。下面是正規化的代碼:
閱讀全文
posted @
2009-10-17 20:43 陳梓瀚(vczh) 閱讀(1885) |
評論 (1) 編輯
Vczh Library++3.0之正則表達式引擎(使用Visitor模式訪問語法樹)
摘要: 雖然說分析語法樹依賴于遞歸,但是你真的去寫遞歸那是一件很煩的事情,個人覺得煩事煩在你每次都要去RegexExpression.h里面聲明所有的虛函數之后復制過來一一運行。有沒有辦法僅編輯.cpp文件就能做到呢?也就是說,在如何不修改Expression一系列類的接口的情況下給Expression添加算法?一般來說對付樹形結構都是使用Visitor模式的。
(內附代碼)
閱讀全文
posted @
2009-10-17 17:34 陳梓瀚(vczh) 閱讀(2016) |
評論 (0) 編輯
Vczh Library++3.0之正則表達式引擎(語法分析)
摘要: 這幾天正在著手開發一個基于Vczh Library++ 3.0基礎之上的新的正則表達式引擎。這個東西跟以前的功能沒什么大變化,只是最基礎的那一層被全部改了,而且還不兼容,所以要重寫。不過都是自己的東西,無所謂了,不兼容也沒什么問題。
下面介紹正則表達式引擎的語法分析過程。
閱讀全文
posted @
2009-10-15 05:53 陳梓瀚(vczh) 閱讀(3136) |
評論 (4) 編輯