如何统计代码中注释外的单词或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
相关产品推荐
相关产品推荐

