Kaynağa Gözat

Parse definition

master
Dylan Baker 5 yıl önce
ebeveyn
işleme
e3ab53a63e

+ 1
- 0
lib/chervil/ast.rb Dosyayı Görüntüle

1
 module Chervil::AST
1
 module Chervil::AST
2
   require "chervil/ast/application"
2
   require "chervil/ast/application"
3
+  require "chervil/ast/definition"
3
   require "chervil/ast/identifier"
4
   require "chervil/ast/identifier"
4
   require "chervil/ast/number"
5
   require "chervil/ast/number"
5
   require "chervil/ast/string"
6
   require "chervil/ast/string"

+ 15
- 0
lib/chervil/ast/definition.rb Dosyayı Görüntüle

1
+module Chervil::AST
2
+  class Definition
3
+    attr_reader :name
4
+    attr_reader :value
5
+
6
+    def initialize(name, value)
7
+      @name = name
8
+      @value = value
9
+    end
10
+
11
+    def ==(other)
12
+      @name == other.name && @value == other.value
13
+    end
14
+  end
15
+end

+ 10
- 0
lib/chervil/parser.rb Dosyayı Görüntüle

24
 
24
 
25
     def application
25
     def application
26
       eat(:lparen)
26
       eat(:lparen)
27
+
28
+      if @current_token.type == :identifier && @current_token.value == 'define'
29
+        eat(:identifier)
30
+        name = identifier
31
+        value = expr
32
+        p @current_token
33
+        eat(:rparen)
34
+        return AST::Definition.new(name, value)
35
+      end
36
+
27
       expression = expr
37
       expression = expr
28
 
38
 
29
       args = Array.new
39
       args = Array.new

+ 6
- 0
spec/parser_spec.rb Dosyayı Görüntüle

26
         )
26
         )
27
       )
27
       )
28
     end
28
     end
29
+
30
+    it 'parses a definition' do
31
+      expect(parse('(define x 5)').first).to eq(
32
+        AST::Definition.new(AST::Identifier.new('x'), AST::Number.new(5.0))
33
+      )
34
+    end
29
   end
35
   end
30
 end
36
 end

Loading…
İptal
Kaydet