2012-08-22 44 views
0

我正在使用python模塊PLY編寫解析器,並且正在執行我正在執行的操作。我有一個簡單的規則來檢測字符串:flex(python PLY)字符串正則表達式

r'("|\').*("|\')' 

當詞法錯誤拋出我有這樣的:

def t_error (t) : 
    print 'Illegal lexer input line ' + str(t.lineno) + ' ' + t.value[:16] 
    sys.exit(-1) 

當我養活我的解析器以下輸入:

parse("preg_match('%^[\*\%]+$%', $keywords)") 

我得到退回此回報:

Illegal lexer input line 1 %^[\*\%]+$%', $k 

我的問題是:

1)爲什麼我不解析這個字符串?看來我的正則表達式應該正確處理這個字符串。

2)我該如何解決這個問題?

編輯:

我已經將問題縮小了一點。下面的字符串通過投身非法詞法分析器輸入錯誤:

'%' 
'^' 

回答

1

即使這個表達式中的工作是不是很你想要什麼,例如,將接受"this',這是不是真的一個字符串。這也是「非法詞法分析器輸入」的原因......

成就了它的工作,找到的第一個字符串中"preg_match('詞法分析器是那麼開心,當每個接下來的11個字符%^[\*\%]+$%是非法的(而不是在後t_ignore),因爲它們甚至不以"'開頭。

請嘗試以下兩種情況爲"'執行此操作:「以引號開頭,某些不是引號的內容以引號結尾。那就是:

r'("[^"]*")|(\'[^\']*\')' 

或者,如果你想包括逃脫語音標記:

r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')' 
+1

只是一個注:「*」將查找最長的字符串,所以(‘富’,「酒吧「)將被視爲'(',''foo','bar'',')'。使用 」。*?」意思是「最短的字符串」,所以它會返回'(','「foo」','「bar」',')「。 – swstephe