lib/rouge/reader.rb in rouge-lang-0.0.6 vs lib/rouge/reader.rb in rouge-lang-0.0.7
- old
+ new
@@ -14,11 +14,10 @@
@src = input
@n = 0
@gensyms = []
end
-
def lex
r =
case peek
when MAYBE_NUMBER
number
@@ -245,46 +244,64 @@
Rouge::Seq::Cons[Rouge::Symbol[:quote], form]
end
end
def regexp
- s = ""
- t = '"'
+ expression = ""
+ terminator = '"'
+
while true
- c = @src[@n]
+ char = @src[@n]
- if c.nil?
- reader_raise EndOfDataError, "in regexp, got: #{s}"
+ if char.nil?
+ reader_raise EndOfDataError, "in regexp, got: #{expression}"
end
@n += 1
- if c == t
+ if char == terminator
break
end
- if c == ?\\
- c = "\\"
- if peek == ?"
- c << consume
+ if char == ?\\
+ char = "\\"
+
+ # Prevent breaking early.
+ if peek == terminator
+ char << consume
end
end
- s << c
+ expression << char
end
- Regexp.new(s).freeze
+ Regexp.new(expression).freeze
end
+ def set
+ s = Set.new
+
+ until peek == '}'
+ el = lex
+ s.add el
+ end
+
+ consume
+ s.freeze
+ end
+
def dispatch
consume
case peek
when '('
body, count = dispatch_rewrite_fn(lex, 0)
Rouge::Seq::Cons[
Rouge::Symbol[:fn],
(1..count).map {|n| Rouge::Symbol[:"%#{n}"]}.freeze,
body]
+ when "{"
+ consume
+ set
when "'"
consume
Rouge::Seq::Cons[Rouge::Symbol[:var], lex]
when "_"
consume