Pyparsing忽略除了

Pyparsing ignore except

我有一个文件,行中有 pythonStyleComments,例如:

def foo(): # declare
    # Simple function
    a = 0 # TODO: add random
    return a

那么,我想将 .ignore(pythonStyleComments) 添加到 pyparsing,但想处理任何元数据(例如 TODO: )。我知道所有的元词,所以我怎样才能避免忽略这些评论?

也许将评论声明为'#' + Regex(),Regex 将排除元词?或者pyparsing有更优雅的方法?

我建议通过多次处理来处理这个问题。首先,为您的 TODO 注释定义一个模式,并使用 scanString 来定位所有这些实例。然后 运行 与您的解析器进行第二次传递,并将 TODO 与您找到的元素的位置相匹配。

或者(这完全未经测试),尝试将解析操作附加到 pythonStyleComment,然后像往常一样执行并调用 parser.ignore(pythonStyleComment)。如果一个匹配,并且如果它匹配你的 TODO 格式,那么把关于那个评论的一些东西和它的位置保存到一边。 (我不确定被忽略的表达式会得到它们的解析操作 运行,因此您可能必须使用 2-pass 方法。)

我刚刚声明了comment = Literal('#').suppress() + Optional(restOfLine)

然后将其作为 Optional(comment) 添加到每个语句的末尾,它可能出现的位置。 然后添加

def commentHandler(t):
    result = []
    if "fixed" in t[0]:
        result.append("fixed")
    if "TODO: " in t[0]:
        try:
            message = t[0].split("TODO: ")[1].strip()
            result.append(message)
        except Exception as e:
            result.append(t[0])
    return result

comment.setParseAction(commentHandler)

所以它非常适合我。