我想利用cStyleComment變量,而不僅僅是忽略我想特別處理它們的這些註釋。是否有任何方法可以在投影之前使用pyparsing調用我的處理程序,並在它被扔掉之前將其識別爲註釋?Pyparsing:如何實現對C風格評論的特殊處理?
我正在處理一些C代碼,其中包含一些「特殊」指令內的評論。
我想利用cStyleComment變量,而不僅僅是忽略我想特別處理它們的這些註釋。是否有任何方法可以在投影之前使用pyparsing調用我的處理程序,並在它被扔掉之前將其識別爲註釋?Pyparsing:如何實現對C風格評論的特殊處理?
我正在處理一些C代碼,其中包含一些「特殊」指令內的評論。
在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他原始的來源,但所有的評論將被大寫。
謝謝,transformString()爲我做了詭計!我現在使用2遍。第一個是'cStyleComment.setParseAction(processComments).transformString(src)'只留下像@annotation或@annotation(value)這樣的東西,同時拋出其餘的註釋,然後是第二個 - 調用'parseString() '在我的主要語法上。我稍微不喜歡我必須處理註釋兩次 - 第一次使用re模塊提取它們,但將它們連接回原始字符串,僅在parseString()調用期間第二次處理。它仍然有效! – rincewind 2012-02-11 04:07:54
如果您願意,您可以嘗試解析附加到cStyleComment的解析操作中的註釋,並只做一次。但很難用能夠完成工作的解決方案進行爭論。恭喜,歡迎來到pyparsing! – PaulMcG 2012-02-11 06:39:16