我想利用 cStyleComment 变量,但我想专门处理它们,而不是仅仅忽略这些注释。有什么方法可以让 pyparsing 在将其识别为注释的输入片段上调用我的处理程序,然后再将其丢弃吗?
我正在处理一些 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)
这将打印原始来源,但所有注释都将大写。
关于python - Pyparsing:如何实现C风格注释的特殊处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9221644/