世界实时:懂前端的你也可以轻松定义自己业务的DSL
一个JavaScript版本的bison
jison是一个 JavaScript 编写的解析器生成器,可以用来生成自定义的编程语言解析器。它的令人兴奋的点在于,它允许开发人员使用 JavaScript 语言来定义语法规则,然后将其转换为解析器,从而支持自定义的编程语言。
在前端应用方面,Jison 可以用于实现自定义的模版引擎,例如类似于 Handlebars 或者 Mustache 的模版引擎。通过使用 Jison,开发人员可以定义自己的模版语法规则,然后将其转换为解析器,从而实现对自定义模版语法的支持。
此外,Jison 还可以用于实现自定义的 DSL(领域特定语言),例如在前端应用中实现一些特定的业务逻辑,例如表单验证、数据格式化等等。通过使用 Jison,开发人员可以定义自己的 DSL 语法规则,然后将其转换为解析器,从而实现对自定义 DSL 的支持。
(资料图片仅供参考)
jison有很多demo可以供参考,比如 写一个计算器 https://gerhobbelt.github.io/jison/try/
要实现这个计算器,你的代码不再是手写解析算术表达式,手写语法树解析,然后计算结果,而是只用定义规则,剩下的事让机器帮你搞定就好了:
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对象:
这个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可以用于在特定领域中更有效地解决问题,提高开发效率和代码质量。
关键词:
相关阅读
-
03-17
-
03-17
推荐阅读
-
世界实时:懂前端的你也可以轻松定义自己业务的DSL
jison是一个JavaScript编写的解析器生成器,可以用来生成自定义的编程语言解析器。它的令人兴奋的点在于,它允许开发人员使用JavaScript更多
2023-03-17 17:16:50
-
C罗决定搬豪车,3辆不够开!总价2亿送沙特,卖房
C罗决定搬豪车,3辆不够开!总价2亿送沙特,卖房不再回英国更多
2023-03-17 15:39:38
-
世界今头条!一次吃一整个柚子会胖吗_晚上吃柚子
1、病情分析:晚上吃柚子不会胖,因为柚子是一种低热量的水果,含有丰富的营养物质、维生素、果酸以及能促进脂肪燃烧的化合物。更多
2023-03-17 13:15:16
-
全球实时:法拉利为 2024 Roma Spider 带回软顶
法拉利拆除了漂亮的Roma轿跑车的车顶,打造了2024RomaSpider,它是PortofinoM的继更多
2023-03-17 10:44:14
-
美颜相机怎么把图片抠出来?怎么在一甜相机里抠图
美颜相机怎么把图片抠出来?1、打开一甜相机,点击漫画脸2、点击魔法抠图3、点击立即试试4、选择一张照片5、点击你喜欢的背景即可更换。怎么更多
2023-03-17 09:46:22
-
如何根据无人机相机分辨率算出能拍摄到的最大清晰
如何根据无人机相机分辨率算出能拍摄到的最大清晰面积?拍摄的高度和实际拍摄的面积都是一样的呢拍摄的区域是固定的,升高高度只是代表拍摄更多
2023-03-17 09:43:31
-
单反相机怎么增加曝光?单反的各种曝光模式怎么用
单反相机怎么增加曝光?首先ISO值要调:低ISO值画质好,但是快门速度低,最好有脚架;高ISO快门速度高,便于手持,但ISO过高会有明显噪点。其更多
2023-03-17 09:41:09
-
单反相机如何拍淘宝照片大小?做淘宝用什么相机最
单反相机如何拍淘宝照片大小?对于拍摄淘宝图片而言,不一定需要购买非常昂贵的镜头。一般来说,单反相机搭配18-55mm的镜头就已经足够满足拍更多
2023-03-17 09:32:48
时尚热图
热门标签
世界实时:懂前端的你...
C罗决定搬豪车,3辆不...
世界今头条!一次吃一...
全球实时:法拉利为 ...
美颜相机怎么把图片抠...
如何根据无人机相机分...
单反相机怎么增加曝光...
单反相机如何拍淘宝照...
佳能600d相机有回放功...
mate20和mate30有什么...
《原神》2.2版本大更...
LOL:他们几个很强,...
LOL手游值得练习的6个...
王者荣耀:孙行者上架...
雅典娜18888金币英雄...
《英雄联盟手游》正式...
《堡垒之夜》被苹果拉...
mazon Games宣布他们...
PowerA主题手柄:续航...
银行股终于有了起色 ...
-
今日必看
-
精彩话题
-
资讯播报
- 世界实时:懂前端的你也可以轻松定义自己业务的DSL
- 世界速讯:亮道智能与德国电信达成战略合作
- 俄罗斯工贸部长:俄罗斯可能接管丰田圣彼得堡工厂
- 世界微头条丨中信科移动助力乌海能源5G智能化矿井建设
- 诺记轮胎2.85亿欧元出售俄罗斯业务
- 环球快资讯:广汽集团推购车补贴政策,消费者有机会免费得粤A蓝牌
- 快讯:C6卖完后,神龙其他产品卖得动吗?
- C罗决定搬豪车,3辆不够开!总价2亿送沙特,卖房不再回英国
- 萝卜快跑获批在京开展全无人自动驾驶服务,亦庄单车订单量超网约车
- 即时看!传比亚迪旗下品牌将从今年起独立运营
- 宣布裁员94%,又一家新能源车企面临破产?
- 实时焦点:配大尺寸双联屏 别克全新君越内饰谍照曝光
- 环球观察:2022年国家新型数据中心典型案例名单:中国移动独占9个
- 世界今头条!一次吃一整个柚子会胖吗_晚上吃柚子会胖吗
- 今日热搜:Rivian首席工程师重返迈凯伦
- 今日热文:又一黑科技?比亚迪注册“云辇”商标
- 【世界报资讯】政企联合打“价格战”,今年产量格局变?
- 世界今热点:巅峰之上 再造巅峰,汉唐双旗舰冠军版全新上市,售价20.98~29.98万元
- 总投资12.5亿元,天瞳威视落户天津市东丽经开区
- Meta Materials专利:新型隔板可防止锂电池起火
- 天天日报丨福特因制动故障在全球召回逾130万辆汽车
- 宝理公司开发环保型长纤维素纤维增强树脂 适合汽车应用
- 越南市场取代俄罗斯,斯柯达预计2023年产销将增长
- 中国联通国际公司启动全球ICT供应商第二批公开招募
- 微动态丨沃尔沃客车将重组欧洲业务,1600个工作岗位面临冲击
- 全球实时:法拉利为 2024 Roma Spider 带回软顶
- 助力智能电动汽车研究,哪吒汽车与经纬恒润签约
- 美颜相机怎么把图片抠出来?怎么在一甜相机里抠图?
- 如何根据无人机相机分辨率算出能拍摄到的最大清晰面积?短视频拍摄需要知道哪些问题?
- 单反相机怎么增加曝光?单反的各种曝光模式怎么用?
- u-blox与GMV达成合作 为汽车应用提供安全定位解决方案
- 单反相机如何拍淘宝照片大小?做淘宝用什么相机最好?
- 佳能600d相机有回放功能吗?佳能相机的视频拍摄技巧是什么?
- mate20和mate30有什么不同?华为mate20和mate30买哪个好?
- od岗位是什么意思?华为oa岗位值得去吗?
- 华为手机怎么查看密码?华为用户邮箱在哪里找?
- 华为P40手机如何开启儿童模式?华为p40怎么打开学生模式?
- 手机摄影学习心得体会?如何学习摄影?
- 最新快讯!FCC 出台新规,要求美国无线运营商屏蔽诈骗短信
- 为什么微信拍照会保存到图片库?手机自动保存图片是为什么?
- 焦点播报:河西走廊为何令人魂牵梦绕?答案在叶舟的小说里
- 尼康的相机怎么设置自拍?尼康d5100自拍怎么调?
- dv可以加广角或长距离镜头吗?dv摄像机有什么使用技巧?
- 怎样拍vlog?vlog是什么意思?
- 小鹏P5在深圳开放城市NGP功能
- 每日热闻!1月美国豪华车销量出炉!特斯拉注册量超奔驰和雷克萨斯之和,蝉联第一
- 极氪X动力信息曝光 续航最高560km 售价将高于20万
- 笔记本电脑无法连接佳能相机?佳能数码相机无法跟电脑联机怎么解决?
- 相机怎么开机?一般数码相机开机方式有几种?
- 国轩高科美国电池厂获美国1.75亿美元拨款 出海落子更进一步
- 怎么设置相机延时拍照功能呢?相机设置小技巧是什么?
- 水印相机怎么连拍?水印相机怎么把四张照片合成一张?
- 富士x100s如何Eye-Fi传输?富士gfx100S如何进行无线传输?
- 环球热资讯!2月畅销车型榜:星享V夺冠,江豚暴增15倍,多细分车型TOP3占比超7成
- iqooz3怎样设置照片大小?手机人像模式怎么放大?
- 工信部将于3月20日开通无线电干扰投诉受理热线12381
- 美政府要求字节跳动出售TikTok股份,外交部回应
- 可返还差价 起亚推出全系车型限时保价政策
- 定位高端旗舰轿跑车 广汽埃安Hyper GT将于4月开启预售
- 或将带来全新品牌计划 凯迪拉克V系列20周年庆祝活动最新消息
- 每日时讯!马斯克“背后的人”曝光,特斯拉用意何在?
- 每日热点:狂跌超40%,碳酸锂从“抢”到“让”只用了三个月
- 讯息:富士康抢走歌尔AirPods订单?“果链”分移或需5-10年
- 今日精选:深圳高速(ADR)(SHZNY.US)3月16日收盘报48.12美元/股
- 环球头条:全球首台小型智能机器人移动CT在四川成都亮相
- 短讯!全系标配10大核心高阶配置,汉唐双旗舰冠军版正式上市,售价20.98~29.98万元
- 现代申请天窗设计专利 乘员可按需控制车内亮度及阴凉区域
- 当前热点-McLaren Applied推出新型Halo 300 5G智能边缘天线 为移动车辆应用带来下一代连接
- 全球通讯!格雷甘山酒在什么位置(格雷甘山酒在)
- 当前速读:基于T0.5 模式,拓普与蔚来签署战略合作
- 环球视讯!天际汽车或将完成7.5亿元融资,用于员工薪资补发和推动工厂复产
- 世界信息:国足传奇范志毅骄傲发声:我踢日本队几乎没输过!真实情况:6战4负
- 观热点:一个月内,夏珩卸任多个小鹏关联公司职位
- 世界快资讯丨亮道智能与德国电信达成战略合作
- 每日资讯:电池回收企业杰成新能源完成数亿元B轮融资
- 今日聚焦!均普智能BMS测试技术获专利,将上车宝马电动车
- 环球滚动:马自达CX-50下线 小定开启:199元享受多项权益
- 快看:奔驰EQG量产原型车谍照曝光 还是经典造型
- 报名开启 | 下一代汽车新供应链投融资路演之智能座舱领域·发现好公司系列
- 【天天播资讯】特斯拉全球软件工程副总裁:软件研发开启Plaid模式
- 今日视点:中国移动荣获2023年信息社会世界峰会 (WSIS)最高项目奖
- 当前焦点!山东:2025年建成公共领域充换电站8000座
- 兴业银行打造“反诈重器” 守牢人民群众“钱袋子”
- 天天信息:李想回顾造车史,踩过的坑和押过的注
- 文心一言来了,百度股价跌了
- 数据智能演化路径:从数据底座到数据生态
- 每日快看:讴歌TLX Type S特别版官图发布 限量50台
- 底价16655.35万元:四川省联通通信有限公司100%股权转让
- 起亚推出90天购车价格保护权益
- 今日热门!外观够霸气 福特撼路者Raptor假想图曝光
- 环球即时看!中消协:消费者期望尽量安装快充充电桩、充电桩安装难题待解
- 前沿热点:炫酷的机甲风,能吸引到大众消费者吗?
- 速讯:长安宣布将在逸达车型上搭载“文心一言”
- 环球热议:山东鲁班工程咨询集团有限公司
- 首发启航,上汽宁德基地墨西哥自营航线开通
- 【速看料】东风加速新能源平台建设,S2-E平台首台CTC样车下线
- 【天天聚看点】遥望科技:乔司商城目前还在加紧建设中 待验收完成后开始试营业
- 每日速讯:印尼镍矿生产商Harita Nickel计划IPO,筹资6.47亿美元
- 全球头条:新技术可观察充电电池3D内部结构
- 【世界报资讯】成立仅一年!蔚来旗下保险公司被注销