前言
在前端技术发展的现在,关于语言语法解析的需求日益增加。而在语法解析的过程中,我们除了可以自己手写解析器之外,还可以使用现成的 npm 包,其中包括了 nearley-there 。
本篇文章将介绍如何使用 nearley-there,包括其安装、使用方式和示例代码。读完本文,你将深入了解 nearley-there 的使用方式,并能够应用到自己的项目中去。
安装
首先,我们需要安装 nearley-there 以便在项目中使用它。可以使用 npm 进行安装,命令如下:
npm install --save nearley-there
安装完成之后,我们就可以在项目中使用 nearley-there 了。
使用方式
nearley-there 的主要作用是解析文本,转换为 JavaScript 对象。使用 nearley-there,我们需要先定义一个 grammar(文法),然后用这个 grammar 创建一个 nearley 实例。这个实例可以接收文本,然后进行解析并转换成对象。
定义 grammar
先看一个例子,定义以下简单的 grammar 文件,文件名为 example.ne
。
@{% const letters = /[a-zA-Z]/; %} start -> word* word -> letters+ {% d => d[0] %} | WS {% d => null %} WS -> /[ \n]/
这个文件定义了一个文法,用于将一个或多个单词转换为一个数组。其中,我们使用了 "%" 符号来指示 nearley-there 在解析这个文件时应该将内容视为 JavaScript 代码。
文法文件需要包含以下内容:
- 定义规则的标签,例如
start
和word
; - 规则的定义,定义规则的语法为:“规则名 -> 规则列表”,例如
start -> word*
表示start
规则以零个或多个word
规则开头; - 规则的列表,列表中可以使用正则表达式或者文法的标签,例如
letters+
表示一个或多个字母。
在上面的例子中,"{% %}
" 中的 JavaScript 代码可以进行任何类型的编程操作。
需要注意的是,在列表中可以使用 JavaScript 函数来进行更为复杂的逻辑处理。在上例中,我们定义了一个 d => null
的函数,它将在解析过程中将空格和换行符转换为 null 值。
使用 nearley-there
有了上面的 grammar 文件,我们便可以使用 nearley-there 进行解析。首先,我们需要使用 nearley-parse 工具将 grammar 文件解析为 JavaScript 代码:
npx nearleyc example.ne
这条命令将生成一个 JavaScript 文件,文件名为 example.js
,我们需要在项目中引入它:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------- - ------------------------ ----- ------ - --- ------------------------------------------------------ ----- ----- - ------- -------- ------------------- ------------------------------- -- ------------ --------
在上面的代码中,我们首先引入了 nearley 包,以及使用 nearley-parse 编译后的 example.js
文件。然后,我们创建了一个 nearley 实例 parser
,并将 example
加载到这个实例中。接着,我们使用 feed
方法将文本输入到这个实例中,最后得到解析结果。
需要注意的是,在使用 nearley-there 进行解析时,输出的结果很可能是一个数组。在规则中定义的文本,解析出来的结果可能是一个字符串或一个数组。在调用时需要根据情况对结果进行进一步处理。
示例代码
下面我们来看一个更为具体的例子,使用 nearley-there 实现一个四则运算的计算器。
首先,我们定义一个 calc
的词法定义,名为 calc.ne
:
-- -------------------- ---- ------- --- ----- ------ - -------- ----- ---- - ------ ----- ----- - ------ ----- ----- - ------ ----- ------ - ------- -- ----- -- - ------ - ---------- -- - -- ---- -- --------- -- ---- - ------ -- ------ -- - ------ - --- ------ ----- -------- ------ ------- - - -- --------- -- ----- - ------ -- ------ -- - ------ - --- ------ ----- -------- ------ ------- - - -- --------- -- ----- - ------ -- ------ -- - ------ - --- ------ ----- -------- ------ ------- - - -- --------- -- ------ - ------ -- ------ -- - ------ - --- ------ ----- -------- ------ ------- - - -- ------ -- ------- -- - -- -------------------- -- - -- -- ----- ---- -- --- ----- -- --- ----- -- --- ------ -- ---
这个词法文件定义了以下规则:
operation
规则定义了四个基本运算加
、减
、乘
、除
;number
规则定义了数字类型;start
规则定义了一个初始的数字;- 运算符由
_
、+
、-
、*
、/
组成。
其中,%{ %} 中的代码表示 JavaScript 片段。
下面是实现计算器的 JavaScript 代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------- - --------------------- ----- ----- - ------------ ----- ------ - --- ------------------------------------------------------ ------------------- ----- ---- - ------------------ -------- ----------- - -- ------------------ - ------ - --- ----- ----- --------------- ------ -------------- -- - ---- - ------ -- - - -------- ----------- - -- ------- - --- --------- - ------ -- - ------ ------ - ---- ------ ------ ---------------- - ------------------ ---- ------ ------ ---------------- - ------------------ ---- ------ ------ ---------------- - ------------------ ---- ------ ------ ---------------- - ------------------ - - ------------------ ----- --------------------------
在这个代码中,我们首先将输入的字符串传入 nearley 实例进行解析,得到解析树。然后,我们定义了一个 traverse
函数,用于将解析树转为计算器所需要的树形结构。该函数在解析树中进行递归查找,如果遇到数组就将其转换为可进行计算的树形结构。
接着,我们定义了一个 evalNode
函数,用于计算树形结构。在这个函数中,根据操作符分别计算 left
和 right
参数的结果,并将结果作为函数返回值。
最后,我们通过传入 traverse 转换后的树形结构,调用 evalNode 计算出结果,并将其输出。
结论
本文主要介绍了 npm 包 nearley-there
的使用方式,包括了安装方法、规则定义和示例代码。这个 npm 包能够帮助我们将文本转换为 JavaScript 对象,在进行语法解析的过程中发挥重要作用。
在实际应用中,我们可以使用一个定义好的 grammar 文件对文本进行解析和转换。需要注意的是,转换后得到的结果很可能是一个数组,需要根据规则进行进一步的处理。希望在近期的开发工作中使用 nearley-there 的同学能够从本文中获得一些有用的知识点,加强技术水平,提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055e3081e8991b448dbadf