Guest User

Untitled

a guest
May 30th, 2011
173
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. function tokenize($str) {
  3.     $operators = array('(', ')', '+', '-', '*', '/');
  4.     $tokens = array();
  5.     $buffer = '';
  6.     $push = function() use (&$tokens, &$buffer) {
  7.         if(strlen($buffer) > 0) {
  8.             $tokens[] = intval($buffer);
  9.             $buffer = '';
  10.         }
  11.     };
  12.  
  13.     for($i = 0, $l = strlen($str); $i < $l; $i++) {
  14.         if(is_numeric($str[$i])) {
  15.             $buffer .= $str[$i];
  16.         } else if(in_array($str[$i], $operators)) {
  17.             $push();
  18.             $tokens[] = $str[$i];
  19.         }
  20.     }
  21.    
  22.     $push();
  23.    
  24.     return $tokens;
  25. }
  26.  
  27. function expr($tokens) {
  28.     list($v, $tokens) = term($tokens);
  29.    
  30.     while(count($tokens) > 0 && in_array($tokens[0], array('+', '-'))) {
  31.         $t = array_shift($tokens);
  32.         list($w, $tokens) = term($tokens);
  33.        
  34.         if($t == '+') {
  35.             $v += $w;
  36.         } else if($t == '-') {
  37.             $v -= $w;
  38.         }
  39.     }
  40.    
  41.     return array($v, $tokens);
  42. }
  43.  
  44. function term($tokens) {
  45.     list($v, $tokens) = factor($tokens);
  46.    
  47.     while(count($tokens) > 0 && in_array($tokens[0], array('*', '/'))) {
  48.         $t = array_shift($tokens);
  49.         list($w, $tokens) = term($tokens);
  50.        
  51.         if($t == '*') {
  52.             $v *= $w;
  53.         } else if($t == '/') {
  54.             $v /= $w;
  55.         }
  56.     }
  57.    
  58.     return array($v, $tokens);
  59. }
  60.  
  61. function factor($tokens) {
  62.     assert(count($tokens) > 0);
  63.     $t = array_shift($tokens);
  64.    
  65.     if($t == '(') {
  66.         list($v, $tokens) = expr($tokens);
  67.         $t = array_shift($tokens);
  68.         assert($t == ')');
  69.         return array($v, $tokens);
  70.     } else if($t == '-') {
  71.         $number = array_shift($tokens);
  72.         assert(is_numeric($number));
  73.         return array(-$number, $tokens);
  74.     } else {
  75.         assert(is_numeric($t));
  76.         return array($t, $tokens);
  77.     }
  78. }
  79.  
  80. function calc($str) {
  81.     list($value, $tokens) = expr(tokenize($str));
  82.     assert(count($tokens) == 0);
  83.     return $value;
  84. }
  85.  
  86. echo "Ergebnis: " . calc($argv[1]);
RAW Paste Data