hiqdev / hoa-compiler
Hiqdev Hoa\Compiler 库。
Requires
- php: >=7.4
- hoa/consistency: ~1.0
- hoa/exception: ~1.0
- hoa/file: ~1.0
- hoa/iterator: ~2.0
- hoa/math: ~1.0
- hoa/protocol: ~1.0
- hoa/regex: ~1.0
- hoa/visitor: ~2.0
Requires (Dev)
- hoa/json: ~2.0
- hoa/test: ~2.0
- phpunit/phpunit: ^9.5
Replaces
- hoa/compiler: ~3.0
This package is auto-updated.
Last update: 2024-08-29 06:18:13 UTC
README
Hoa 项目已被归档,不提供升级或补丁,也不接受合并请求。
HOA 包包含一些对 PHP 8.0 和 PHP 8.1 已废弃的代码,但我们需要这些包在现代 PHP 版本上运行。
从哪里发生了变化?
主要影响方法声明中的返回数据类型提示以及未初始化属性的访问。
如何使用
我们目前已分叉以下包,主要是为了让 hoa/ruler 与 PHP 8.1 兼容
您只需将 composer.json 中的 hoa 包的要求替换为相应的分叉包:无需更改代码库中的任何内容。如果您使用某个需要 hoa 的包,只需将分叉添加到您的项目根目录 composer.json 中:我们将分叉标记为替代品,所以 composer 将安装它们而不是原始包。
版本
我们从最新的 hoa 包版本分叉,并从 1.0 版本开始提升自己的版本。
测试
在运行测试套件之前,必须安装开发依赖项
$ composer install
然后,运行所有测试套件
$ vendor/bin/hoa test:run
有关更多信息,请参阅贡献指南。
快速使用
作为一个快速概述,我们将查看 PP 语言和 LL(k) 编译器编译器。
PP 语言
语法由词元(单词的单元)和规则(请参阅文档了解语言理论的介绍)组成。PP 语言使用以下结构声明词元
%token [source_namespace:]name value [-> destination_namespace]
默认命名空间是 default
。词元的值由一个 PCRE 表示。我们可以使用 %skip
结构跳过词元。
以下以 JSON 语言 的简化语法为例。完整的语法在 hoa://Library/Json/Grammar.pp
文件中。因此
%skip space \s
// Scalars.
%token true true
%token false false
%token null null
// Strings.
%token quote_ " -> string
%token string:string [^"]+
%token string:_quote " -> default
// Objects.
%token brace_ {
%token _brace }
// Arrays.
%token bracket_ \[
%token _bracket \]
// Rest.
%token colon :
%token comma ,
%token number \d+
value:
<true> | <false> | <null> | string() | object() | array() | number()
string:
::quote_:: <string> ::_quote::
number:
<number>
#object:
::brace_:: pair() ( ::comma:: pair() )* ::_brace::
#pair:
string() ::colon:: value()
#array:
::bracket_:: value() ( ::comma:: value() )* ::_bracket::
我们可以看到 PP 构造
rule()
用于调用规则;<token>
和::token::
用于声明词元;|
用于析取;(…)
用于分组多个声明;e?
表示e
是可选的;e+
表示e
至少出现 1 次;e*
表示e
可以出现 0 或多次;e{x,y}
表示e
可以出现x
到y
次;#node
用于创建 AST(结果树)中的节点;token[i]
用于统一词元值。
统一非常有用。例如,如果我们有一个表示引号(简单或双引号)的词元,我们可以有
%token quote "|'
%token handle \w+
string:
::quote:: <handle> ::quote::
因此,数据 "foo"
和 'foo'
将是有效的,但也可以是 "foo'
和 'foo'
!为了避免这种情况,我们可以通过统一它们来添加对词元值的新约束,从而
string:
::quote[0]:: <handle> ::quote[0]::
对于该规则实例的所有 quote[0]
必须具有相同的值。另一个示例是 XML 标签名称的统一。
LL(k) 编译器编译器
Hoa\Compiler\Llk\Llk
类提供了一些操作(加载或保存)编译器的辅助工具。以下代码将使用之前的语法创建一个编译器,并解析一个 JSON 字符串。如果解析成功,它将生成一个 AST(抽象语法树),我们可以对其进行访问,例如将其转储
// 1. Load grammar. $compiler = Hoa\Compiler\Llk\Llk::load(new Hoa\File\Read('Json.pp')); // 2. Parse a data. $ast = $compiler->parse('{"foo": true, "bar": [null, 42]}'); // 3. Dump the AST. $dump = new Hoa\Compiler\Visitor\Dump(); echo $dump->visit($ast); /** * Will output: * > #object * > > #pair * > > > token(string, foo) * > > > token(true, true) * > > #pair * > > > token(string, bar) * > > > #array * > > > > token(null, null) * > > > > token(number, 42) */
非常简单。
命令行界面编译器
该库提出一个脚本来解析并应用特定语法的访问者。非常有用。此外,我们可以使用管道(因为 Hoa\File\Read
——请参阅Hoa\File
库—— 支持使用 0
作为 stdin
),因此
$ echo '[1, [1, [2, 3], 5], 8]' | hoa compiler:pp Json.pp 0 --visitor dump > #array > > token(number, 1) > > #array > > > token(number, 1) > > > #array > > > > token(number, 2) > > > > token(number, 3) > > > token(number, 5) > > token(number, 8)
您可以使用任何访问者类。
错误
错误显示良好
$ echo '{"foo" true}' | hoa compiler:pp Json.pp 0 --visitor dump Uncaught exception (Hoa\Compiler\Exception\UnexpectedToken): Hoa\Compiler\Llk\Parser::parse(): (0) Unexpected token "true" (true) at line 1 and column 8: {"foo" true} ↑ in hoa://Library/Compiler/Llk/Parser.php at line 1
采样器
有一些算法可以根据语法生成数据。我们将给出一个基于覆盖的生成算法的示例,该算法将激活语法中的所有分支和标记
$sampler = new Hoa\Compiler\Llk\Sampler\Coverage( // Grammar. Hoa\Compiler\Llk\Llk::load(new Hoa\File\Read('Json.pp')), // Token sampler. new Hoa\Regex\Visitor\Isotropic(new Hoa\Math\Sampler\Random()) ); foreach ($sampler as $i => $data) { echo $i, ' => ', $data, "\n"; } /** * Will output: * 0 => true * 1 => {" )o?bz " : null , " %3W) " : [false, 130 , " 6" ] } * 2 => [{" ny " : true } ] * 3 => {" Ne;[3 " :[ true , true ] , " th: " : true," C[8} " : true } */
研究论文
- 使用现实领域的基于语法的PHP测试,在A-MOST 2012(加拿大蒙特利尔)上发表(文章,演示,详情)。
文档
Hoa\Compiler
的黑客手册包含了有关如何使用此库及其工作原理的详细信息。
要本地生成文档,请执行以下命令
$ composer require --dev hoa/devtools $ vendor/bin/hoa devtools:documentation --open
更多文档可以在项目的网站上找到: hoa-project.net。
获取帮助
获取帮助主要有两种方式
- 在
#hoaproject
IRC频道上 - 在users.hoa-project.net的论坛上
贡献
你想贡献吗?谢谢!详细的贡献指南解释了你需要知道的一切。
许可证
Hoa遵循新BSD许可证(BSD-3-Clause)。请参阅LICENSE
以获取详细信息。