]> git.wincent.com - walrat.git/blob - lib/walrat/node.rb
e0e6a22a44f4f422f22ac26438ee0441a81cc70a
[walrat.git] / lib / walrat / node.rb
1 # Copyright 2007-2014 Greg Hurrell. All rights reserved.
2 # Licensed under the terms of the BSD 2-clause license.
3
4 require 'walrat'
5
6 module Walrat
7   # Make subclasses of this for use in Abstract Syntax Trees (ASTs).
8   class Node
9     include Walrat::LocationTracking
10
11     attr_reader :lexeme
12
13     def initialize lexeme
14       @string_value = lexeme.to_s
15       @lexeme = lexeme
16     end
17
18     def to_s
19       @string_value
20     end
21
22     # Overrides the default initialize method to accept the defined
23     # attributes and sets up an read accessor for each.
24     #
25     # Raises an error if called directly on Node itself rather than
26     # a subclass.
27     def self.production *results
28       raise 'Node#production called directly on Node' if self == Node
29
30       # set up accessors
31       results.each { |result| attr_reader result }
32
33       # set up initializer
34       initialize_body = "def initialize #{results.map { |symbol| symbol.to_s}.join(', ')}\n"
35       initialize_body << %Q{  @string_value = ""\n}
36       results.each do |result|
37         initialize_body << "  @#{result} = #{result}\n"
38         initialize_body << "  @string_value << #{result}.to_s\n"
39       end
40       initialize_body << "end\n"
41       class_eval initialize_body
42     end
43   end # class Node
44 end # module Walrat