File: visitor.rb

package info (click to toggle)
rdtool 0.6.38-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 940 kB
  • sloc: ruby: 8,213; lisp: 387; sh: 33; makefile: 16
file content (86 lines) | stat: -rw-r--r-- 2,297 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
require "rd/version"

module RD
  class Visitor
    SYSTEM_NAME = "RDtool Framework -- Visitor"
    SYSTEM_VERSION = "$Version: "+RD::VERSION+"$"
    VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION)

    def Visitor.version
      VERSION
    end
    
    def visit(tree)
      tree.accept(self)
    end

    def visit_children(element)
      ret = []
      element.each_child do |i|
	ret.push(i.accept(self))
      end
      ret
    end

    def Visitor.define_visit_Nonterminal(element_type)
      eval <<-END_OF_EVAL
      def visit_#{element_type.id2name}(element)
	apply_to_#{element_type.id2name}(element, visit_children(element))
      end
      END_OF_EVAL
    end

    def Visitor.define_visit_Terminal(element_type)
      eval <<-END_OF_EVAL
      def visit_#{element_type.id2name}(element)
	apply_to_#{element_type.id2name}(element)
      end
      END_OF_EVAL
    end

    define_visit_Terminal(:Include)
    define_visit_Terminal(:Verbatim)
    define_visit_Terminal(:MethodListItemTerm)

    define_visit_Nonterminal(:DocumentElement)
    define_visit_Nonterminal(:Headline)
    define_visit_Nonterminal(:TextBlock)
    define_visit_Nonterminal(:ItemList)
    define_visit_Nonterminal(:EnumList)
    define_visit_Nonterminal(:DescList)
    define_visit_Nonterminal(:MethodList)
    define_visit_Nonterminal(:ItemListItem)
    define_visit_Nonterminal(:EnumListItem)
    
    def visit_DescListItem(element)
      term = element.term.accept(self)
      apply_to_DescListItem(element, term, visit_children(element))
    end

    define_visit_Nonterminal(:DescListItemTerm)

    def visit_MethodListItem(element)
      term = element.term.accept(self)
      apply_to_MethodListItem(element, term, visit_children(element))
    end

    define_visit_Terminal(:StringElement)
    define_visit_Terminal(:Verb)

    define_visit_Nonterminal(:Emphasis)
    define_visit_Nonterminal(:Code)
    define_visit_Nonterminal(:Var)
    define_visit_Nonterminal(:Keyboard)
    define_visit_Nonterminal(:Index)
    define_visit_Nonterminal(:Footnote)

    def visit_Reference(element)
      children = visit_children(element)
      begin
	element.result_of_apply_method_of(self, children)
      rescue NameError
	apply_to_Reference(element, children)
      end
    end
  end 
end