浏览代码

Parse definition

master
Dylan Baker 6 年前
父节点
当前提交
e3ab53a63e
共有 4 个文件被更改,包括 32 次插入0 次删除
  1. 1
    0
      lib/chervil/ast.rb
  2. 15
    0
      lib/chervil/ast/definition.rb
  3. 10
    0
      lib/chervil/parser.rb
  4. 6
    0
      spec/parser_spec.rb

+ 1
- 0
lib/chervil/ast.rb 查看文件

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 查看文件

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 查看文件

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 查看文件

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

正在加载...
取消
保存