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

Python Pyparsing:如何实现C风格注释的特殊处理?,python,parsing,pyparsing,Python,Parsing,Pyparsing,我想利用cStyleComment变量,但不只是忽略这些注释,我想专门处理它们。有没有办法让pyparsing调用我的处理程序来处理它识别为注释的输入片段,然后再将其丢弃 我正在处理一些C代码,其中包含一些注释中的“特殊”指令。在pyparsing中定义的任何xxxStyleComment表达式中都没有导致忽略它们的内在因素。它们的存在是为了方便,特别是因为一些评论格式很容易出错。除非在较大的语法中调用ignore方法,否则它们不会被忽略,如: cHeaderParser.ignore(cSty

我想利用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,则这些将用于替换输入标记-如果它不返回任何标记,或忽略return语句,则使用tokens对象。您还可以就地修改tokens对象(例如添加新的结果名称)

所以你可以写这样的东西,把你的评论写成大写:

def commentHandler(tokens):
    return tokens[0].upper()    
cStyleComment.setParseAction(commentHandler)
(像这样简单的解析操作甚至可以写成
cStyleComment.setParseAction(lambda t:t[0].upper())

在编写这样的转换解析操作时,可能会使用
transformString
,而不是
parseString

print cStyleComment.transformString(source)

这将打印原始源代码,但所有注释都将大写。

谢谢,transformString()为我完成了这项任务!我现在用两次传球。第一个是
cStyleComment.setParseAction(processComments).transformString(src)
,只留下@annotation或@annotation(value)之类的内容,同时丢弃其余的注释,第二个是在我的主语法中调用
parseString()
。我有点不喜欢我必须处理注释两次——第一次我使用re模块提取注释,但将它们连接回原始字符串,只在parseString()调用期间处理第二次。尽管如此,它仍然有效!如果需要,可以尝试在附加到cStyleComment的解析操作中解析注释,并且只进行一次传递。但要找到一个能完成任务的解决方案是很难的。恭喜,欢迎来到pyparsing!