我想利用cStyleComment变量,但我不想忽略这些注释,而是要特别处理它们。是否有任何方法可以使pyparsing在输入的部分调用我的处理程序,它将被识别为注释,然后才会被丢弃?
我正在处理一些C代码,其中包含注释中的一些“特殊”指令。
答案 0 :(得分: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语句,则使用tokens对象。您还可以就地修改令牌对象(例如添加新的结果名称)。
所以你可以这样写一些会使你的评论大写的内容:
def commentHandler(tokens):
return tokens[0].upper()
cStyleComment.setParseAction(commentHandler)
(简单的解析操作甚至可以写成cStyleComment.setParseAction(lambda t:t[0].upper())
)
在编写这样的转换解析操作时,可能会使用transformString
而不是parseString
,
print cStyleComment.transformString(source)
这将打印原始来源,但所有评论都将是大写的。