rltk 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rltk/token.rb CHANGED
@@ -12,16 +12,30 @@ module RLTK # :nodoc:
12
12
  # The StreamPosition class is used to indicate the position of a token or
13
13
  # other text inside a stream.
14
14
  class StreamPosition
15
+ # @return [Integer]
15
16
  attr_accessor :stream_offset
17
+
18
+ # @return [Integer]
16
19
  attr_accessor :line_number
20
+
21
+ # @return [Integer]
17
22
  attr_accessor :line_offset
23
+
24
+ # @return [Integer]
18
25
  attr_accessor :length
19
26
 
27
+ # @return [String]
20
28
  attr_accessor :file_name
21
29
 
22
30
  alias :start :line_offset
23
31
 
24
32
  # Instantiates a new StreamPosition object with the values specified.
33
+ #
34
+ # @param [Integer] stream_offset The position from the beginning of the stream.
35
+ # @param [Integer] line_number The number of newlines since the beginning of the file.
36
+ # @param [Integer] line_offset The offset of this token from the beginning of the current line.
37
+ # @param [Integer] length The length of the text of the token.
38
+ # @param [String, nil] file_name The name of the file being lexed.
25
39
  def initialize(stream_offset = 0, line_number = 0, line_offset = 0, length = 0, file_name = nil)
26
40
  @stream_offset = stream_offset
27
41
  @line_number = line_number
@@ -34,13 +48,20 @@ module RLTK # :nodoc:
34
48
  # The Token class is used to represent the output of a RLTK::Lexer and the
35
49
  # input of a RLTK::Parser.
36
50
  class Token
51
+ # @return [Symbol]
37
52
  attr_reader :type
53
+
54
+ # @return [Symbol]
38
55
  attr_reader :value
39
56
 
40
- # The StreamPosition object associated with this token.
57
+ # @return [StreamPosition] StreamPosition object associated with this token.
41
58
  attr_reader :position
42
59
 
43
60
  # Instantiates a new Token object with the values specified.
61
+ #
62
+ # @param [Symbol] type A symbol representing the type of this Token.
63
+ # @param [Object, nil] value A value associated with this token.
64
+ # @param [StreamPosition, nil] position The position of the token in a stream.
44
65
  def initialize(type, value = nil, position = nil)
45
66
  @type = type
46
67
  @value = value
@@ -48,13 +69,17 @@ module RLTK # :nodoc:
48
69
  @position = position
49
70
  end
50
71
 
51
- # Compares one token to another. This only tests the token's _type_
52
- # and _value_ and not the location of the token in its source.
72
+ # Compares one token to another. This only tests the token's *type*
73
+ # and *value* and not the location of the token in its source.
74
+ #
75
+ # @param [Token] other Another Token to compare to.
76
+ #
77
+ # @return [Boolean]
53
78
  def ==(other)
54
79
  self.type == other.type and self.value == other.value
55
80
  end
56
81
 
57
- # Returns a string representing the tokens _type_ and _value_.
82
+ # @return [String] String representing the tokens *type* and *value*.
58
83
  def to_s
59
84
  if value
60
85
  "#{self.type}(#{self.value})"
@@ -0,0 +1,25 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/04/20
4
+ # Description: This file holds an implementation of an AbstractClass module.
5
+
6
+ # A module used for making abstract classes. Any class that includes this
7
+ # module will not be able to be instantiated directly.
8
+ module AbstractClass
9
+ # Callback method for when this module is included.
10
+ #
11
+ # @param [Class] klass The Class object for the including class.
12
+ def self.included(klass)
13
+ klass.instance_exec do
14
+ @abstract_class = klass
15
+
16
+ def self.new(*args)
17
+ if self == @abstract_class
18
+ raise "Instantiating abstract class #{self} is not allowed."
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,125 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/03/08
4
+ # Description: This file holds various monkey patches that make coding easier.
5
+
6
+ ############
7
+ # Requires #
8
+ ############
9
+
10
+ ###########
11
+ # Methods #
12
+ ###########
13
+
14
+ # A helper method for type checking Ruby values.
15
+ #
16
+ # @param [Object] o Object to type check.
17
+ # @param [Class] type Class the object should be an instance of.
18
+ # @param [String, nil] blame Variable name to blame for failed type checks.
19
+ # @param [Boolean] strict Strict or non-strict checking. Uses `instance_of?` and `is_a?` respectively.
20
+ #
21
+ # @return [Object] The object passed as parameter o.
22
+ def check_type(o, type, blame = nil, strict = false)
23
+ type_ok = if strict then o.instance_of?(type) else o.is_a?(type) end
24
+
25
+ if type_ok
26
+ o
27
+ else
28
+ if blame
29
+ raise "Parameter #{blame} must be an instance of the #{type.name} class. Received an instance of #{o.class.name}."
30
+ else
31
+ raise "Expected an object of type #{type.name}. Received an instance of #{o.class.name}."
32
+ end
33
+ end
34
+ end
35
+
36
+ # A helper method for type checking Ruby array values.
37
+ #
38
+ # @param [Array<Object>] array Array of objects to type check.
39
+ # @param [Class] type Class the objects should be an instance of.
40
+ # @param [String, nil] blame Variable name to blame for failed type checks.
41
+ # @param [Boolean] strict Strict or non-strict checking. Uses `instance_of?` and `is_a?` respectively.
42
+ #
43
+ # @return [Object] The object passed in parameter o.
44
+ def check_array_type(array, type, blame = nil, strict = false)
45
+ array.each do |o|
46
+ type_ok = if strict then o.instance_of?(type) else o.is_a?(type) end
47
+
48
+ if not type_ok
49
+ if blame
50
+ raise "Parameter #{blame} must contain instances of the #{type.name} class."
51
+ else
52
+ raise "Expected an object of type #{type.name}."
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ #######################
59
+ # Classes and Modules #
60
+ #######################
61
+
62
+ # Monkey-patched Object class.
63
+ class Object
64
+ # Simple implementation of the Y combinator.
65
+ #
66
+ # @param [Object] value Value to be returned after executing the provided block.
67
+ #
68
+ # @return [Object] The object passed in parameter value.
69
+ def returning(value)
70
+ yield(value)
71
+ value
72
+ end
73
+ end
74
+
75
+ # Monkey-patched Class class.
76
+ class Class
77
+ # Checks for module inclusion.
78
+ #
79
+ # @param [Module] mod Module to check the inclusion of.
80
+ def includes_module?(mod)
81
+ self.included_modules.include?(mod)
82
+ end
83
+
84
+ # @return [String] Name of class without the namespace.
85
+ def short_name
86
+ self.name.split('::').last
87
+ end
88
+
89
+ # Checks to see if a Class object is a subclass of the given class.
90
+ #
91
+ # @param [Class] klass Class we are checking if this is a subclass of.
92
+ def subclass_of?(klass)
93
+ raise 'The klass parameter must be an instance of Class.' if not klass.is_a?(Class)
94
+
95
+ if (superklass = self.superclass)
96
+ superklass == klass or superklass.subclass_of?(klass)
97
+ else
98
+ false
99
+ end
100
+ end
101
+ end
102
+
103
+ # Monkey-patchec Integer class.
104
+ class Integer
105
+ # @return [Boolean] This Integer as a Boolean value.
106
+ def to_bool
107
+ self != 0
108
+ end
109
+ end
110
+
111
+ # Monkey-patched TrueClass class.
112
+ class TrueClass
113
+ # @return [1]
114
+ def to_i
115
+ 1
116
+ end
117
+ end
118
+
119
+ # Monkey-patched FalseClass class.
120
+ class FalseClass
121
+ # @return [0]
122
+ def to_i
123
+ 0
124
+ end
125
+ end
data/lib/rltk/version.rb CHANGED
@@ -3,6 +3,9 @@
3
3
  # Date: 2012/03/08
4
4
  # Description: This file specifies the version number of RLTK.
5
5
 
6
- module RLTK
7
- VERSION = "1.2.0"
6
+ module RLTK # :nodoc:
7
+ # The version number of the RLTK library.
8
+ VERSION = '2.0.0'
9
+ # The version of LLVM targeted by RLTK.
10
+ LLVM_TARGET_VERSION = '3.0'
8
11
  end
data/test/tc_ast.rb CHANGED
@@ -18,17 +18,17 @@ require 'rltk/ast'
18
18
  # Classes and Modules #
19
19
  #######################
20
20
 
21
- class ANode < RLTK::ASTNode
22
- child :left, ANode
23
- child :right, ANode
24
- end
25
-
26
- class BNode < ANode; end
27
- class CNode < ANode; end
21
+ class ASTNodeTester < Test::Unit::TestCase
22
+ class ANode < RLTK::ASTNode
23
+ child :left, ANode
24
+ child :right, ANode
25
+ end
28
26
 
29
- class DNode < RLTK::ASTNode; end
27
+ class BNode < ANode; end
28
+ class CNode < ANode; end
30
29
 
31
- class ASTNodeTester < Test::Unit::TestCase
30
+ class DNode < RLTK::ASTNode; end
31
+
32
32
  def setup
33
33
  @leaf0 = CNode.new(nil, nil)
34
34
  @tree0 = ANode.new(BNode.new(@leaf0, nil), BNode.new(nil, nil))
@@ -63,8 +63,8 @@ class ASTNodeTester < Test::Unit::TestCase
63
63
  end
64
64
 
65
65
  def test_initialize
66
- assert_raise(Exception) { RLTK::ASTNode.new }
67
- assert_nothing_raised(Exception) { ANode.new(nil, nil) }
66
+ assert_raise(RuntimeError) { RLTK::ASTNode.new }
67
+ assert_nothing_raised(RuntimeError) { ANode.new(nil, nil) }
68
68
  end
69
69
 
70
70
  def test_notes
data/test/tc_lexer.rb CHANGED
@@ -20,61 +20,61 @@ require 'rltk/lexers/ebnf'
20
20
  # Classes and Modules #
21
21
  #######################
22
22
 
23
- class ABLongest < RLTK::Lexer
24
- rule(/a+/) { :APLUS }
25
- rule(/b+/) { :BPLUS }
23
+ class LexerTester < Test::Unit::TestCase
24
+ class ABLongest < RLTK::Lexer
25
+ rule(/a+/) { :APLUS }
26
+ rule(/b+/) { :BPLUS }
26
27
 
27
- rule(/a+b+/) { :APLUSBPLUS }
28
- end
28
+ rule(/a+b+/) { :APLUSBPLUS }
29
+ end
29
30
 
30
- class ABFirst < RLTK::Lexer
31
- match_first
31
+ class ABFirst < RLTK::Lexer
32
+ match_first
32
33
 
33
- rule(/a+/) { :APLUS }
34
- rule(/b+/) { :BPLUS }
34
+ rule(/a+/) { :APLUS }
35
+ rule(/b+/) { :BPLUS }
35
36
 
36
- rule(/a+b+/) { :APLUSBPLUS }
37
- end
37
+ rule(/a+b+/) { :APLUSBPLUS }
38
+ end
38
39
 
39
- class ENVLexer < RLTK::Lexer
40
- rule(/a/) { [:A, next_value] }
40
+ class ENVLexer < RLTK::Lexer
41
+ rule(/a/) { [:A, next_value] }
41
42
 
42
- class Environment < Environment
43
- def initialize(*args)
44
- super(*args)
45
- @value = -1
46
- end
47
-
48
- def next_value
49
- @value += 1
43
+ class Environment < Environment
44
+ def initialize(*args)
45
+ super(*args)
46
+ @value = -1
47
+ end
48
+
49
+ def next_value
50
+ @value += 1
51
+ end
50
52
  end
51
53
  end
52
- end
53
54
 
54
- class FlagLexer < RLTK::Lexer
55
- rule(/a/) { set_flag(:a); :A }
56
- rule(/\s/)
55
+ class FlagLexer < RLTK::Lexer
56
+ rule(/a/) { set_flag(:a); :A }
57
+ rule(/\s/)
57
58
 
58
- rule(/b/, :default, [:a]) { set_flag(:b); :B }
59
- rule(/c/, :default, [:a, :b]) { :C }
60
- end
59
+ rule(/b/, :default, [:a]) { set_flag(:b); :B }
60
+ rule(/c/, :default, [:a, :b]) { :C }
61
+ end
61
62
 
62
- class StateLexer < RLTK::Lexer
63
- rule(/a/) { :A }
64
- rule(/\s/)
63
+ class StateLexer < RLTK::Lexer
64
+ rule(/a/) { :A }
65
+ rule(/\s/)
65
66
 
66
- rule(/\(\*/) { push_state(:comment) }
67
+ rule(/\(\*/) { push_state(:comment) }
67
68
 
68
- rule(/\(\*/, :comment) { push_state(:comment) }
69
- rule(/\*\)/, :comment) { pop_state }
70
- rule(/./, :comment)
71
- end
72
-
73
- class MatchDataLexer < RLTK::Lexer
74
- rule(/a(b*)(c+)/) { [:FOO, match[1,2]] }
75
- end
69
+ rule(/\(\*/, :comment) { push_state(:comment) }
70
+ rule(/\*\)/, :comment) { pop_state }
71
+ rule(/./, :comment)
72
+ end
76
73
 
77
- class LexerTester < Test::Unit::TestCase
74
+ class MatchDataLexer < RLTK::Lexer
75
+ rule(/a(b*)(c+)/) { [:FOO, match[1,2]] }
76
+ end
77
+
78
78
  def test_calc
79
79
  expected =
80
80
  [
data/test/tc_parser.rb CHANGED
@@ -8,8 +8,8 @@
8
8
  ############
9
9
 
10
10
  # Standard Library
11
- require 'pp'
12
11
  require 'test/unit'
12
+ require 'tmpdir'
13
13
 
14
14
  # Ruby Language Toolkit
15
15
  require 'rltk/lexer'
@@ -23,130 +23,130 @@ require 'rltk/parsers/postfix_calc'
23
23
  # Classes and Modules #
24
24
  #######################
25
25
 
26
- class ABLexer < RLTK::Lexer
27
- rule(/a/) { [:A, 1] }
28
- rule(/b/) { [:B, 2] }
29
-
30
- rule(/\s/)
31
- end
32
-
33
- class APlusBParser < RLTK::Parser
34
- production(:a, 'A+ B') { |a, _| a.length }
35
-
36
- finalize
37
- end
38
-
39
- class AQuestionBParser < RLTK::Parser
40
- production(:a, 'A? B') { |a, _| a }
26
+ class ParserTester < Test::Unit::TestCase
27
+ class ABLexer < RLTK::Lexer
28
+ rule(/a/) { [:A, 1] }
29
+ rule(/b/) { [:B, 2] }
30
+
31
+ rule(/\s/)
32
+ end
41
33
 
42
- finalize
43
- end
44
-
45
- class AStarBParser < RLTK::Parser
46
- production(:a, 'A* B') { |a, _| a.length }
34
+ class APlusBParser < RLTK::Parser
35
+ production(:a, 'A+ B') { |a, _| a.length }
36
+
37
+ finalize
38
+ end
47
39
 
48
- finalize
49
- end
50
-
51
- class AmbiguousParser < RLTK::Parser
52
- production(:e) do
53
- clause('NUM') {|n| n}
54
-
55
- clause('e PLS e') { |e0, _, e1| e0 + e1 }
56
- clause('e SUB e') { |e0, _, e1| e0 - e1 }
57
- clause('e MUL e') { |e0, _, e1| e0 * e1 }
58
- clause('e DIV e') { |e0, _, e1| e0 / e1 }
40
+ class AQuestionBParser < RLTK::Parser
41
+ production(:a, 'A? B') { |a, _| a }
42
+
43
+ finalize
59
44
  end
60
45
 
61
- finalize
62
- end
63
-
64
- class ArrayCalc < RLTK::Parser
65
- array_args
46
+ class AStarBParser < RLTK::Parser
47
+ production(:a, 'A* B') { |a, _| a.length }
48
+
49
+ finalize
50
+ end
66
51
 
67
- production(:e) do
68
- clause('NUM') { |v| v[0] }
52
+ class AmbiguousParser < RLTK::Parser
53
+ production(:e) do
54
+ clause('NUM') {|n| n}
55
+
56
+ clause('e PLS e') { |e0, _, e1| e0 + e1 }
57
+ clause('e SUB e') { |e0, _, e1| e0 - e1 }
58
+ clause('e MUL e') { |e0, _, e1| e0 * e1 }
59
+ clause('e DIV e') { |e0, _, e1| e0 / e1 }
60
+ end
69
61
 
70
- clause('PLS e e') { |v| v[1] + v[2] }
71
- clause('SUB e e') { |v| v[1] - v[2] }
72
- clause('MUL e e') { |v| v[1] * v[2] }
73
- clause('DIV e e') { |v| v[1] / v[2] }
62
+ finalize
74
63
  end
75
64
 
76
- finalize
77
- end
78
-
79
- class DummyError1 < Exception; end
80
- class DummyError2 < Exception; end
81
-
82
- class ErrorCalc < RLTK::Parser
83
- production(:e) do
84
- clause('NUM') {|n| n}
65
+ class ArrayCalc < RLTK::Parser
66
+ array_args
67
+
68
+ production(:e) do
69
+ clause('NUM') { |v| v[0] }
85
70
 
86
- clause('e PLS e') { |e0, _, e1| e0 + e1 }
87
- clause('e SUB e') { |e0, _, e1| e0 - e1 }
88
- clause('e MUL e') { |e0, _, e1| e0 * e1 }
89
- clause('e DIV e') { |e0, _, e1| e0 / e1 }
71
+ clause('PLS e e') { |v| v[1] + v[2] }
72
+ clause('SUB e e') { |v| v[1] - v[2] }
73
+ clause('MUL e e') { |v| v[1] * v[2] }
74
+ clause('DIV e e') { |v| v[1] / v[2] }
75
+ end
90
76
 
91
- clause('e PLS ERROR') { |_, _, _| raise DummyError1 }
92
- clause('e SUB ERROR') { |_, _, _| raise DummyError2 }
77
+ finalize
93
78
  end
94
79
 
95
- finalize
96
- end
80
+ class DummyError1 < StandardError; end
81
+ class DummyError2 < StandardError; end
82
+
83
+ class ErrorCalc < RLTK::Parser
84
+ production(:e) do
85
+ clause('NUM') {|n| n}
86
+
87
+ clause('e PLS e') { |e0, _, e1| e0 + e1 }
88
+ clause('e SUB e') { |e0, _, e1| e0 - e1 }
89
+ clause('e MUL e') { |e0, _, e1| e0 * e1 }
90
+ clause('e DIV e') { |e0, _, e1| e0 / e1 }
91
+
92
+ clause('e PLS ERROR') { |_, _, _| raise DummyError1 }
93
+ clause('e SUB ERROR') { |_, _, _| raise DummyError2 }
94
+ end
95
+
96
+ finalize
97
+ end
97
98
 
98
- class ELLexer < RLTK::Lexer
99
- rule(/\n/) { :NEWLINE }
100
- rule(/;/) { :SEMI }
99
+ class ELLexer < RLTK::Lexer
100
+ rule(/\n/) { :NEWLINE }
101
+ rule(/;/) { :SEMI }
101
102
 
102
- rule(/\s/)
103
+ rule(/\s/)
103
104
 
104
- rule(/[A-Za-z]+/) { |t| [:WORD, t] }
105
- end
105
+ rule(/[A-Za-z]+/) { |t| [:WORD, t] }
106
+ end
106
107
 
107
- class ErrorLine < RLTK::Parser
108
+ class ErrorLine < RLTK::Parser
108
109
 
109
- production(:s, 'line*') { |l| l }
110
+ production(:s, 'line*') { |l| l }
110
111
 
111
- production(:line) do
112
- clause('NEWLINE') { |_| nil }
112
+ production(:line) do
113
+ clause('NEWLINE') { |_| nil }
113
114
 
114
- clause('WORD+ SEMI NEWLINE') { |w, _, _| w }
115
- clause('WORD+ ERROR NEWLINE') { |w, e, _| error(pos(1).line_number); w }
116
- end
115
+ clause('WORD+ SEMI NEWLINE') { |w, _, _| w }
116
+ clause('WORD+ ERROR NEWLINE') { |w, e, _| error(pos(1).line_number); w }
117
+ end
117
118
 
118
- finalize
119
- end
120
-
121
- class RotatingCalc < RLTK::Parser
122
- production(:e) do
123
- clause('NUM') {|n| n}
124
-
125
- clause('PLS e e') { |_, e0, e1| e0.send(get_op(:+), e1) }
126
- clause('SUB e e') { |_, e0, e1| e0.send(get_op(:-), e1) }
127
- clause('MUL e e') { |_, e0, e1| e0.send(get_op(:*), e1) }
128
- clause('DIV e e') { |_, e0, e1| e0.send(get_op(:/), e1) }
119
+ finalize
129
120
  end
130
-
131
- class Environment < Environment
132
- def initialize
133
- @map = { :+ => 0, :- => 1, :* => 2, :/ => 3 }
134
- @ops = [ :+, :-, :*, :/ ]
121
+
122
+ class RotatingCalc < RLTK::Parser
123
+ production(:e) do
124
+ clause('NUM') {|n| n}
125
+
126
+ clause('PLS e e') { |_, e0, e1| e0.send(get_op(:+), e1) }
127
+ clause('SUB e e') { |_, e0, e1| e0.send(get_op(:-), e1) }
128
+ clause('MUL e e') { |_, e0, e1| e0.send(get_op(:*), e1) }
129
+ clause('DIV e e') { |_, e0, e1| e0.send(get_op(:/), e1) }
135
130
  end
131
+
132
+ class Environment < Environment
133
+ def initialize
134
+ @map = { :+ => 0, :- => 1, :* => 2, :/ => 3 }
135
+ @ops = [ :+, :-, :*, :/ ]
136
+ end
136
137
 
137
- def get_op(orig_op)
138
- new_op = @ops[@map[orig_op]]
138
+ def get_op(orig_op)
139
+ new_op = @ops[@map[orig_op]]
139
140
 
140
- @ops = @ops[1..-1] << @ops[0]
141
+ @ops = @ops[1..-1] << @ops[0]
141
142
 
142
- new_op
143
+ new_op
144
+ end
143
145
  end
146
+
147
+ finalize
144
148
  end
145
149
 
146
- finalize
147
- end
148
-
149
- class ParserTester < Test::Unit::TestCase
150
150
  def test_ambiguous_grammar
151
151
  actual = AmbiguousParser.parse(RLTK::Lexers::Calculator.lex('1 + 2 * 3'), {:accept => :all})
152
152
  assert_equal([7, 9], actual.sort)
@@ -272,4 +272,30 @@ class ParserTester < Test::Unit::TestCase
272
272
 
273
273
  assert_raise(RLTK::NotInLanguage) { RLTK::Parsers::PrefixCalc.parse(RLTK::Lexers::Calculator.lex('1 + 2 * 3')) }
274
274
  end
275
+
276
+ def test_use
277
+ tmpfile = File.join(Dir.tmpdir, 'usetest')
278
+
279
+ parser0 = Class.new(RLTK::Parser) do
280
+ production(:a, 'A+') { |a| a.length }
281
+
282
+ finalize :use => tmpfile
283
+ end
284
+
285
+ result0 = parser0.parse(ABLexer.lex('a'))
286
+
287
+ assert(File.exist?(tmpfile), 'Serialized parser file not found.')
288
+
289
+ parser1 = Class.new(RLTK::Parser) do
290
+ production(:a, 'A+') { |a| a.length }
291
+
292
+ finalize :use => tmpfile
293
+ end
294
+
295
+ result1 = parser1.parse(ABLexer.lex('a'))
296
+
297
+ assert_equal(result0, result1)
298
+
299
+ File.unlink(tmpfile)
300
+ end
275
301
  end
data/test/ts_rltk.rb ADDED
@@ -0,0 +1,50 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2011/04/06
4
+ # Description: This file contains the test suit for RLTK. It requires the
5
+ # individual tests from their respective files.
6
+
7
+ ############
8
+ # Requires #
9
+ ############
10
+
11
+ if RUBY_VERSION[0..2] == '1.9'
12
+ begin
13
+ require 'simplecov'
14
+ SimpleCov.start do
15
+ add_filter 'tc_*'
16
+ add_filter 'generated*'
17
+ end
18
+
19
+ rescue LoadError
20
+ puts 'SimpleCov not installed. Continuing without it.'
21
+ end
22
+ end
23
+
24
+ # Rubygems
25
+ require 'rubygems'
26
+ require 'ffi'
27
+
28
+ # Ruby Language Toolkit
29
+ require 'rltk/version'
30
+
31
+ # Test cases
32
+ require 'tc_token'
33
+ require 'tc_ast'
34
+ require 'tc_cfg'
35
+ require 'tc_lexer'
36
+ require 'tc_parser'
37
+
38
+ require 'util/ts_util'
39
+
40
+ begin
41
+ class Tester
42
+ extend FFI::Library
43
+
44
+ ffi_lib("LLVM-#{RLTK::LLVM_TARGET_VERSION}")
45
+ end
46
+
47
+ # The test suite for the LLVM bindings
48
+ require 'cg/ts_cg'
49
+ rescue
50
+ end