vidarh / writing-a-compiler-in-ruby

Code from my series on writing a Ruby compiler in Ruby

This URL has Read+Write access

commit  cbefdad73ef9d0d430b03c939ea921e24a4fee54
tree    c6c68bf7cfd57e8e0f1740e53ce6213644f9d3d4
parent  386f2801b1921bb6c71a743343d60674bb32d7c7
writing-a-compiler-in-ruby / sexp.rb
100644 30 lines (23 sloc) 0.562 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
require 'parserbase'
 
# Simple Recursive-Descent s-expression parser
class SEXParser < ParserBase
 
  def initialize s
    @s = s # The scanner
  end
 
  def parse
    return nil if !@s.expect("%s")
    return parse_sexp || raise("Expected s-expression")
  end
 
  def parse_sexp
    return nil if !@s.expect("(")
    @s.ws
    exprs = zero_or_more(:exp)
    raise "Expected ')'" if !@s.expect(")")
    return exprs
  end
 
  def parse_exp
    @s.ws
    (ret = @s.expect(Atom) || @s.expect(Int) || @s.expect(Quoted) || parse_sexp) && @s.ws
    return ret
  end
end