2015-10-05 4 views
1

У меня есть файл с pythonStyleComments в строках, например:Pyparsing игнорировать кроме

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

Итак, я хочу, чтобы добавить .IGNORE (pythonStyleComments) в Pyparsing, но хочу обрабатывать любую мету (например, ДЕЛАТЬ:). Я знаю все мета-слова, так как я могу исключить эти комментарии из игнорирования?

Может быть, объявить комментарий как '#' + Regex(), где Regex будет исключать мета-слова? Или pyparsing имеет более элегантный метод?

ответ

0

Я только что объявили comment = Literal('#').suppress() + Optional(restOfLine)

, а затем добавить его в качестве факультативных (комментарий) до конца каждого утверждения, где он может появиться. Затем добавьте

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) 

Так она прекрасно работает для меня.

1

Я предлагаю обработать это с несколькими проходами. Сначала определите шаблон для комментариев TODO и используйте scanString для поиска всех этих экземпляров. Затем запустите второй проход с вашим парсером и сопоставьте TODO с местоположениями элементов, которые вы найдете.

ИЛИ (это полностью непроверено), попробуйте подключить действие синтаксического анализа к pythonStyleComment, затем выполните, как обычно, и вызовите parser.ignore (pythonStyleComment). Если один из них соответствует, и если он соответствует вашему типу TODO, сохраните что-нибудь об этом комментарии и его местоположении в стороне. (Я не уверен, что игнорировали выражения получают их синтаксического анализа действия идут, так что вы, возможно, придется пойти с подходом 2 прохода.)