恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
一份文法,9种语言输出:syntax多语言插件生态实战指南
首页
资讯中心
/
一份文法,9种语言输出:syntax多语言插件生态实战指南
一份文法,9种语言输出:syntax多语言插件生态实战指南
发布时间:2026/8/23 11:25:12
一份文法9种语言输出syntax多语言插件生态实战指南【免费下载链接】syntaxSyntactic analysis toolkit, language-agnostic parser generator.项目地址: https://gitcode.com/gh_mirrors/sy/syntaxsyntax是一款语言无关的语法分析工具包与解析器生成器parser generator。它内置 LR 和 LL 两套解析算法只需编写一份文法就能为 JavaScript、Python、PHP、Ruby、C、C#、Rust、Java、Julia 共9 种语言生成可直接使用的解析器代码是构建 DSL、配置语言、表达式引擎时的实用选择。为什么需要多语言解析器生成器手写词法分析器和语法解析器既费时又容易出错而传统工具如 Yacc/Bison通常只输出 C 代码。syntax 的思路是文法只写一遍解析表计算一次代码生成可以面向任意目标语言。文法支持JSON-like 记法和Yacc/Bison 记法两种风格解析模式覆盖 LR(0)、SLR(1)、LALR(1)、CLR(1) 与 LL(1)内置词法生成器支持宏、起始条件词法器状态机、大小写不敏感匹配支持优先级与结合性声明%left、%right、%nonassoc自动解决移位-归约冲突安装与快速上手3 条命令跑通 首先全局安装 CLI 工具npm 包名为syntax-clinpm install -g syntax-cli以 Python 目标为例直接生成一个计算器解析器syntax-cli -g examples/calc.py.g -m lalr1 -o calcparser.py在 Python 中即可调用 import calcparser calcparser.parse(2 2 * 2) 6关键点目标语言由输出文件扩展名决定-o calcparser.py中的.py文法内容本身无需为任何语言做任何改动。9 种语言插件一览同一文法不同产出 项目内置 JavaScript默认 8 个语言插件示例文法都放在 examples/ 目录下目标语言示例文法输出示例插件源码位置JavaScript默认examples/calc.example.g.js模块内置于核心模板Pythonexamples/calc.py.gcalcparser.pysrc/plugins/python/PHPexamples/calc.php.gCalcParser.phpsrc/plugins/php/Rubyexamples/calc.rb.gCalcParser.rbsrc/plugins/ruby/Cexamples/calc.cpp.gCalcParser.hsrc/plugins/cpp/C#examples/calc.cs.gCalcParser.cssrc/plugins/csharp/Rustexamples/calc.rs.glib.rssrc/plugins/rust/Javaexamples/calc.java.gCalcParser.javasrc/plugins/java/Juliaexamples/calc.jl.gSyntaxParser.jlsrc/plugins/julia/各语言生成器还内置了对应的 AST 生成示例例如 Rust 的examples/calc-ast.rs.g递归 AST 结构和 Java 的examples/calc-ast-java.bnf方便你从求值平滑过渡到构建语法树。插件架构解析表计算与代码生成为何能解耦 syntax 的核心设计是分层语法解析层把文法解析成统一的 AST其 BNF 文法见examples/bnf.bnf词法部分由src/grammar/lex-grammar.js等模块处理解析表计算层LR 算法在src/lr/目录如src/lr/canonical-collection.js计算规范 LR 项目集族LL 算法在src/ll/目录与目标语言完全无关代码生成层插件每个语言插件只做一件事——消费解析表吐出目标语言代码。以src/plugins/example/这个示例插件为模板一个完整插件包含plugins/ └── your-language/ ├── ll/ll-parser-generator-your-language.js ├── lr/lr-parser-generator-your-language.js ├── your-language-parser-generator-trait.js └── templates/ ├── ll.template.ext ├── lr.template.ext └── tokenizer.template.exttemplates把模板代码移植到目标语言LR 模板、LL 模板、词法器模板trait特征写死目标语言特性的代码生成逻辑如词法规则处理函数、解析表的目标语言序列化generator按 LR/LL 两种解析模式组装生成流程。完整的插件开发指南见src/plugins/README.mdRust 和 Java 插件还有各自的独立文档src/plugins/rust/README.md、src/plugins/java/README.md。各语言插件使用要点速查 ⚡Python / PHP / Ruby动态语言组用法高度一致-o指定扩展名即可PHP 与 Ruby 的类名跟随输出文件名钩子函数如on_parse_begin、on_parse_end可参考examples/module-include.py.g、examples/module-include.php.g、examples/module-include.rb.g。C / C# / Java编译型语言组C 生成单头文件CalcParser.h直接 include 使用C# 生成CalcParser.cs后实例化类调用parse()Java 默认生成到com/syntax包路径如com/syntax/CalcParser.java解析异常通过ParseException抛出。Rust强类型组唯一需要额外书写的是闭包类型标注。因为 Rust 是静态类型语言语义动作中参与运算的参数需显式声明类型例如Expr Expr { |$1: i32, $3: i32| - i32; $$ $1 $3 }生成的 Rust 解析器依赖onig与lazy_static两个 crate测试工程可直接参考src/__tests__/rust-calc/。Julia科学计算组生成的解析器依赖DataStructures.jl包官方建议复杂文法优先使用 JSON-like 记法定义词法以避免 JS → Julia 之间的转义序列问题见examples/letter.jl.bnf。如何为 syntax 新增一门语言插件5 步教程 ️建目录按src/plugins/example/的结构创建src/plugins/your-language/移植模板将 example 插件的三个模板翻译成目标语言模板内注释详尽基本可 1:1 对照实现生成器移植lr/目录下的生成器并实现 trait 文件中的语言专属代码生成注册构建把新插件加入构建脚本的PLUGINS数组和bin/syntax中_genericLR的GENERATORS对象跑通测试把examples/calc.example.g移植到目标语言并执行生成命令验证2 2 * 2 6即可提交 PR。常见问题 FAQ ❓Q解析模式选哪个优先使用--mode lalr1这是自动解析器的事实标准LL(1) 目前只做语法校验。Q遇到 shift-reduce 冲突怎么办用优先级与结合性声明解决例如给、*声明%left也可先用--validate选项查看冲突报告与修复建议示例见examples/calculator-assoc-conflict.g与examples/calculator-assoc.g的对比。Q词法部分可以只取 token 列表吗可以--lex指定词法文件加--tokenize即可输出带行列信息的 token 流无需完整生成解析器。小结一份文法多端复用 ✅syntax 用解析表计算 可插拔代码生成的架构把一份 BNF 文法放大为 9 种语言的生产级解析器。无论你要做表达式引擎、领域特定语言还是跨语言项目的统一语法定义都值得把它装进工具箱安装syntax-cli挑一个examples/下的文法改起来十分钟就能跑通第一个多语言解析器。【免费下载链接】syntaxSyntactic analysis toolkit, language-agnostic parser generator.项目地址: https://gitcode.com/gh_mirrors/sy/syntax创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考