写点什么

Tree-sitter 入门

作者:阿呆
  • 2022 年 9 月 30 日
    北京
  • 本文字数:1444 字

    阅读完需:约 5 分钟

Tree-sitter入门

tree-sitter 简介


Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be:

  • General enough to parse any programming language

  • Fast enough to parse on every keystroke in a text editor

  • Robust enough to provide useful results even in the presence of syntax errors

  • Dependency-free so that the runtime library (which is written in pure C) can be embedded in any application

概括的来说,tree-sitter 是一个解析器生成工具和增量解析库,能够将代码源文件解析成具体的语法树,能解析绝大多数语言,并且用纯 c 编写,无依赖。更详细的介绍,可以从官方文档中查看:https://tree-sitter.github.io/tree-sitter

本系列介绍在 python 中使用 tree-sitter 解析不同语言,以下介绍安装及用法。

py-tree-sitter 安装

该包现在只适用于 python3,需要安装 c 编译器,安装命令为:

pip3 install tree_sitter
复制代码

在 windows 环境中安装时,可能会有以下报错,

根据https://xie.infoq.cn/article/a9d8231121bb5370ae8b8690e 中安装 c 编译器即可。


py-tree-sitter 用法

使用 Language.build_library 方法,将现有或自己的语言存储库编译为 python 可以是用的库,首先将语言存储库下载到本地(新建 vendor 目录,将代码下载到 vendor 目录下)

git clone https://github.com/tree-sitter/tree-sitter-gogit clone https://github.com/tree-sitter/tree-sitter-javascriptgit clone https://github.com/tree-sitter/tree-sitter-python
复制代码

在与 vendor 同级的目录下,新建 py 文件,将语言存储库编译,代码如下

from tree_sitter import Language, Parser
Language.build_library( # Store the library in the `build` directory 'build/my-languages.so',
# Include one or more languages [ 'vendor/tree-sitter-go', 'vendor/tree-sitter-javascript', 'vendor/tree-sitter-python' ])
复制代码

将语言作为对象,加载到我们的应用程序中

GO_LANGUAGE = Language('build/my-languages.so', 'go')JS_LANGUAGE = Language('build/my-languages.so', 'javascript')PY_LANGUAGE = Language('build/my-languages.so', 'python')
复制代码

解析 python 代码,并遍历语法树的代码如下

from tree_sitter import Language, ParserPY_LANGUAGE = Language('build/my-languages.so', 'python')parser = Parser()parser.set_language(PY_LANGUAGE)tree = parser.parse(bytes("""def foo():    if bar:        baz()""", "utf8"))
cursor = tree.walk()
assert cursor.node.type == 'module'
assert cursor.goto_first_child()assert cursor.node.type == 'function_definition'
assert cursor.goto_first_child()assert cursor.node.type == 'def'
# Returns `False` because the `def` node has no childrenassert not cursor.goto_first_child()
assert cursor.goto_next_sibling()assert cursor.node.type == 'identifier'
assert cursor.goto_next_sibling()assert cursor.node.type == 'parameters'
assert cursor.goto_parent()assert cursor.node.type == 'function_definition'
复制代码

其中 1-4 行,是将 python 的语言加载,并初始化解析器,5-9 行,将一段 python 代码解析为语法树,11 行以后的,针对语法树进行遍历。

发布于: 2022 年 09 月 30 日阅读数: 3
用户头像

阿呆

关注

坚守准则,认真做事。 2018.05.22 加入

职位:360资深后台开发,主要负责DevOps平台开发 技术:Python 爱好:炉石传说

评论

发布
暂无评论
Tree-sitter入门_Python_阿呆_InfoQ写作社区