npm 包 nearley-there 使用教程

阅读时长 8 分钟读完

前言

在前端技术发展的现在,关于语言语法解析的需求日益增加。而在语法解析的过程中,我们除了可以自己手写解析器之外,还可以使用现成的 npm 包,其中包括了 nearley-there

本篇文章将介绍如何使用 nearley-there,包括其安装、使用方式和示例代码。读完本文,你将深入了解 nearley-there 的使用方式,并能够应用到自己的项目中去。

安装

首先,我们需要安装 nearley-there 以便在项目中使用它。可以使用 npm 进行安装,命令如下:

安装完成之后,我们就可以在项目中使用 nearley-there 了。

使用方式

nearley-there 的主要作用是解析文本,转换为 JavaScript 对象。使用 nearley-there,我们需要先定义一个 grammar(文法),然后用这个 grammar 创建一个 nearley 实例。这个实例可以接收文本,然后进行解析并转换成对象。

定义 grammar

先看一个例子,定义以下简单的 grammar 文件,文件名为 example.ne

这个文件定义了一个文法,用于将一个或多个单词转换为一个数组。其中,我们使用了 "%" 符号来指示 nearley-there 在解析这个文件时应该将内容视为 JavaScript 代码。

文法文件需要包含以下内容:

  1. 定义规则的标签,例如 startword
  2. 规则的定义,定义规则的语法为:“规则名 -> 规则列表”,例如 start -> word* 表示 start 规则以零个或多个 word 规则开头;
  3. 规则的列表,列表中可以使用正则表达式或者文法的标签,例如 letters+ 表示一个或多个字母。

在上面的例子中,"{% %}" 中的 JavaScript 代码可以进行任何类型的编程操作。

需要注意的是,在列表中可以使用 JavaScript 函数来进行更为复杂的逻辑处理。在上例中,我们定义了一个 d => null 的函数,它将在解析过程中将空格和换行符转换为 null 值。

使用 nearley-there

有了上面的 grammar 文件,我们便可以使用 nearley-there 进行解析。首先,我们需要使用 nearley-parse 工具将 grammar 文件解析为 JavaScript 代码:

这条命令将生成一个 JavaScript 文件,文件名为 example.js,我们需要在项目中引入它:

-- -------------------- ---- -------
----- ------- - -------------------
----- ------- - ------------------------

----- ------ - --- ------------------------------------------------------

----- ----- - ------- --------

-------------------
------------------------------- -- ------------ --------

在上面的代码中,我们首先引入了 nearley 包,以及使用 nearley-parse 编译后的 example.js 文件。然后,我们创建了一个 nearley 实例 parser,并将 example 加载到这个实例中。接着,我们使用 feed 方法将文本输入到这个实例中,最后得到解析结果。

需要注意的是,在使用 nearley-there 进行解析时,输出的结果很可能是一个数组。在规则中定义的文本,解析出来的结果可能是一个字符串或一个数组。在调用时需要根据情况对结果进行进一步处理。

示例代码

下面我们来看一个更为具体的例子,使用 nearley-there 实现一个四则运算的计算器。

首先,我们定义一个 calc 的词法定义,名为 calc.ne

-- -------------------- ---- -------
---
  ----- ------ - --------
  ----- ---- - ------
  ----- ----- - ------
  ----- ----- - ------
  ----- ------ - -------
--

----- -- - ------ - ---------- -- - -- ---- --

--------- -- ---- - ------ --
  ------ -- -
    ------ - --- ------ ----- -------- ------ ------- -
  -
--
--------- -- ----- - ------ --
  ------ -- -
    ------ - --- ------ ----- -------- ------ ------- -
  -
--
--------- -- ----- - ------ --
  ------ -- -
    ------ - --- ------ ----- -------- ------ ------- -
  -
--
--------- -- ------ - ------ --
  ------ -- -
    ------ - --- ------ ----- -------- ------ ------- -
  -
--

------ -- ------- -- - -- -------------------- --

- -- -- -----
---- -- ---
----- -- ---
----- -- ---
------ -- ---

这个词法文件定义了以下规则:

  1. operation 规则定义了四个基本运算
  2. number 规则定义了数字类型;
  3. start 规则定义了一个初始的数字;
  4. 运算符由 _+-*/ 组成。

其中,%{ %} 中的代码表示 JavaScript 片段。

下面是实现计算器的 JavaScript 代码:

-- -------------------- ---- -------
----- ------- - -------------------
----- ------- - ---------------------

----- ----- - ------------
----- ------ - --- ------------------------------------------------------

-------------------

----- ---- - ------------------

-------- ----------- -
  -- ------------------ -
    ------ - --- ----- ----- --------------- ------ -------------- --
  - ---- -
    ------ --
  -
-

-------- ----------- -
  -- ------- - --- --------- -
    ------ --
  -
  ------ ------ -
    ---- ------
      ------ ---------------- - ------------------
    ---- ------
      ------ ---------------- - ------------------
    ---- ------
      ------ ---------------- - ------------------
    ---- ------
      ------ ---------------- - ------------------
  -
-

------------------ ----- --------------------------

在这个代码中,我们首先将输入的字符串传入 nearley 实例进行解析,得到解析树。然后,我们定义了一个 traverse 函数,用于将解析树转为计算器所需要的树形结构。该函数在解析树中进行递归查找,如果遇到数组就将其转换为可进行计算的树形结构。

接着,我们定义了一个 evalNode 函数,用于计算树形结构。在这个函数中,根据操作符分别计算 leftright 参数的结果,并将结果作为函数返回值。

最后,我们通过传入 traverse 转换后的树形结构,调用 evalNode 计算出结果,并将其输出。

结论

本文主要介绍了 npm 包 nearley-there 的使用方式,包括了安装方法、规则定义和示例代码。这个 npm 包能够帮助我们将文本转换为 JavaScript 对象,在进行语法解析的过程中发挥重要作用。

在实际应用中,我们可以使用一个定义好的 grammar 文件对文本进行解析和转换。需要注意的是,转换后得到的结果很可能是一个数组,需要根据规则进行进一步的处理。希望在近期的开发工作中使用 nearley-there 的同学能够从本文中获得一些有用的知识点,加强技术水平,提高开发效率。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055e3081e8991b448dbadf

纠错
反馈