furnace 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011-2012 Peter Zotov <whitequark@whitequark.org>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a
4
+ copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included
12
+ in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,16 @@
1
+ module Furnace
2
+ module Code
3
+ class NonterminalToken < Token
4
+ attr_reader :children
5
+
6
+ def initialize(origin, children, options={})
7
+ super(origin, options)
8
+ @children = children.compact
9
+ end
10
+
11
+ def to_text
12
+ children.map(&:to_text).join
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Furnace
2
+ module Code
3
+ class SeparatedToken < NonterminalToken
4
+ def text_between
5
+ ""
6
+ end
7
+
8
+ def to_text
9
+ "#{text_before}#{children.map(&:to_text).join(text_between)}#{text_after}"
10
+ end
11
+
12
+ def to_structure(options={})
13
+ structurize "#{text_before} #{([text_between] * 3).join(" ")} #{text_after}", options
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Furnace
2
+ module Code
3
+ class SurroundedToken < NonterminalToken
4
+ def text_before
5
+ ""
6
+ end
7
+
8
+ def text_after
9
+ ""
10
+ end
11
+
12
+ def to_text
13
+ "#{text_before}#{children.map(&:to_text).join}#{text_after}"
14
+ end
15
+
16
+ def to_structure(options={})
17
+ structurize "#{text_before} ... #{text_after}", options
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Furnace
2
+ module Code
3
+ class TerminalToken < Token
4
+ def to_structure(options={})
5
+ structurize to_text, options
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,73 @@
1
+ module Furnace
2
+ module Code
3
+ class Token
4
+ attr_reader :origin
5
+
6
+ def initialize(origin, options={})
7
+ @origin, @options = origin, options
8
+ @waiters = []
9
+ end
10
+
11
+ def self.type
12
+ @type ||= name.sub(/^.*::/, '').sub(/Token$/, '').to_sym
13
+ end
14
+
15
+ def type
16
+ self.class.type
17
+ end
18
+
19
+ def subscribe(proc)
20
+ @waiters << proc
21
+ end
22
+
23
+ def unsubscribe(proc)
24
+ @waiters.delete proc
25
+ end
26
+
27
+ def to_text
28
+ raise "Reimplement Token#to_text in a subclass"
29
+ end
30
+
31
+ def to_structure(options={})
32
+ structurize nil, options
33
+ end
34
+
35
+ protected
36
+
37
+ def indent(code, options)
38
+ unless code.empty?
39
+ code.to_s.gsub(/^/, (options[:indent_with] || ' ') * (options[:level] || 1))
40
+ else
41
+ ""
42
+ end
43
+ end
44
+
45
+ def structurize(comment, options)
46
+ options = { level: 0 }.merge(options)
47
+
48
+ structure = indent(type, options)
49
+
50
+ if comment
51
+ structure = structure.ljust(options[:describe_at] || 50)
52
+
53
+ if comment =~ /^\s+$/
54
+ structure += " <whitespace>"
55
+ else
56
+ structure += " ; #{comment.gsub(%r{\/\*.*?\*\/}, '').
57
+ gsub(/[ \t]+/, ' ').gsub("\n", '')}"
58
+ end
59
+ end
60
+
61
+ structure += "\n"
62
+
63
+ if @children
64
+ structure += @children.map do |child|
65
+ child.to_structure(options.merge(:level => options[:level] + 1))
66
+ end.join
67
+ end
68
+
69
+ structure
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,10 @@
1
+ require "set"
2
+
3
+ require "furnace/base"
4
+
5
+ require "furnace/code/token"
6
+ require "furnace/code/terminal_token"
7
+ require "furnace/code/nonterminal_token"
8
+ require "furnace/code/surrounded_token"
9
+ require "furnace/code/separated_token"
10
+ require "furnace/code/newline_token"
@@ -1,3 +1,3 @@
1
1
  module Furnace
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
data/lib/furnace.rb CHANGED
@@ -2,6 +2,7 @@ require "furnace/version"
2
2
 
3
3
  require "furnace/ast"
4
4
  require "furnace/cfg"
5
+ require "furnace/code"
5
6
 
6
7
  require "furnace/anf/node"
7
8
  require "furnace/anf/edge"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: furnace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-17 00:00:00.000000000 Z
12
+ date: 2012-04-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Furnace is a static code analysis framework for dynamic languages, aimed
15
15
  at efficient type and behavior inference.
@@ -23,6 +23,7 @@ files:
23
23
  - .gitignore
24
24
  - .rvmrc
25
25
  - Gemfile
26
+ - LICENSE
26
27
  - Rakefile
27
28
  - bin/furnace
28
29
  - furnace.gemspec
@@ -46,6 +47,12 @@ files:
46
47
  - lib/furnace/cfg/edge.rb
47
48
  - lib/furnace/cfg/graph.rb
48
49
  - lib/furnace/cfg/node.rb
50
+ - lib/furnace/code.rb
51
+ - lib/furnace/code/nonterminal_token.rb
52
+ - lib/furnace/code/separated_token.rb
53
+ - lib/furnace/code/surrounded_token.rb
54
+ - lib/furnace/code/terminal_token.rb
55
+ - lib/furnace/code/token.rb
49
56
  - lib/furnace/graphviz.rb
50
57
  - lib/furnace/transform.rb
51
58
  - lib/furnace/transform/generic/anf_build.rb
@@ -77,9 +84,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
84
  version: '0'
78
85
  requirements: []
79
86
  rubyforge_project:
80
- rubygems_version: 1.8.10
87
+ rubygems_version: 1.8.17
81
88
  signing_key:
82
89
  specification_version: 3
83
90
  summary: A static code analysis framework
84
91
  test_files: []
85
- has_rdoc: