当前位置: 首页 > article >正文

tree-sitter 的 grammar.js 编写方法

tree-sitter 的 grammar.js 编写方法

    • 一、`grammar.js` 的作用是什么?
    • 二、基本结构
    • 三、关键词解释
    • 四、编写小技巧
      • 1. 起点是 `source_file`
      • 2. 所有规则名(如 `identifier`, `number`)都是 `$ => ...`
      • 3. 正则表达式用于定义词法规则(终结符),例如:
    • 五、🍀 `$`的简单解释:`$` 是规则的“引用工具”
      • ❓ 那 `$` 到底能干嘛?
      • 🧠 举个例子来说明
    • 🔧 类比一下:

要掌握 tree-sittergrammar.js 编写方法,首先我们要理解 tree-sitter 的核心概念,它是一个 基于GLR算法的增量解析器生成工具,常用于语法高亮、代码分析等任务。

一、grammar.js 的作用是什么?

这是 tree-sitter 语法的定义文件,描述了一个语言的 词法规则(Lexing)语法规则(Parsing)


二、基本结构

grammar.js 是一个 CommonJS 模块,通常长这样:

module.exports = grammar({name: 'my_language', // 语言名称// 词法规则extras: $ => [/\s/, $.comment], // 忽略的内容,如空格、注释// 定义词法(token)rules: {source_file: $ => repeat($.statement),statement: $ => choice($.variable_declaration,$.function_call),variable_declaration: $ => seq('let',$.identifier,'=',$.expression,';'),function_call: $ => seq($.identifier,'(',optional($.expression),')',';'),expression: $ => choice($.number,$.string,$.identifier),identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/,number: $ => /\d+/,string: $ => /"[^"]*"/,comment: $ => /\/\/.*/}
});

三、关键词解释

  • seq(...): 顺序匹配(sequence),表示一段连续的符号。
  • choice(...): 匹配多个可能之一(like OR)。
  • repeat(...): 重复0次或多次。
  • repeat1(...): 重复至少1次。
  • optional(...): 可选项。
  • token(...): 表示这是一个词法单元(token),不会再细分。
  • prec(n, rule): 设置优先级(n 越大,优先级越高)。

四、编写小技巧

1. 起点是 source_file

tree-sitter 会从你定义的 rules.source_file 开始解析整个文件。

2. 所有规则名(如 identifier, number)都是 $ => ...

这个 $ 是构造语法树时的“工具”,让你可以引用别的规则。

3. 正则表达式用于定义词法规则(终结符),例如:

identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/,
number: $ => /\d+/,

五、🍀 $的简单解释:$ 是规则的“引用工具”

grammar.js 中,你写的每一个语法规则都是一个函数,比如这样:

identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/

这里的 $ => 就是给 tree-sitter 传递一个函数,这个函数的参数 $ 是个“语法引用器”。

❓ 那 $ 到底能干嘛?

它能让你“引用其他规则”。

🧠 举个例子来说明

比如你想定义这样一个语句:

let x = 42;

你在写规则时会写成:

variable_declaration: $ => seq('let',$.identifier,'=',$.expression,';'
)

这里的 $.identifier$.expression 就是**“引用”之前定义的两个规则**。注意:

  • $.identifier -> 指向你之前写的 identifier: $ => ...
  • $.expression -> 指向你之前写的 expression: $ => ...

这样 tree-sitter 就能在 variable_declaration 这个规则里,使用别的规则了。


🔧 类比一下:

你可以把 rules 想象成一个对象:

rules = {identifier: ...,expression: ...,variable_declaration: ...
}

$.identifier 就相当于 rules.identifier

所以这个 $ 就是代表你整个 rules 对象本身。


相关文章:

tree-sitter 的 grammar.js 编写方法

tree-sitter 的 grammar.js 编写方法 一、grammar.js 的作用是什么?二、基本结构三、关键词解释四、编写小技巧1. 起点是 source_file2. 所有规则名(如 identifier, number)都是 $ > ...3. 正则表达式用于定义词法规则(终结符&…...

Git 实践笔记

这里写自定义目录标题 一、将当前改动追加到某次commit上二、git 强制修改分支位置 一、将当前改动追加到某次commit上 stash工作区中的当前改动 git stash假设需要修改的commit是 f744c32,将HEAD移动到需要改动的commit的父提交上 git rebase f744c32^ --interact…...

【特权FPGA】之数码管

case语句的用法: 计数器不断的计数,每一个num对应数码管一种数据的输出。实例通俗易懂,一目了然。 timescale 1ns / 1ps// Company: // Engineer: // // Create Date: // Design Name: // Module Name: // Project Name: //…...

Stable Diffusion 四重调参优化——项目学习记录

学习记录还原:在本次实验中,我基于 Stable Diffusion v1.5模型,通过一系列优化方法提升生成图像的质量,最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手,逐步推进到参数微调、DreamShaper 模型和 Contro…...

遇到git提交报错:413

是因为提交文件过大导致内存溢出。 解决方法: 假设您的提交历史如下: Apply to .gitignore abcd123 当前提交 efgh456 包含node_modules的提交 ijkl789 较早的正常提交 您可以: 回退到添加node_modules之前的提交: bash App…...

关于nacos注册的服务的ip异常导致网关路由失败的问题

文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二:设置优先使用的网络段方法三:指定网络接口方法四:忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...

大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究

目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与慢性淋巴细胞白血病相关知识 2.1 大模型技术原理与特点 2.2 慢性淋巴细胞白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模…...

【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南

写在前面 两天都没手搓实现可用的凸包生成算法相关的代码,自觉无法手搓相关数学库,遂改为使用成熟数学库。 一、GLM库安装与介绍 1.1 vcpkg安装GLM 跨平台C包管理利器vcpkg完全指南 在PowerShell中执行命令: vcpkg install glm# 集成到系…...

408 计算机网络 知识点记忆(8)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...

基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南

基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南 一、背景与价值 在流计算生产环境中,Flink on YARN的部署方式凭借其资源管理优势被广泛采用。Savepoint作为Flink任务状态的一致性快照,承载着故障恢复、版本升级、作业暂停等重要场景…...

我可能用到的网站和软件

我可能用到的网站和软件 程序员交流的网站代码管理工具前端组件库前端框架在线工具人工智能问答工具学习的网站Windows系统电脑的常用工具 程序员交流的网站 csdn博客博客园 - 开发者的网上家园InfoQ - 软件开发及相关领域-极客邦掘金 (juejin.cn) 代码管理工具 GitHub 有时…...

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机(Finite State Machine, FSM)是计算机科学和工程领域中的一种抽象模型,用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态,并通过事件触发状态间的转移。 2.状态机…...

2024年第十五届蓝桥杯CC++大学A组--成绩统计

2024年第十五届蓝桥杯C&C大学A组--成绩统计 题目: 动态规划, 对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩&…...

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件,支持单选或多选操作,适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合,支持动…...

Kotlin 学习-集合

/*** kotlin 集合* List:是一个有序列表,可通过索引(下标)访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:(字典)是一组键值对。键是唯一的…...

解决java使用easyexcel填充模版后,高度不一致问题

自定义工具,可以通过获取上一行行高设置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…...

数据结构与算法之ACM Fellow-算法4.3 最小生成树

数据结构与算法之ACM Fellow-算法4.3 最小生成树 加权图 是一种为每条边关联一个 权值 或是 成本 的图模型。这种图能够自然地表示许多应用。在一幅航空图中,边表示航线,权值则可以表示距离或是费用。在一幅电路图中,边表示导线,…...

使用POCO库进行ZIP压缩和解压

使用POCO库进行ZIP压缩和解压 POCO C Libraries提供了一个ZIP模块&#xff0c;可以方便地进行文件和数据流的压缩与解压操作。下面我将介绍如何使用POCO的ZIP模块进行这些操作。 1. 基本ZIP文件操作 压缩文件/目录到ZIP #include <Poco/Zip/Compress.h> #include <…...

自动驾驶的未来:多模态感知融合技术最新进展

作为自动驾驶领域的专业人士&#xff0c;我很高兴与大家分享关于多模态感知融合技术的前沿研究和实践经验。在迅速发展的自动驾驶领域&#xff0c;多模态感知融合已成为提升系统性能的关键技术。本文将深入探讨基于摄像头和激光雷达的多模态感知融合技术&#xff0c;重点关注最…...

亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景

4 月 9 日&#xff0c;2025 全球分布式云大会暨 AI 基础设施大会在深圳成功举办&#xff0c;火山引擎边缘云产品解决方案高级总监沈建发出席并以《智启边缘&#xff0c;畅想未来&#xff1a;边缘计算新场景落地与 Al 趋势新畅想》为主题&#xff0c;分享了边缘计算在 AI 技术趋…...

XCode集成第三方framework步骤

一、添加 .framework 文件到项目 ‌拖拽或手动添加‌ 在Xcode中&#xff0c;直接将 .framework 文件拖入项目导航器的目标文件夹中, 确保 .framework 文件被复制到项目目录内&#xff08;非外部路径&#xff09;‌。或通过菜单操作&#xff1a; ‌General → Frameworks, Libra…...

无损分区管理,硬盘管理的“瑞士军刀”!

打工人们你们好&#xff01;这里是摸鱼 特供版~ 今天给大家带来一款简单易用、功能强大的无损分区软件——分区助手技术员版&#xff0c;让你的硬盘管理变得轻松又高效&#xff01; 推荐指数&#xff1a;★★★★★ 软件简介 分区助手技术员版是一款功能强大的硬盘分区工具&…...

VS Code下开发FPGA——FPGA开发体验提升__下

上一篇&#xff1a;IntelliJ IDEA下开发FPGA-CSDN博客 Type&#xff1a;Quartus 一、安装插件 在应用商店先安装Digtal IDE插件 安装后&#xff0c;把其他相关的Verilog插件禁用&#xff0c;避免可能的冲突。重启后&#xff0c;可能会弹出下面提示 这是插件默认要求的工具链&a…...

ffmpeg播放音视频流程

文章目录 &#x1f3ac; FFmpeg 解码播放流程概览&#xff08;以音视频文件为例&#xff09;1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包&#xff08;Packet&#xff09;5️⃣ 解码成帧&#xff08;Frame&#xff09;6️⃣ 播放 / …...

SpringCloud微服务: 分布式架构实战

# SpringCloud微服务: 分布式架构实战 第一章&#xff1a;理解SpringCloud微服务架构 什么是SpringCloud微服务架构&#xff1f; 在当今互联网应用开发中&#xff0c;微服务架构已经成为业界的主流趋势。SpringCloud是一个基于Spring Boot的快速开发微服务架构的工具&#xff0…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月11日第49弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

Spring其它知识点

33.Spring 源码用到了哪些设计模式&#xff1f; 工厂模式&#xff1a;通过BeanFactory或者ApplicationContext创建Bean对象。BeanFactory是延迟注入&#xff0c;使用到Bean的时候才注入。ApplicationContext是在容器启动时&#xff0c;一次性创建所有的Bean。单例模型&#xf…...

【models】Transformer 之 各种 Attention 原理和实现

Transformer 之 各种 Attention 原理和实现 本文将介绍Transformer 中常见的Attention的原理和实现&#xff0c;其中包括&#xff1a; Self Attention、Spatial Attention、Temporal Attention、Cross Attention、Grouped Attention、Tensor Product Attention、FlashAttentio…...

C++ 学习资源整理

awesome-cpp&#xff08;C 资源大全&#xff09; &#x1f517; https://github.com/fffaraz/awesome-cpp 收集了各种 C 库、框架、教程和示例代码。 CPlusPlusThings&#xff08;C 基础知识整理&#xff09; &#x1f517; https://github.com/Light-City/CPlusPlusThings 包…...

opengrok搭建与配置

前提条件 需要配置好docker与docker-compose环境 1.代码准备 mkdir -p /data/opengrok/{etc,src,data} cd /data/opengrok/src/ # 克隆一个测试项目 git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git 2.创建docker-compose.yml文件&…...