2 require 'voodoo/symbol_tracker'
5 # Generator that does not generate code.
9 @symbol_tracker = SymbolTracker.new
12 def add section, *code
16 # Returns a set of symbols that have been used, but not defined.
18 @symbol_tracker.used_but_undefined_symbols
26 def analyze statements
27 statements.each { |code| analyze_statement code }
30 def analyze_statement code
34 @locals = Set.new @locals
44 @locals = Set.new @locals
57 analyze_expr code[2..-1]
59 analyze_expr code[1..-1]
61 analyze_values [code[1]]
62 analyze_expr code[2..-1]
64 if code[0].to_s[0...2] == "if"
65 analyze_values code[1]
67 analyze code[3] if code.length > 3
69 analyze_values code[1..-1]
78 analyze_values code[1..-1]
82 def analyze_values values
86 elsif x.respond_to?(:[]) && x[0] == :'@'
93 @symbol_tracker.define *symbols
97 syms = Set.new symbols
98 nonlocals = syms - @locals
99 @symbol_tracker.use *nonlocals