Bash -Подобный синтаксический анализ - PullRequest
0 голосов
/ 16 июня 2020

Я хотел бы проанализировать следующий текст, используя Pyparsing :

# It is a comment

# It is a comment
# It is a comment
It is not a comment



# It is a comment
It is not a comment
It is not a comment
  It is not a comment


It is not a comment

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

Результат, которого я хотел бы достичь, заключается в следующем. Пожалуйста, обратите внимание на сохранение символов новой строки, когда имеется несколько последовательных пустых строк, что очень важно для составления исходного текста из проанализированного текста:

[
  {"description": "# It is a comment"},
  {"description": "# It is a comment\n# It is a comment", "content": "It is not a comment\n\n"},
  {"description": "# It is a comment", "content": "It is not a comment\nIt is not a comment\n  It is not a comment\n"},
  {"content": "It is not a comment"}
]

Я пробовал разные решения. Чисто регулярное выражение работает очень хорошо, но я хотел бы лучше воспользоваться инструментом Pyparsing , который мне кажется очень интересным.

Вот реализованный код, в котором проблема с продолжением в бесконечном l oop.

from pyparsing import Group, Literal, ZeroOrMore, restOfLine

data = '''
# It is a comment

# It is a comment
# It is a comment
It is not a comment



# It is a comment
It is not a comment
It is not a comment
  It is not a comment


It is not a comment
'''


def bnf():
    strip = lambda e: e[0].strip()
    join = lambda e: '\n'.join(e[0])

    number_sign = Literal('#').suppress()

    description = number_sign + restOfLine
    description = description.setParseAction(strip)
    description = ZeroOrMore(description)
    description = Group(description).setParseAction(join)('description')

    content = ~number_sign + restOfLine
    content = ZeroOrMore(content)
    content = Group(content).setParseAction(join, strip)('content')

    elements = Group(description + content)
    elements = ZeroOrMore(elements)

    return elements


tokens = bnf().parseString(data)
print(tokens.dump())

Хотелось бы помимо решения проблемы понять, почему программа зависает в бесконечном l oop.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...