Download .zip |
Info | Documentation | View files (17) | Download .zip | Reputation | Support forum | Blog | Links |
Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
2020-03-28 (19 hours ago) | Not yet rated by the users | Total: 84 This week: 5 | All time: 9,461 This week: 69 |
Version | License | PHP version | Categories | |||
minilang 1.0.1 | GNU Lesser Genera... | 5 | PHP 5, Language, Parsers |
A mini script language for PHP. It does three simple tasks.
For example :
> when var1>5 and var2>20 then var3=20
> init var5=20 when var1>5 and var2>20 then var3=var5
Sometimes we need to execute arbitrary code in the basis of "if some value equals to, then we set or execute another code."
In PHP, we could do the next code.
if($condition) {
$variable=1;
}
However, this code is executed at runtime. What if we need to execute this code at some specific point?.
We could do the next code:
$script='if($condition) {
$variable=1;
}';
// and later..
eval($script);
This solution works (and it only executes if we call the command eval). But it is verbose, prone to error and it's dangerous.
Our library does the same but safe and clean.
$mini->separate("when condition then variable=1");
Installing it using composer:
> composer requires eftec/minilang
Creating a new project
use eftec\minilang\MiniLang;
include "../lib/MiniLang.php"; // or the right path to MiniLang.php
$mini=new MiniLang();
$mini->separate("when field1=1 then field2=2"); // we set the logic of the language but we are not executed it yet.
$mini->separate("when field1=2 then field2=4"); // we set more logic.
$result=['field1'=>1,'field2'=>0]; // used for variables.
$callback=new stdClass(); // used for callbacks if any
$mini->evalAllLogic($callback,$result);
var_dump($result);
> __construct(&$caller,&$dict,array $specialCom=[],$areaName=[],$serviceClass=null)
It reset the previous definitions but the variables, service and areas.
Set a caller object.
Set a dictionary with the variables used by the system.
It sends an expression to the MiniLang, and it is decomposed in its parts. The script is not executed but parsed.
It evaluates a logic. It returns true or false.
It sets a value or values. It does not consider if WHERE is true or not.
The syntaxis of the code is separated into four parts. INIT, WHERE (or when), SET (or THEN) and ELSE.
Example:
$mini->separate("when field1=1 then field2=2");
It says if field1=1 then we set field2 as 2.
A variable is defined by varname
Example: examples/examplevariable.php
$mini=new MiniLang();
$mini->separate("when field1>0 then field2=3"); // we prepare the language
$variables=['field1'=>1]; // we define regular variables
$callback=new stdClass();
$mini->evalAllLogic($callback,$variables); // we set the variables and run the languageand run the language
var_dump($variables); // field1=1, field2=3
A variable could host a PHP object, and it is possible to call and to access the fields inside it.
varname.field
Example of code examples/examplevariable2.php
class MyModel {
var $id=1;
var $value="";
public function __construct($id=0, $value="")
{
$this->id = $id;
$this->value = $value;
}
}
class ClassCaller {
public function Processcaller($arg) {
echo "Caller: setting the variable {$arg->id}<br>";
}
}
class ClassService {
public function ProcessService($arg) {
echo "Service: setting the variable {$arg->id}<br>";
}
}
$mini=new MiniLang([],[],new ClassService());
$mini->separate("when field1.id>0 then
field2.value=3
and field3.processcaller
and processcaller(field3)
and processservice(field3)"); // we prepare the language
$variables=['field1'=>new MyModel(1,"hi")
,'field2'=>new MyModel(2,'')
,'field3'=>new MyModel(3,'')]; // we define regular variables
$callback=new ClassCaller();
$mini->evalAllLogic($callback,$variables,false); // we set the variables and run the languageand run the language
var_dump($variables);
A variable could hold an associative/index array, and it is possible to read and to access the elements inside it.
vararray.associndex // vararray['associindex']
vararray.4 // vararray[4]
vararray.param('a.b.c') // vararray['a']['b']['c']
param(vararray,'a.b.c') // vararray['a']['b']['c']
Example of code examples/examplevariable_arr.php
class ClassCaller {
public function Processcaller($arg) {
echo "Caller: setting the variable {$arg['id']}<br>";
}
}
class ClassService {
public function ProcessService($arg) {
echo "Service: setting the variable {$arg['id']}<br>";
}
}
$mini=new MiniLang([],[],new ClassService());
$mini->separate("when field1.id>0 then
field2.value=3
and field3.processcaller
and processcaller(field3)
and processservice(field3)");
$variables=['field1'=>['id'=>1,'value'=>3]
,'field2'=>['id'=>2,'value'=>'']
,'field3'=>['id'=>3,'value'=>'']];
$callback=new ClassCaller();
$mini->evalAllLogic($callback,$variables,false);
var_dump($variables);
A global variable takes the values of the PHP ($GLOBAL), so it doesn't need to be defined or set inside the language
A global variable is defined by
$globalname
$globalname.associndex // $globalname['associindex']
$globalname.4 // $globalname[4]
$globalname.param('a.b.c') // $globalname['a']['b']['c']
param($globalname,'a.b.c') // $globalname['a']['b']['c']
For example:
$globalname=30
Example Code: examples/exampleglobal.php
$field1=1; // global variable
$mini=new MiniLang();
$mini->separate('when $field1>0 then $field1=3'); // we prepare the language
$variables=[]; // local variables
$callback=new stdClass();
$mini->evalAllLogic($callback,$variables); // we set the variables and run the languageand run the language
var_dump($field1); // returns 3
| Type | Example | |------|---------| |Number|20| |string|"hello world", 'hello world'| |stringp|"my name is {{var}}"| |function|namefunction(arg,arg)|
> set var=20 and var2="hello" and var3="hello {{var}}" and var4=fn()
| Reserved word | Explanation | |---------------|------------------------------------------------------------------------------| | null() | null value | | false() | false value | | true() | true value | | on() | 1 | | param(var,'l1.l2.l3') | Separates an array (var) into var['l1']['l2']['l3'] | | off() | 0 | | undef() | -1 (for undefined) | | flip() | (special value). It inverts a value ON<->OFF<br>Used as value=flip() | | now() | returns the current timestamp (integer) | | timer() | returns the current timestamp (integer) | | interval() | returns the interval (in seconds) between the last change and now. It uses the field dateLastChange or method dateLastChange() of the callback class | | fullinterval() | returns the interval (in seconds) between the start of the process and now. It uses the field dateInit or method dateInit() of the callback class |
Example: examples/examplereserved.php
$mini=new MiniLang();
$mini->separate("when true=true then field1=timer()"); // we prepare the language
$variables=['field1'=>1]; // we define regular variables
$callback=new stdClass();
$mini->evalAllLogic($callback,$variables); // we set the variables and run the language
var_dump($variables);
Example Timer: examples/examplereservedtimer.php
class ClassWithTimer {
var $dateLastChange;
public function dateInit() {
return time();
}
public function __construct()
{
$this->dateLastChange=time();
}
}
$mini=new MiniLang();
$mini->separate("when true=true then field1=interval() and field2=fullinterval()"); // we prepare the language
$variables=['field1'=>0,'field2'=>0]; // we define regular variables
$callback=new ClassWithTimer();
$mini->evalAllLogic($callback,$variables); // we set the variables and run the language
var_dump($variables);
This part of the expression allows setting a value. This expression is usually optional, and it could be omitted.
> It is similar to SET, but it is executed before WHERE and no matter if WHERE is valid or not.
> init counter=20 where variable1=20 set variable+counter
$mini->separate("init tmp=50 when condition=1 then field1+10"); // set tmp to 50. If condition is 1 then it increases the field1 by 10.
This part of the expression adds a condition to the statement.
We can also use "when."
> where expression
or
> when expression
It's possible to compare more than a condition at the same time by separating by "and" or "or."
> where v1=10 and v2=20 or v3<50
> where variable1=20 and $variable2=variable3 or function(20)=40
> where $field=20 and field2<>40 or field3=40 // sql syntax
> where $field==20 && field2!=40 || field3=+40 // PHP syntax
> where 1 // it always true
This part of the expression allows setting the value of a variable. It is possible to set more than one variable at the same time by separating by "," or "and."
We can also use "then."
> set expression
or
> then expression
> SET is only executed if WHERE is valid
It is also possible to set a function. However, the value could not be set (but the function is executed)
We could set a variable using the next expressions:
This library does not allow complex instruction such as
> set variable1=20 and $variable2=variable3 and function(20)=40
$mini->separate("when condition=1 then field1+10"); // if condition is 1 then it increases the field1 by 10.
This optional part of the expression allows setting the value of a variable. It is possible to set more than one variable at the same time by separating by "," or "and".
> This code is only evaluated if "where" returns false of if ELSE is called manually.
> else variable1=20 and $variable2=variable3 and function(20)=40
We call the some operations 1000 times.
Medium-Creating a new scripting language on PHP
Files |
File | Role | Description | ||
---|---|---|---|---|
examples (8 files) | ||||
lib (1 file) | ||||
tests (3 files) | ||||
.travis.yml | Data | Auxiliary data | ||
composer.json | Data | Auxiliary data | ||
LICENSE | Lic. | License text | ||
phpunit.xml | Data | Auxiliary data | ||
README.md | Doc. | Documentation |
Files | / | examples |
File | Role | Description |
---|---|---|
example1.php | Class | Class source |
examplebenchmark.php | Class | Class source |
exampleglobal.php | Example | Example script |
examplereserved.php | Example | Example script |
examplereservedtimer.php | Class | Class source |
examplevariable.php | Example | Example script |
examplevariable2.php | Class | Class source |
examplevariable_arr.php | Class | Class source |
Files | / | tests |
File | Role | Description |
---|---|---|
AbstractMiniLang.php | Class | Class source |
CompilationTest.php | Class | Class source |
CompilationTest2.php | Class | Class source |
Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
100% |
|
|
Applications that use this package |
If you know an application of this package, send a message to the author to add a link here.