ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

prism4cj语法继承进阶:extendGrammar、insertBeforeToken与TokenFilter三大技巧全解析

prism4cj语法继承进阶:extendGrammar、insertBeforeToken与TokenFilter三大技巧全解析 prism4cj语法继承进阶extendGrammar、insertBeforeToken与TokenFilter三大技巧全解析【免费下载链接】prism4cj一个轻量的语法高亮库项目地址: https://gitcode.com/Cangjie-TPC/prism4cjprism4cj 是一个用仓颉语言实现的轻量级语法高亮库内置 26 种语言的高亮规则。当你想为项目添加新语言支持时不需要从零写规则——通过语法继承只需几行代码就能站在巨人肩膀上。本文带你完整解析三大进阶技巧extendGrammar 继承覆盖、insertBeforeToken 精准插入、TokenFilter 过滤继承帮你快速定制属于自己的语法高亮方案。为什么需要语法继承prism4cj 的高亮规则由Grammar语法对象组成每个 Grammar 包含一组Token标记如keyword、string、comment。仔细观察 src/languages/ 目录下的语言文件你会发现一个规律C、C#、Dart、Go、Groovy、Java、JavaScript、Kotlin、仓颉语言全都继承自clikeC 类语言通用规则Cpp 继承cRust 再继承cppScala 继承javaMarkdown 继承markup这种基类语法 → 派生语法的设计避免了大量重复规则子语言只写自己特有的部分其余能力注释、函数名、基础符号等自动继承。技巧一extendGrammar 继承并覆盖同名标记 一句话理解克隆父语法替换你关心的部分extendGrammar定义在语法工具类中见 grammar_utils.cj。它的工作方式克隆父 Grammar 的全部 Token通过 cloner.cj 深拷贝不影响父语法用你传入的 Token 列表覆盖同名标记——比如父语法的keyword换成你自己的 C 关键词正则名字对不上的 Token 原样保留以仓颉语言为例prism_cangjie.cj 继承 clike 后只覆盖了keyword、number、string、operator等少数标记comment之外的通用能力全部白拿。关键认知extendGrammar 是全量克隆 定点替换父语法完全不受影响你可以放心大胆地改。技巧二insertBeforeToken 在指定位置精准插入 ✨为什么要插入而不是覆盖有些新标记在父语法里根本不存在。比如 C 语言没有booleantrue/false标记Cpp 需要新增它。此时不能靠覆盖而是告诉 prism4cj请把新标记插到某个已有标记的前面。insertBeforeToken实现见 grammar_utils.cj核心签名GrammarUtils.insertBeforeToken(grammar, 目标标记名, 新Token列表)prism_cpp.cj 是教科书级用法连续三次插入插入位置新增标记作用function之前boolean高亮 true/falsekeyword之前class-name高亮 class 后的类名string之前raw-string高亮 C11 原始字符串顺序即优先级高亮引擎按标记顺序逐个匹配先匹配到的吃掉这段文本。把raw-string插在string前面原始字符串就不会被普通字符串规则抢先截胡——这是 prism 系高亮库最核心的技巧之一。⚠️ 注意insertBeforeToken是就地修改传入的 Grammar与 extendGrammar 的克隆后返回新对象不同操作对象时别搞混。技巧三TokenFilter 过滤式继承 有些标记继承过来反而碍事clike 基类里有class-name和Bool等标记但 C 语言根本没有类的概念这些规则留在 C 的语法里只会产生误高亮。解决方案就是TokenFilter接口定义在 grammar_utils.cj——它只有一个test方法返回true保留该标记返回false丢弃。C 语言的实现非常直白见 prism_c.cj返回 class-name ! name Bool ! name也就是说除了class-name和Bool其他标记统统继承。使用方式是调用带 filter 的四参版extendGrammar源码位置Go、Kotlin 等语言同样采用了这一招。选型口诀只想换规则 → 三参版extendGrammar要删掉不合适的标记 → 四参版 TokenFilter三大技巧组合拳Cpp 的完整实战 把三个技巧串起来看 prism_cpp.cj这就是一个完整的新语言接入流程GrammarUtils.require(prism, c)拿到父语法extendGrammar克隆 c 语法覆盖 C 专属的keyword、operator正则三次insertBeforeToken补上boolean、class-name、raw-string返回新 Grammar注册后即被 grammar_locator.cj 装载可用全程不到 50 行代码却拥有了 c clike 两层基类的全部高亮能力。新手避坑清单 ⚠️改正则先测边界覆盖keyword时建议保留\b(?:...)\b形式避免if误伤ifconfig插入位置决定胜负越特殊的标记越要插得越靠前raw-string 在 string 前filter 返回逻辑别写反test返回true是保留不是过滤掉嵌套路径慎用insertBeforeToken支持a/b形式定位 inside 嵌套标记实现细节但一个 Token 有多个 pattern 时只能定位到第一个带 inside 语法的 pattern更多接口细节可查阅 doc/feature_api.md核心类源码在 src/prism/prism.cj、src/prism/grammar.cj 和 src/prism/token.cj。总结 技巧适用场景一句话记忆extendGrammar继承父语言、替换规则克隆 覆盖insertBeforeToken父语法没有的新标记插得越前优先级越高TokenFilter剔除不合适的继承标记按需瘦身掌握这三大技巧你就能像仓库中的 Cpp、Cangjie、Kotlin 一样用几十行代码为 prism4cj 添加一种全新语言的高亮支持。上手最快的方式打开 src/languages/ 挑一个你熟悉的语言文件读一读再照着 test/LLT/ 下的测试用例写几个自己的进阶之路就此打通。【免费下载链接】prism4cj一个轻量的语法高亮库项目地址: https://gitcode.com/Cangjie-TPC/prism4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表