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 / src / build
Text File  |  2001-04-07  |  7KB  |  329 lines

  1. #!/usr/local/bin/ruby
  2.  
  3. require 'amstd/must'
  4.  
  5. require 'racc/info'
  6. require 'racc/grammer'
  7. require 'racc/state'
  8. require 'racc/output'
  9.  
  10.  
  11. def openread( fn )
  12.   fn = File.expand_path( fn )
  13.   f = File.open( fn )
  14.   ret = f.read
  15.   f.close
  16.   ret
  17. end
  18.  
  19. module Racc
  20.  
  21.  
  22. class LALRstate
  23.   def sr_conflict( *args )
  24.     bug! 'sr conflict in build'
  25.   end
  26.   def rr_conflict( *args )
  27.     bug! 'sr conflict in build'
  28.   end
  29. end
  30.     
  31. class Compiler
  32.  
  33.   attr :ruletable
  34.   attr :symboltable
  35.   attr :statetable
  36.  
  37.   def filename() '(build)' end
  38.  
  39.   def debug_parser() @dflag end
  40.   def convert_line() true end
  41.   def omit_action()  true end
  42.   def result_var()   true end
  43.  
  44.   def debug()   false end
  45.   def d_parse() false end
  46.   def d_rule()  false end
  47.   def d_token() false end
  48.   def d_state() false end
  49.   def d_la()    false end
  50.   def d_prec()  false end
  51.  
  52.  
  53.   def r( targ, symlist, act )
  54.     targ = @symboltable.get( targ ) if targ
  55.  
  56.     symlist.collect! do |i|
  57.       bug! 'nil in symlist' unless i
  58.       @symboltable.get(i)
  59.     end
  60.     act.sub!( /\A\s*\n/, '' )
  61.     act.sub!( /\s+\z/, '' )
  62.  
  63.     /:(\d+)(?:\z|:)/ === caller(1)[0]
  64.     lineno = $1.to_i + 1
  65.     symlist.push UserAction.new( act, lineno )
  66.  
  67.     @ruletable.register_rule( targ, symlist )
  68.   end
  69.  
  70.  
  71.   def build( debugflag )
  72.     @dflag = debugflag
  73.  
  74.     @symboltable = SymbolTable.new( self )
  75.     @ruletable   = RuleTable.new( self )
  76.     @statetable  = StateTable.new( self )
  77.  
  78. ############
  79.     # 1
  80.     r :xclass, [ :XCLASS, :class, :params, :XRULE, :rules, :XEND ], %{
  81.       @ruletable.end_register_rule
  82.     }
  83. ############
  84.     r :class, [ :rubyconst ], %{
  85.       @class_name = val[0]
  86.     }
  87.     r nil, [ :rubyconst, '<', :rubyconst ], %{
  88.       @class_name = val[0]
  89.       @super_class = val[2]
  90.     }
  91. ############
  92.     r :rubyconst, [ :XSYMBOL ], %{
  93.       result = result.id2name
  94.     }
  95.     r nil, [ :rubyconst, ':', ':', :XSYMBOL ], %{
  96.       result << '::' << val[3].id2name
  97.     }
  98. ############
  99.     # 2
  100.     r :params, [], ''
  101.     # 3
  102.     r nil, [ :params, :param_seg ], ''
  103. ############
  104.     # 4
  105.     r :param_seg, [ :XCONV, :convdefs, :XEND ], %{
  106.       @symboltable.end_register_conv
  107.     }
  108.     # 5
  109.     r nil, [ :xprec ], ''
  110.     # 6
  111.     r nil, [ :XSTART, :symbol ], %{
  112.       @ruletable.register_start val[1]
  113.     }
  114.     # 7
  115.     r nil, [ :XTOKEN, :symbol_list ], %{
  116.       @symboltable.register_token val[1]
  117.     }
  118.     # 8
  119.     r nil, [ :XOPTION, :bare_symlist ], %{
  120.       val[1].each do |s|
  121.         @ruletable.register_option s.to_s
  122.       end
  123.     }
  124.     r nil, [ :XEXPECT, :DIGIT ], %{
  125.       @ruletable.expect val[1]
  126.     }
  127. ############
  128.     # 7
  129.     r :convdefs, [ :symbol, :STRING ], %{
  130.       @symboltable.register_conv( val[0], val[1] )
  131.     }
  132.     # 8
  133.     r nil, [ :convdefs, :symbol, :STRING ], %{
  134.       @symboltable.register_conv( val[1], val[2] )
  135.     }
  136. ############
  137.     # 9
  138.     r :xprec, [ :XPRECHIGH, :preclines, :XPRECLOW ], %{
  139.       @symboltable.end_register_prec( true )
  140.     }
  141.     # 10
  142.     r nil, [ :XPRECLOW, :preclines, :XPRECHIGH ], %{
  143.       @symboltable.end_register_prec( false )
  144.     }
  145. ############
  146.     # 11
  147.     r :preclines, [ :precline ], ''
  148.     # 12
  149.     r nil, [ :preclines, :precline ], ''
  150. ############
  151.     # 13
  152.     r :precline, [ :XLEFT, :symbol_list ], %{
  153.       @symboltable.register_prec( :Left, val[1] )
  154.     }
  155.     # 14
  156.     r nil, [ :XRIGHT, :symbol_list ], %{
  157.       @symboltable.register_prec( :Right, val[1] )
  158.     }
  159.     # 15
  160.     r nil, [ :XNONASSOC, :symbol_list ], %{
  161.       @symboltable.register_prec( :Nonassoc, val[1] )
  162.     }
  163. ############
  164.     # 16
  165.     r :symbol_list, [ :symbol ], %{
  166.       result = val
  167.     }
  168.     # 17
  169.     r nil, [ :symbol_list, :symbol ], %{
  170.       result.push val[1]
  171.     }
  172.     r nil, [ :symbol_list, '|' ], ''
  173. ############
  174.     # 18
  175.     r :symbol, [ :XSYMBOL ], %{
  176.       result = @symboltable.get( result )
  177.     }
  178.     # 19
  179.     r nil,    [ :STRING ], %{
  180.       result = @symboltable.get( eval '"' + val[0] + '"' )
  181.     }
  182. ############
  183.     # 20
  184.     r :rules, [ :rules_core ], %{
  185.       unless result.empty? then
  186.         @ruletable.register_rule_from_array result
  187.       end
  188.     }
  189.     # 21
  190.     r nil, [], ''
  191. ############
  192.     # 22
  193.     r :rules_core, [ :symbol ], %{
  194.       result = val
  195.     }
  196.     # 23
  197.     r nil,         [ :rules_core, :rule_item ], %{
  198.       result.push val[1]
  199.     }
  200.     # 24
  201.     r nil,         [ :rules_core, ';' ], %{
  202.       unless result.empty? then
  203.         @ruletable.register_rule_from_array result
  204.       end
  205.       result.clear
  206.     }
  207.     # 25
  208.     r nil,         [ :rules_core, ':' ], %{
  209.       pre = result.pop
  210.       unless result.empty? then
  211.         @ruletable.register_rule_from_array result
  212.       end
  213.       result = [pre]
  214.     }
  215. ############
  216.     # 26
  217.     r :rule_item, [ :symbol ], ''
  218.     # 27
  219.     r nil,        [ '|' ], %{
  220.       result = OrMark.new( @scanner.lineno )
  221.     }
  222.     # 28
  223.     r nil,        [ '=', :symbol ], %{
  224.       result = Prec.new( val[1], @scanner.lineno )
  225.     }
  226.     # 29
  227.     r nil,        [ :ACTION ], %{
  228.       result = UserAction.new( *result )
  229.     }
  230. ############
  231.     r :bare_symlist, [ :XSYMBOL ], %{
  232.       result = [ result.id2name ]
  233.     }
  234.     r nil,           [ :bare_symlist, :XSYMBOL ], %{
  235.       result.push val[1].id2name
  236.     }
  237. ############
  238.  
  239.     @ruletable.init
  240.     @statetable.init
  241.     @statetable.determine
  242.  
  243.     File.open( 'raccp.rb', 'w' ) do |f|
  244.       f.write <<'HEADER_END'
  245. #
  246. # raccp.rb
  247. #
  248. #   Copyright (c) 1999-2001 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
  249. #
  250. #   This program is free software.
  251. #   You can distribute/modify this program under the terms of
  252. #   the GNU Lesser General Public License version 2.
  253. #
  254.  
  255. require 'racc/parser'
  256. require 'racc/raccs'
  257. require 'racc/ucodep'
  258.  
  259.  
  260. module Racc
  261.  
  262.   class RaccParser < Parser
  263.  
  264.     def initialize( racc )
  265.       @yydebug     = racc.d_parse && Racc_debug_parser
  266.       @ruletable   = racc.ruletable
  267.       @symboltable = racc.symboltable
  268.  
  269.       @class_name = nil
  270.       @super_class = nil
  271.     end
  272.  
  273.     attr :class_name
  274.     attr :super_class
  275.  
  276.     def parse( str )
  277.       @scanner = RaccScanner.new( str )
  278.       @scanner.debug = @yydebug
  279.  
  280.       do_parse
  281.     end
  282.  
  283.  
  284.     private
  285.  
  286.     def next_token
  287.       @scanner.scan
  288.     end
  289.  
  290.     def on_error( tok, val, _values )
  291.       if val.respond_to? :id2name then
  292.         v = val.id2name
  293.       elsif String === val then
  294.         v = val
  295.       else
  296.         v = val.inspect
  297.       end
  298.       raise ParseError, "#{@scanner.lineno}: unexpected token '#{v}'"
  299.     end
  300.  
  301. HEADER_END
  302.       fmt = CodeGenerator.new( self )
  303.       fmt.output( f )
  304.       f.write <<'FOOTER_END'
  305.   end   # class RaccParser
  306.  
  307. end   # module Racc
  308. FOOTER_END
  309.     end
  310.  
  311.     ver = VerboseOutputter.new( self )
  312.     File.open( 'b.output', 'w' ) do |f|
  313.       ver.output( f )
  314.     end
  315.   end
  316.  
  317. end
  318.  
  319. end
  320.  
  321.  
  322. de = false
  323. ARGV.each do |i|
  324.   case i
  325.   when '-g' then de = true
  326.   end
  327. end
  328. Racc::Compiler.new.build de
  329.