2009-02-05 46 views
1

即時編寫一個簡單的命題邏輯公式分析器在python中,它使用正則表達式re模塊和lex/yacc模塊進行lexing/parsing。本來我的代碼可以挑出寓意爲 - >,但添加邏輯等價(< - >)而造成的問題與編譯後的表情幫助在python中使用re模塊構建正則表達式

IMPLICATION = re.compile('[\s]*\-\>[\s]*') 
EQUIVALENCE = re.compile('[\s]*\<\-\>[\s]*') 
... 
elif self.IMPLICATION.search(formula[0].strip()): 
... 
elif self.EQUIVALENCE.search(formula[0].strip()): 
... 

我最初嘗試添加[^ <]與前部 - >使它忽略等價的實例,但這只是使它不能接受任何蘊涵的實例。任何可能的幫助將熱烈歡迎:)

+0

你爲什麼要用正則表達式而不是yacc語法? – jrockway 2009-02-05 03:55:48

+0

你可以發佈展示此行爲的最小自包含示例嗎?你也可以創建這個例子。 – llimllib 2009-02-05 03:59:21

回答

0

我認爲你可以簡單地通過重新排序你的檢查匹配等價性,然後影響。然而,這似乎工作:

>>> IMPLICATION = re.compile(r'\s*[^\<]\-\>\s*') 
>>> EQUIVALENCE = re.compile(r'\s*\<\-\>\s*') 
4

據我所知,你的正則表達式等同於以下內容:

# This is bad, because IMPLICATION also will match every 
# string that EQUIVALENCE matches 
IMPLICATION = re.compile("->") 
EQUIVALENCE = re.compile("<->") 

當你寫它,你還匹配了0或更多空格字符在-><->之前。但是你沒有捕獲空間,所以指定「匹配空格是否存在」是沒有用的。另外請注意,->不需要在這些正則表達式中轉義。

你有兩個選擇,因爲我看到它。首先是確保IMPLICATION不相同字符串匹配的EQUIVALENCE

# This ought to work just fine. 
IMPLICATION = re.compile("[^<]->") 
EQUIVALENCE = re.compile("<->") 

另一種選擇是使用maximal munch method;即與所有正則表達式匹配,並選擇最長匹配。這將通過賦予EQUIVALENCE比IMPLICATION更高的優先級來解決模糊性。