2013-11-10 35 views
0

我在Python中使用層構建詞法分析器。我有2個稱爲TkConjuncion(它指邏輯和)和TkDisjuncion(指邏輯和)的令牌。正則表達式中的層平衡括號

對他們倆的規則寫成如下(還有其他的規則很好,但無關):

t_TkDisjuncion = '\\\/' 
t_TkConjuncion = '\/\\' 

哪裏\\\/\/\/\\/\。但是,當我測試我的代碼,它說:

ERROR: Invalid regular expression for rule 't_TkConjuncion'. unbalanced parenthesis

\\詞法分析器作爲\讀,所以它接受t_TkDisjuncion,但我不明白爲什麼它不接受其他令牌。我一直在網上進行調查,但沒有發現任何東西。

爲什麼會發生這種情況的任何想法?

回答

1

我不知道,但我下注有超過1級的反斜槓解釋正在進行。 Python在編譯字符串文字時肯定會達到一個級別。你在你的例子創建實際的字符串是

\/ 

/\ 

如果ply接着嵌入那些在正則表達式沒有逃脫首先他們(這是我不知道的部分 - 但認爲它很可能),那麼第二個字符串中的尾部反斜槓將會採取行動逃避它後面的任何內容。這可能是右括號,因此是「不平衡的括號」投訴。

總之,儘量使這些原始字符串代替:

t_TkDisjuncion = r'\\\/' 
t_TkConjuncion = r'\/\\' 

的「R」字頭防止Python從專門治療反斜槓,讓那些線創建實際的字符串是

\\\/ 

\/\\ 

如果那些嵌入到沒有e的正則表達式中他們首先(他們最多可以達到ply,不是由你自己決定),他們會做你想做的。

編輯我很肯定就是這樣。查看ply文檔,令牌確實使用正則表達式指定,並且文檔建議使用原始字符串(因爲這樣可以避免我上面討論的反斜槓的雙重解釋)。

+0

是的!就是這樣!這是厭倦事情的問題,謝謝你,我完全錯過了(即使我在其他規則中使用原始字符串)。 – Allianz91