Browse Source

Implement booleans

master
Dylan Baker 5 years ago
parent
commit
03bc1d2184

+ 1
- 0
lib/chervil/ast.rb View File

@@ -3,6 +3,7 @@ require "chervil"
3 3
 module Chervil
4 4
   module AST
5 5
     require "chervil/ast/application"
6
+    require "chervil/ast/boolean"
6 7
     require "chervil/ast/definition"
7 8
     require "chervil/ast/identifier"
8 9
     require "chervil/ast/number"

+ 17
- 0
lib/chervil/ast/boolean.rb View File

@@ -0,0 +1,17 @@
1
+module Chervil::AST
2
+  class Boolean
3
+    attr_reader :value
4
+
5
+    def initialize(value)
6
+      @value = value
7
+    end
8
+
9
+    def ==(other)
10
+      @value == other.value
11
+    end
12
+
13
+    def evaluate(env)
14
+      @value
15
+    end
16
+  end
17
+end

+ 11
- 0
lib/chervil/lexer.rb View File

@@ -27,6 +27,17 @@ module Chervil
27 27
       when ')'
28 28
         advance
29 29
         Token.new(:rparen, ")")
30
+      when '#'
31
+        advance
32
+        if current_char == 't'
33
+          advance
34
+          Token.new(:boolean, true)
35
+        elsif current_char == 'f'
36
+          advance
37
+          Token.new(:boolean, false)
38
+        else
39
+          raise "Unexpected character #{current_char}"
40
+        end
30 41
       when '"', '\''
31 42
         delimiter = current_char
32 43
         advance

+ 6
- 1
lib/chervil/parser.rb View File

@@ -13,12 +13,14 @@ module Chervil
13 13
     end
14 14
 
15 15
     def expr
16
-      if [:string, :number].include?(@current_token.type)
16
+      if [:string, :number, :boolean].include?(@current_token.type)
17 17
         constant
18 18
       elsif @current_token.type == :identifier
19 19
         identifier
20 20
       elsif @current_token.type == :lparen
21 21
         application
22
+      else
23
+        raise "Unexpected token #{@current_token.type}: #{@current_token.value}"
22 24
       end
23 25
     end
24 26
 
@@ -58,6 +60,9 @@ module Chervil
58 60
       when :string
59 61
         token = eat(:string)
60 62
         AST::String.new(token.value)
63
+      when :boolean
64
+        token = eat(:boolean)
65
+        AST::Boolean.new(token.value)
61 66
       end
62 67
     end
63 68
 

+ 7
- 0
spec/ast/boolean_spec.rb View File

@@ -0,0 +1,7 @@
1
+module Chervil
2
+  RSpec.describe AST::String do
3
+    it 'evaluates' do
4
+      expect(AST::Boolean.new(true).evaluate(Env.new)).to eq(true)
5
+    end
6
+  end
7
+end

+ 6
- 0
spec/lexer_spec.rb View File

@@ -43,5 +43,11 @@ module Chervil
43 43
         Token.new(:string, 'world')
44 44
       )
45 45
     end
46
+
47
+    it 'lexes booleans' do
48
+      lexer = Lexer.new("#t #f")
49
+      expect(lexer.get_next_token).to eq(Token.new(:boolean, true))
50
+      expect(lexer.get_next_token).to eq(Token.new(:boolean, false))
51
+    end
46 52
   end
47 53
 end

+ 9
- 0
spec/parser_spec.rb View File

@@ -56,5 +56,14 @@ module Chervil
56 56
         )
57 57
       )
58 58
     end
59
+
60
+    it 'parses booleans' do
61
+      expect(parse('#t #f')).to eq(
62
+        [
63
+          AST::Boolean.new(true),
64
+          AST::Boolean.new(false),
65
+        ]
66
+      )
67
+    end
59 68
   end
60 69
 end

Loading…
Cancel
Save