我想说,是的,你需要一个解析树(和源代码) - 否则你怎么知道什么构成了“行”和有效的语句?
但实际的简化可能是“语句分析器”而不是“行分析器”。
在 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 <- 0
and a <- 1
映射到同一行...
祝你好运!