Bladeren bron

Evaluate definition/indentifier

master
Dylan Baker 5 jaren geleden
bovenliggende
commit
fa2699e483

+ 1
- 0
lib/chervil.rb Bestand weergeven

1
 require 'chervil/ast'
1
 require 'chervil/ast'
2
+require 'chervil/env'
2
 require 'chervil/interpreter'
3
 require 'chervil/interpreter'
3
 require 'chervil/lexer'
4
 require 'chervil/lexer'
4
 require 'chervil/parser'
5
 require 'chervil/parser'

+ 4
- 0
lib/chervil/ast/definition.rb Bestand weergeven

11
     def ==(other)
11
     def ==(other)
12
       @name == other.name && @value == other.value
12
       @name == other.name && @value == other.value
13
     end
13
     end
14
+
15
+    def evaluate(env)
16
+      env.set(@name.name, @value)
17
+    end
14
   end
18
   end
15
 end
19
 end

+ 4
- 0
lib/chervil/ast/identifier.rb Bestand weergeven

9
     def ==(other)
9
     def ==(other)
10
       @name == other.name
10
       @name == other.name
11
     end
11
     end
12
+
13
+    def evaluate(env)
14
+      env.get(@name)
15
+    end
12
   end
16
   end
13
 end
17
 end

+ 2
- 1
lib/chervil/interpreter.rb Bestand weergeven

5
     end
5
     end
6
 
6
 
7
     def interpret
7
     def interpret
8
-      @tree.map(&:evaluate)
8
+      env = Env.new
9
+      @tree.map { |node| node.evaluate(env) }
9
     end
10
     end
10
   end
11
   end
11
 end
12
 end

+ 12
- 0
spec/ast/definition_spec.rb Bestand weergeven

1
+module Chervil
2
+  RSpec.describe AST::Definition do
3
+    it 'evaluates' do
4
+      env = Env.new
5
+      AST::Definition.new(
6
+        AST::Identifier.new("x"),
7
+        AST::Number.new(5.0)
8
+      ).evaluate(env)
9
+      expect(env.get("x")).to eq(AST::Number.new(5.0))
10
+    end
11
+  end
12
+end

+ 12
- 0
spec/ast/identifier_spec.rb Bestand weergeven

1
+module Chervil
2
+  RSpec.describe AST::Identifier do
3
+    it 'evaluates' do
4
+      env = Env.new
5
+      identifier = AST::Identifier.new("x")
6
+      value = AST::Number.new(5.0)
7
+      definition = AST::Definition.new(identifier, value)
8
+      definition.evaluate(env)
9
+      expect(identifier.evaluate(env)).to eq(value)
10
+    end
11
+  end
12
+end

Laden…
Annuleren
Opslaan