简介
在前端开发中,有时需要使用到语法解析和转换等相关工具。其中,@gerhobbelt/json2jison 是一个基于 JSON 形式描述的词法和语法分析器生成器,可以帮助开发者快速生成自己需要的词法和语法分析器。
使用方法
安装
在安装该 npm 包之前,需要保证已经安装了 Node.js。然后,通过以下命令进行安装:
--- ------- ---------- ----------------------
使用
安装完成后,可以在项目中使用该工具。具体使用方法如下:
- 编写 JSON 文件
在项目目录下,新建一个文件夹,例如 grammar
,在其中新建一个 JSON 文件,例如 my_language.json
,并按照下面的格式编辑内容:
- ------ - -------- - ------------- ------- ---------------- ---------- ------- ----------- - -- ------------ - -------- ---- ----- -------- ---- ---- -- ------ - ------------- - ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ --- ---------- --- ------- ------ -------------- ------- ---------- ---------- ------- ------------------- - - -
其中 lex
对象用于定义词法作用域,rules
数组表示匹配规则,规则是由两个字符串组成的数组。第一个字符串表示正则表达式,第二个字符串表示解析出的词法单元。
operators
数组用于定义语法作用域,表示运算符及其优先级。
bnf
对象用于定义语法规则,其中定义了 expression
和 IDENTIFIER
、NUMBER
三种非终结符的产生式。
- 生成词法和语法分析器
在 my_language.json
文件所在目录下,执行以下命令:
---------------------------- ---------------- -- --------------
则会自动生成一个 my_language.js
文件,其中包含生成的词法和语法分析器。
- 使用生成的词法和语法分析器
在项目中引入 my_language.js
文件,通过以下方式使用生成的词法和语法分析器:
----- ------- - --------------------------------- ----- ------ - --- ----------------- ----- ------ - --------------- - - - -- - ----- -------------------- -- --
深度剖析
词法分析器
在编写代码的过程中,需要将代码转化成计算机可以识别的语言。因此,我们需要先将代码转化成一系列的词法单元。
词法分析器负责将源代码转换为一系列的词法单元,例如标识符、关键字、运算符等等。其中,识别词法单元所使用的规则是正则表达式。
@gerhobbelt/json2jison 中使用了 lex-parser 这个库来实现词法分析器。其中,lex
对象用于定义词法作用域及其规则。
例如,上面的例子中,我们定义了两个规则:
- ------ - -------- - ------------- ------- ---------------- ---------- ------- ----------- - - -
当传入 myVar
这个单词时,会被识别为标识符 IDENTIFIER
,当传入 123
这个数字时,会被识别为数字 NUMBER
。
语法分析器
词法分析器识别出了一系列的词法单元后,语法分析器则将它们转化为一系列的语法结构,并建立起它们之间的关系,以便进行进一步的分析和处理。
在 @gerhobbelt/json2jison 中,语法部分采用了类似 BNF 的方式来描述语言的规则。其中,使用了 jison 这个库来实现语法分析器。
例如,上面的例子中,我们定义了语法规则:
- ------ - ------------- - ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ ------------ - ------------ ------- -- - ------ --- ---------- --- ------- ------ -------------- ------- ---------- ---------- ------- ------------------- - - -
其中 expression
表示一个非终结符,包含了多个产生式。每个产生式表示了该非终结符可以被转换成的内容,它们使用了类似 JavaScript 的语法来描述。
当传入 1 + 2 * (3 - 4)
这个表达式时,会被识别为:
----------- ---------- - ----------- ----------- ------ --- ----------- ---------- - ----------- ----------- --- ---------- ---- ----------- ------ --- ----------- ---------- - ----------- ----------- ------ --- ----------- ------ ---
然后,根据定义的产生式,依次对这个表达式进行转换,最终得到 -1
。
总结
@gerhobbelt/json2jison 是一个非常实用的工具,可以帮助开发者快速生成自己需要的词法和语法分析器。掌握该工具使用方法,可以在一定程度上提高开发效率,同时可以更好地理解编程语言的词法和语法规则。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/60056cda81e8991b448e686e