懂前端的你也可以轻松定义自己业务的DSL
腾讯云 2023-03-13 19:58:56

一个JavaScript版本的bison

jison是一个 JavaScript 编写的解析器生成器,可以用来生成自定义的编程语言解析器。它的令人兴奋的点在于,它允许开发人员使用 JavaScript 语言来定义语法规则,然后将其转换为解析器,从而支持自定义的编程语言。

在前端应用方面,Jison 可以用于实现自定义的模版引擎,例如类似于 Handlebars 或者 Mustache 的模版引擎。通过使用 Jison,开发人员可以定义自己的模版语法规则,然后将其转换为解析器,从而实现对自定义模版语法的支持。


(相关资料图)

此外,Jison 还可以用于实现自定义的 DSL(领域特定语言),例如在前端应用中实现一些特定的业务逻辑,例如表单验证、数据格式化等等。通过使用 Jison,开发人员可以定义自己的 DSL 语法规则,然后将其转换为解析器,从而实现对自定义 DSL 的支持。

jison有很多demo可以供参考,比如 写一个计算器 https://gerhobbelt.github.io/jison/try/

demo

要实现这个计算器,你的代码不再是手写解析算术表达式,手写语法树解析,然后计算结果,而是只用定义规则,剩下的事让机器帮你搞定就好了:

cala.bison

/* description: Parses end executes mathematical expressions. *//* lexical grammar */%lex%%\s+                   /* skip whitespace */[0-9]+("."[0-9]+)?\b  return "NUMBER""*"                   return "*""/"                   return "/""-"                   return "-""+"                   return "+""^"                   return "^""("                   return "("")"                   return ")""PI"                  return "PI""E"                   return "E"<>               return "EOF".                     return "INVALID"/lex/* operator associations and precedence */%left "+" "-"%left "*" "/"%left "^"%left UMINUS%start expressions%% /* language grammar */expressions    : e EOF        {return $1;}    ;e    : e "+" e        {$$ = $1+$3;}    | e "-" e        {$$ = $1-$3;}    | e "*" e        {$$ = $1*$3;}    | e "/" e        {$$ = $1/$3;}    | e "^" e        {$$ = Math.pow($1, $3);}    | "-" e %prec UMINUS        {$$ = -$2;}    | "(" e ")"        {$$ = $2;}    | NUMBER        {$$ = Number(yytext);}    | E        {$$ = Math.E;}    | PI        {$$ = Math.PI;}    ;

要了解jison的强大,就必须了解下DSL,以及它能够高效的解决哪些问题:

DSL(Domain-Specific Language)是一种用于特定领域的编程语言,它是为了解决某些领域特定的问题而设计的。与通用编程语言相比,DSL更加专注于特定领域,因此在该领域内更易于使用和理解。DSL可以通过语法、关键字或标记等方式来描述特定领域内的问题,并提供相应的解决方案。常见的DSL包括配置文件语言、领域特定脚本语言、数据流语言等。DSL的好处在于可以提高编程效率和代码可读性,同时也使得非程序员能够更容易地理解和维护代码。

简单的实现一个DSL的步骤

要完整实现一个DSL,需要以下步骤:

1.定义DSL的语法和语义:DSL语言需要有自己的语法和语义,以便用户能够使用该语言来表达自己的意图。语法定义通常使用BNF或EBNF表示。

2.实现DSL的解析器:DSL解析器是将DSL代码解析为计算机可执行的指令的程序。解析器通常使用词法分析器语法分析器来实现。

3.实现DSL的执行器:DSL执行器是将DSL代码转化为实际的计算机操作的程序。执行器通常使用解释器或编译器实现。

其中词法分析器,语法分析器这些都有非常稳定的工具,比如,如果有定义好的BNF范式,直接丢给 flex 就可以解决词法分析的这个过程,然后在丢给 yacc,就可以按照这个规则编译出可执行程序,也许你会觉得这个非常不可思议,怎么写一堆规则就可以变成可执行程序呢?但实际上,你好好思考下,你写程序部也是在规定一些规则吗?

if/else/while/... ,这部都是在告诉计算机如何理解并执行你的意图吗?OK,立即这些,就看看其中的一些概念,对于新手可能需要科普一下:

BNF或EBNF简单的描述

BNF(巴克斯-诺尔范式)和 EBNF(扩展巴克斯-诺尔范式)是一种用于描述编程语言结构的形式语法。例如,下面是一个使用BNF表示的简单数学表达式:

 ::=  |  "+"  |  "-"  ::=  |  "*"  |  "/"  ::=  | "("  ")"

这个BNF描述了一个数学表达式可以由一个项(term)或一个表达式(expr)加减一个项(term)组成。一个项可以由一个因子(factor)或一个项(term)乘除一个因子(factor)组成。一个因子可以是一个数字(number)或者一个表达式(expr)。

EBNF是BNF的一个扩展,添加了更多的元素来描述更复杂的语言结构。例如,下面是一个使用EBNF描述的简单的JSON对象:

 ::= "{"  {"," } "}" ::=  ":"  ::= """ {} """  ::=  |  |  |  | "true" | "false" | "null" ::= {} ["." {}] ["e" [] {}]

这个EBNF描述了一个JSON对象由大括号包围着若干个属性(property)组成。每个属性包含一个字符串键(string)和一个值(value),用冒号分隔。字符串是由双引号包围的任意字符的序列(char)。值可以是一个字符串,一个数字,一个JSON对象,一个JSON数组,或者true/false/null中的一个。数字是由一个或多个数字(digit)和一个可选的小数点以及一个可选的指数部分组成。

上面这一堆精准定义的规则都是一些上下文无关文法,要准确写出flex可以用的规则,必须对上下文无关文法比较熟悉,比如不能出现左递归、不能出现空规则等等:

上下文无关文法

上下文无关文法(Context-Free Grammar)指的是一种形式文法,其中所有规则的左部只包含一个非终结符号,而右部可以是任意长度的终结符和非终结符序列。上下文无关文法是自然语言处理、编译原理和计算机语言设计等领域中广泛使用的一种形式化表示方法。

要轻松写一个上下文无关文法,可以按照以下步骤进行:

1. 确定终结符号集和非终结符号集。终结符号是指语言中的基本符号,如字母、数字、标点符号等;非终结符号是指可以被分解为其他符号序列的符号,如句子、短语、单词等。2. 编写规则。规则由两部分组成,左部为非终结符号,右部为终结符号和/或非终结符号的序列。例如,一个简单的规则可以写为:S -> aSb,表示S可以被替换为一个"a",后面跟着S,再后面跟着一个"b"。3. 定义起始符号。起始符号是文法中唯一的一个非终结符号,表示整个文法的起点。通常用大写字母来表示起始符号。4. 检查文法的合法性。文法需要满足一些条件,如不能存在左递归、不能出现空规则等。

例如,一个简单的上下文无关文法可以表示一个简单的算术表达式:

1. 终结符号集:数字(0-9)、加号(+)、减号(-)、左括号(()、右括号())

2. 非终结符号集:表达式(E)、项(T)、因子(F)

3. 规则:

E -> E+T | E-T | T   T -> T*F | T/F | F   F -> (E) | num

4. 起始符号:E

这个文法可以生成类似于“3+4*5”的算术表达式。

左递归和空规则

左递归:在一个产生式的右部出现了该产生式本身作为左部的情况,例如:A->Aα(α为任意串)。这种产生式会导致递归调用,容易陷入死循环,因此需要消除左递归。

空规则:也称ε规则,表示产生式右部可以为空,例如:A->ε。如果某个非终结符的所有产生式都是空规则,那么这个非终结符可以被省略,也就没有必要存在了。但是,如果存在空规则,那么在语法分析时需要进行特殊处理,增加算法的复杂度。因此,尽量避免使用空规则。

DSL擅长解决哪些领域的问题

DSL(领域特定语言)擅长解决领域特定问题,即在特定领域中使用的编程语言。以下是一些DSL可以解决的问题的例子:

1. SQL:SQL是一种DSL,用于在关系数据库中查询和操作数据。它是用于数据管理和查询的最常用的DSL之一。2. HTML和CSS:HTML和CSS是用于构建Web页面的DSL。HTML用于定义页面的结构和内容,CSS用于定义页面的外观和样式。3. LaTeX:LaTeX是一种DSL,用于创建高质量的科学文档和出版物。它提供了丰富的排版控制,使得用户可以创建复杂的数学公式,图表和图形。4. R:R是一种DSL,用于数据分析和统计。它提供了许多内置函数和库,可以用于数据可视化,机器学习和预测建模等任务。5. Regex:正则表达式是一种DSL,用于匹配和操作文本。它在许多编程语言中都得到了广泛的应用,可以用于文本搜索,替换和解析。

DSL可以用于在特定领域中更有效地解决问题,提高开发效率和代码质量。

懂前端的你也可以轻松定义自己业务的DSL

2023-03-13 19:58:56

英国文化贸易与投资合作指南_关于英国文化贸易与投资合作指南的简介-动态

2023-03-13 17:40:42

全球今日讯!理想推用户购车价格保护权益,李想曾称不会降价

2023-03-13 15:54:38

内蒙古涉疫医疗器械合格率接近百分之百

2023-03-13 13:13:52

硅谷银行倒闭波及英国 现货白银大幅收涨

2023-03-13 10:48:45

河北肃宁:邵庄中学开展心理健康教育培训为教师解压

2023-03-13 08:39:00

今日热闻!井莉简介_井莉

2023-03-13 04:13:46

淘师湾作业网答案完整版2019_淘师湾作业网高一答案

2023-03-12 22:13:15

国王40胜更衣室疯狂庆祝:官推挺布朗当选最佳教练 五数据联盟前5_世界速读

2023-03-12 18:15:44

各种各样照样子写词语怎么写_各种各样照样子写词语-观天下

2023-03-12 14:46:36

油菜花成乡村振兴“金引擎”

2023-03-12 10:38:20

今日播报!完达山婴儿奶粉怎么样_完达山元乳奶粉怎么样

2023-03-12 06:00:39

全球热推荐:津门虎热身赛拿下国安!根伟不满足……

2023-03-12 00:17:37

中秋诗词有哪些_中秋古诗词有哪些

2023-03-11 19:50:05

大紫荆勋章的艺人_大紫荆勋章

2023-03-11 15:47:40

全球今日报丨airpods无缝切换设备怎么设置_airpods定位怎么用

2023-03-11 12:23:05

鹏华基金与北京银行战略签约共建投教基地

2023-03-11 11:57:02

全球短讯!小时代4结局大火揭秘最后的晚餐_小时代4结局大火揭秘

2023-03-11 08:52:25

天天报道:血型星座

2023-03-11 06:48:07

加索尔:很多国际球员在NBA占主导地位 我想也许我做出了一点贡献|天天观点

2023-03-11 05:59:52

当前热门:怎样做好死缓复核程序

2023-03-11 00:57:42

紫燕百味鸡加盟方式及费用_紫燕百味鸡加盟 当前速读

2023-03-10 21:28:08

百事通!迟子建散文在线阅读_迟子建散文

2023-03-10 20:46:02

全球热门:第二届海南省工艺美术作品展颁奖·捐赠·闭幕仪式圆满举行

2023-03-10 17:58:12

成都青羊区社保缴费标准基数及比例2023年一览表(2022-2023年个人社保缴费标准表) 当前时讯

2023-03-10 16:18:14

游戏王zexal133 焦点短讯

2023-03-10 15:54:59

怎样挑选新鲜草莓

2023-03-10 13:57:52

一年级数学课堂小游戏(一年级课堂小游戏)

2023-03-10 10:58:36

【环球报资讯】蛇简笔画图片_蛇简笔画

2023-03-10 10:13:01

3月10日生意社环己烷基准价为7333.33元/吨

2023-03-10 10:00:08

迈腾s档和d档的区别_s档和d档的区别-焦点播报

2023-03-10 07:01:07

同花顺交易手续费怎么查询_同花顺交易 全球微速讯

2023-03-10 04:26:14

精选!小方框打钩符号复制_小方框

2023-03-10 02:01:39

楚辞简介秒懂百科_楚辞简介_当前动态

2023-03-09 22:03:38

每日消息!伟禄集团(01196)拟携手国有发电企业,于浙江省离岸风力发电厂建设及开发储能设备

2023-03-09 19:24:37

环球热消息:使徒行者最后结局_使徒行者结局什么意思

2023-03-09 18:52:41

金地集团30亿公司债将本息兑付及摘牌 利率5.68%

2023-03-09 17:00:46

“主动”还是“被动”?美股投资策略的艰难抉择

2023-03-09 16:03:05

世界微头条丨小米 13 Pro 评测:不错,但不是你应该买的小米

2023-03-09 13:55:42

水冷空调怎么调制冷_水冷空调

2023-03-09 12:43:32

仅用67天,全国快递业务量突破200亿件|世界百事通

2023-03-09 11:41:03

航运概念开盘拉升,招商轮船涨超5%_环球今亮点

2023-03-09 09:54:17

焦点消息!孙涛的老婆梁丽_孙涛妻子梁利

2023-03-09 07:23:37

托纳利:米兰重回欧冠八强对我意味着很多,对每个人也都很多

2023-03-09 07:00:05

当前热讯:K60至尊版曝光 处理器换上天玑9200

2023-03-09 01:49:33

关注:进错教堂抢对新郎书包网_进错教堂抢对新郎

2023-03-08 21:48:38

地尔硫卓片说明书愈风(地尔硫卓片说明书)

2023-03-08 21:00:16

即时:盐城汽车客运站

2023-03-08 18:59:04

科治好 当前看点

2023-03-08 18:23:51

热资讯!海天瑞声(688787)3月8日主力资金净卖出7174.11万元

2023-03-08 16:04:48

靓妹啥意思是什么

2023-03-08 15:01:17

全球新增确诊病例持续下降,2月欧美经济活动进入扩张区间丨全球疫情与经济观察(2023年3月6日)|全球快讯

2023-03-08 14:20:50

刘雯井柏然秀场合体,甜蜜说笑帮理项链好甜

2023-03-08 11:46:33

黄村 环球焦点

2023-03-08 11:42:34

世界头条:中国动物园协会回应:已派专家在美协助照料丫丫

2023-03-08 10:02:47

美国遗产税|每日时讯

2023-03-08 09:01:01

求生之路2中文版百度网盘_求生之路2中文版

2023-03-08 08:05:09

喷气飞机|天天快资讯

2023-03-08 05:18:46

观焦点:火影忍者结印手势教学_火影忍者结印

2023-03-08 04:03:03

西安市育才中学开展学雷锋系列活动_全球消息

2023-03-07 23:07:04

甜蜜家园讲的什么-环球实时

2023-03-07 21:54:10

年度必入!这份“新势力计划”里藏着音乐人专业成长密码

2023-03-07 20:15:22

知否昌哥儿结局-全球今亮点

2023-03-07 18:28:37

到了夏天手上长小水泡还痒怎么回事_夏天手上长小水泡痒是怎么回事|速看

2023-03-07 17:53:46

天天热点!印度垃圾山起火影响数十万人 有毒烟雾让人感到窒息

2023-03-07 15:50:06

教师的责任

2023-03-07 15:19:49

世界通讯!怎么看螃蟹是死是活?

2023-03-07 13:59:03

天天微头条丨bestv

2023-03-07 12:07:21

宿松县人武部役前教育第一课:学习雷锋好榜样 观察

2023-03-07 11:23:52

code 82 是什么故障码_code 82|天天即时看

2023-03-07 09:50:04

世界关注:金马玉堂

2023-03-07 08:51:21

值得入手的9个大牌底妆,虽然很贵,但值得!没有平替

2023-03-07 07:01:46

鸣人的爸爸是谁 环球关注

2023-03-07 05:41:43

天天看点:皮凉鞋发黄怎么清洗变白_白凉鞋发黄怎么清洗

2023-03-07 01:50:28

Vision 357概念车旨在庆祝保时捷成立75周年|世界信息

2023-03-06 21:47:33

横扫千星-天天微动态

2023-03-06 22:04:11

天天新消息丨充值卡充值话费不到账_充值卡充值话费

2023-03-06 19:02:55

成都万科金色领域 要闻

2023-03-06 18:52:49

西安矩浪音乐节4月2日演出有哪些人

2023-03-06 17:02:16

每日速读!如何在ps中添加文字

2023-03-06 15:37:52

频谱仪的作用与功能_频谱仪的作用 全球速讯

2023-03-06 15:13:18

野村:重申微博(WB.US)中性评级 目标价升至21美元

2023-03-06 13:01:02

文化建设的内涵和意义_文化建设的内容包括 全球快看

2023-03-06 12:21:50

焦点快报!windows7系统下载_windows系统常见的密码问题

2023-03-06 11:06:14

erp解决方案_最新资讯

2023-03-06 09:30:18

天天快报!为什么我们看到的胖子越来越多,只是因为吃得太饱吗?

2023-03-06 09:07:42

行脚的委托

2023-03-06 05:42:35

每日报道:qq音乐官网_qq音乐和网易云音乐哪个好

2023-03-06 05:01:40

百度收录自动推送api接口最新修复版 天天观速讯

2023-03-05 23:08:04

世界热资讯!八年级下册数学知识点总结人教版_八年级下册数学知识点总结人教版

2023-03-05 21:42:44

天天观天下!美国纽约出现抗议活动 民众呼吁解除对叙利亚制裁

2023-03-05 19:52:47

建行网上银-全球速递

2023-03-05 18:34:33

四川成都自助游三天攻略,成都三日游最佳线路安排,超实用干货-焦点要闻

2023-03-05 16:04:00

求各种穿越洪荒类小说越多越好-全球速讯

2023-03-05 15:40:14

每日速讯:安全免费健康随行北欧豪华中型轿车沃尔沃全新S60正式开启预售

2023-03-05 13:00:43

漏液是什么意思

2023-03-05 12:29:16

青海民族大学是几本排名_青海民族大学是几本|全球快播

2023-03-05 09:31:10

调整英语地位应与经济和社会发展相适应,同步发展,而不是现在抱着老办法一直不变

2023-03-05 09:14:09

天天简讯:酯怎么读粤语_酯怎么读

2023-03-04 23:45:55

热消息:乳杆菌和乳酸杆菌一样吗_乳杆菌

2023-03-04 17:51:26