Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function tokenize($str) {
- $operators = array('(', ')', '+', '-', '*', '/');
- $tokens = array();
- $buffer = '';
- $push = function() use (&$tokens, &$buffer) {
- if(strlen($buffer) > 0) {
- $tokens[] = intval($buffer);
- $buffer = '';
- }
- };
- for($i = 0, $l = strlen($str); $i < $l; $i++) {
- if(is_numeric($str[$i])) {
- $buffer .= $str[$i];
- } else if(in_array($str[$i], $operators)) {
- $push();
- $tokens[] = $str[$i];
- }
- }
- $push();
- return $tokens;
- }
- function expr($tokens) {
- list($v, $tokens) = term($tokens);
- while(count($tokens) > 0 && in_array($tokens[0], array('+', '-'))) {
- $t = array_shift($tokens);
- list($w, $tokens) = term($tokens);
- if($t == '+') {
- $v += $w;
- } else if($t == '-') {
- $v -= $w;
- }
- }
- return array($v, $tokens);
- }
- function term($tokens) {
- list($v, $tokens) = factor($tokens);
- while(count($tokens) > 0 && in_array($tokens[0], array('*', '/'))) {
- $t = array_shift($tokens);
- list($w, $tokens) = term($tokens);
- if($t == '*') {
- $v *= $w;
- } else if($t == '/') {
- $v /= $w;
- }
- }
- return array($v, $tokens);
- }
- function factor($tokens) {
- assert(count($tokens) > 0);
- $t = array_shift($tokens);
- if($t == '(') {
- list($v, $tokens) = expr($tokens);
- $t = array_shift($tokens);
- assert($t == ')');
- return array($v, $tokens);
- } else if($t == '-') {
- $number = array_shift($tokens);
- assert(is_numeric($number));
- return array(-$number, $tokens);
- } else {
- assert(is_numeric($t));
- return array($t, $tokens);
- }
- }
- function calc($str) {
- list($value, $tokens) = expr(tokenize($str));
- assert(count($tokens) == 0);
- return $value;
- }
- echo "Ergebnis: " . calc($argv[1]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement