Selaa lähdekoodia

Use env in interpreter

master
Dylan Baker 5 vuotta sitten
vanhempi
commit
df383987bf
3 muutettua tiedostoa jossa 19 lisäystä ja 4 poistoa
  1. 3
    3
      lib/chervil/interpreter.rb
  2. 0
    1
      lib/chervil/parser.rb
  3. 16
    0
      spec/interpreter_spec.rb

+ 3
- 3
lib/chervil/interpreter.rb Näytä tiedosto

1
 module Chervil
1
 module Chervil
2
   class Interpreter
2
   class Interpreter
3
-    def initialize(tree)
3
+    def initialize(tree, env = Env.new)
4
       @tree = tree
4
       @tree = tree
5
+      @env = env
5
     end
6
     end
6
 
7
 
7
     def interpret
8
     def interpret
8
-      env = Env.new
9
-      @tree.map { |node| node.evaluate(env) }
9
+      @tree.map { |node| node.evaluate(@env) }
10
     end
10
     end
11
   end
11
   end
12
 end
12
 end

+ 0
- 1
lib/chervil/parser.rb Näytä tiedosto

29
         eat(:identifier)
29
         eat(:identifier)
30
         name = identifier
30
         name = identifier
31
         value = expr
31
         value = expr
32
-        p @current_token
33
         eat(:rparen)
32
         eat(:rparen)
34
         return AST::Definition.new(name, value)
33
         return AST::Definition.new(name, value)
35
       end
34
       end

+ 16
- 0
spec/interpreter_spec.rb Näytä tiedosto

1
+module Chervil
2
+  RSpec.describe Interpreter do
3
+    def interpret(source, env)
4
+      lexer = Lexer.new(source)
5
+      tree = Parser.new(lexer).parse
6
+      Interpreter.new(tree, env).interpret
7
+    end
8
+
9
+    it 'interprets a definition and variable usage' do
10
+      env = Env.new
11
+      interpret('(define x 5)', env)
12
+      expect(env.get("x")).to eq(AST::Number.new(5.0))
13
+      expect(interpret('x', env).first).to eq(AST::Number.new(5.0))
14
+    end
15
+  end
16
+end

Loading…
Peruuta
Tallenna