ARTICLE DETAIL

资讯详情

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

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

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),仅供参考
返回列表