2010-10-01 61 views
2

改寫...多層次的分析算法

我想知道如何以最佳方式解析功能/條件語句。所以如果你有這樣的:[if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if]這是一個有條件的條件。看起來我不能只用正則表達式。


原來的問題

現在我不得不通過動作解析出一些命令的一個非常簡單的方法。

我使用正則表達式查找使用標籤,命令和操作數...

+key_word+ // any text surrounded by + 
[ifempty +val_1+]+val_2+[/ifempty] //simple conditional 
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot] // conditional with operands 

我目前的算法開始標記[**]與第一關閉標籤[/**]即使它不匹配相匹配。這意味着我不能做像[ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty]這樣的事情 - 基本上把一個條件放在另一個條件之內。

我使用的解析內聯的方式在此基礎上正則表達式\[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]

任何人都可以提出一個更強大的算法更強大的解析慣例/標準,其將字符串轉換成字符串數組?特別是對於as3。

回答

2

正則表達式定義常規語言。正則語言不能有限制但可能是無限遞歸的區域。

思考它的一種方式是所有正則語言都可以用有限狀態機表示。你需要一個狀態來表示每個可能的數字,但是這臺機器必須是'有限的',所以你需要一個綁定。一個典型的例子是:

a{n}b{n}, n >= 0 
(meaning n a's, followed by n b's) 

當你分析每個一個,你就需要去到另一個狀態(有限狀態機具有超越國家他們沒有記憶,這就是他們能記得N到後來匹配的唯一途徑) 。要解析任意數量的n,你需要無限多的狀態。

這與您所處的情況相同,正則表達式可以表示有限數量的ifs(儘管需要相當多的複製粘貼操作),但不是無限數量。但是請注意,一些正則表達式實現會作弊一點,給他們更多的權力比他們的數學等值。

無論如何,最好的辦法就是使用更強大的解析方法。一個recursive descent parser是特別有趣的實施,並可以很容易地做你所需要的。您還可以查看LR解析器,或使用堆棧構建簡單的解析器。根據你的語言,你可以找到一個解析庫,比如pyparse for Python或Boost Spirit for C++。