2012-02-10 36 views
1

我想利用cStyleComment變量,而不僅僅是忽略我想特別處理它們的這些註釋。是否有任何方法可以在投影之前使用pyparsing調用我的處理程序,並在它被扔掉之前將其識別爲註釋?Pyparsing:如何實現對C風格評論的特殊處理?

我正在處理一些C代碼,其中包含一些「特殊」指令內的評論。

回答

2

在pyparsing中定義的任何xxxStyleComment表達式中沒有任何內容會導致它們被忽略。他們在那裏作爲一種方便,特別是因爲一些評論格式很容易出錯。他們沒有得到忽略,除非你調用ignore方法對你更大的語法,如:

cHeaderParser.ignore(cStyleComment) 

(其中cHeaderParser可能是你寫的,通過.h文件讀取提取API信息,例如某事)

並且對處理程序的pyparsing回調是內置的,只需使用cStyleComment.setParseAction(commentHandler)即可。 Pyparsing可以處理任何與這些簽名的解析動作:

def commentHandler(inputString, locn, tokens): 
def commentHandler(locn, tokens): 
def commentHandler(tokens): 
def commentHandler(): 

如果您commentHandler返回一個字符串或字符串,或新ParseResults的名單,這些將被用來替換輸入令牌 - 如果它返回None,或省略了return語句,那麼使用了令牌對象。您還可以修改令牌對象(例如添加新的結果名稱)。

所以,你可以寫這樣的事情,將大寫您的評論:

def commentHandler(tokens): 
    return tokens[0].upper()  
cStyleComment.setParseAction(commentHandler) 

(解析動作這麼簡單,甚至可以寫cStyleComment.setParseAction(lambda t:t[0].upper())

當寫這樣的轉化解析動作,一個可能會使用transformString而不是parseString

print cStyleComment.transformString(source) 

這將印花T他原始的來源,但所有的評論將被大寫。

+0

謝謝,transformString()爲我做了詭計!我現在使用2遍。第一個是'cStyleComment.setParseAction(processComments).transformString(src)'只留下像@annotation或@annotation(value)這樣的東西,同時拋出其餘的註釋,然後是第二個 - 調用'parseString() '在我的主要語法上。我稍微不喜歡我必須處理註釋兩次 - 第一次使用re模塊提取它們,但將它們連接回原始字符串,僅在parseString()調用期間第二次處理。它仍然有效! – rincewind 2012-02-11 04:07:54

+0

如果您願意,您可以嘗試解析附加到cStyleComment的解析操作中的註釋,並只做一次。但很難用能夠完成工作的解決方案進行爭論。恭喜,歡迎來到pyparsing! – PaulMcG 2012-02-11 06:39:16