Class: Depager::ActionExtension

Inherits:
Extension show all
Defined in:
lib/depager/plugins/action.rb

Instance Attribute Summary

Attributes inherited from Extension

#d_parser, #g_parser

Instance Method Summary collapse

Methods inherited from Extension

#decorator_name, #extension_registered

Methods included from Utils::CodeGeneratorMethods

#expand_inline_code, #generate_action_decorator_code, #generate_decorator_code, #parse_block

Methods included from Utils::CommonMethods

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

Instance Method Details

#init_extensionObject



2
3
4
5
# File 'lib/depager/plugins/action.rb', line 2

def init_extension
  @action_code = ""
  @on_reduce = []
end

#modify_action_code(code) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/depager/plugins/action.rb', line 37

def modify_action_code(code)
  let_code = "    # empty rule\n"
  unless g_parser.rhs_names.empty?
    vars = g_parser.rhs_names.map do |i|
      /[a-zA-Z][a-zA-Z0-9_]*/.match?(i) ? "_#{i}" : "_"
    end
    let_code = "    #{vars.join(', ')}, = *val\n"
  end
  let_code << code
end

#post_rhsObject



23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/depager/plugins/action.rb', line 23

def post_rhs
  return unless /\s*\{/.match?(g_parser.line)

  @original_line = g_parser.original_line
  @line = g_parser.line
  lineno = g_parser.file.lineno
  code = modify_action_code(parse_block)
  n = g_parser.rules.size - 1
  @action_code <<
    expand_inline_code(code, lineno, wrap: "def _act_#{n} val", delta: 1)
  g_parser.update_context @line
  @on_reduce[n] = ":_act_#{n}"
end

#pre_rule_listObject



12
13
14
15
16
17
18
19
20
21
# File 'lib/depager/plugins/action.rb', line 12

def pre_rule_list
  return unless /^%ACTION\{\s*$/.match?(g_parser.original_line)

  while (line = file.gets)
    break if /^%\}\s*$/.match?(line)

    @action_code << line
  end
  g_parser.update_context ""
end

#term_extensionObject



7
8
9
10
# File 'lib/depager/plugins/action.rb', line 7

def term_extension
  g_parser.outer_code <<
    generate_action_decorator_code(@on_reduce, @action_code)
end