home *** CD-ROM | disk | FTP | other *** search
/ ftp.cse.unsw.edu.au / 2014.06.ftp.cse.unsw.edu.au.tar / ftp.cse.unsw.edu.au / pub / doc / languages / perl / nutshell / ch2 / calc1 < prev    next >
Encoding:
Text File  |  1992-10-18  |  1.1 KB  |  73 lines

  1. #!/usr/bin/perl
  2.  
  3. &driver;
  4.  
  5. # First, the driver loop.
  6.  
  7. sub driver {
  8.     while (<>) {          # For each line.
  9.     s/\s+//g;         # Remove all white space, \n included.
  10.     $val = &expr;     # Evaluate the expression.
  11.     die "Expected an operator: $_\n" unless $_ eq "";
  12.     print "$val\n";
  13.     }
  14.     exit;
  15. }
  16.  
  17. # Parse an expression.
  18.  
  19. sub expr {
  20.     local($left, $op, $right);
  21.  
  22.     $left = &term;
  23.     while ($op = &addop) {
  24.     $right = &term;
  25.     if ($op eq '+')
  26.         { $left += $right; }
  27.     else
  28.         { $left -= $right; }
  29.     }
  30.     $left;
  31. }
  32.  
  33. sub addop {
  34.     s/^([+-])// && $1;
  35. }
  36.  
  37. # Parse a term.
  38.  
  39. sub term {
  40.     local($left, $op, $right);
  41.  
  42.     $left = &factor;
  43.     while ($op = &mulop) {
  44.     $right = &factor;
  45.     if ($op eq '*')
  46.         { $left *= $right; }
  47.     else
  48.         { $left /= $right; }
  49.     }
  50.     $left;
  51. }
  52.  
  53. sub mulop {
  54.     s#^([*/])## && $1;
  55. }
  56.  
  57. # Parse a factor.
  58.  
  59. sub factor {
  60.     local($val);
  61.     if (s/^([\d.]+)//) {        # Found a number.
  62.     $val = $1;
  63.     }
  64.     elsif (s/^\(//) {           # Found a parenthesized expr.
  65.     $val = &expr;
  66.     s/^\)// || die "Missing right paren: $_\n";
  67.     }
  68.     else {
  69.     die "Expected a factor: $_";
  70.     }
  71.     $val;
  72. }
  73.