【问题标题】:How can I 'unparse' a parse tree in q/kdb+?如何在 q/kdb+ 中“解析”解析树?
【发布时间】:2015-01-11 10:32:30
【问题描述】:

我正在尝试创建一个自动“调试器”来跟踪函数流。因为我不是神,我确实会犯错误,而且当我这样做时,我通常会在我的函数中抛出一堆“秀”。我要做的是创建一个函数,该函数将在每行之前插入显示,用于该行表达式中使用的每个变量以及之前分配给的任何变量。

想象一下,我有一个函数 f 抛出了一个无用的错误。我会插入 f: 调试包装[f]; 在函数定义之后在函数字符串的行中插入适当的调试,解析并返回扩展函数。

我已经成功处理了参数和简单函数,但我遇到的麻烦是分号不表示 eol 的地方,例如在函数调用中。在函数体上使用 parse,我可以轻松地分解所有行并找到所需的变量,但是一旦我这样做了,我需要对函数中的每一行进行“解析”。这种反解析给我带来了麻烦,尤其是在函数被翻译成我认为是 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: *:

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

感谢大家提供的任何帮助。

【问题讨论】:

标签: kdb q-lang


【解决方案1】:

了解如何进行调试的最佳位置是使用以下代码:http://code.kx.com/q/ref/debug/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2022-11-08
    • 1970-01-01
    相关资源
    最近更新 更多