Chervil is a toy Lisp interpreter written in Ruby
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. expect(Lexer.new("'world'").get_next_token).to eq(
  38. Token.new(:string, 'world')
  39. )
  40. end
  41. it 'lexes booleans' do
  42. lexer = Lexer.new("#t #f")
  43. expect(lexer.get_next_token).to eq(Token.new(:boolean, true))
  44. expect(lexer.get_next_token).to eq(Token.new(:boolean, false))
  45. end
  46. end
  47. end