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

1 投票
1 回答
1850 浏览
提问于 2025-04-17 12:44

我想利用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)

这将打印出原始源代码,但所有的注释都会变成大写。

撰写回答