python使用tree-sitter解析cpp代码获得AST文本序列

前言
在使用 tree-sitter 时候,希望把 C/C++ 的源代码表征成一段 AST (抽象语法树)的结构文本序列,以便于代码的分类预测任务,基于个人摸索,发现其实操作很简单。

什么是AST结构文本序列?
就是下面👇这个东西(它其实是一个树形文本),而我希望拿到这个代码的 AST 信息全部拼接在一起的文本序列(也就是整合成一句话)
AST文本序列

👉 具体操作参考官方说明wiki:tree-sitter | Introduction
👉 注意,如果您还未安装tree-sitter环境,请先移步博客 👉 tree-sitter环境安装入门教程

如何生成 AST 序列?
关键就是 sexp = root.sexp() 这一句代码,可以直接将代码生成AST结构文本序列(AST sequence)。

然后,在拿到结构序列后面就接NLP(自然语言处理) 相关的技术,或者LSH(模糊哈希)等技术,就完成了代码结构语义的表征了,精度高而且性能也好。

源代码实例

from tree_sitter import Language, Parser  # 解析器库

# 这是测试用的cpp代码片段, 斐波那契数列
cpp_code_snippet = '''
int fib(int n){
    long long f1 = 1, f2 = 1;
    int time = (n + 1) / 2;
    for (int i = 1; i < time; i++){
        f1 = f1 + f2;
        f2 = f2 + f1;
    }
    if (n % 2 == 0) return f2;
    else return f1;
}
'''

# tree-sitter CPP解析器
CPP_LANGUAGE = Language('build/my-languages.so', 'cpp')
cpp_parser = Parser()
cpp_parser.set_language(CPP_LANGUAGE)

# 解析指定的源代码段
tree = cpp_parser.parse(bytes(cpp_code_snippet, "utf8"))
root = tree.root_node  # 注意,root_node 才是可遍历的树节点

# 获取AST序列
sexp = root.sexp()  

# 打印AST文本序列
print(sexp)

程序得到的AST序列的结果如下:

(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (identifier)))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (init_declarator declarator: (identifier) value: (number_literal)) declarator: (init_declarator declarator: (identifier) value: (number_literal))) (declaration type: (primitive_type) declarator: (init_declarator declarator: (identifier) value: (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal)))) (for_statement initializer: (declaration type: (primitive_type) declarator: (init_declarator declarator: (identifier) value: (number_literal))) condition: (binary_expression left: (identifier) right: (identifier)) update: (update_expression argument: (identifier)) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))))) (if_statement condition: (condition_clause value: (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (number_literal))) consequence: (return_statement (identifier)) alternative: (else_clause (return_statement (identifier)))))))

tree-sitter | playground 得到的ast tree结果的完全一致,只不过ast序列通过括号的形式来表示了树形的层级,相当于扁平化了这个AST Tree。那么后面就可以针对这个AST文本序列做一些语义抽象上的事情啦!
tree-sitter playground
个人创作不易,请多多支持,欢迎提问,谢谢!

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tree-sitter java 是一种使用 Tree-sitter 技术实现的 Java 语法解析工具。Tree-sitter 是一款高效、跨平台的解析器生成器,能够生成用于解析多种编程语言解析器。通过使用 Tree-sitter java,我们可以进行 Java 代码解析,实现语法高亮、代码导航、自动补全等功能。 Tree-sitter java 的工作原理是先使用 Tree-sitter 技术生成 Java 语言解析器,并将解析器集成到我们的应用程序中。在解析过程中,Tree-sitter java 会将 Java 代码转换成一个抽象的语法树(AST),这个语法树可以准确地表示代码的各种语法结构和语义。我们可以通过遍历这棵语法树来分析代码,实现各种功能。 相比于传统的基于正则表达式或有限状态机的解析器,Tree-sitter java 的优势在于它是基于语法树的。语法树可以准确地表示代码的结构和语义,使得我们可以更加灵活地分析和操作代码。而且,Tree-sitter java 的解析过程是非常快速的,可以快速地处理大型的 Java 代码库。 使用 Tree-sitter java 可以带来很多好处。首先,它可以为我们的代码编辑器提供丰富的语法高亮功能,使得代码更加易读。其次,我们可以利用它实现更智能的代码导航和自动补全功能,提高我们的开发效率。此外,Tree-sitter java 还可以用于代码分析和重构,帮助我们理解和改进代码质量。 总之,Tree-sitter java 是一种强大的 Java 语法解析工具,通过利用它,我们可以实现更智能、更高效的代码编辑和分析。它不仅提高了我们的开发效率,还有助于改善我们的代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值