home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ruby164.zip / rbemx164.zip / ruby / share / doc / racc-1.3.9 / sample / calc.y < prev    next >
Text File  |  2001-04-07  |  1KB  |  87 lines

  1.  
  2. # simple calc parser
  3.  
  4. class Calcp
  5.  
  6.   prechigh
  7.     nonassoc UMINUS
  8.     left '*' '/'
  9.     left '+' '-'
  10.   preclow
  11.  
  12. rule
  13.  
  14.   target: exp
  15.         | /* none */ { result = 0 }
  16.         ;
  17.  
  18.   exp: exp '+' exp { result += val[2] }
  19.      | exp '-' exp { result -= val[2] }
  20.      | exp '*' exp { result *= val[2] }
  21.      | exp '/' exp { result /= val[2] }
  22.      | '(' exp ')' { result = val[1] }
  23.      | '-' NUMBER  = UMINUS { result = -val[1] }
  24.      | NUMBER
  25.      ;
  26.  
  27. end
  28.  
  29.  
  30. ---- header ----
  31.  
  32. # calc.rb : generated by racc
  33.  
  34. ---- inner ----
  35.   
  36.   def parse( str )
  37.     @q = []
  38.  
  39.     while str.size > 0 do
  40.       case str
  41.       when /\A\s+/o
  42.       when /\A\d+/o
  43.         @q.push [:NUMBER, $&.to_i]
  44.       when /\A.|\n/o
  45.         s = $&
  46.         @q.push [s, s]
  47.       end
  48.       str = $'
  49.     end
  50.     @q.push [false, '$end']
  51.  
  52.     do_parse
  53.   end
  54.  
  55.   def next_token
  56.     @q.shift
  57.   end
  58.  
  59.  
  60. ---- footer ----
  61.  
  62. parser = Calcp.new
  63. count = 0
  64. scnt  = 0
  65.  
  66. puts
  67. puts 'type "Q" to quit.'
  68. puts
  69.  
  70. while true do
  71.   puts
  72.   print '? '
  73.   str = gets.chop!
  74.   break if /q/i === str
  75.  
  76.   begin
  77.     val = parser.parse( str )
  78.     print '= ', val, "\n"
  79.   rescue ParseError
  80.     puts $!
  81.   rescue
  82.     puts 'unexpected error ?!'
  83.     raise
  84.   end
  85.  
  86. end
  87.