
Sencilla clase desarrollada en PHP basada en el código de dreamvb desarrollado en VB 6.
Como usarla:
include_once('modLex.php');
$Calc = new LexMath;
$Calc->init(); // Inicializa la clase.
Para agregar variables, se escriben de la siguiente forma:
$Calc->AddVar("pi", 3.14159265358979);
$Calc->AddVar("e", 2.71828182845905);
Y finalmente para realizar los cálculos se de realizar de la siguiente forma:
$Calc->Calc("area = 180");
$Calc->Calc("4 * Atn(1)")
$Calc->Calc("(-5 + 3)")
$Calc->Calc("Rnd(8)")
/**
*
* By DreamVB
* Programado en PHP por HACKPRO TM (C) 2008-2010
* Versión: 1.0
* Todos los Derechos Reservados
* ------------------------------------------
* @author Heriberto Mantilla Santamaría
* @version 1.0
*/
// Token Types
define('LERROR', -1);
define('NONE', 0);
define('DELIMITER', 1);
define('DIGIT', 2);
define('LSTRING', 3);
define('VARIABLE', 4);
define('IDENTIFIER', 6);
define('HEXDIGIT', 5);
define('FINISHED', 7);
// Relational
define('GE', 1); // Greator than or equal to
define('NE', 2); // Not equal to
define('LE', 3); // Less than or equal to
// Bitwise
define('cAND', 4);
define('cOR', 5);
// Bitshift
define('shr', 6);
define('shl', 7);
define('cXor', 8);
define('cIMP', 9);
define('cEqv', 11);
// define('cINC', 12);
class LexMath {
var $Str_Ops = 'AND,OR,XOR,MOD,DIV,SHL,SHR,IMP,EQV,NOT';
var $Str_Funcs = 'ABS,ATN,COS,EXP,LOG,LN,RND,ROUND,SGN,SIN,SQR,TAN,SUM,IIF';
// We use this to store variables
var $Token; // Current processing token
var $TOK_TYPE; // Used to idenfiy the tokens
var $Look_Pos; // Current processing char pointer
var $ExprLine; // The Expression line to scan
var $lVarCount;
var $CalclMsg;
var $lVars;
function Abort($code, $aStr = '') {
switch ($code) {
case 0:
$lMsg = 'Variable indefinida [' . $aStr . '] ';
break;
case 1:
$lMsg = 'División por cero';
break;
case 2:
$lMsg = 'Falta paréntesis ")" ';
break;
case 3:
$lMsg = 'Dígito inválido [' . $aStr . '] ';
break;
case 4:
$lMsg = 'Carácter desconocido [' . $aStr . '] ';
break;
case 5:
$lMsg = 'La Variable [' . $aStr . '] es un identificador y no puede usarse.';
break;
case 6:
$lMsg = "Expresión prevista.";
break;
case 7:
$lMsg = 'Valor hexagesimal inválido [0x' . strtoupper($aStr) . '] ';
break;
}
$this->CalclMsg = $lMsg;
$this->Look_Pos = strlen($this->ExprLine) + 1;
}
function AddVar($name, $lValue = 0) {
// Add a new variable along with the variables value.
$this->lVars[$name] = $lValue; // Add variable name and varaible data
$this->lVarCount = $this->lVarCount + 1; // INC variable Counter
}
function Atom() {
$atom = '';
// Check for Digits ,Hexadecimal,Functions, Variables
switch ($this->TOK_TYPE) {
case HEXDIGIT: // Hexadecimal
$Temp = trim($this->strright($this->Token, strlen($this->Token) - 2));
if (strlen($Temp) == 0) {
$this->Abort(6);
return;
} else
if ($this->isHex($Temp) == false) {
$this->Abort(7, $Temp);
return;
} else {
$atom = hexdec("&H" . $Temp);
$this->GetToken();
}
break;
case IDENTIFIER: // Inbuilt Functions
$atom = $this->CallIntFunc($this->Token);
$this->GetToken();
break;
case DIGIT: // Digit const found
if (is_numeric($this->Token) == false) {
$this->Abort(3, $this->Token); // Check we have a real digit
return;
}
$atom = $this->Token; // Return the value
$this->GetToken(); // Get next token
break;
case LERROR: // Expression phase error
$this->Abort(0, $this->Token); // Show error message
break;
return;
case VARIABLE: // Variable found
if ($this->FindVarIdx($this->Token) == -1) {
$this->Abort(0, $this->Token);
return;
}
$atom = $this->GetVarData($this->Token); // Return variable value
$this->GetToken(); // Get next token
break;
}
return $atom;
}
function CallIntFunc($sFunction) {
// ABS,ATN,COS,EXP,LOG,RND,ROUND,SGN,SIN,SQR,TAN,IFF
switch (strtoupper($sFunction)) {
case 'ABS':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = abs($Temp);
$this->PushBack();
break;
case 'ATN':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = atan($Temp);
$this->PushBack();
break;
case 'COS':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = cos($Temp);
$this->PushBack();
break;
case 'EXP':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = exp($Temp);
$this->PushBack();
break;
case 'LOG':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = log10($Temp);
$this->PushBack();
break;
case 'LN':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = log($Temp);
$this->PushBack();
break;
case 'RND':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = $this->Rnd($Temp);
$this->PushBack();
break;
case 'ROUND':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = round($Temp);
$this->PushBack();
break;
case 'SGN':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = $this->Sgn($Temp);
$this->PushBack();
break;
case 'SIN':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = sin($Temp);
$this->PushBack();
break;
case 'SQR':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = sqrt($Temp);
$this->PushBack();
break;
case 'TAN':
$this->GetToken();
$Temp = $this->Exp6();
$CallIntF = tan(Temp);
$this->PushBack();
break;
case 'SUM':
$ArgList = $this->GetArgs();
$Temp = 0;
for ($X = 0; $X < count($ArgList); $X++) {
$Temp = $this->CDbl($Temp) + $this->CDbl($ArgList[$X]);
}
$this->GetToken();
$CallIntF = $Temp;
$this->PushBack();
break;
case 'IIF':
$ArgList = $this->GetArgs();
$CallIntF = $this->IIf($ArgList[0], $ArgList[1], $ArgList[2]);
$this->PushBack();
break;
}
return $CallIntF;
}
function ClearVar() {
$this->lVarCount = 0;
unset($this->lVars); // Resize variable stack
}
function Calc($Expression, $printExpression = false) {
$this->CalclMsg = '';
$this->ExprLine = $Expression; // Store the expression to scan
$this->Look_Pos = 1; // Default state of char pos
$this->GetToken(); // Kick start and Get the first token.
if (($this->TOK_TYPE == FINISHED) or (strlen(trim($Expression)) == 0)) {
return null;
exit;
} else {
$Return = $this->Exp0();
}
if ($printExpression == true) {
$Return = $Expression . ' : ' . $Return;
}
if (strlen($this->CalclMsg) > 0) {
return 'NaN';
} else {
return $Return;
}
}
function Sgn($val) {
return $val == 0 ? 0 : ($val > 0 ? 1 : -1);
}
function Mid($tmp, $start, $length = '') {
$start -= 1;
if (is_string($length) == true) {
$length = strlen($tmp);
}
$str = substr($tmp, $start, $length);
return $str;
}
function strleft($tmp, $nLeft) {
$len = strlen($tmp);
if ($nLeft == 0) {
$str = '';
} else
if ($nLeft < $len) {
$str = $this->Mid($tmp, 1, $nLeft);
}
return $str;
}
function strright($tmp, $nRight) {
$len = strlen($tmp);
if ($nRight == 0) {
$str = '';
} else
if ($nRight < $len) {
$str = $this->Mid($tmp, $len - $nRight + 1, $len);
}
return $str;
}
function CDbl(&$Temp) {
settype($varTemp, 'double');
$varTemp = $Temp;
return $varTemp;
}
function Rnd() {
srand(); // Initialize random-number generator.
do {
$tmp = abs(tan(rand()));
} while (($tmp > "1") || ($tmp < "0"));
$tmp = $this->Mid($tmp, 1, 8);
return $tmp;
}
function IIf($tst, $cmp, $bad) {
return (($tst == $cmp) ? $cmp : $bad);
}
function Exp0() {
// Assignments
if ($this->TOK_TYPE == VARIABLE) {
// Store temp type and token
// we first need to check if the variable name is not an identifier
if ($this->isIdent($this->Token) == true) {
$this->Abort(5, $this->Token);
}
$Tmp_tokType = $this->TOK_TYPE;
$Tmp_Token = $this->Token;
// Locate the variables index
$Var_Idx = $this->FindVarIdx($this->Token);
// If we have an invaild var index -1 we Must add a new variable
if ($Var_Idx == null) {
// Add the new variable
$this->AddVar($this->Token);
// Now get the variable index again
$Var_Idx = $this->FindVarIdx($this->Token);
} else {
$Exp0 = $this->Exp1();
return $Exp0;
}
// Get the next token
$this->GetToken();
if ($this->Token != '=') {
$this->PushBack(); // Move expr pointer back
$this->Token = $Tmp_Token; // Restore temp token
$this->TOK_TYPE = $Tmp_tokType; // Restore temp token type
} else {
// Carry on processing the expression
$this->GetToken();
// Set the variables value
$Temp = $this->Exp1();
$this->SetVar($Var_Idx, $Temp);
$Exp0 = $Temp;
}
}
$Exp0 = $this->Exp1();
return $Exp0;
}
function Exp1() {
// Relational operators
$Relops = chr(GE) . chr(NE) . chr(LE) . '<>=!' . chr(0);
$Exp1 = $this->Exp2();
$op = $this->Token; // Get operator
if (empty($op) == true) {
$rPos = -1;
} else {
$rPos = strpos($Relops, $op); // Check for other ops in token <> =
}
if ($rPos > 0) {
$this->GetToken(); // Get next token
$Temp = $this->Exp2(); // Store temp val
switch ($op) {
case '<': // less {
$Exp1 = $this->CDbl($Exp1) < $this->CDbl($Temp);
break;
case '>': // greator than
$Exp1 = $this->CDbl($Exp1) > $this->CDbl($Temp);
break;
case chr(NE):
$Exp1 = $this->CDbl($Exp1) != $this->CDbl($Temp);
break;
case chr(LE):
$Exp1 = $this->CDbl($Exp1) <= $this->CDbl($Temp);
break;
case chr(GE):
$Exp1 = $this->CDbl($Exp1) >= $this->CDbl($Temp);
break;
case '=': // equal to
$Exp1 = $this->CDbl($Exp1) == $this->CDbl($Temp);
break;
case '!':
$Exp1 = !$this->CDbl($Temp);
break;
}
// op = Token
}
return $Exp1;
}
function Exp2() {
// Add or Subtact two terms
$Exp2 = $this->Exp3();
$op = $this->Token; // Get operator
while (($op == "+") or ($op == "-")) {
$this->GetToken(); // Get next token
$Temp = $this->Exp3(); // Temp value
// Peform the expresion for the operator
switch ($op) {
case '-':
$Exp2 = $this->CDbl($Exp2) - $this->CDbl($Temp);
break;
case '+':
$Exp2 = $this->CDbl($Exp2) + $this->CDbl($Temp);
break;
}
$op = $this->Token;
}
return $Exp2;
}
function Exp3() {
// Multiply or Divide two factors
$Exp3 = $this->Exp4();
$op = $this->Token; // Get operator
while (($op == "*") or ($op == "/") or ($op == "\\") or ($op == "%")) {
$this->GetToken(); // Get next token
$Temp = $this->Exp4(); // Temp value
// Peform the expresion for the operator
switch ($op) {
case '*':
$Exp3 = $this->CDbl($Exp3) * $this->CDbl($Temp);
break;
case '/':
if ($Temp == 0) {
$this->Abort(1);
return;
}
$Exp3 = $this->CDbl($Exp3) / $this->CDbl($Temp);
break;
case "\\":
if ($Temp == 0) {
$this->Abort(1);
return;
}
$Exp3 = intval($this->CDbl($Exp3) / $this->CDbl($Temp));
break;
case '%':
if ($Temp == 0) {
$this->Abort(1);
return;
}
$Exp3 = $this->CDbl($Exp3) % $this->CDbl($Temp);
break;
}
$op = $this->Token;
}
return $Exp3;
}
function Exp4() {
// Bitwise operators ^ | & || &&
$BitWOps = chr(cAND) . chr(cOR) . chr(shl) . chr(shr) . chr(cXor) . chr(cIMP) .
chr(cEqv) . '^|&' . chr(0);
$Exp4 = $this->Exp5();
$op = $this->Token; // Get operator
if (empty($op) == true) {
$rPos = -1;
} else {
$rPos = strpos($BitWOps, $op); // Check for other ops in token <> =
}
if ($rPos === false) {
} else {
$this->GetToken(); // Get next token
$Temp = $this->Exp5(); // Store temp val
switch ($op) {
case '^': // Excompnent
$Exp4 = pow($this->CDbl($Exp4), $this->CDbl($Temp));
break;
case '&':
$Exp4 = $this->CDbl($Exp4) . $this->CDbl($Temp);
break;
case chr(cAND):
$Exp4 = $this->CDbl($Exp4) and $this->CDbl($Temp);
break;
case chr(cOR):
$Exp4 = $this->CDbl($Exp4) or $this->CDbl($Temp);
break;
case chr(shl):
// Bitshift Shift left
$Exp4 = $this->CDbl($Exp4) * (pow(2, $this->CDbl($Temp)));
break;
case chr(shr):
// bitshift right
$Exp4 = $this->CDbl($Exp4) / (pow(2, $this->CDbl($Temp)));
break;
case chr(cXor):
// Xor
$Exp4 = $this->CDbl($Exp4) xor $this->CDbl($Temp);
break;
case chr(cIMP):
// IMP
//$Exp4 = $this->CDbl($Exp4) Imp $this->CDbl($Temp);
break;
case chr(cEqv):
// EQV
//$Exp4 = $this->CDbl($Exp4) Eqv $this->CDbl($Temp);
break;
}
}
return $Exp4;
}
function Exp5() {
$op = '';
// Unary +,-
if (($this->TOK_TYPE == DELIMITER) and (($this->Token == "+") or ($this->Token ==
"-"))) {
$op = $this->Token;
$this->GetToken();
}
$Exp5 = $this->Exp6();
if ($op == '-') {
$Exp5 = -$this->CDbl($Exp5);
}
return $Exp5;
}
function Exp6() {
// Check for Parenthesized expression
if ($this->Token == '(') {
$this->GetToken(); // Get next token
$Exp6 = $this->Exp1();
// Check that we have a closeing bracket
if ($this->Token != ')') {
$this->Abort(2);
return;
}
$this->GetToken(); // Get next token
} else {
$Exp6 = $this->atom();
}
return $Exp6;
}
function FindVarIdx($name) {
// Locate a variables position in the variables array
$idx = null; // Bad position
foreach ($this->lVars as $key => $value) {
if (strtolower($key) == strtolower($name)) {
$idx = $key;
break;
}
}
return $idx;
}
function GetArgs() {
$this->GetToken();
$Count = 0;
$Temp = array();
if ($this->Token != '(') {
return;
}
do {
$this->GetToken();
$Value = $this->Exp1();
$Temp[$Count] = $Value;
$Count += 1;
} while ($this->Token != ")");
$Count = 0;
$Value = 0;
return $Temp;
}
function GetToken() {
$Temp = '';
// This is the main part of the pharser and is used to.
// Identfiy all the tokens been scanned and return th correct token type
// Clear current token info
$this->Token = '';
$this->TOK_TYPE = NONE;
$Exit = false;
if ($this->Look_Pos > strlen($this->ExprLine)) {
$this->TOK_TYPE = FINISHED;
return;
}
// Above exsits the function if we are passed expr len
while (($this->Look_Pos <= strlen($this->ExprLine)) and ($this->isWhite($this->
Mid($this->ExprLine, $this->Look_Pos, 1)) == true)) {
// Skip over white spaces. and stay within the expr len
$this->Look_Pos += 1; // INC
if ($this->Look_Pos > strlen($this->ExprLine)) {
$Exit = true;
break;
}
}
if ($Exit == true) {
return;
}
// Some little test I was doing to do Increment/Decrement operators -- ++
if (($this->Mid($this->ExprLine, $this->Look_Pos, 1) == '+') or ($this->Mid($this->
ExprLine, $this->Look_Pos, 1) == '-')) {
if (($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '+') or ($this->Mid
($this->ExprLine, $this->Look_Pos + 1, 1) == '-')) {
$Temp = $this->Mid($this->ExprLine, 1, $this->Look_Pos - 1);
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '+') {
$dTmp = $this->GetVarData($Temp) + 1;
} else
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '-') {
$dTmp = $this->GetVarData($Temp) - 1;
}
$this->SetVar($this->FindVarIdx($Temp), $dTmp);
$this->Token = $Temp;
return;
}
}
// //
if (($this->Mid($this->ExprLine, $this->Look_Pos, 1) == '&') or ($this->Mid($this->
ExprLine, $this->Look_Pos, 1) == '|')) {
// Bitwise code, I still got some work to do on this yet but it does the ones
// that are listed below fine
switch ($this->Mid($this->ExprLine, $this->Look_Pos, 1)) {
case '&':
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '&') {
$this->Look_Pos += 2;
$this->Token = chr(cAND);
return;
} else {
$this->Look_Pos += 1;
$this->Token = '&';
return;
}
break;
case '|':
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '|') {
$this->Look_Pos += 2;
$this->Token = chr(cOR);
return;
} else {
$this->Look_Pos += 1;
$this->Token = '|';
return;
}
$this->TOK_TYPE = DELIMITER;
break;
}
}
if (($this->Mid($this->ExprLine, $this->Look_Pos, 1) == '<') or ($this->Mid($this->
ExprLine, $this->Look_Pos, 1) == '>')) {
// Check for Relational operators < > <= >= <>
// check for not equal to get first op <
switch ($this->Mid($this->ExprLine, $this->Look_Pos, 1)) {
case '<':
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '>') {
// Not Equal to
$this->Look_Pos += 2;
$this->Token = Chr(NE);
return;
} else
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '=') {
// Less { of equal to
$this->Look_Pos += 2;
$this->Token = chr(LE);
return;
} else
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '<') {
// Bitshift left
$this->Look_Pos += 2;
$this->Token = chr(shl);
return;
} else {
// Less {
$this->Look_Pos += 2;
$this->Token = '<';
return;
}
break;
case '>':
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '=') {
// Greator than or equal to
$this->Look_Pos += 2;
$this->Token = chr(GE);
return;
} else
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == '>') {
$this->Look_Pos += 2;
$this->Token = chr(shr);
return;
} else {
// Greator than
$this->Look_Pos = $this->Look_Pos + 1;
$this->Token = '>';
return;
}
$this->TOK_TYPE = DELIMITER;
break;
}
}
if ($this->IsDelim($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == true) {
// Check if we have a Delimiter ;,+-<>^=(*)/\%
$this->Token = $this->Token . $this->Mid($this->ExprLine, $this->Look_Pos, 1); // Get next char
$this->Look_Pos = $this->Look_Pos + 1; // INC
$this->TOK_TYPE = DELIMITER; // Delimiter Token type
} else
if ($this->isDigit($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == true) {
// See if we are dealing with a Hexadecimal Value
if ($this->Mid($this->ExprLine, $this->Look_Pos + 1, 1) == 'x') {
while ($this->isAlphaNum($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == true) {
$this->Token = $this->Token . $this->Mid($this->ExprLine, $this->Look_Pos, 1);
$this->Look_Pos += 1;
$this->TOK_TYPE = HEXDIGIT;
}
return;
}
// Check if we are dealing with only digits 0 .. 9
while ($this->IsDelim($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == false) {
$this->Token .= $this->Mid($this->ExprLine, $this->Look_Pos, 1); // Get next char
$this->Look_Pos += 1; // INC
if ($this->Look_Pos > strlen($this->ExprLine)) {
break;
}
}
$this->TOK_TYPE = DIGIT; // Digit token type
} else
if ($this->isAlpha($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == true) {
// Check if we have strings Note no string support in this version
// this is only used for variables.
while ($this->IsDelim($this->Mid($this->ExprLine, $this->Look_Pos, 1)) == false) {
$this->Token .= $this->Mid($this->ExprLine, $this->Look_Pos, 1);
$this->Look_Pos += 1; // INC
// tok_type = VARIABLE
$this->TOK_TYPE = LSTRING; // String token type
if ($this->Look_Pos > strlen($this->ExprLine)) {
break;
}
}
} else {
$this->Abort(4, $this->Mid($this->ExprLine, $this->Look_Pos, 1));
$this->TOK_TYPE = FINISHED;
}
if ($this->TOK_TYPE == LSTRING) {
// check for identifiers
if ($this->isIdent($this->Token) == true) {
$OkToken = false;
switch (strtoupper($this->Token)) {
case 'AND':
$this->Token = chr(cAND);
$OkToken = true;
break;
case 'OR':
$this->Token = chr(cOR);
$OkToken = true;
break;
case 'NOT':
$this->Token = '!';
$OkToken = true;
break;
case 'IMP':
$this->Token = chr(cIMP);
$OkToken = true;
break;
case 'EQV':
$this->Token = chr(cEqv);
$OkToken = true;
break;
case 'DIV':
$this->Token = "\\";
$OkToken = true;
break;
case 'MOD':
$this->Token = "%";
$OkToken = true;
break;
case 'XOR':
$this->Token = chr(cXor);
$OkToken = true;
break;
case 'SHL':
$this->Token = chr(shl);
break;
case 'SHR':
$this->Token = chr(shr);
break;
}
if ($OkToken == true) {
return;
}
$this->TOK_TYPE = DELIMITER;
return;
} else
if ($this->IsIdentFunc($this->Token) == true) {
$this->TOK_TYPE = IDENTIFIER;
// GetToken
return;
} else {
$this->TOK_TYPE = VARIABLE;
return;
}
}
}
function GetVarData($name) {
// Return data from a variable stored in the variable stack
return $this->lVars[$name];
}
function init() {
$this->lVarCount = 0;
unset($this->lVars);
$this->lVars = array();
}
function isAlpha($c) {
// Return true if we only have letters a-z A-Z
if ((strtoupper($c) >= "A") and (strtoupper($c) <= "Z")) {
return true;
} else {
return false;
}
}
function isAlphaNum($c) {
return ($this->isDigit($c) or $this->isAlpha($c));
}
function IsDelim($c) {
// Return true if we have a Delimiter
$mystring = ' ;,+-<>^=(*)/\%&|!';
$pos = strpos($mystring, $c);
if ($pos === false) {
$pos = false;
} else {
$pos = true;
}
return $pos;
}
function isDigit($c) {
// Return true when we only have a digit
if (is_numeric($c) == false) {
return false;
}
if (($c >= '0') and ($c <= '9')) {
return true;
} else {
return false;
}
}
function isHex($HexVal) {
for ($X = 1; $X <= strlen($HexVal); $X++) {
$c = $this->Mid($HexVal, $X, 1);
switch (strtoupper($c)) {
case 0:
$isHex = true;
break;
case 1:
$isHex = true;
break;
case 2:
$isHex = true;
break;
case 3:
$isHex = true;
break;
case 4:
$isHex = true;
break;
case 5:
$isHex = true;
break;
case 6:
$isHex = true;
break;
case 7:
$isHex = true;
break;
case 8:
$isHex = true;
break;
case 9:
$isHex = true;
break;
case 'A':
$isHex = true;
break;
case 'B':
$isHex = true;
break;
case 'C':
$isHex = true;
break;
case 'D':
$isHex = true;
break;
case 'E':
$isHex = true;
break;
case 'F':
$isHex = true;
break;
default:
$isHex = false;
break;
}
}
return $isHex;
}
function isIdent($sIdentName) {
$Idents = split(",", $this->Str_Ops);
$IsIdentF = false;
for ($X = 0; $X < count($Idents); $X++) {
if (strtolower($Idents[$X]) == strtolower($sIdentName)) {
$IsIdentF = true;
break;
}
}
$X = 0;
unset($Idents);
return $IsIdentF;
}
function IsIdentFunc($sIdentName) {
$Idents = split(",", $this->Str_Funcs);
$IsIdentF = false;
for ($X = 0; $X < count($Idents); $X++) {
if (strtolower($Idents[$X]) == strtolower($sIdentName)) {
$IsIdentF = true;
break;
}
}
$X = 0;
unset($Idents);
return $IsIdentF;
}
function isWhite($c) {
// Return true if we find a white space.
if (($c == ' ') or ($c == chr(9))) {
return true;
} else {
return false;
}
}
function PushBack() {
$tok_len = strlen($this->Token);
$this->Look_Pos -= $tok_len;
}
function SetVar($vIdx, $lData = 0) {
// Set a variables value, by using the variables index vIdx
$this->lVars[$vIdx] = $lData;
}
}