Tree-sitter#
Note
Tree-sitter 是一个跨语言的语法解析器生成工具,支持 C++、Python、Java 等多种语言。它的特点是:
能为代码构建抽象语法树(AST),即使代码存在语法错误,也会尝试生成尽可能完整的树,并标记错误位置。
提供 API 供开发者遍历语法树,检查节点类型(包括 “错误节点”)。
使用 Tree-sitter 检测代码中的语法错误#
以使用 Python 绑定库,检测 C++ 代码为例子。核心思路是利用其解析能力生成语法树,再通过检查语法树中是否存在 “错误节点” 来判断代码是否有语法问题。
Install#
# 安装 Python 绑定
pip install tree-sitter
# 安装 C++ 语言预编译包
pip install tree-sitter-cpp
Example#
from tree_sitter import Parser, Language
import tree_sitter_cpp as tscpp
def has_cpp_syntax_errors(code: str) -> bool:
"""检查 C++ 代码是否存在语法错误(基于 tree-sitter-cpp 预编译包)"""
# 1. 初始化解析器并加载 C++ 语言定义(无需手动编译)
CPP_LANGUAGE = Language(tscpp.language())
parser = Parser(CPP_LANGUAGE)
# 2. 解析代码生成语法树
tree = parser.parse(code.encode("utf-8"))
root_node = tree.root_node
# 3. 遍历语法树,检查是否有 ERROR 节点
def traverse(node):
if node.type == "ERROR":
return True
for child in node.children:
if traverse(child):
return True
return False
return traverse(root_node)
# 有语法错误的 C++ 代码(括号不匹配)
bad_code = """
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl
// 缺少分号 }
"""
# 无语法错误的 C++ 代码
good_code = """
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
"""
print("Bad code has errors:", has_cpp_syntax_errors(bad_code)) # 输出 True
print("Good code has errors:", has_cpp_syntax_errors(good_code)) # 输出 False
Bad code has errors: True
Good code has errors: False