一个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
jison是一个JavaScript编写的解析器生成器,可以用来生成自定义的编程语言解析器。它的令人兴奋的点在于,它允许开发人员使用JavaScript
-
与网课相伴的日子作文_作文 与 相伴的日子
1、与“鬼”相伴的日子我曾经有过一段与“鬼”相伴的日子。2、先说那鼎鼎大名的“胆小鬼”吧,它已陪伴我多年了。3、我到四年
-
Football-Oranje:利物浦和曼联都对...-全球球精选
Football-Oranje:利物浦和曼联都对安德莱赫特的20岁门将巴特-费布鲁亨感兴趣,由于荷兰队门将位置的伤病原因,这名年轻门将周五入选了科曼3月
-
城隍爷和阎王谁大谁小_城隍爷和阎王谁大
1、城隍爷是冥界的地方官,职权相当于阳界的市长。2、阎王是管理阴间的神,掌管着十八层地狱,是冥界的总裁,是城隍爷的上级。
-
记者:刘军帅、宋文杰、钟晋宝等加盟在即,青岛海牛引援基本完成
根据青岛早报记者“咖啡烟325”的消息,刘军帅以及宋文杰即将加盟青岛海牛,球队的引援已经基本完成。继官宣许东、马兴煜两名内援后,青岛...
-
焦点日报:andy怎么读_andy
1、andy(韩国神话成员andy)一般指李先镐。2、李先镐(이선호 AndyLee),艺名Andy,韩国歌手、制
-
法国人18世纪才开始吃土豆,全因为一名军方药剂师
土豆,可能是现在世界上最受欢迎的蔬菜之一。仅仅是在法国,每年每人就要吃掉约27公斤的土豆。但谁又能想到,土豆曾经走过一条曲折的上餐桌之
-
【全球新要闻】the king is always lucky翻译(the king is always lucky)
1、这是网络流行语开英语的玩笑笑一笑而已:四大天王:Thekingisalwayslucky——王老吉;Thekingiskeptjust
-
绵白糖和白砂糖哪个好_冰糖和白砂糖的区别
1、白糖和冰糖在外观上都是坚硬的晶体。2、我们先来了解一下白糖是怎么做的。3、白糖如果加入一定比例的水融化,会通过生产过程重结晶。4、此
-
林肯飞行家参数报价_林肯飞行家参数
1、林肯飞行家(国产),目前销售的都是2020款,还没有2021款的参数数据,预计今年7月,2021款的车型才会上市。2
-
山映斜阳天接水_儿童眠落叶鸟雀噪斜阳的意思 世界播报
1、小孩子欢快地躺在落叶堆里玩耍(或:在厚厚的落叶堆里酣然入睡),夕阳西下,一群群鸟雀在稻田上空飞翔,喳喳喳地叫得正
-
游戏显示器可改善您的WiFi信号 焦点
有线互联网为PC游戏玩家提供最快、最可靠的连接。但有些游戏玩家受困于Wi-Fi。这就是华擎PG34WQ15R3A
-
2023年蜜月旅行市场规模分析:蜜月旅行发展成重点开发市场
疫情开放旅游市场有所恢复,蜜月旅行市场成旅游行业主力市场。当前在适婚人口规模增大、婚庆消费观念改变、婚庆消费能力提升以及
-
天天热资讯!芝商所下调原油合约保证金
芝商所(CME)下调WTI原油期货4月合约保证金至6000美元 手合约,之前为6600美元,同时下调5-12月到期原油期货合约保证金,幅度为200-600美元。
-
Mysteel调研:新车降价潮短期内对汽车供应链影响较小
前言:7月1日我国正式实施国六B标准,全国整车库存处在高位,促使地方和车企联手购车补贴进行库存清理。3月6日,一则“最高补贴9万元,湖北出
-
保济丸说明书阅读理解_保济丸说明书
1、保济丸具有解表,祛湿,和中的功效,对于夏季湿热引起的发热头痛、腹痛腹泻、恶心呕吐、肠胃不适等症状有一定改善作用。2、
-
【环球新视野】小学三年级单位换算_小学三年级单位换算题100道
1、1厘米+19毫米=()厘米()毫米2分米-18厘米=()厘米=()毫米14厘米+26厘米=()分米600米
-
紫光国微:近几年,特种装备规模不断增长,国产化率持续提高,同时信息化水平也在提升,带动整体行业快速发展,公司经营业绩也实现了高速增长
同花顺金融研究中心3月16日讯,有投资者向紫光国微提问,特种集成电路是国家核心战略资源,装备信息化、国产化建设驱动行业加速发展。我国现处
-
五十音app_起音美可图片
1、“手拿麦克风,充满朝气的女孩”……不过其实是个暴力女。2、公认的大姐,虽无确切年龄设定,但比KAITO要年长,不折不
-
世界报道:今日葫芦丝音不准怎么办
1、由于簧片在冷却状态下,簧舌根部的振动会很呆板,甚至振动不起来,客观上造成可振动簧舍的长度变短,故振动频率升高,筒音也
-
百度李彦宏:到2030年,人工智能可以将知识工作者的生产力提高4倍以上
今日(3月16日)下午,文心一言发布会在百度科技园举行。据百度创始人李彦宏介绍,自2月份百度官宣“文心一言”以来,已有超过650家企业宣布...
-
海口一出租屋凌晨起火,10余辆电动车被烧毁,2人不幸身亡
昨日有海口市民向记者反映3月14日3时40分许海口龙华区城西镇头铺村一栋出租屋发生火灾导致2人不幸身亡10余辆电动车被烧毁经消防部门初步调查系
-
焦点热门:金针菇的做法家庭菜的做法_金针菇的做法
1、一、茄汁金针菇用料:金针菇500克、番茄酱20克、青辣椒10克、红辣椒10克、盐4克、糖3克、鸡精2克、食用油10克做法:1 将金针菇清洗干净,
-
我的世界实体303怎么召唤无指令视频_我的世界实体303怎么召唤
1、先用红色和黑色的方块组成十字架并将其点燃。2、再用红,棕,黑三种方块和岩浆,火焰组成一个祭坛。3、在面板上输入ENT
-
晨起第1杯水很讲究!这4种常见的水,只有一种适合早上喝|世界实时
“一日之计在于晨。”健康的早晨是美好一天的开始。而想要健康,那就一定离不开早上的第一杯水。当人体经过了一夜之间的休息,早晨补充水分...
-
欧足联正在调查国米球迷被拒绝进入球场,数千名球迷无法入场|焦点滚动
欧足联正在调查国米球迷被拒绝进入球场,数千名球迷无法入场,欧冠,国米,欧足联,波尔图,国际米兰,巨龙球场
-
唐僧与女国王经典对白_求回家的诱惑中的经典对白 世界短讯
1、1 品如:忽视了作为女人的我、侮辱了作为妻子的我、又杀了作为妈妈的我、将我的人生连根拔起。2、你真的好残忍!2 品
-
天天报道:【风口解读】啥情况?天永智能股东一年多来持续减持,又抛不超1%减持计划
3月15日晚间,天永智能(603895 SH)发布公告,股东陈丽红计划自公告之日起十五个交易日后的六个月内以集中竞价方式减持所持公司股份,减持数量
-
当前资讯!华如科技:公司暂未与中国卫通有业务往来
每经AI快讯,有投资者在投资者互动平台提问:请问贵司是中国卫通核心供应商吗?公司在天基互联、卫星通信等领域是否已签订实质订单?华如科技(
-
微醺之美:Denis的葡萄酒赏味笔记-天天报道
1、《微醺之美Denis的葡萄酒赏味笔记》是2012年龙门书局出版的图书。2、作者是林殿理。本文到此分享完毕,希望对