[KDB+/Q]: депарсить дерево синтаксического анализа q в выражение q (строка)

Давайте определим deparse1 как операцию обратную к собственной операции parse q, чтобы выполнялось следующее:

q)aStringQExpression~deparse parse aStringQExpression
1b

Вопрос

Каково определение функции deparse, чтобы вышеизложенное действительно работало?

Например, в приведенном ниже выражении обновления мы знаем, что выражение "a*0^b+c-d" соответствует дереву синтаксического анализа (*;`a;(^;0;(+;`b;(-;`c;`d)))):

q)-3!parse "update col:a*0^b+c-d from t"
"(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"

Таким образом, предполагаемая функция deparse должна возвращать:

q)deparse "(*;`a;(^;0;(+;`b;(-;`c;`d))))"
"a*0^b+c-d"
q)deparse "(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"
"update col:a*0^b+c-d from t"

Мотивация/предыстория/вариант использования: встроенные выражения, возможно, быстрее, чем человеческим глазом (слева направо), чем глубоко вложенные деревья синтаксического анализа. Хотя в фоновом режиме мой код программно редактирует дерево синтаксического анализа, для отладки или презентации удобно преобразовать полученное дерево синтаксического анализа в строку встроенного выражения.


1 Аналогичные функции описаны здесь: http://adv-r.had.co.nz/Expressions.html#parsing-and-deparsing


person Daniel Krizian    schedule 04.07.2017    source источник


Ответы (2)


Я думаю, что единственный способ сделать это - рекурсивно проанализировать список и создать строку, например. для диады:

q)deparse:{a:-3!'x;a[1],a[0],a[2]}
q)deparse parse "3*3"
"3*3"

Таким образом, вы можете подсчитать last x, чтобы получить его валентность и соответственно построить строку.

person Manish Patel    schedule 05.07.2017
comment
В конце концов мне очень повезло, и я случайно наткнулся на полное решение на Github. Смотрите мой ответ, но большое спасибо! - person Daniel Krizian; 16.07.2017

Этот unparse репозиторий с Github решает проблему. Удивительно:

q).unparse.unparse parse "update col:a*0^b+c-d from t"
"update col:(a*(0^(b+(c-d)))) from t"

q).unparse.unparse parse "a*0^b+c-d"
"(a*(0^(b+(c-d))))"
person Daniel Krizian    schedule 16.07.2017