Browse Source

Parse definition

master
Dylan Baker 5 years ago
parent
commit
e3ab53a63e
4 changed files with 32 additions and 0 deletions
  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 View File

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

+ 15
- 0
lib/chervil/ast/definition.rb View File

@@ -0,0 +1,15 @@
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 View File

@@ -24,6 +24,16 @@ module Chervil
24 24
 
25 25
     def application
26 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 37
       expression = expr
28 38
 
29 39
       args = Array.new

+ 6
- 0
spec/parser_spec.rb View File

@@ -26,5 +26,11 @@ module Chervil
26 26
         )
27 27
       )
28 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 35
   end
30 36
 end

Loading…
Cancel
Save