Как я могу сгладить диктат в Pyparsing - PullRequest
0 голосов
/ 12 мая 2018

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, чтобы получить последний соответствующий токен (который не пустой), но это не так?

1 Ответ

0 голосов
/ 12 мая 2018

Оказывается, что, чтобы сгладить это, я просто добавляю, чтобы добавить мою setParserAction до родителя грамматики комментариев.Он имеет всю информацию после собственного разбора ребенка и может заменить себя, таким образом «сгладить» или дублировать или преобразовать ребенка.

...