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