Update Formula1.php

Added Arrays
This commit is contained in:
Lico San
2019-08-12 16:36:48 +02:00
committed by GitHub
parent 6409998175
commit 2523f84882
+55 -9
View File
@@ -2,6 +2,7 @@
class Formula1 { class Formula1 {
public $tree=[]; public $tree=[];
public $parse_error='';
private $dual_hp_ops = ['/','*','%','^']; private $dual_hp_ops = ['/','*','%','^'];
private $dual_lp_ops = ['+','-']; private $dual_lp_ops = ['+','-'];
private $single_ops = ['+','-']; private $single_ops = ['+','-'];
@@ -12,11 +13,10 @@ class Formula1 {
$this->precision_mode = $precision_mode; $this->precision_mode = $precision_mode;
$f = $this->replace_parenth($formula, 0); $f = $this->replace_parenth($formula, 0);
if(strrpos($f, ')')>-1) { if(strrpos($f, ')')>-1) {
echo('PARSING ERROR: Too many closing parenthesis !'); $this->parse_error = 'PARSING ERROR: Too many closing parenthesis !';
return(false); return(false);
} }
$this->tree = $this->parse($f); $this->tree = $this->parse($f);
return(true);
} }
private function do_single_op($op, $x){ private function do_single_op($op, $x){
@@ -59,7 +59,7 @@ class Formula1 {
if($c=='(') { if($c=='(') {
$closing_idx = $this->find_closingp($f, $i); $closing_idx = $this->find_closingp($f, $i);
if($closing_idx===false) { if($closing_idx===false) {
echo("PARSING ERROR: missing closing parenthesis !"); $this->parse_error = "PARSING ERROR: missing closing parenthesis !";
return(''); return('');
} }
$expr = substr($f, $i+1, $closing_idx-$i-1); $expr = substr($f, $i+1, $closing_idx-$i-1);
@@ -76,28 +76,74 @@ class Formula1 {
private function parse($f){ private function parse($f){
//echo('<div style="font-size:12px;color:blue;">Parsing:'.$f.'</div>');
$re = '/^(.+?)([\\'.implode('\\',$this->dual_lp_ops).'])(.+)$/'; // dual low priority op $re = '/^(.+?)([\\'.implode('\\',$this->dual_lp_ops).'])(.+)$/'; // dual low priority op
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){ if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
return([$this->parse($matches[1][0]), $matches[2][0], $this->parse($matches[3][0])]); $recur = $this->parse($matches[3][0]);
if($recur!==false) return([$this->parse($matches[1][0]), $matches[2][0], $recur]);
else return(false);
} else { } else {
$re = '/^(.+?)([\\'.implode('\\',$this->dual_hp_ops).'])(.+)$/'; // dual high priority op $re = '/^(.+?)([\\'.implode('\\',$this->dual_hp_ops).'])(.+)$/'; // dual high priority op
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){ if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
return([$this->parse($matches[1][0]), $matches[2][0], $this->parse($matches[3][0])]); $recur = $this->parse($matches[3][0]);
if($recur!==false) return([$this->parse($matches[1][0]), $matches[2][0], $recur]);
else return(false);
} else { } else {
$re = '/^([\\'.implode('\\',$this->single_ops).'])(.+)$/'; // single op $re = '/^([\\'.implode('\\',$this->single_ops).'])(.+)$/'; // single op
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){ if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
return([null, $matches[1][0], $this->parse($matches[2][0])]); $recur = $this->parse($matches[2][0]);
if($recur!==false) return([null, $matches[1][0], $recur]);
else return(false);
} else { } else {
$re = '/^([A-Za-z][A-Za-z0-9_]*)$/'; $re1 = '/^([A-Za-z][A-Za-z0-9_]*)\[\"([A-Za-z0-9_]+)\"\]$/'; // arrays with alphanum keys
$re2 = "/^([A-Za-z][A-Za-z0-9_]*)\[\'([A-Za-z0-9_]+)\'\]$/"; // arrays with alphanum keys
if(preg_match($re1, $f, $matches1, PREG_OFFSET_CAPTURE, 0)||preg_match($re2, $f, $matches2, PREG_OFFSET_CAPTURE, 0)){
$array_name = (count($matches1)>0) ? $matches1[1][0] : $matches2[1][0];
$array_key = (count($matches1)>0) ? $matches1[2][0] : $matches2[2][0];
if(array_key_exists($array_name, $this->params) && is_array($this->params[$array_name])) {
if(array_key_exists($array_key, $this->params[$array_name])) {
return($this->parse($this->params[$array_name][$array_key]));
} else {
$this->parse_error = 'PARSING ERROR: Unknown key "'.$array_key.'" for array "'.$array_name.'" ';
return(false);
}
} else {
$this->parse_error = 'PARSING ERROR: Unknown array "'.$array_name.'" ';
return(false);
}
} else {
$re = '/^([A-Za-z][A-Za-z0-9_]*)\[(\d+)\]$/'; // arrays with alphanum keys
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
$array_name = $matches[1][0];
$array_index = $matches[2][0];
if(array_key_exists($array_name, $this->params) && is_array($this->params[$array_name])) {
if(isset($this->params[$array_name][$array_index])) {
return($this->parse($this->params[$array_name][$array_index]));
} else {
$this->parse_error = 'PARSING ERROR: Unknown index "'.$array_index.'" for array "'.$array_name.'" ';
return(false);
}
} else {
$this->parse_error = 'PARSING ERROR: Unknown array "'.$array_name.'" ';
return(false);
}
} else {
$re = '/^([A-Za-z][A-Za-z0-9_]*)$/'; // simple variables
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){ if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
if(array_key_exists($matches[0][0], $this->params)) return($this->parse($this->params[$matches[0][0]])); if(array_key_exists($matches[0][0], $this->params)) return($this->parse($this->params[$matches[0][0]]));
else echo('PARSING ERROR: Unknown expression "'.$matches[0][0].'" '); else {
$this->parse_error = 'PARSING ERROR: Unknown expression "'.$matches[0][0].'" ';
return(false);
}
} else { } else {
$re = '/^\d*(\.\d+)?$/'; // unsigned float or int $re = '/^\d*(\.\d+)?$/'; // unsigned float or int
if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){ if(preg_match($re, $f, $matches, PREG_OFFSET_CAPTURE, 0)){
return($matches[0][0]); return($matches[0][0]);
} else { } else {
echo('PARSING ERROR at '.$f.'<br/>'); $this->parse_error = 'PARSING ERROR at '.$f.'<br/>';
return(false);
}
}
} }
} }
} }