用于代码的行探查器是否需要解析树,是否足够?

发布于 2021-01-29 16:19:16

我正在尝试确定为一种语言(如可用于Python和Matlab的语言)编写行分析器的必要条件。

解释“行事件探查器”的一种幼稚方法是假设可以在每行周围插入时间日志,但是行的定义取决于解析器如何处理空白,这只是第一个问题。似乎需要使用解析树并在各个节点周围插入时序。

这个结论正确吗?线路探查器是否需要解析树,是否还需要所有这些(超越时间记录)?


更新1:为此提供悬赏,因为问题仍未解决。

更新2:这是一个著名的Python行分析器的链接,以防它有助于回答这个问题。相对于解析,我还无法做出这样的决定。恐怕无法访问Matlab分析器的代码。

还应注意,可以说手动修饰输入代码将消除对解析树的需求,但这不是自动分析器。

更新3:尽管此问题与语言无关,但由于我正在考虑为R创建这样的工具(除非它存在并且我没有找到它)而出现。

更新4:关于使用线路分析器和调用堆栈分析器-
有关使用调用堆栈分析器的帖子Rprof()在本例中)说明了为什么使用调用堆栈而不是通过线路分析器直接分析事情会很痛苦。

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我想说的是,您需要一个解析树(和源)-您还怎么知道什么构成“行”和有效语句?

    实际的简化可能是“语句分析器”而不是“线路分析器”。在R中,分析树很容易使用:body(theFunction),因此在每个语句周围插入测量代码应该相当容易。通过更多的工作,您可以将其插入到属于同一行的一组语句周围。

    在R中,从文件加载的函数主体通常还具有一个属性srcref,该属性列出了每个“行”(实际上是每个语句)的源:

    这是一个示例函数(输入“ example.R”):

    f <- function(x, y=3)
    {
        a <- 0; a <- 1  # Two statements on one line
        a <- (x + 1) *  # One statement on two lines
            (y + 2)
    
        a <- "foo       
            bar"        # One string on two lines
    }
    

    然后在R中:

    source("example.R")
    dput(attr(body(theFunction), "srcref"))
    

    哪个打印此行/列信息:

    list(structure(c(2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L), srcfile = <environment>, class = "srcref"), 
        structure(c(3L, 2L, 3L, 7L, 9L, 14L, 3L, 3L), srcfile = <environment>, class = "srcref"), 
        structure(c(3L, 10L, 3L, 15L, 17L, 22L, 3L, 3L), srcfile = <environment>, class = "srcref"), 
        structure(c(4L, 2L, 5L, 15L, 9L, 15L, 4L, 5L), srcfile = <environment>, class = "srcref"), 
        structure(c(7L, 2L, 8L, 6L, 9L, 20L, 7L, 8L), srcfile = <environment>, class = "srcref"))
    

    如您所见(每个结构的最后两个数字是开始/结束行),表达式a <- 0a <- 1映射到同一行…

    祝好运!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看