介绍
phpegjs 是一个基于 JavaScript 实现的解析器生成器,它可以用于生成 PHP 语言的解析器。该工具支持语法输入文件的自定义,让用户可以灵活地根据需求定制自己的解析器。
安装
phpegjs 可以通过 NPM 包管理器进行安装,使用以下命令进行安装:
npm install -g phpegjs
基础使用
在使用 phpegjs 之前,需要准备好使用的语法输入文件。这里以一个简单的四则运算语法文件(calc.pegjs)为例:
-- -------------------- ---- ------- ---------- - -------- -------- - ------------------- --- -------------- - -------------- -------------- - ---------- --- -------------------- - ----- ----- - --- ---------- - ------- ------- - ------------- - --- ---------- --- - ------ -- -
其中,Expression 是该语法文件的起始符号。Addition 表示加法运算,Multiplication 表示乘法运算,Unary 表示负号运算,Primary 表示数字或括号表达式。
在命令行中运行以下命令即可生成对应的 PHP 解析器文件:
phpegjs calc.pegjs calc.php
生成的 PHP 解析器文件中,会包含与输入语法文件对应的各个解析规则的实现。以 calc.pegjs 的例子为参考,生成的 calc.php 文件中包含了如下内容:
-- -------------------- ---- ------- ----- ---------------- - ----------- ------------------- - -------- ------------------- - ------- -------------------- - ------- ------------- - ------- -------------- - ------ -------------- - ------- --------------- - -------- --------------- - ------ ----------------- - ------- -------- --------------- - ------- - --- ------- ------- -- ------ - -- ----------------- - ------- ------ -- --------- - --------- - --------- - - ---- - --------- - ------ - - ------ -------- - -------- -------------------- ---- ------- ------- - ---------------- ------ -------- - ---- ---------- ------ ------- -- --- ---- ----------- ------ ----- - ------- ---- ----------------- ------ ----- - ------- ---- -------- ------ ------------------------------ ---- ------------- ------ ---------- -------- ----- --- ------------------ ------ ----- --------- - - ----- ---------- - -------- ------------------- -------- - --- - -------------- - --- -------------------- -------------- - --- --------------- - -- -------------------- - ----- ------------ - ----- -- ---------------------------- - -------------- - -------------------- - ---- - -------------- - --- - - -------- -------- - ------ ------------------------- - -------- ----- - ------ ---------------------- - -------- ----------- - ------ ---------------------------- - -------- ---------- - ------ --------------------------- - -------- ------------ - ------------- - ------ - ---------- -- ------- ----- ------ - ------ - --------------------------- -- --------------- --- ----------------------- - ------ - ---- - --------------- -- ------------------------------ - -- -------------------------- ----- -------- - -------------------- - ------------ -------- ----- - ------ ---------- ----- - ------ ------------------------- ----- -------- - -- --------------------------- ----------- - -------------------- - ------------ -------- ----- - ------ -------------- ----- - ---- - -------------------- - ------------ -------- ----- - ------ ----------------- ----- - - ---- - -------------------- - ------------ -------- ----- - ------ ---- ----- - - - ------ --------------------- -------- - -------- -------------- ------- - ------- - ----------- ----- - ---------------- --------- - ------------------------------ - --------------------------------- - --- --- - -- ------ - ---------- --------- ----- -------------- - -- - ------------ ------ - -------------------- - --- -- ---- -- --------------------- - ------------------ --------- - ------ - --------------------------- ----- - ------------------- -- ------------------ - -- ------ -- --------------- - --------------- - ------------- - ------------------------ ------ - ---- - ------- - --------------------- -- ------------------------------- - --------------------- ----------- - ------------------------------ --------------- - ------ --- - --------------------- --------- - ---- - ------------ - - ------ -- -------------- --------- -- --------- ----- --- ---------------- -------- ----- -- --------------- -- ------ ----- - - - ---- - ------ - ------ --------------------- --- --- - ------------ - -- -- -- -- ----- - ---- - ---------- -- ---------------------- - ------------ - --- - ------------------------ -------------------------- ------------------------ - -------------------------------------------- ---------- -- ------- --- - ------------------ ------------------ -------- -------- ------- --------------------- -- ----- - ------------------ ----------------------------- --------- - ----------- - ----- --- - -- - -- ---- -- --------------------- - ------------------ -- ------------------------------- - ----- - ------------------- ---- -- ------------ --------------------- ----------- - ------------------------------ - - - ------ ------------- - - ----- ----------- - ----- --------- - -- -------- ------------------- - ------------ - ------- ---------- - -- ------------------- - -------- -------- - ------ ----------- - -------- ----------- - ----- ----------- - --------------------- - -- ---------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- --------- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ ------------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ --------- - ------ ------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ -------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ -------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ --------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ --------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ ----------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ ------------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ------ -------------------------------------------- ------------- ------- ----- ------------ - ---------- -- ------------------ ------------ - - ------ -- ---- ------- -- ---------- ----- -- ---------- - ------------------ -- ------- - ---- - ------------- --------- - - ------------ - - ------ -- ---------------- ------- -- --- ----- -- ----------- -- - -------- ---------- - ------ ------------- - -------- ----- - ------ -------------------- --- ---------------- - -
在 PHP 代码中使用该解析器可以通过以下方式实现:
$parser = new CalcParser("1 + 2 * (3 - 4)"); $result = $parser->parse(); echo $result; // -1
进阶用法
phpegjs 支持对语法输入文件进行自定义,通过自定义语法输入文件,可以让生成的解析器具有更高的灵活性。以 calc.pegjs 的例子为参考,以下是该语法文件的注释信息,可以帮助我们更深入地了解 phpegjs 的用法:
-- -------------------- ---- ------- -- ------- ------ -- -- ---------- -- ---------- - -------- -------- - ------------------- --- -------------- - -------------- -------------- - ---------- --- -------------------- - ----- ----- -- ---- -- - --- ---------- - ------- ------- -- ----- -- - ------------- - --- ---------- --- - ------ -- - -- -------------- -- -- -------- ------ ---- ----- -- -- --------- -- --------- ------ - ------ - ----- ------ ----- ----- ------ ----- -- - -------------- ------ - ------ - ----- ----------- ----- ----- ------ ----- -- - ------------- - ------ - ----- --------- ------ ----- -- - ------------- - ------ - ----- --------- ------ ----- -- - -- ---------- -- -- -------- -- - --- - - --------------- - ------- ------------ - - -- --- - - --------------- - ------- ------------ - - -- --- - - --------------- - ------- ------------ - - -- --- - - --------------- - ------- ------------ - - - -
除了定义词法分析器的模式(即正则表达式)和语法规则之外,calc.pegjs 中还定义了输出解析器对应的抽象语法树节点和运算符优先级等信息,这些信息可以方便我们更好地控制解析器的行为。
我们可以自定义 calc.pegjs,让生成的 PHP 解析器实现更高级的功能。作为示例,以一个简单的日期格式解析器为例:
-- -------------------- ---- ------- ---- - --------- --- ----------- --- ------- - ------ - ----- --------------- ------ ---------------- ---- ------------- -- - ---- - -------- ----- - ----------------- - ------ ---------------- - --- - ----------------- - ------ ---------------- -
运行以下命令即可生成对应的日期格式解析器:
phpegjs date.pegjs date.php
在 PHP 代码中使用该解析器可以通过以下方式实现:
$parser = new DateParser("2022-12-31"); $result = $parser->parse(); var_dump($result); // array("year" => 2022, "month" => 12, "day" => 31)
总结
phpegjs 是一个强大的解析器生成器,可以帮助我们生成各种语言的解析器。在使用过程中,我们需要先准备好用于生成解析器的语法输入文件,并通过 NPM 包管理器进行安装。通过定义语法规则、抽象语法树节点和优先级等信息,我们可以方便地控制生成的解析器的行为。通过本教程的介绍,相信你已经掌握了 phpegjs 的基础用法和进阶技巧,可以使用该工具生成自己需要的解析器。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055d2d81e8991b448dae5d