Pyparsing позволяет именованные компоненты лексера (или использовать setResultsName
для той же цели), которые после синтаксического анализа могут использоваться в качестве атрибутов или записей dict.
Это позволяет получить хороший плоский вид большинства проанализированных компонентов ... за исключением случаев, когда вам необходимо заменить соответствующие токены определенным образом.
В моем случае я хочу преобразовать и продублировать их. Поэтому я создал такую функцию:
def process_comments(_1,_2,token):
urls = []
comments = []
#...transform here...
return {"list":comments, "urls":urls}
comments = ZeroOrMore(Suppress(Keyword("comment")) + quotes.copy()).setParseAction(process_comments)
comments.setResultsName("comments")
Это работает, но вызывает ненужную глубину карты (и ухудшается при вложенных подстановках). Я бы предпочел иметь возможность создать две записи на верхнем уровне результата, 'comments' и 'urls', и оставить оригинальный токен в пустоте.
Можно ли это сделать? Помните, что преобразование не является частью исходного ввода, это просто исходный токен, так что это должна быть модификация после анализа или что-то странное должно быть сделано в грамматике.
Было бы здорово, если бы был способ добавить токен Empty
, который я мог бы настроить с помощью setParseAction, чтобы получить последний соответствующий токен (который не пустой), но это не так?