npm 包 jison-plus 使用教程

阅读时长 8 分钟读完

前言

jison-plus 是一个基于 jison 的编译器生成器,提供了一种简化的 BNF 语法,并支持多目标语言生成。在前端开发中,我们常常需要编写一些语法分析器以及编译器,例如解析 CSS、JSX 等语言。jison-plus 提供了一种快速高效的解决方案。

本文将详细介绍 jison-plus 的基本用法和使用场景,并通过两个示例代码演示如何使用 jison-plus 构建一个简单的语法分析器和编译器。

jison-plus 的基本用法

jison-plus 的基本用法类似于 jison,只需要在 terminal 上使用 npm 安装即可:

jison-plus 常用于以下场景:

  • 生成语法分析器(parser):将输入的字符串解析成符合语法规则的抽象语法树(AST)。
  • 生成编译器(compiler):将符合语法规则的 AST 转换成目标语言的字符串。

在 jison-plus 中,我们需要按照以下步骤来生成一个 parser 和一个 compiler。

第一步:定义 BNF 文法

BNF(巴克斯-诺尔范式)是一种用于描述计算机语言语法的形式语言。我们需要按照 BNF 文法的规则来定义我们所需要的语法。

jison-plus 的 BNF 文法和 jison 相似,但是更加简化。例如,下面是一个简单的 jison-plus BNF 文法定义:

这个文法定义了一个简单的加减法运算表达式。其中,S 是语法的起始符号,expression 表示四则运算表达式,number 表示数字。我们可以看到,在 jison-plus 中,BNF 文法的语法非常简单明了,易于理解和书写。

第二步:定义 lexer 规则

lexer 是词法分析器,将输入的字符串进行词法分析,转换成 token 序列。在 jison-plus 中,我们可以通过定义 lexer 规则来实现词法分析。

例如,我们可以定义以下 lexer 规则:

这个 lexer 规则定义了三种 token 类型:NUMBER 表示数字,"+" 表示加号,"-" 表示减号。

第三步:定义语法动作

在 BNF 文法中,我们可以通过定义语法动作,对语法规则进行处理。在 jison-plus 中,语法动作通常用于生成 AST 和转换成目标语言的字符串。

例如,我们可以定义以下语法动作:

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

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

------        - ------
              - -- - ----------------- - 
展开代码

这个语法动作定义了三个规则:S、expression 和 number。其中,S 表示语法的起始符号,expression 表示表达式,number 表示数字。在这些规则中,我们通过简单的 JavaScript 代码,对语法规则进行展开,生成了 AST。

示例代码

接下来,我们将通过两个示例代码,演示如何使用 jison-plus 进行语法分析和编译。

示例 1:加减法表达式解析器

以下代码定义了一个加减法表达式解析器。它可以将输入的加减法表达式,转换成 AST。

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

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

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

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

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

--------------------------- - - - - - -- - ------
展开代码

在这个示例代码中,我们首先定义了一个 BNF 文法 grammar 和一个 lexer 规则 lexer。然后,在 jison-plus 的构造函数中,我们传递了这两个变量,生成了一个 parser。最后,我们调用了 parser.parse() 方法,将一个加减法表达式传递给 parser,输出了解析出来的 AST。

示例 2:简单编译器

以下代码定义了一个简单编译器,它可以将输入的加减法表达式,转换成 JavaScript 代码。

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

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

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

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

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

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

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

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

-- -------
-- -------- ----------- -
--     ----- ------ - - - - - - - -- - ---
--     ------ -------
-- -
--
-- -------------------------
展开代码

在这个示例代码中,我们首先定义了一个 BNF 文法 grammar 和一个 lexer 规则 lexer。然后,在 jison-plus 的构造函数中,我们传递了这两个变量,生成了一个 parser。接着,我们调用了 parser.parse() 方法,将一个加减法表达式传递给 parser,生成了一段 JavaScript 代码。

最后,我们可以将这段代码打印出来,得到一个输出的 JavaScript 函数,它可以计算一段加减法表达式的值。

总结

在本文中,我们详细介绍了 jison-plus 的基本用法和使用场景,并通过示例代码演示了如何使用 jison-plus 构建一个简单的语法分析器和编译器。通过学习本文,相信读者已经掌握了 jison-plus 的基本用法,并可以将 jison-plus 应用于自己的 Web 开发项目中。

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