/
www
/
wwwroot
/
alo88.autos
/
wp-content
/
plugins
/
wp-content-crawler
/
app
/
vendor
/
mossadal
/
math-parser
/
src
/
MathParser
/
Lexing
/
Upload File
HOME
<?php /* * Short description * * Long description * * @package Lexical analysis * @author Frank Wikström <frank@mossadal.se> * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; /** * Lexer capable of recognizing all standard mathematical expressions. * * Subclass of the generic Lexer, with TokenDefinition patterns for * numbers, elementary functions, arithmetic operations and variables. * * ### Recognized tokens * * `/\~?\d+/` matching integers matching * `/sqrt/` matching square root function * `/round/` matching rouding function * `/ceil/` matching rounding up function * `/floor/` matching rounding down function * `/sinh/` matching hyperbolic sine * `/cosh/` matching hyperbolic cosine * `/tanh/` matching hyperbolic tangent * `/coth/` matching hyperbolic cotangent * `/sind/` matching sine (argument in degrees) * `/cosd/` matching cosine (argument in degrees) * `/tand/` matching tangent (argument in degrees) * `/cotd/` matching cotangent (argument in degrees) * `/sin/` matching sine * `/cos/` matching cosine * `/tan/` matching tangent * `/cot/` matching cotangent * `/arsinh|arcsinh|asinh/` matching inverse hyperbolic sine * `/arcosh|arccosh|acosh/` matching inverse hyperbolic cosine * `/artanh|arctanh|atanh/` matching inverse hyperbolic tangent * `/arcoth|arccoth|acoth/` matching inverse hyperbolic cotangent * `/arcsin|asin/` matching inverse sine * `/arccos|acos/` matching inverse cosine * `/arctan|atan/` matching inverse tangent * `/arccot|acot/` matching inverse cotangent * `/exp/` matching exponential function * `/log10|lg/` matching logarithm (base 10) * `/log|ln/` matching natural logarithm * `/abs/` matching absolute value * `/sgn/` matching signum function * `/\(/` matching opening parenthesis (both as delimiter and function evaluation) * `/\)/` matching closing parenthesisis (both as delimiter and function evaluation) * `/\+/` matching + for addition (or unary +) * `/\-/` matching - for subtraction (or unary -) * `/\* /` matching * for multiplication * `/\//` matching / for division * `/\^/` matching ^ for exponentiation * `/pi/` matching constant pi * `/e/` matching constant e * `/[a-zA-Z]/` matching variables (note that we only allow single letter identifiers, * this improves parsing of implicit multiplication) * `/\n/` matching newline * `/\s+/` matching whitespace */ class StdMathLexer extends Lexer { public function __construct() { $this->add(new TokenDefinition('/\d+[,\.]\d+(e[+-]?\d+)?/', TokenType::RealNumber)); $this->add(new TokenDefinition('/\d+/', TokenType::PosInt)); $this->add(new TokenDefinition('/sqrt/', TokenType::FunctionName)); $this->add(new TokenDefinition('/round/', TokenType::FunctionName)); $this->add(new TokenDefinition('/ceil/', TokenType::FunctionName)); $this->add(new TokenDefinition('/floor/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sinh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cosh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tanh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/coth/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sind/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cosd/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tand/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cotd/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sin/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cos/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tan/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cot/', TokenType::FunctionName)); $this->add(new TokenDefinition('/arsinh|arcsinh|asinh/', TokenType::FunctionName, 'arsinh')); $this->add(new TokenDefinition('/arcosh|arccosh|acosh/', TokenType::FunctionName, 'arcosh')); $this->add(new TokenDefinition('/artanh|arctanh|atanh/', TokenType::FunctionName, 'artanh')); $this->add(new TokenDefinition('/arcoth|arccoth|acoth/', TokenType::FunctionName, 'arcoth')); $this->add(new TokenDefinition('/arcsin|asin/', TokenType::FunctionName, 'arcsin')); $this->add(new TokenDefinition('/arccos|acos/', TokenType::FunctionName, 'arccos')); $this->add(new TokenDefinition('/arctan|atan/', TokenType::FunctionName, 'arctan')); $this->add(new TokenDefinition('/arccot|acot/', TokenType::FunctionName, 'arccot')); $this->add(new TokenDefinition('/exp/', TokenType::FunctionName)); $this->add(new TokenDefinition('/log10|lg/', TokenType::FunctionName, 'lg')); $this->add(new TokenDefinition('/log/', TokenType::FunctionName, 'log')); $this->add(new TokenDefinition('/ln/', TokenType::FunctionName, 'ln')); $this->add(new TokenDefinition('/abs/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sgn/', TokenType::FunctionName)); $this->add(new TokenDefinition('/\(/', TokenType::OpenParenthesis)); $this->add(new TokenDefinition('/\)/', TokenType::CloseParenthesis)); $this->add(new TokenDefinition('/\+/', TokenType::AdditionOperator)); $this->add(new TokenDefinition('/\-/', TokenType::SubtractionOperator)); $this->add(new TokenDefinition('/\*/', TokenType::MultiplicationOperator)); $this->add(new TokenDefinition('/\//', TokenType::DivisionOperator)); $this->add(new TokenDefinition('/\^/', TokenType::ExponentiationOperator)); // Postfix operators $this->add(new TokenDefinition('/\!\!/', TokenType::SemiFactorialOperator)); $this->add(new TokenDefinition('/\!/', TokenType::FactorialOperator)); $this->add(new TokenDefinition('/pi/', TokenType::Constant)); $this->add(new TokenDefinition('/e/', TokenType::Constant)); $this->add(new TokenDefinition('/NAN/', TokenType::Constant)); $this->add(new TokenDefinition('/INF/', TokenType::Constant)); $this->add(new TokenDefinition('/[a-zA-Z]/', TokenType::Identifier)); $this->add(new TokenDefinition('/\n/', TokenType::Terminator)); $this->add(new TokenDefinition('/\s+/', TokenType::Whitespace)); } }