Pyparsing:如何实现C风格注释的特殊处理?

时间:2012-02-10 01:47:42

标签: python parsing pyparsing

我想利用cStyleComment变量,但我不想忽略这些注释,而是要特别处理它们。是否有任何方法可以使pyparsing在输入的部分调用我的处理程序,它将被识别为注释,然后才会被丢弃?

我正在处理一些C代码,其中包含注释中的一些“特殊”指令。

1 个答案:

答案 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)

这将打印原始来源,但所有评论都将是大写的。