Chervil is a toy Lisp interpreter written in Ruby
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lexer_spec.rb 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module Chervil
  2. RSpec.describe Lexer do
  3. it 'lexes parens' do
  4. expect(Lexer.new('()').tokenize).to eq(
  5. [
  6. Token.new(:lparen, '('),
  7. Token.new(:rparen, ')'),
  8. Token.new(:eof, 'eof')
  9. ]
  10. )
  11. end
  12. it 'lexes integers' do
  13. expect(Lexer.new('1').get_next_token).to eq(Token.new(:number, '1'))
  14. end
  15. it 'lexes floats' do
  16. expect(Lexer.new('2.3').get_next_token).to eq(Token.new(:number, '2.3'))
  17. end
  18. it 'ignores whitespace' do
  19. expect(Lexer.new('1 2 3').tokenize).to eq(
  20. [
  21. Token.new(:number, '1'),
  22. Token.new(:number, '2'),
  23. Token.new(:number, '3'),
  24. Token.new(:eof, 'eof')
  25. ]
  26. )
  27. end
  28. it 'lexes identifiers' do
  29. expect(Lexer.new('hello').get_next_token).to eq(
  30. Token.new(:identifier, 'hello')
  31. )
  32. end
  33. it 'lexes strings' do
  34. expect(Lexer.new('"hello"').get_next_token).to eq(
  35. Token.new(:string, 'hello')
  36. )
  37. end
  38. it 'lexes booleans' do
  39. lexer = Lexer.new('#t #f')
  40. expect(lexer.get_next_token).to eq(Token.new(:boolean, true))
  41. expect(lexer.get_next_token).to eq(Token.new(:boolean, false))
  42. end
  43. it 'returns an error given an unterminated string' do
  44. lexer = Lexer.new('"hello world')
  45. expect(lexer.get_next_token).to eq(Error.new("Unterminated string"))
  46. end
  47. it 'lexes quotes' do
  48. lexer = Lexer.new('\'')
  49. expect(lexer.get_next_token).to eq(Token.new(:quote, '\''))
  50. end
  51. end
  52. end