smuuf / primi
一种在PHP中编写的脚本语言,且可在PHP中执行。
Requires
- php: >=7.1
- smuuf/php-peg: ^2
Requires (Dev)
- nette/tester: ^2.0
- phpstan/phpstan: ^0.12
- smuuf/koloader: dev-master
- smuuf/phpcb: dev-master
README
Primi
一种在PHP中编写并在PHP中解释的脚本语言。
Primi旨在为希望让客户编写自己自定义逻辑的PHP开发者使用。Primi允许您(开发者)在沙盒中执行不受信任的代码(仅以字符串形式提供),安全地将其与其环境分离。
快速访问
动机
Primi(就像生活中有时会发生的那样)最初是为了解决一个实际问题:我需要一种通用(即不是特别针对特定领域)的脚本语言,我的其他应用程序的用户可以使用它来编写简单的自定义逻辑。我需要一个通用的、原始的脚本工具,具有熟悉的语法(PHP-like x C-like x JS-like)且可以在纯PHP环境中安全执行(没有对v8js、v8等外部依赖,这意味着JavaScript不在游戏中...)。
因此,Primi(主要作为一个实验)被创建。
安装
您可以使用Primi作为一个独立包(a)
- 用于开发、贡献、调试,或者只是玩一玩。或者您可以将Primi用于您自己的项目(b)
,通过将其作为Composer依赖项安装。
您需要以下之一
git clone https://github.com/smuuf/primi.git
(独立使用)composer require smuuf/primi
(在您的项目中使用Primi作为库)
a) 独立安装
- 克隆此存储库。
git clone https://github.com/smuuf/primi.git
- 安装Composer依赖项。
composer install
- 使用Primi CLI运行某些内容。
chmod +x ./primi && ./primi -s -c "a = 1 + 2 / 3;"
方便的安装One-liner™
git clone https://github.com/smuuf/primi.git && cd primi && composer install && chmod +x ./primi && ./primi -s -c "msg = 'Primi works.';"
额外内容
-
为当前用户注册Primi的CLI可执行文件,以便键入
primi
时表现得像二进制文件(否则您需要键入./primi
,并且必须位于正确的目录中)./bin/registerbin
注意:这将向当前用户的.bashrc文件中添加一个别名。
-
运行测试 (测试位于
./tests/
目录中)./bin/test
-
重建解析器 (当您修改Primi的语法定义时,您将想要重建解析器以反映这些更改)
./bin/buildparser
b) 将Primi用作库
- 首先,安装Primi Composer包:
composer require smuuf/primi
- 然后像这样使用它
<?php require __DIR__ . "/vendor/autoload.php"; $context = new \Smuuf\Primi\Context; $interpreter = new \Smuuf\Primi\Interpreter($context); try { // Let the interpreter run a source code. $interpreter->run('a = 1; b = a + 2; c = "some string"; d = c + " extra thing";'); // Get defined variables from primary context and print them. foreach ($context->getVariables() as $name => $value) { printf("%s (%s) ... %s\n", $name, $value::TYPE, $value->getCoreValue()); } } catch (\Smuuf\Primi\ErrorException $e) { die($e->getMessage()); }
运行此代码会输出
a (number) ... 1
b (number) ... 3
c (string) ... some string
d (string) ... some string extra thing
REPL模式
Primi提供了一个方便的“沙盒” REPL模式,可以通过执行不带任何参数的./primi
来启动。您可以使用此模式进行语言实验或测试您可能正在尝试实现的新功能(例如,用PHP编写的自己的Primi扩展)。
在此模式下,所有语句在键入时都会执行,并返回最后一个表达式的结果值。REPL命令历史记录在不同的会话之间保留(历史记录存储在~/.primi_history
文件中)。
语言参考
语言语法和数据类型的基础知识请在此处查看:https://github.com/smuuf/primi/blob/master/docs/language_reference.md