首页/新闻资讯/正文详情

prism4cj如何添加一门新语言支持:从正则模式到完整语法对象的实战教程

发布时间:2026/9/25 1:59:43 来源:云帆数科 栏目:资讯中心
prism4cj如何添加一门新语言支持:从正则模式到完整语法对象的实战教程
prism4cj如何添加一门新语言支持从正则模式到完整语法对象的实战教程【免费下载链接】prism4cj一个轻量的语法高亮库项目地址: https://gitcode.com/Cangjie-TPC/prism4cj本文面向新手带你用 prism4cj 这个轻量级语法高亮库亲手完成一门新语言支持的完整流程从编写正则模式Pattern、组合 Token 标记到构建完整的语法对象Grammar并注册到语法加载器最终通过测试用例验证高亮效果。先认识 prism4cj 的三层构件prism4cj 的语法高亮遵循语言查询 → 代码解析 → 渲染输出的流水线整个架构分为核心层与语言包两层非常清晰添加一门新语言本质上就是搭好三个构件它们自底向上层层组合构件作用核心源码Pattern 模式描述长什么样的代码片段由正则表达式驱动src/prism/pattern.cjToken 标记给一类片段起个名字如 keyword、number可挂多个模式src/prism/token.cjGrammar 语法对象用语言名 Token 集合打包一门语言的完整规则src/prism/grammar.cj 记住这条公式正则 → Pattern → Token → Grammar → 注册加载器后文每一步都对应公式中的一环。第1步写出第一条正则模式高亮的最小单元是Prism.pattern它把一个正则包装成模式对象。以 src/languages/prism_brainfuck.cj 为参考你的新语言只需要为关键词、数字、字符串、注释这几类片段各写一条正则即可Prism.token(keyword, Prism.pattern(Regex(\\b(?:if|else|while)\\b))) Prism.token(number, Prism.pattern(Regex(\\b\\d\\.?\\d*\\b))) Prism.token(comment, Prism.pattern(Regex(//[^\\n]*)))pattern最多支持 5 个参数新手建议先只传第一个其余按需开启参数说明regex正则对象核心lookbehind是否允许后行断言影响匹配起点greedy是否贪婪匹配alias别名让片段复用其他类型的样式inside嵌套语法对片段内部的片段再高亮第2步组合 Token生成完整语法对象把若干 Token 放进ArrayList连同语言名一起交给GrammarImpl一门语言的高亮规则就成型了let mylang GrammarImpl(mylang, ArrayListToken([...]))组合完成后高亮器就能把代码切分为文本 标记两类节点。下图中类名、注解、关键字等不同片段被分别识别标记正是 Token 名称起作用的结果 建议Token 命名沿用库内既有习惯keyword、string、comment、number、operator这样默认样式即可生效无需额外配置。第3步复用父类语法偷懒但正确地省工作量如果新语言与已有语言同族例如 C 之于 C、Dart 之于 Clike 风格不要从零写起。prism4cj 提供了语法继承三件套src/languages/prism_c.cj 是绝佳范例GrammarUtils.require(prism, clike)取回父语法GrammarUtils.extendGrammar(...)覆盖/追加本语言的 Token并用过滤器剔除不需要的GrammarUtils.insertBeforeToken(...)在指定 Token 前插入新规则如 C 的 macro 宏定义这三类工具的完整签名见 doc/feature_api.md照着 test/LLT/testC.cj 就能快速上手。第4步把新语言注册到语法加载器规则写好后最后一步是让它可被按名查询。打开 src/grammar_locator_grammar_utils.cj做三处小改动obtainGrammar的 match 分支中加一行case mylang grammar PrismMylang.create(prism)languages()集合中set.add(mylang)可选在realLanguageName中为新语言配置别名例如js javascript这类映射✅ 注意本库默认预创建全部已支持语法因此测试时请求的语言名必须与注册名一一对应否则会得到None。第5步编写测试用例验证高亮效果复制一份现成用例作为骨架是最快的方式推荐参考 test/LLT/testBrainfuck.cj它演示了读用例文件 → 按名取语法 → tokenize → 断言的完整流程公共工具集中在 test/LLT/testUtils.cj。行为级用例则放在 HLT 目录按功能一个文件如 test/HLT/function/languages/brainfuck/all_feature.test。编译执行步骤cjpm build及cjc命令参数说明详见 README.md 的执行用例一节。常见问题速查grammar 返回 None检查第4步注册是否完整match 分支、languages() 集合、语言名拼写三者都要对上。高亮范围不准优先调整正则需要断言边界时再考虑 lookbehind需要嵌套高亮时才使用 inside。想查某个类的完整接口直接看 doc/feature_api.md所有 Pattern/Token/Grammar/Visitor 接口都有注释。小结与参考路径添加新语言支持 正则模式 Token 组合 语法对象 加载器注册 测试验证五步走完即可上线一门语言。核心文件速查语言规则示例src/languages/prism_brainfuck.cj、src/languages/prism_c.cj核心类实现src/prism/pattern.cj、src/prism/token.cj、src/prism/grammar.cj加载器注册src/grammar_locator_grammar_utils.cj接口文档doc/feature_api.md测试骨架test/LLT/testBrainfuck.cj构建配置cjpm.toml【免费下载链接】prism4cj一个轻量的语法高亮库项目地址: https://gitcode.com/Cangjie-TPC/prism4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Senparc.Weixin SDK 库与组件全景指南:微信全平台 .NET 包体系架构解析
Senparc.Weixin SDK 库与组件全景指南:微信全平台 .NET 包体系架构解析

后端即时通讯金融科技 【免费下载链接】WeiXinMPSDK 微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 … · 2026/9/25 1:59:43

ChatGPT易编程 VSCode 插件配 TaoToken:settings.json 骨架与报错排查
ChatGPT易编程 VSCode 插件配 TaoToken:settings.json 骨架与报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:59:43

HTML5多图片上传预览核心实现与内存优化:从FileReader到ObjectURL
HTML5多图片上传预览核心实现与内存优化:从FileReader到ObjectURL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:59:43

提示词实测:剩菜太多不知道吃什么,让 AI 直接决定今晚菜单
提示词实测:剩菜太多不知道吃什么,让 AI 直接决定今晚菜单

冰箱里剩下一堆食材、又不想专门买菜时,晚上吃什么最头疼。我实测了一组提示词,把人数、食材、口味和时间限制一次性告诉 AI,让它直接决定菜单,而不是列一堆菜让我自己选。提示词的关键要求 提示词要求 AI 优先使用现有食材、根据… · 2026/9/25 22:05:10

Python接口自动化测试之UnitTest详解
Python接口自动化测试之UnitTest详解

基本概念这个单元测试框架是受到了JUnit这种测试工具的启发。它和其他编程语言里面那些主流的单元测试框架长得很像。在风格上, 这些框架都彼此相似。这个框架支持做自动化测试工作。它还能够帮助配置共享的东西。它也支持测试关机时的代码逻辑。另外, 它能够把很多测试样板聚集… · 2026/9/25 22:05:03

ArcMap拓扑实战:从空间数据质量管控到业务规则落地
ArcMap拓扑实战:从空间数据质量管控到业务规则落地

1. 这不是“画图软件里的花架子”:ArcMap拓扑到底在解决什么真问题?很多人第一次点开ArcMap的“拓扑”菜单时,心里想的是:“不就是让线头对齐、面不重叠吗?我手动修修不就行了?”——这话放在十年前做乡镇土… · 2026/9/25 22:04:50

如何快速调优 MindSpeed LLM FSDP2 后端:Profiling 定位性能瓶颈实战指南
如何快速调优 MindSpeed LLM FSDP2 后端:Profiling 定位性能瓶颈实战指南

如何快速调优 MindSpeed LLM FSDP2 后端:Profiling 定位性能瓶颈实战指南 【免费下载链接】MindSpeed-LLM 昇腾LLM分布式训练框架 项目地址: https://gitcode.com/Ascend/MindSpeed-LLM 在昇腾 NPU 上使用 MindSpeed LLM 的 FSDP2 后端做分布式训练时&#x… · 2026/9/25 22:04:50

Agent技能系统设计实战:从函数调用到可复用能力单元
Agent技能系统设计实战:从函数调用到可复用能力单元

前几天和一个做AI应用的朋友聊天,他吐槽说现在接大模型接口写Agent,最头疼的不是模型能力不够,而是把“让模型干活”这件事做得可靠。他团队里十几个Agent,每个都挂了一堆函数,有的叫get_weather,有的叫fet… · 2026/9/25 22:04:50

社区医疗系统源码部署与二次开发全攻略:跑通门诊、药房、收费闭环
社区医疗系统源码部署与二次开发全攻略:跑通门诊、药房、收费闭环

简介:这是一份面向Java开发学习者的社区医疗系统完整项目源码,适用于计算机、数学、电子信息等专业的学生作为课程设计、期末大作业或毕业设计的参考实现。项目基于常见JavaWeb技术栈,包含业务逻辑、页面展示与数据库脚本,可帮助使… · 2026/9/25 22:04:37

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码