Ограничить новые строки в заданных выражениях c - PullRequest
1 голос
/ 16 апреля 2020

Аналогичный вопрос: Использование PyParsing для синтаксического анализа языка со знаками новой строки (например, Python)


Мне нравится функция pyparsing, которая вообще игнорирует пробелы, но есть некоторые выражения в моем синтаксисе, которые должны быть записаны в одной строке.

Вопрос: как ограничить разрывы строк для указанного c выражения?

Я вижу в документах метод setWhitespaceChars, который должен делать именно это, но, похоже, он не работает (см. Примеры ниже).

Примеры

Мне нужно проанализировать следующее выражение:

{
    ref: 4121!
}

Здесь фигурные скобки могут быть отформатированы с новыми строками, но часть ref должна быть однострочной.

Я определяю синтаксис:

>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums) + '!'
>>> braces = '{' + ref + '}'

Теперь я пытаюсь изменить пробелы для ref:

>>> ref.setWhitespaceChars({' ', '\t'}) 
{{'ref:' W:(0123...)} "!"}
>>> ref.whiteChars
{'\t', ' '}

Но когда я пытаюсь проанализировать test_string (неправильно отформатированный), он анализирует его без ошибки:

>>> test_string = 'ref:\n123\n!'
>>> ref.parseString(test_string)
(['ref:', '123', '!'], {})

Что я делаю не так?

UPD:

Кажется, мне нужно подать заявку setWhitespaceChars к КАЖДОМУ элементу, который должен оставаться в одной строке:

>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums).setWhitespaceChars(' \t\r') + pp.Literal('!').setWhitespaceChars(' \t\r')
>>> s = 'ref:\n123\n!'
>>> ref.parseString(s)
Traceback (most recent call last):
...
pyparsing.ParseException: Expected W:(0123...), found '\n'  (at char 4), (line:1, col:5)

Это добавляет столько беспорядка, что я, вероятно, лучше позвоню setDefaultWhitespaceChars в начале, а затем добавлю элементы новой строки вокруг каждого выражение, которое я почти верил, что мне не нужно делать с pyparsing. Есть ли другое решение?

...