【问题标题】:Calculate the number of statements in a javascript function计算 javascript 函数中的语句数
【发布时间】:2019-08-21 15:38:03
【问题描述】:

我想计算一段 javascript 代码中的语句数。这是为了评估代码对于编程挑战有多短(如果有更好/更简单的方法来评估代码,我也有兴趣听听)。

出于本次评估的目的,我想假设语句是能够在其中执行操作的任何内容,例如:

let values = ['test 1', 'test 2'];
for(let i in values) {
    let object = {
        a: i%3,
        b: Math.floor(i/3),
        c: i*2
    };
    let another = {test: 0 || 4};
    let something = values[i];
    let otherSomething = getSomeValues(object[a], object[b]);
    setSomeValues(object[a], object[c]);
    for(let j = 0; j < 5; i++) if(i < j) break;
}

有相当多的语法需要涵盖,所以理想情况下,如果有可用的库,我想用一个库来做到这一点 - 我的谷歌搜索无法找到任何非常合适的东西。

我尝试编写一个正则表达式来匹配语句之间所有可能的中断,但这很快就会变得混乱:

[\n;]|\)[ \w]|[{,][\s\w]+:\s*|[{}]

这是我一直在使用的the regexr 的链接。分解:

  • [\n;] - 匹配换行符或分号,这是开始新语句的正常方式
  • \)[ \w] - 匹配右括号后的语句,例如if (something) return;
  • [{,][\s\w]+:\s* - 匹配对象中键值对的键
  • [{}] - 匹配块的左括号和右括号

我还删除了所有长度为零的匹配项,因为语句不能为空。

正如我所说,理想情况下我更喜欢图书馆,但我想就我的方法以及我是否有大多数边缘情况征求一些意见。

【问题讨论】:

  • 我无法想象正则表达式足够强大以应对所有情况,因此:stackoverflow.com/questions/14355910/…
  • @LeeTaylor 这似乎是一个与 C# 相关的问题,你能更具体地说明你指的是什么吗?
  • 我怀疑写一个简单的正则表达式在这里会有很大帮助。如果您想要准确的结果,几乎可以肯定,您需要编写解析器和词法分析器。试试this
  • esprima.org/demo/parse.html我相信这是用js写的。
  • 嗯,请求库是off-topic(见第4 条),但我想有很多工具。您可以四处搜索并查看我上面提到的那个——我不知道他们的名字可能会在我脑海中浮现。我主要想提一下,写一个正则表达式会非常困难,并指出你要做个人研究。

标签: javascript regex static-analysis


【解决方案1】:

由于您试图理解特定代码块而不是构建库,因此您应该查看astexplorer.net

Here is a link 显示解析良好的树,如果需要,您可以将示例配置为使用替代解析器(babel、acorn、eslint 等)。

【讨论】:

  • 谢谢,向我指出 AST(抽象语法树)的方向非常有帮助。我最终使用esprima 解析提交的代码并通过迭代生成的树来计算元素。
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多