Kaynağa Gözat

Improve errors a little bit

master
Dylan Baker 5 yıl önce
ebeveyn
işleme
3119c4b7d1
3 değiştirilmiş dosya ile 18 ekleme ve 4 silme
  1. 6
    0
      bin/chervil
  2. 7
    4
      lib/chervil/parser.rb
  3. 5
    0
      spec/parser_spec.rb

+ 6
- 0
bin/chervil Dosyayı Görüntüle

9
       break if line == "(exit)"
9
       break if line == "(exit)"
10
       lexer = Chervil::Lexer.new(line)
10
       lexer = Chervil::Lexer.new(line)
11
       tree = Chervil::Parser.new(lexer).parse
11
       tree = Chervil::Parser.new(lexer).parse
12
+
13
+      if tree.is_a? Chervil::Error
14
+        puts tree
15
+        next
16
+      end
17
+
12
       results = Chervil::Interpreter.new(tree, env).interpret
18
       results = Chervil::Interpreter.new(tree, env).interpret
13
       results.each { |result| puts result unless result.nil? }
19
       results.each { |result| puts result unless result.nil? }
14
     end
20
     end

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

1
 module Chervil
1
 module Chervil
2
-  class Parser def initialize(lexer)
2
+  class Parser
3
+    def initialize(lexer)
3
       @lexer = lexer
4
       @lexer = lexer
4
       @tree = Array.new
5
       @tree = Array.new
5
       @current_token = @lexer.get_next_token
6
       @current_token = @lexer.get_next_token
7
+      @error = nil
6
     end
8
     end
7
 
9
 
8
     def parse
10
     def parse
9
       until @current_token.type == :eof
11
       until @current_token.type == :eof
10
         @tree << expr
12
         @tree << expr
13
+        return @error unless @error.nil?
11
       end
14
       end
12
       @tree
15
       @tree
13
     end
16
     end
20
       elsif @current_token.type == :lparen
23
       elsif @current_token.type == :lparen
21
         application
24
         application
22
       else
25
       else
23
-        raise "Unexpected token #{@current_token.type}: #{@current_token.value}"
26
+        @error = Error.new("Unexpected token #{@current_token.type}: #{@current_token.value}")
24
       end
27
       end
25
     end
28
     end
26
 
29
 
34
       expression = expr
37
       expression = expr
35
 
38
 
36
       args = Array.new
39
       args = Array.new
37
-      until @current_token.type == :rparen
40
+      until @current_token.type == :rparen || @current_token.type == :eof
38
         args << expr
41
         args << expr
39
       end
42
       end
40
 
43
 
95
         @current_token = @lexer.get_next_token
98
         @current_token = @lexer.get_next_token
96
         token
99
         token
97
       else
100
       else
98
-        raise "Expected #{type} but got #{@current_token.type}"
101
+        @error = Error.new("Expected #{type} but got #{@current_token.type}")
99
       end
102
       end
100
     end
103
     end
101
   end
104
   end

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

88
         )
88
         )
89
       )
89
       )
90
     end
90
     end
91
+
92
+    it 'returns a syntax error object instead of raising' do
93
+      expect(parse('(+ 1')).to eq(Error.new("Expected rparen but got eof"))
94
+      expect(parse('1)')).to eq(Error.new("Unexpected token rparen: )"))
95
+    end
91
   end
96
   end
92
 end
97
 end

Loading…
İptal
Kaydet