news 2026/9/25 1:59:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
prism4cj如何添加一门新语言支持:从正则模式到完整语法对象的实战教程

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

【免费下载链接】prism4cj一个轻量的语法高亮库项目地址: https://gitcode.com/Cangjie-TPC/prism4cj

本文面向新手,带你用 prism4cj 这个轻量级语法高亮库,亲手完成一门新语言支持的完整流程:从编写正则模式(Pattern)、组合 Token 标记,到构建完整的语法对象(Grammar)并注册到语法加载器,最终通过测试用例验证高亮效果。

先认识 prism4cj 的三层构件

prism4cj 的语法高亮遵循"语言查询 → 代码解析 → 渲染输出"的流水线,整个架构分为核心层与语言包两层,非常清晰:

添加一门新语言,本质上就是搭好三个构件,它们自底向上层层组合:

构件作用核心源码
Pattern 模式描述"长什么样的代码片段",由正则表达式驱动src/prism/pattern.cj
Token 标记给一类片段起个名字(如 keyword、number),可挂多个模式src/prism/token.cj
Grammar 语法对象用"语言名 + 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", ArrayList<Token>([...]))

组合完成后,高亮器就能把代码切分为"文本 + 标记"两类节点。下图中类名、注解、关键字等不同片段被分别识别标记,正是 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,做三处小改动:

  1. obtainGrammar的 match 分支中加一行:case "mylang" => grammar = PrismMylang.create(prism)
  2. languages()集合中set.add("mylang")
  3. (可选)在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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 1:59:39

2026芯片IP选型实战手册:避坑指南与决策树

/* 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:39

ESP32-C5双频Wi-Fi 6模块实战指南

/* 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:16

H10G-13融合网关刷安卓9教程:S905L3芯片变身电视盒子

/* 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:58:52

从零搭建QPSK收发链路:AD9361初始化与GNU Radio同步调试实战

/* 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:57:58

Aliens Eye输出6大格式:JSON、CSV、HTML到PDF与图谱报告的速查清单

Aliens Eye输出6大格式&#xff1a;JSON、CSV、HTML到PDF与图谱报告的速查清单 【免费下载链接】Aliens_eye Hunt down 840 social media accounts using AI 项目地址: https://gitcode.com/gh_mirrors/al/Aliens_eye Aliens Eye 是一款 AI 驱动的 OSINT 用户名扫描工具…

作者头像 李华