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 / hash.y < prev    next >
Text File  |  2001-04-07  |  1KB  |  69 lines

  1. #
  2. # hash.y
  3. #
  4. # converting Hash-like string into (real) Hash
  5. #
  6.  
  7. class HashParser
  8. rule
  9.  
  10. hash    : '{' contents '}'   { result = val[1] }
  11.         | '{' '}'            { result = Hash.new }
  12.          
  13. contents: IDENT '=>' IDENT   # Racc can handle string over 2 bytes.
  14.             {
  15.               result = { val[0] => val[2] }
  16.             }
  17.         | contents ',' IDENT '=>' IDENT
  18.             {
  19.               result[ val[2] ] = val[4]
  20.             }
  21.  
  22. end
  23.  
  24. ---- inner
  25.  
  26.   def parse( str )
  27.     @q = []
  28.  
  29.     until str.empty? do
  30.       case str
  31.       when /\A\s+/
  32.         ;
  33.       when /\A\w+/
  34.         @q.push [:IDENT, $&]
  35.       when /\A=>/
  36.         @q.push ['=>', '=>']
  37.       else
  38.         c = str[0,1]
  39.         @q.push [c, c]
  40.         str = str[1..-1]
  41.         next
  42.       end
  43.       str = $'
  44.     end
  45.     @q.push [false, '$']   # DO NOT FORGET THIS!!!
  46.  
  47.     do_parse
  48.   end
  49.  
  50.   def next_token
  51.     @q.shift
  52.   end
  53.  
  54. ---- footer
  55.  
  56. if $0 == __FILE__ then
  57.   src = <<S
  58. {
  59.   name => MyName,
  60.   id => MyIdent
  61. }
  62. S
  63.   puts 'parsing:'
  64.   print src
  65.   puts
  66.   puts 'result:'
  67.   p HashParser.new.parse( src )
  68. end
  69.