2017-03-01 67 views
-1

我建立一個lex程序,將分析類似以下...正則表達式忽略多餘的括號

function myFunc { 
    if a = b { 
     print "Cool" 
    } 
} 

是否有可能,特別是使用柔性,以創建一個正則表達式,這將挑選出在第一一切{}

,所以我會得到

{ if a = b { print "Cool" } } 

,而不是

{ if a = b { print "Cool" } 

目前在我的Flex文件我有這樣的正則表達式 {[^ \ 0] *}

+1

似乎匹配大括號應該是'野牛'做的東西,但不是'flex' – tsh

回答

0

一個問題與你正在嘗試做的是,正則表達式是由默認的貪婪(可以做一些技巧來改變這種狀況,但你仍然會遇到問題),如果你在一個包含多個函數的文件上運行它,你會比預期的更匹配。原因在於大多數編程語言是Chomsky層次結構中的Type 1 grammars或上下文敏感語法,RegEx是2類(上下文無關)語法。如果沒有大量的工作,使用後者直接解析前者是根本不可能的。對此的完整解釋是......很長。但歸結起來,在上下文敏感的語法中,給定元素的含義可以根據輸入中的位置而改變,而在上下文無關的語法中,每個元素只有一個含義。在你的情況下,你不想匹配任何一個'},你想匹配相應的}到一個開放的{,其中包括計算你迄今爲止看到的{}的數量。

如果你真的想做代碼解析,而不必重新發明輪子,犁,火,鋼,一直到電力,我建議你去GitHub上檢查AnTLR。 AnTLR將允許您創建一個語法(如果尚不存在的話),您將嘗試解析該語言並以Parse Tree的形式向您提供解析的源代碼。分析樹是非常非常容易使用的,AnTLR的語法已經可以用於幾乎所有可以想象的語言,並且plugins for several languages

除此之外,我使用的在線正則表達式測試程序和Notepad ++與您的示例代碼都匹配。您可以嘗試RegEx {.*},它也符合所有要求。