2015-01-11 15 views
0

我正在尝试创建一个用于跟踪函数流的自动“调试器”。因为我不是上帝,所以我犯了错误,而当我这样做时,通常最终会在我的职责中抛出一堆“秀”。我正在做的是创建一个函数,该函数将在每行之前插入显示在该行上的表达式中使用的每个变量以及在前一行中分配的任何变量的显示。如何解开q/kdb +中的解析树?

想象一下,我有一个函数f抛出无用的错误。我会插入 f:debugwrap [f]; 函数定义后在函数字符串的行内插入适当的调试,解析并返回增强函数。

我已经成功地处理了参数和简单的函数,但是我遇到问题的地方是分号不能指示eol,比如函数调用。使用函数体的解析,我可以轻松地分解所有行并找到所需的变量,但是一旦我这样做了,我需要“解压”函数中的每一行。解析给我带来了麻烦,尤其是在函数被转换为我认为是k的地方 - 比如“*:”。

简单的例子,只有最初的记录:

q)f: {[a;b] a: a xexp b; c: a-first `int$-1#string first table[`symbols]; :c } 
    q)df: dp[f;";"] 
    q)df 
    "{[a;b] show "a is ",string[a]; show "b is ",string[b]; a : a xexp b;c : a - *:`int$-1#$:*:table`symbols;: c;}" 
    q)parse df 
    ERROR: *: 

我现在正在做递归通过解析树步行和重建呼叫。这是痛苦的,并没有产生结果。我认为最好的方法是从每个解析子树中获取我需要的信息,然后解开该子树并将其附加到我的函数字符串中。

感谢大家提供的帮助。

+0

[这'unparse'从GitHub库(https://github.com/patmok/unparse/blob/master/ unparse.q)解开q解析树,我认为这是你关于调试问题的一部分。看到这个所以问题和答案只关注于:https://stackoverflow.com/questions/44904518/kdb-q-deparse-q-parse-tree-into-q-expression-string –

回答