adding support for comparisons and strings in formulas

git-svn-id: https://svn.php.net/repository/pear/packages/Spreadsheet_Excel_Writer/trunk@118238 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Xavier Noguer Gallego 2003-02-26 22:52:34 +00:00
parent befca62210
commit c3402eafb9
1 changed files with 141 additions and 5 deletions

View File

@ -62,6 +62,31 @@ define('SPREADSHEET_EXCEL_WRITER_CLOSE',")");
*/ */
define('SPREADSHEET_EXCEL_WRITER_COMA',","); define('SPREADSHEET_EXCEL_WRITER_COMA',",");
/**
* @const SPREADSHEET_EXCEL_WRITER_GT token identifier for character ">"
*/
define('SPREADSHEET_EXCEL_WRITER_GT',">");
/**
* @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<"
*/
define('SPREADSHEET_EXCEL_WRITER_LT',"<");
/**
* @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<="
*/
define('SPREADSHEET_EXCEL_WRITER_LE',"<=");
/**
* @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">="
*/
define('SPREADSHEET_EXCEL_WRITER_GE',">=");
/**
* @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "="
*/
define('SPREADSHEET_EXCEL_WRITER_EQ',"=");
require_once('PEAR.php'); require_once('PEAR.php');
@ -503,6 +528,10 @@ class Parser extends PEAR
{ {
return($this->_convertNumber($token)); return($this->_convertNumber($token));
} }
elseif(preg_match("/^\"[^\"]{0,255}\"$/", $token))
{
return($this->_convertString($token));
}
// match references like A1 // match references like A1
elseif(preg_match("/^([A-I]?[A-Z])(\d+)$/",$token)) elseif(preg_match("/^([A-I]?[A-Z])(\d+)$/",$token))
{ {
@ -550,7 +579,7 @@ class Parser extends PEAR
* Convert a number token to ptgInt or ptgNum * Convert a number token to ptgInt or ptgNum
* *
* @access private * @access private
* @param mixed $num an integer or double for conersion to its ptg value * @param mixed $num an integer or double for conversion to its ptg value
*/ */
function _convertNumber($num) function _convertNumber($num)
{ {
@ -568,6 +597,19 @@ class Parser extends PEAR
} }
} }
/**
* Convert a string token to ptgStr
*
* @access private
* @param string $string A string for conversion to its ptg value
*/
function _convertString($string)
{
// chop away beggining and ending quotes
$string = substr($string, 1, strlen($string) - 2);
return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string;
}
/** /**
* Convert a function to a ptgFunc or ptgFuncVarV depending on the number of * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of
* args that it takes. * args that it takes.
@ -978,6 +1020,27 @@ class Parser extends PEAR
case SPREADSHEET_EXCEL_WRITER_COMA: case SPREADSHEET_EXCEL_WRITER_COMA:
return($token); return($token);
break; break;
case SPREADSHEET_EXCEL_WRITER_GT:
if ($this->_lookahead == '=') { // it's a GE token
break;
}
return($token);
break;
case SPREADSHEET_EXCEL_WRITER_LT:
if ($this->_lookahead == '=') { // it's a LE token
break;
}
return($token);
break;
case SPREADSHEET_EXCEL_WRITER_GE:
return($token);
break;
case SPREADSHEET_EXCEL_WRITER_LE:
return($token);
break;
case SPREADSHEET_EXCEL_WRITER_EQ:
return($token);
break;
default: default:
// if it's a reference // if it's a reference
if(eregi("^[A-I]?[A-Z][0-9]+$",$token) and if(eregi("^[A-I]?[A-Z][0-9]+$",$token) and
@ -1011,10 +1074,16 @@ class Parser extends PEAR
{ {
return($token); return($token);
} }
// If it's a number
elseif(is_numeric($token) and !is_numeric($token.$this->_lookahead)) elseif(is_numeric($token) and !is_numeric($token.$this->_lookahead))
{ {
return($token); return($token);
} }
// If it's a string (of maximum 255 characters)
elseif(ereg("^\"[^\"]{0,255}\"$",$token))
{
return($token);
}
// if it's a function call // if it's a function call
elseif(eregi("^[A-Z0-9À-Ü\.]+$",$token) and ($this->_lookahead == "(")) elseif(eregi("^[A-Z0-9À-Ü\.]+$",$token) and ($this->_lookahead == "("))
{ {
@ -1036,12 +1105,72 @@ class Parser extends PEAR
$this->_formula = $formula; $this->_formula = $formula;
$this->_lookahead = $formula{1}; $this->_lookahead = $formula{1};
$this->_advance(); $this->_advance();
$this->_parse_tree = $this->_expression(); $this->_parse_tree = $this->_condition(); //$this->_expression();
if($this->isError($this->_parse_tree)) { if($this->isError($this->_parse_tree)) {
return($this->_parse_tree); return($this->_parse_tree);
} }
} }
/**
* It parses a condition. It assumes the following rule:
* Cond -> Expr [(">" | "<") Expr]
*
* @access private
* @return mixed The parsed ptg'd tree
*/
function _condition()
{
$result = $this->_expression();
if($this->isError($result)) {
return $result;
}
if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT)
{
$this->_advance();
$result2 = $this->_expression();
if($this->isError($result2)) {
return $result2;
}
$result = $this->_createTree('ptgLT', $result, $result2);
}
elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT)
{
$this->_advance();
$result2 = $this->_expression();
if($this->isError($result2)) {
return $result2;
}
$result = $this->_createTree('ptgGT', $result, $result2);
}
elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE)
{
$this->_advance();
$result2 = $this->_expression();
if($this->isError($result2)) {
return $result2;
}
$result = $this->_createTree('ptgLE', $result, $result2);
}
elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE)
{
$this->_advance();
$result2 = $this->_expression();
if($this->isError($result2)) {
return $result2;
}
$result = $this->_createTree('ptgGE', $result, $result2);
}
elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ)
{
$this->_advance();
$result2 = $this->_expression();
if($this->isError($result2)) {
return $result2;
}
$result = $this->_createTree('ptgEQ', $result, $result2);
}
return $result;
}
/** /**
* It parses a expression. It assumes the following rule: * It parses a expression. It assumes the following rule:
* Expr -> Term [("+" | "-") Term] * Expr -> Term [("+" | "-") Term]
@ -1051,6 +1180,13 @@ class Parser extends PEAR
*/ */
function _expression() function _expression()
{ {
// If it's a string return a string node
if (ereg("^\"[^\"]{0,255}\"$", $this->_current_token))
{
$result = $this->_current_token;
$this->_advance();
return($result);
}
$result = $this->_term(); $result = $this->_term();
if($this->isError($result)) { if($this->isError($result)) {
return($result); return($result);
@ -1148,7 +1284,7 @@ class Parser extends PEAR
if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN)
{ {
$this->_advance(); // eat the "(" $this->_advance(); // eat the "("
$result = $this->_parenthesizedExpression();//$this->_expression(); $result = $this->_parenthesizedExpression();
if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) {
return($this->raiseError("')' token expected.")); return($this->raiseError("')' token expected."));
} }
@ -1222,14 +1358,14 @@ class Parser extends PEAR
else { else {
return($this->raiseError("Sintactic error: coma expected $num_args")); return($this->raiseError("Sintactic error: coma expected $num_args"));
} }
$result2 = $this->_expression(); $result2 = $this->_condition(); //$this->_expression();
if($this->isError($result2)) { if($this->isError($result2)) {
return($result2); return($result2);
} }
$result = $this->_createTree('arg', $result, $result2); $result = $this->_createTree('arg', $result, $result2);
} }
else { else {
$result2 = $this->_expression(); $result2 = $this->_condition(); //$this->_expression();
if($this->isError($result2)) { if($this->isError($result2)) {
return($result2); return($result2);
} }