Аналогичный вопрос: Использование 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. Есть ли другое решение?