Pyparsing:如何实现C风格注释的特殊处理?
我想利用cStyleComment这个变量,但我不想只是忽略这些注释,而是想特别处理它们。有没有办法让pyparsing在识别到输入中的注释后,先调用我的处理函数,然后再决定是否丢弃这些注释呢?
我正在处理一些C语言代码,这些代码的注释里包含了一些“特殊”的指令。
1 个回答
3
在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,或者省略返回语句,那么就会使用原来的标记对象。你也可以直接修改标记对象(比如添加新的结果名称)。
所以你可以写一些代码来将你的注释转换为大写字母:
def commentHandler(tokens):
return tokens[0].upper()
cStyleComment.setParseAction(commentHandler)
(像这样的解析动作甚至可以写成cStyleComment.setParseAction(lambda t:t[0].upper())
)
在写这样的转换解析动作时,通常会使用transformString
而不是parseString
,
print cStyleComment.transformString(source)
这将打印出原始源代码,但所有的注释都会变成大写。