Class: Depager::ExtensionGenerator

Inherits:
Generator
  • Object
show all
Defined in:
lib/depager.rb

Direct Known Subclasses

LALR::ExtensionGenerator

Constant Summary

Constants inherited from Generator

Generator::TEMPLATES_DIR

Instance Attribute Summary collapse

Attributes inherited from Generator

#d_parser, #decorators, #g_parser, #inner_code, #options, #outer_code, #parsing_method, #requirements, #setup_code

Instance Method Summary collapse

Methods inherited from Generator

#generate_code, #parse_block, #parse_common, #parse_prec

Methods included from Utils::CommonMethods

#error_exit, #error_message, #expanded_code_delimiter, #file, #full_target_name, #input_path, #inspect, #target_name, #target_namespace, #warning

Constructor Details

#initialize(d_parser) ⇒ ExtensionGenerator

Returns a new instance of ExtensionGenerator.



486
487
488
489
# File 'lib/depager.rb', line 486

def initialize(d_parser)
  super
  @slaves = {}
end

Instance Attribute Details

#slavesObject

Returns the value of attribute slaves.



484
485
486
# File 'lib/depager.rb', line 484

def slaves
  @slaves
end

Instance Method Details

#master_code_templateObject



545
# File 'lib/depager.rb', line 545

def master_code_template; end

#parseObject



491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
# File 'lib/depager.rb', line 491

def parse
  until file.eof?
    line = file.gets
    case line
    when %r{^%hook\s+([\w \t]+?)(/((?:[^/\\]+|\\.)+)/(\s+skip)?)?\s*$}
      hooks = $1.split
      @banner = hooks.join(",")
      @do_parse_re   = $3
      @do_parse_skip = $4

      parts = hooks.map do |i|
        error_exit "Unknown hook: #{i}" unless g_parser.hook_name? i
        i.split("_").map(&:capitalize).join
      end
      target_name = "#{d_parser.target_namespace}::#{parts.join}#{slaves.size}::Parser"
      @slaves[target_name] = hooks
      @outer_code << parse_hook(target_name)
    when /^%%\s*$/
      @outer_code << parse_block(raw: true)
    else
      parse_common(line)
    end
  end
  generate_code master_code_template
end

#parse_hook(target_name) ⇒ Object



517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
# File 'lib/depager.rb', line 517

def parse_hook(target_name)
  inner = ""
  precs = []
  @slave_mixins = @mixins.dup
  until file.eof?
    line = file.gets
    case line
    when /^%banner\s*'(([^'\\]+|\\.)*)'\s*$/
      @banner = $1
    when /^%inner\s*\{\s*$/
      inner = parse_block
    when /^%mixin\s*(.+?)\s*(\((.+)\)\s*)?$/
      @slave_mixins << $1
      @requirements.push $3 if $3
    when /^%prec\s*(.*?)\s*$/
      precs = parse_prec
    when /^%%\s*$/
      g_parser.parse(target_name, precs, @extensions, @options)
      g_parser.inner_code << inner
      return generate_code slave_code_template
    else
      warning "syntax error(declaration).\n> #{line}", file.lineno
    end
  end
end

#slave_code_templateObject



543
# File 'lib/depager.rb', line 543

def slave_code_template; end