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-ja.y < prev    next >
Text File  |  2001-04-07  |  2KB  |  122 lines

  1. #
  2. # simple calc 2 (ja)
  3. #
  4. # This file contains Japanese characters (euc-jp) !!!
  5. #
  6.  
  7. class Calcp
  8.  
  9.   prechigh
  10.     nonassoc UMINUS
  11.     left '*' '/'
  12.     left '+' '-'
  13.   preclow
  14.  
  15. rule
  16.  
  17.   target  : exp
  18.           | /* none */ { result = 0 }
  19.  
  20.   exp     : exp '+' exp { result += val[2] }
  21.           | exp '-' exp { result -= val[2] }
  22.           | exp '*' exp { result *= val[2] }
  23.           | exp '/' exp { result /= val[2] }
  24.           | '(' exp ')' { result = val[1] }
  25.           | '-' NUMBER  = UMINUS { result = -val[1] }
  26.           | NUMBER
  27.  
  28. end
  29.  
  30.  
  31. ---- header ----
  32. #
  33. # calc.rb : generated by racc
  34. #
  35.  
  36. ---- inner ----
  37.   
  38.   def parse( str )
  39.     @q = []
  40.  
  41.     while str.size > 0 do
  42.       case str
  43.       when /\A\s+/
  44.       when /\A\d+/
  45.         @q.push [:NUMBER, $&.to_i]
  46.       when /\A.|\n/
  47.         s = $&
  48.         @q.push [s, s]
  49.       end
  50.       str = $'
  51.     end
  52.     @q.push [false, '$']
  53.  
  54.     do_parse
  55.   end
  56.  
  57.   def next_token
  58.     @q.shift
  59.   end
  60.  
  61. ---- footer ----
  62.  
  63. class Nemui < Exception; end
  64.  
  65. parser = Calcp.new
  66. count = 0
  67. scnt  = 0
  68.  
  69. print "\n***********************"
  70. print "\n─╢╣δ▓┌ñ¬╠≥ñ└ñ┴┼┼┬ε2╣µ╡í"
  71. print "\n***********************\n\n"
  72. print "╡óñΩñ┐ñ»ñ╩ñ├ñ┐ñΘQñ≥Ñ┐ÑñÑ╫ñ╖ñ╞ñ═\n"
  73.  
  74. while true do
  75.   print "\n"
  76.   print 'ikutu? > '
  77.   str = gets.chop!
  78.   break if /q/i === str
  79.  
  80.   begin
  81.     val = parser.parse( str )
  82.     print 'kotae! = ', val, "\n"
  83.     scnt += 1
  84.     
  85.     case scnt
  86.     when 5
  87.       print "\n╞»ñ¡ñΓñ╬ñ╟ñ╖ñτñ├ 5▓≤ñΓ╖╫╗╗ñ╖ñ┴ñπñ├ñ┐í¬\n\n"
  88.     when 8
  89.       print "\nñññ├ñ╤ññ╖╫╗╗ñ╣ñδñ≤ñ└ñ═í─\n\n"
  90.     when 9
  91.       print "\nñ═ñ¿í╝ñ├ ñΓñªñ─ñ½ñ∞ñ┐í╝í¬ ñΓñª╡┘ñΓñªñΦí╝\n\n"
  92.     when 10
  93.       print "\nñΓñªñ═ñδñ╬ñ├í¬í¬\n\n"
  94.       raise Nemui, "ñΓñªñ└ñßíú"
  95.     end
  96.  
  97.   rescue ParseError
  98.     case count
  99.     when 0
  100.       print "\n  ñññ╕ñ∩ñδñ├í¬\n"
  101.     when 1
  102.       print "\n  ñΓñªñ├íóñ¬ñ│ñ├ñ┴ñπñªñΦí¬í¬\n"
  103.     when 2
  104.       print "\n  ñΓñª╡÷ñ╖ñ╞ñóñ▓ñ╩ñññ≤ñ└ñ½ñΘñ├í¬í¬í¬\n\n\n"
  105.       sleep 0.5
  106.       print "           ñ¿ñññ├í∙\n\n"
  107.       sleep(1)
  108.       raise
  109.     end
  110.     count += 1
  111.  
  112.   rescue
  113.     print "\n  ñ╡ñΦñ╩ñΘí─\n"
  114.     raise
  115.  
  116.   end
  117.  
  118. end
  119.  
  120. print "\nñ╕ñπñóíóñ▐ñ┐ñ═ñ├\n\n"
  121. sleep 0.5
  122.