另外一个也是 js 写的 ,叫做 jison 。这两个工具都是用来解析 DSL 的,你可以根据自己的需求选择合适的工具。好的,下面我就来一个实际的案例了。 这里就以 jison 为例,来编写 DSL 的语法规则。jison 是一个 JavaScript 的解析器生成器,它可以从类似 BNF 的语法描述中生成一个解析器。 以下是一个基于你提供的 DSL 示例的简化的 jison 语法规则:/* Lexical rules */%lex%%\s+ /* skip whitespace * }"in" { return 'IN'; }">=" { return 'GE'; } // 这里匹配采取的是贪婪匹配,可以参考 jison 这个文件可以通过 jison 的命令行工具来编译成一个 JavaScript 文件,然后你可以在你的代码中使用这个文件来解析你的 DSL。那么解析后的结果是什么呢?
在前端应用方面,Jison 可以用于实现自定义的模版引擎,例如类似于 Handlebars 或者 Mustache 的模版引擎。 通过使用 Jison,开发人员可以定义自己的模版语法规则,然后将其转换为解析器,从而实现对自定义模版语法的支持。 此外,Jison 还可以用于实现自定义的 DSL(领域特定语言),例如在前端应用中实现一些特定的业务逻辑,例如表单验证、数据格式化等等。 通过使用 Jison,开发人员可以定义自己的 DSL 语法规则,然后将其转换为解析器,从而实现对自定义 DSL 的支持。 jison有很多demo可以供参考,比如 写一个计算器 https://gerhobbelt.github.io/jison/try/图片要实现这个计算器,你的代码不再是手写解析算术表达式,手写语法树解析
详见:【解决方案】jison解决JS处理后台返回的Long型数据精度丢失
我们知道,在 C 的领域,有 flex / bison(大学期间编译原理使用的 lex / yacc 的升级版),由于我们的系统是 nodejs 构建的,直接用有诸多不便,所以我们选用了 jison — 用 jison 描述 BNF(严格说,是 EBNF)很容易,定义好 lex 后,就可以定义 grammar 了。关于这个主题,我之前写过文章,见:如何愉快地写个小parser。在这里就不详述了。 jison 会把 EBNF 编译成 javascript 文件,然后我们包装一个简单的接口(主要考虑易用性),就可以让系统的其他部分调用了。它的效率很高,很好地支撑起了我们的服务。 time policy check 100000 21.12 µs/op 写了两个测试例和线上的环境对比一下,500 个 policy,在完全没 cache 的情况下,nodejs 的基于 JISON
好吧,接下来我们讲讲jison。我想你应该猜到了,这货是javascript bison,bison在javascript上的变态。先来个解析SQL里的 create table 的例子。 嗯,实现这个只需要写一个jison的语法文件(和flex/bison相似),然后用jison编译即可: ? (仅包含了语法分析部分,略过了词法分析) ? (在nodejs下运行) ? 用javascript/jison做parser有什么好处呢? 如果你想定义一门语言生成javascript(我不建议你干这个),可以参考coffeescript,它 也使用了jison。 接下来我们讲一下另一个神器 antlr4。
Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
需要注意的是,当收到jison为{"L":1}时,我们需要做闪烁效果,模拟左转向效果。因此,需要(高-低-高-低……)每隔0.5s转换。当收到关灯{"L":0}时,直接低电平关闭即可。
Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
AI项目体验地址 https://loveai.tech 6、把打标后的jison文件转换为对应的五个文件。其中的代码文件是:labelme_json_to_dataset.py,使用的代码是: ?
以我几次、有限的创建 DSL 的经历来说,诸如:stepping,我觉得外部 DSL 并不容易实现——虽然已经有了 Flex 和 Bison(在 JavaScript 世界里,有一个名为 Jison 的实现 如我之前设计用于 DDD 的 stepping 看上去就像是一个配置文件,而我是使用 Jison 写了自己的语法分析: domain: 库存子域 aggregate: 库存 event: 库存已增加 event
Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
tasks Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
noSQL的特点:1.快,响应很快;2.缓存出来,用户操作的响应就很快,可能一个响应多2ms看起来不多,但是如果是200个操作呢,这样时间累计起来就很多了;MongoDB:json进jison出,面向对象的形式
我们用 nodejs 和 jison 开发了一个 rule parser(关于如何用 jison,见我的文章 如何愉快地写个小parser),性能不错,但没有特别本质的飞跃,所以我们另辟蹊跷,研发了一个
寻找语法解析器及现成语法 市面上已经有一系列现成的词法解析器、语法解析器: JavaCC Lex 和 Yacc Flex 和 Bison Jison (for JavaScript) Parsec Antlr
Critical tasks Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
tasks Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
tasks Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison
Mermaid 使用 Jison 作为解析器,然后将其转换为不同的图模型,如流、时序等,再使用 graphlib、dargre 进行布局,最后使用 dagre-d3、d3 进行渲染。
答案是有的,例如 C 语言有 Bison 框架,JS 上选择就更多了,你可以选择 Jison、parsimmon、PEG.js 、Nearley 等,本文则基于使用人数较多的 Nearley 框架。