tree-sitter编写parser,用external scanner实现eof规则

news/2024/12/3 23:50:03/文章来源:https://www.cnblogs.com/dacec/p/18585278

介绍和分析

tree-sitter是一个parser生成工具,用于生成语法树。

eof规则表示从当前位置开始,匹配空字符直到文件结尾,中途任何的非空字符都会导致匹配失败。

tree-sitter本身不提供eof规则,以下是使用external scanner功能实现的eof

代码实现

.代表项目根目录
记得将代码中的your_language替换成你的语言名称

./binding.gyp 文件中

{"targets": [{..."sources": ["bindings/node/binding.cc","src/parser.c","src/scanner.c", // 添加这一行],...}]
}

scanner.c 文件需要手动创建
external scanner的具体规则用法参考 tree-sitter external scanner

./src/scanner.c

#include "tree_sitter/alloc.h"
#include "tree_sitter/array.h"
#include "tree_sitter/parser.h"static bool scan_eof(TSLexer *lexer);enum TokenType { Eof };void *tree_sitter_your_language_external_scanner_create(void) { return NULL; }void tree_sitter_your_language_external_scanner_destroy(void *payload) {}unsigned tree_sitter_your_language_external_scanner_serialize(void *payload,char *buffer) {return 0;
}void tree_sitter_your_language_external_scanner_deserialize(void *payload,const char *buffer,unsigned length) {}bool tree_sitter_your_language_external_scanner_scan(void *payload, TSLexer *lexer,const bool *valid_symbols) {if (valid_symbols[Eof]) {return scan_eof(lexer);}return false; // 匹配失败
}bool scan_eof(TSLexer *lexer) {// 标记匹配开始位置lexer->mark_end(lexer);while (!lexer->eof(lexer)) {// 检查是否有非空字符,具体忽略哪些空字符可以在这里指定if (lexer->lookahead != ' ' && lexer->lookahead != '\n' &&lexer->lookahead != '\r' && lexer->lookahead != '\t' &&lexer->lookahead != '\f' && lexer->lookahead != '\v') {return false; // 匹配失败}lexer->advance(lexer, true); // 消耗字符lexer->mark_end(lexer);      // 动态更新结束位置}// 到达文件末尾,匹配成功lexer->result_symbol = Eof;return true;
}

最后在external中声明添加的规则,就可以使用这个规则了

./grammer.js

module.exports = grammar({name: "your_language",externals: $ => [$.eof,],rules: {source_file: $ => seq("world",$.eof), // 一个简单的示例}

运行

创建一个简单的文本文件example.txt,结尾可以加上任意数量的空字符

world

控制台运行命令

tree-sitter generate
tree-sitter parse ./example.txt

得到以下输出,说明eof规则运行成功

(source_file [0, 0] - [6, 0](world [0, 0] - [0, 5])(eof [6, 0] - [6, 0]))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846391.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cannot find a valid baseurl for repo: base/7/x86_64

001、yum报错(base) [root@PC1 yum.repos.d]# yum install httpd ## yum安装应用报错 。002、解决方法(base) [root@PC1 home]# cd /etc/yum.repos.d (base) [root@PC1 yum.repos.d]# ls CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.rep…

【Comsol 6.2软件下载与安装教程】

1、安装包 「COMSOL 6.2」: 下载地址 2、安装教程(建议关闭杀毒软件和系统防护) 1) 下载并解压下载的安装包,双击Setup.exe安装,弹窗安装对话框2) 选择简体中文,点击下一步3) 选择先安装6.24) 选择我接受,点击许可证格式-许可证文件-浏览 – C…

搭建eureka集群环境以及客户端配置

先来效果图 eureka集群节点一 eureka集群节点二 节点一显示的注册服务 节点二显示的注册服务 eureka服务端配置如下所示 现在将eureka服务端放到了测试环境 192.168.31.50 192.168.31.60 服务信息 最后给出全部的eureka代码 pom文件<?xml version="1.0" encodin…

【推荐算法】推荐系统的评估

这篇文章是笔者阅读《深度学习推荐系统》第五章推荐系统的评估的学习笔记,在原文的基础上增加了自己的理解以及内容的补充,在未来的日子里会不断完善这篇文章的相关工作。离线评估在离线环境中利用已有的数据划分训练集和测试集对模型进行评估划分数据集方法机器学习常用划分…

考研打卡(34)

开局(34) 开始时间 2024-12-03 22:36:03 结束时间 2024-12-03 23:17:57为什么昨天没写,因为昨天想死,但我jio得不能每天都想死吧,所以今天该写了数据结构如果一棵二叉树的先序序列是…a…b…,中序序列是…b…a…,则_______(北京师范大学 2015年) A 节点a和节点b分别在…

Educational Codeforces Round 172 (Rated for Div. 2)题解记录(A~D)

比赛链接:https://codeforces.com/contest/2042 这场爆了,卡死在C题了,QWQ.卡题得跳题啊!!! A.Greedy Monocarp 题面: 有 \(n\) 个箱子,第 \(i\) 个箱子最初包含 \(a_i\) 枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:…

Educational Codeforces Round 172 (Rated for Div. 2)(A~D)

比赛链接:https://codeforces.com/contest/2042 这场爆了,卡C题了,QWQ.卡题得跳一跳!!! A.Greedy Monocarp 题面: 有 \(n\) 个箱子,第 \(i\) 个箱子最初包含 \(a_i\) 枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:所有…

树上的最远距离

题目 题目描述 给定一棵树,对于每一个点,输出离它最远的点到它的距离。 输入格式 第一行包含整数 \(n\)。 接下来 \(n-1\) 行,每行包含两个整数 \(a_i,b_i\),表示点 \(a_i\) 和 \(b_i\) 之间存在一条边。 输出格式 输出一行 \(n\) 个整数,第 \(i\) 个数表示离节点 \(i\) 最…

go 多线程

goroutine以及gmp原理go 多线程 进程、线程、和协程进程分配系统资源(CPU 时间、内存等)基本单位 有独立的内存空间,切换开销大线程:进程的一个执行流,是 CPU 调度并能独立运行的的基本单位同一进程中的多线程共享内存空间,线程切换代价小 多线程通信方便 从内核层面来看…

第57篇 docker的常用命令

1 镜像管理2 容器管理3 容器运行4 网络管理5 插件管理6 数据卷管理7 日常操作8 常用dockerfile指令

技术美术学习路线

技术美术学习路线 理想路线 第一个阶段熟练一门编程语言(课设写个例如医院管理系统,图书管理系统之类的):C/python/C++/C#,并尝试用它写一个飞机大战小游戏养成良好的审美,每日收集图片,鉴赏各种美术风格从Unity客户端开始学习,之后逐步学习技术美术:如何不写代码却能…

Pwn-栈溢出

原理 基本的栈帧结构(以 x64 的栈为例)(图片摘自Hello-CTF) RBP 为栈底寄存器,RSP 为栈顶寄存器,分别记录了栈帧中记录数据部分的起始和终止地址。函数的临时变量的在内存中的位置都是通过这两个寄存器加减偏移确定的。 栈底分别还记录了上一个栈帧的 RBP 的值,以及函数的…