当前动态:懂前端的你也可以轻松定义自己业务的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可以用于在特定领域中更有效地解决问题,提高开发效率和代码质量。
标签:
推荐
- 当前动态:懂前端的你也可以轻松定义自己业务的DSL
- 祖国祖国我爱你儿歌歌词_歌曲 祖国祖国我爱你 的歌词
- 什么什么什么引成语大全集_什么什么什么引成语
- 胡晓光_关于胡晓光介绍 热头条
- 【世界新视野】腾景科技:2022年实现营业收入约3.44亿元,同比增长13.74%
- 翔鹭钨业(002842)3月17日主力资金净卖出15.08万元_天天看热讯
- 原油暴跌扭转调价预期!成品油或迎年内“第二跌”-世界独家
- 大同交警精准破获肇事逃逸案
- 好利科技3月17日盘中涨幅达5%
- 稳增长 促发展 强信心丨我省出台跨境电商专项政策 13条措施激发外贸增长新动能
- 伏秒特性作用_伏秒特性
- Scotto:湖人和里夫斯均有意续约 最多能签下一份4年5000万合同 天天速递
- 天禄科技: 关于投资设立子公司的公告 每日讯息
- 2023农夫演唱会佛山站演出地点在哪里? 全球速讯
- 公安部部署依法严厉打击制售假劣农资犯罪
- 【天天热闻】2023年兰溪市乡村马拉松报名官网入口+报名规则
- 港股异动 | 赣锋锂业(01772)再跌超4% 近七周累跌近40% 碳酸锂价格跌至34万元/吨
- 世界观热点:智云股份3月16日快速反弹
- 国二改国三是什么意思_国三是什么意思|当前动态
- 肋软骨炎 疼痛部位_肋软骨炎疼痛的位置|每日快讯
- 每日热门:中国平安拟续聘安永华明及安永香港
- 【全球速看料】江苏女官员日记内容_女官员肥白紧窄
- “差评”算侵权吗?全国消费维权十大典型司法案例发布
- 长航凤凰(000520)3月15日主力资金净卖出178.47万元
- 泰康增额终身寿险的优点和缺点,告诉你泰康增额终身寿险值得买吗?
- 全球热推荐:大爆冷!世界第四1:3被淘汰,直板名将双线出局,提前结束大满贯
- 亚洲资产延迟刊发2022年度业绩 继续停牌-当前独家
- 玫瑰糠疹是牛皮癣吗_玫瑰糠疹是梅毒吗
- 啾咪是什么梗_啾咪 环球速读
- 汤爹:哈登的后撤步三分改变了NBA 张伯伦和奥尼尔也是
- 禾信仪器: 独立董事关于第三届董事会第十一次会议相关事项的独立意见-天天微速讯
- 祝贺!中国科学家刷新纪录 环球通讯
- 快看点丨鲁泰A:近期推出无忧防护系列面料 抗菌类广谱高效
- 小丝巾扣的系法图解-小丝巾的系法图解 环球焦点
- 预算员招聘_预算员|每日速讯
- 中国石油:3月13日融资买入1.58亿元,融资融券余额23.37亿元
- 天天快播:满品网_关于满品网介绍
- 乐享云南丨美食·麻栗坡“军民鱼水情”
- 汉仪股份:拟1600万元认购赛博爱思11.94%的股权
- 0 80070035找不到网络路径_错误代码0x80070035找不到网络路径
- 世界热讯:同方股份成被执行人
- 停航半年 嘉峪关机场将进行飞行区工程施工_天天观察
- 知名安全公司Acronis被攻击 黑客:他们技术渣 只是羞辱一下
- 环球时讯:三星gts3930c_三星gts3930c
- TTG碾压LGD,诠释猴子为何上不了KPL!打野教学,RW系真出野王
- 湖南开设首家糖尿病逆转专科门诊
- 头条:胃癌淋巴转移能活多久_胃癌低分化腺癌转移淋巴能活多久
- 《无限超越班》收官:实力演员韩雪粤语献唱《漫步人生路》
- 山海经鲲鹏展翅_山海经鲲鹏原文出处
- 随着重大风险暴露,掉期定价美联储年底前将会降息1次
- 深天马A董秘回复:截止2023年2月28日,公司股东户数为85,379户(含信用账户)
- ps仿制图章工具怎么使用_ps仿制图章工具使用教程_天天报资讯
- 君子慎独不欺暗室_君子慎独
- 天天快看:时装杂志
- 【环球速看料】武汉动物园将提前开园!大熊猫要来了
- 大同市里有什么好玩好吃的_大同市里有什么好玩的地方
- 世界即时:艾薇儿贴吧_艾薇儿吧
- 发动机怠速不稳的故障原因及排除方法是什么 _柴暖启动不了怎么回事_世界今亮点
- 情人与枕头与星期四
- 韩国自研超音速战斗机KF21首次夜间试飞成功-快看点
- 饭后有5件长寿事,能坚持一个月,也很不错!
- 电脑内存条在哪个位置怎么拿出来_电脑内存条在哪个位置
- 港铁:检讨票价机制料年中完成,通关后客流恢复疫前九成
- how are you going? 是什么意思_how are
- 看明白当下,才能有所谓的后疫情时代 焦点日报
- vivo隔空投送怎么定位_vivo手机隔空投送定位 世界播资讯
- 当前滚动:国外展台设计策划服务费用(国外展台设计特点)
- 天天最资讯丨房子抵押贷款利息怎么算?借款人额度是多少?
- 前引号能放在开头第一个格吗_前引号
- 沥青混凝土摊铺机型号_沥青摊铺机型号 全球微头条
- cfevo3黑金传说怎么样_黑金传奇3 145仿光通
- 秦时明月之雪落星坠_秦时明月之星雪琉璃_全球播资讯
- 30秒|让农贸市场既有“烟火气”又有“文明范” 成都开展农(集)贸市场整治提升工作督导_视点
- 【环球速看料】港股异动 | 高伟电子(01415)升7% 机构指激光雷达业务有望构成公司第二增长曲线
- 世界信息:058期刘飞排列三预测奖号:百十个位杀号
- 世界新动态:房子户型图大全网站_房子户型图大全
- 香港传媒股早盘再度拉升
- 世界动态:基于Android 11的Realme UI 2.0将与Narzo 20系列一同发布
- 北京恐龙博物馆在哪里_恐龙博物馆在哪里 焦点播报
- 苏宁零钱宝无法转出_苏宁零钱宝
- 宁德时代宜春枧下窝选矿厂基建完工时间存疑,已较原计划延期-焦点快看
- 在微信上怎么删除小程序
- 只会聊天?松下首款家用机器人来了:5月发售,3000元! 视焦点讯
- 竹里馆
- 国企与国运
- 最新资讯:兰州市二手车交易市场_兰州二手车交易市场
- 雨水是什么季节 雨水属于哪个季节的节气-焦点讯息
- 关于暑假生活的英语手抄报内容文字_关于暑假生活的英语手抄报内容
- 今日聚焦!周克希
- 每日快播:融资客看好6股 买入占成交超三成
- 环球速讯:至强cpu和普通cpu的区别_至强cpu和酷睿的区别
- 雷神笔记本售后服务点_雷神笔记本售后服务
- 世界观焦点:戈登:我能投篮能组织 可以在很多不同的方面帮助这支球队
- 杭州龙井茶
- 男男小黄车高速车藤蔓_男男车文|全球短讯
- 大熊猫福菀被游客泼水后委屈躲在角落惹全网心疼,基地回应:考虑黑名单等措施
- 全球观天下!蛇吞象是什么成语
- 上海医药与康方药业签订新药联用开发合作协议 增强公司肿瘤领域竞争力
- 梦幻西游109天地号配置 当前滚动
- 23东莞银行CD032今日发布发行公告
X 关闭
行业规章
X 关闭