You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计代码中注释外的单词或Token数量?

统计代码中注释外的单词/Token数量:用Tree-sitter+Shell工具实现

现有工具里,cloc能统计代码文件或目录的行数、代码量,wc可以统计纯文本的单词数,但它们都没法直接统计代码里注释以外的单词或Token数量。

那有没有办法不用从头写完整程序,靠Tree-sitter这类通用编程语言解析工具,配合Shell脚本或简单工具实现这个需求?

示例说明

以C语言文件foo.c为例:

int /* this is
a multi-line
comment!
*/
foo(int x) { 
    /* comment 1 */
    return 123;  // comment 2
}

统计结果分两种场景:

  • 把括号、大括号、分号等符号也算作Token:总计11个,分别是int、foo、(、int、x、)、{、return、123、;、}
  • 仅统计关键字、标识符、字面量这类“单词”:总计6个,分别是int、foo、int、x、return、123

实现方案(基于Tree-sitter)

Tree-sitter是通用的代码解析工具,能精准识别代码的Token和注释,搭配Shell命令就能快速实现统计。

1. 前置准备

先安装Tree-sitter CLI和对应语言的语法包:

  • 安装CLI:npm install -g tree-sitter-cli(也可通过源码编译安装)
  • 安装目标语言语法(以C语言为例):
    tree-sitter clone tree-sitter/tree-sitter-c
    cd tree-sitter-c && npm install
    

2. 统计所有非注释Token(含符号)

用tree-sitter tokenize输出所有Token,过滤掉注释类型的条目后统计行数:

tree-sitter tokenize foo.c | grep -v 'comment' | wc -l

执行后会得到示例中的11个Token的统计结果。

3. 仅统计“单词类”Token(排除符号)

不同语言的Token类型命名略有差异,以C语言为例,我们只保留keyword(关键字)、identifier(标识符)、number_literal(数字字面量)这类类型:

tree-sitter tokenize foo.c | grep -E '(keyword|identifier|number_literal)' | wc -l

执行后会得到示例中的6个单词的统计结果。

注意:其他语言需要调整过滤的Token类型,比如Python的字符串字面量类型是string_literal,需要根据Tree-sitter的输出自行匹配。

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:17:38