npm 包 bisonjs 使用教程

Bisonjs 是一个基于 JavaScript 的解析器生成器。其通过提供一个简单的 DSL(领域特定语言)来使得用户能够轻松地定义自己的语法。在使用过程中,您只需编写一些规则即可自动生成语法解析器。Bisonjs 最受欢迎的应用场景是在编译器设计、模板解析和代码生成等领域。

本文将提供一个 bisonjs 的使用教程,内容详细、深入和有指导意义。我们将介绍 bisonjs 的工作原理、API 和示例,帮助您有效地利用这个强大的工具。

工作原理

Bisonjs 是一个 LALR(Look-Ahead Left-to-Right)解析器生成器。在生成解析器的过程中,它会分析用户提供的规则从而生成状态机。`

状态机的每一个状态都代表一个在语法分析过程中的位置。在一个特定的状态中,bisonjs 会期待一个特定的 token 从而转移到下一个状态。当状态机走到了最后,bisonjs 就会生成一棵语法分析树。

安装

您可以使用 npm 包管理器来安装 bisonjs:

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

使用

我们首先需要编写一个 BNF(巴克斯-诺尔范式),它包含了我们自己的语法规则。在 bisonjs 中,你可以用类似下面的方式来定义语法规则:

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

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

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

在这里,我们首先定义了两个“操作符”:"+" 和 "-"。 然后,我们定义了一个“括号”操作符。在 bisonjs 中,您可以使用 operatorPrecedence 属性来指定操作符的优先级。startSymbol 表示语法规则的开始标识符。

完成了 BNF 的编写,我们还需要指定 token。在 bisonjs 中,token 可以是任何正则表达式。我们可以像下面这样定义 token:

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

在这里,我们声明了五个 token,包括数字、加号、减号、左括号和右括号。

接下来,我们可以使用 bisonjs 生成语法分析器:

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

其中,grammar 就是我们前面定义的 BNF 规则。

以一个简单的表达式 "1 + 2 - 3" 为例,我们可以开始解析:

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

最终返回的 ast 将包含如下的内容:

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

在上面的示例中,-1 + 2 - 3 的语法分析树已被成功地生成。

我们还可以为解析器设置一个上下文对象,以便在解析过程中存储一些中间状态。例如:

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

在解析过程中,你可以访问ctx对象。

示例

让我们通过一个简单的示例来说明 bisonjs 的用法。

假设我们要为某个简单的编程语言编写一个解释器,它支持数字运算、变量赋值、if 条件语句和函数调用。该编程语言的语法规则如下:

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

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

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

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

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

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

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

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

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

其中,ID 表示标识符。

我们来解构这个规则:

  • Program 是所有语句的最高级别的语法规则。
  • Statements 是一连串语句、可以是任何数量的 Statement 实例。
  • Statement 是能够出现在这个编程语言中的语句。 Assignment 表示变量赋值,IfStatement 代表条件语句,Expr 代表数学运算表达式,FunctionCall 代表函数调用表达式。
  • Args 代表函数调用时的参数列表。
  • Expr 表示一个算数表达式,支持加、减、乘和除。其中,Atom 表示一个基本的表达式(例如:数字或者括号表达式)。

我们需要将上述规则翻译成代码如下:

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

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

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

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

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

在上面的示例中, 我们定义了一个简单的程序并在运行它的时候打印了语法分析树。Bisonjs 很容易读取您定义的语法规则,并生成与该规则对应的语法分析树。

语法分析树是一种基于语法规则的数据结构。它对于代码的构建和分析非常有帮助。在 AST 中,每个节点都代表着一个特定的语法结构。例如,表达式 x + y 在 AST 中的表现是这样的:

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

在此处,我们使用了 type 属性来说明该节点的类型,这有助于开发者在 AST 中进行查找。left 和 right 属性分别表示左操作数和右操作数。

总结

Bisonjs 是一个强大的解析器生成器,通过使用它,您可以很容易地定义自己的语法规则,以及分析和推导出您想要的语法结构。通过本文,您学会了如何使用 bisonjs,包括 BNF 规则的定义、token 的处理以及语法分析器的生成。我们还展示了一个简单的示例来说明 bisonjs 的使用方式,希望本文对于您的前端工作有所帮助。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/80459


猜你喜欢

  • npm 包 emblem-js 使用教程

    Emblem-js 是一个模板引擎,它可以将模板转化为 HTML。它使用类似 Handlebars 的语法,并且提供了像默认值、条件语句、循环等功能。本文将会介绍如何使用 npm 包 emblem-j...

    5 年前
  • npm 包 babel-plugin-inline-json 使用教程

    在前端开发中,我们经常会遇到需要在 JavaScript 代码中使用 JSON 数据的情况。如果每次都把 JSON 数据写在 JavaScript 文件里显然是不太优雅的做法,而且也不便于维护。

    5 年前
  • npm 包 robonomics-js 使用教程

    Robonomics 是一个针对机器人经济的开源平台,而 robonomics-js 是 Robonomics 官方提供的 JS 库,提供了与 Robonomics 网络进行交互的接口。

    5 年前
  • npm 包 xrtd-js 使用教程

    在前端开发中,我们常常会使用一些第三方的库和工具来提高开发效率。其中,NPM 是一个广受欢迎的包管理工具,能够帮助我们轻松地管理和下载所需的 JavaScript 包。

    5 年前
  • npm 包 ipfs-api 使用教程

    什么是 IPFS IPFS(InterPlanetary File System)是由 Juan Benet 创建的开源分布式文件系统。它是一个基于内容寻址的 p2p 文件系统,旨在使整个互联网可以变...

    5 年前
  • npm 包 complex-filter 使用教程

    在前端开发过程中,我们常常需要对数据进行筛选和过滤。这个时候,一个好用的数据过滤工具就显得尤为重要了。其中,npm 上有一个常用的数据筛选工具,名为 complex-filter。

    5 年前
  • npm 包 oip-js 使用教程

    什么是 oip-js? oip-js 是一款基于 Node.js 平台的 npm 包,用于实现与 OIP(Open Index Protocol)协议的交互。OIP 是一种去中心化数据存储和查询协议,...

    5 年前
  • npm 包 etdb-downloads 使用教程

    前言 etdb-downloads 是一个基于 Node.js 的 npm 包,用于批量下载 ETDB 数据库文件。ETDB(The Encyclopedia of DNA Elements)是一个基...

    5 年前
  • npm 包 build-and-watch 使用教程

    简介 build-and-watch 是一个基于命令行的 npm 包,用于监听指定目录下的文件变化并执行一些构建任务,可以帮助前端工程师自动化构建,提高工作效率。 安装 在命令行中输入以下代码进行安装...

    5 年前
  • npm 包 blockexplorer 使用教程

    如果你是前端开发者,而且对比特币和区块链有所了解,那么你肯定听说过 blockexplorer。 blockexplorer 是一个开源的区块链浏览器,它可以用来查询比特币和其他加密货币的交易和区块信...

    5 年前
  • npm 包 blockstorm-cli 使用教程

    在前端开发中,我们常常需要使用一些第三方库或工具来辅助开发。而 npm 是目前最常用的 JavaScript 包管理器之一。blockstorm-cli 是一个基于 npm 的命令行工具,它提供了便捷...

    5 年前
  • npm包promiser-serial使用教程

    有时我们需要按照特定的顺序依次执行异步任务,而promise-serial就是一个可以让我们达成这个目的的npm包。在本篇文章中,我们将会探讨promise-serial的使用方法,并配有详细的指导和...

    5 年前
  • npm包`tplink-lightbulb`使用教程

    前言 现在,智能家居越来越流行,智能家居设备也越来越多。本文将介绍一个npm包tplink-lightbulb,能够帮助我们控制智能灯泡。通过本文,你可以了解到如何使用tplink-lightbulb...

    5 年前
  • npm 包 homebridge-tplink-hs100-lightbulbs 使用教程

    前言 在我们生活的时代,物联网已经不再是遥远的概念。越来越多的物品与互联网相连,让我们的生活变得更加便捷和智能化。其中家庭智能化设备的应用越来越广泛,而其中智能灯泡的应用尤其受欢迎。

    5 年前
  • npm 包 homebridge-hs100 使用教程

    介绍 Homebridge 是一款开源的家庭自动化桥接软件,其可以让本来不支持 HomeKit 的设备通过插件的形式连接到 HomeKit 中。其中 homebridge-hs100 插件可以连接到 ...

    5 年前
  • npm 包 hs100-api 使用教程

    简介 hs100-api 是一个使用 Node.js 操作智能插座 TP-Link HS100 的 npm 包,旨在提供简单易用的接口,方便前端开发人员在他们的项目中使用智能插座。

    5 年前
  • npm 包 thing.js 使用教程

    前言 npm 是 Node.js 的包管理器,通过 npm 可以方便地安装、升级、卸载各种 JavaScript 库和工具。thing.js 是一个封装了常见数据类型处理的 npm 库,支持一些常见的...

    5 年前
  • npm 包 telismo 使用教程

    当我们需要为网站添加电话呼叫功能时,可以选择使用 telismo 这个 npm 包来实现。telismo 提供了一种简单的方式来添加电话号码,以便于访问者可以直接点击电话号码来打电话。

    5 年前
  • npm 包 ddp 使用教程

    前言 在前端开发过程中,经常会使用到许多 npm 包来提高开发效率。其中,ddp 包就是一个专门为 Meteor 框架设计的包。它提供了一种快速、实时更新的数据通信方式,使得前端和后端可以直接进行数据...

    5 年前
  • npm 包 ddp-underscore-patched 使用教程

    简介 DDP(Distributed Data Protocol)是 Meteor 开发框架中的一个很重要的组件,其作用是在客户端和服务器之间进行实时数据传输。而 ddp-underscore-pat...

    5 年前

相关推荐

    暂无文章