[KDB + / Q]:将q解析树解析为q表达式(字符串)

时间:2017-07-04 11:16:07

标签: parsing kdb q-lang

让我们将deparse 1 定义为对q的原生parse操作,以便以下保持:

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"

动机/背景/使用案例 对于人眼(从左到右),内联表达式可以说比grok更快,而不是深度嵌套的解析树。虽然在后台我的代码是以编程方式编辑解析树,但它对于调试或呈现很方便,可以方便地将生成的解析树转换为内联表达式字符串。

1 此处描述的类似功能:http://adv-r.had.co.nz/Expressions.html#parsing-and-deparsing

2 个答案:

答案 0 :(得分:0)

我认为这样做的唯一方法是递归地解析列表并构建一个字符串,例如对于一个二元的:

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

因此,您可以计算last x以获得它的效价并相应地构建字符串

答案 1 :(得分:0)

This unparse repository from 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))))"