什么是 Lexing?
在程序语言处理的过程中,Lexing 是一个非常重要的步骤。它的作用是将输入的源代码分割成符号 (tokens),以便进行后续的解析和分析。
举个例子,我们有以下的 JavaScript 代码:
----- - - - - --
在 Lexing 的过程中,该段代码会被分割为如下的符号:
符号 | 类型 |
---|---|
const | 关键字 |
a | 标识符 |
= | 运算符 |
1 | 数字 |
+ | 运算符 |
2 | 数字 |
; | 分号 |
可以看到,通过 Lexing,我们将原本连续的代码字符串拆分成了各种不同类型的符号,方便后续的处理。
npm 包 Lexing 简介
npm 上有很多优秀的 Lexing 相关的包,比如 nearley 和 jison 等等。这里我们介绍一个名为 lex 的包,它是一个轻量级的 Lexing 工具。
如何使用 lex?
使用 lex,我们需要定义一个 Lexing 规则。规则由一组正则表达式和对应的处理函数组成。当 lex 扫描到匹配的字符串时,就会调用相应的处理函数。
下面是一个简单的示例:
----- --- - --------------- ----- ----- - --- ---------- -- - ---------------------- ---------- ---------- --- ------------------ -- -- -------------------- ------- ------------------ -- -- -------------------- ------- --------------------- ------------
该示例定义了两个规则:一个匹配字符 a
,另一个匹配字符 b
。当输入为 'ab'
时,输出结果是:
------- --- ------- ---
可以看到,lex 正确地识别了输入中的每个符号,并且调用了相应的处理函数。
更复杂的例子
在实际的 Lexing 中,我们通常需要定义复杂一些的规则。下面是一个更加复杂的示例,它能够识别类似 JavaScript 的代码中的各种符号:
----- --- - --------------- ----- ----- - --- ---------- -- - ----------------------- ---------- ---------- --- -------------------- -- -- ---- -------------------------- -- -- ---- -- ---- --------------------------------- -- -- ---- -- ---- ---------------------------------- -------- -- -------------------- ------------- -- -- -------------------------------- -------- -- -------------------- ------------- -- --- -------------------------------- -------- -- -------------------- ------------- -- -- --------------------- -- -- --------------------- ------ ----------------------- -- -- --------------------- -------- --------------------------- -- -- --------------------- ------------ ------------------------- -- -- --------------------- ---------- ----------------------------------------- -------- -- ---------------------- ------------- -- ------- ---------------- -------- ------ -- - -- -- - -- - ------ - - -- - ---- - ------ - - -- - - --- ----- ------- ----------------------------------------------------------- ---------- ---------------------------------------------------------------------------------------