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)
所以它非常适合我。
我有一个文件,行中有 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)
所以它非常适合我。