A toy dynamic programming language written in Ruby
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

lexer_spec.rb 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. RSpec.describe Lexer do
  2. it 'lexes null' do
  3. expect(Lexer.new('null').scan_all).to eq(
  4. [Token.new(TokenKinds::NULL), Token.new(TokenKinds::EOF)]
  5. )
  6. end
  7. it 'lexes booleans' do
  8. expect(Lexer.new('true false').scan_all).to eq(
  9. [
  10. Token.new(TokenKinds::BOOLEAN, true),
  11. Token.new(TokenKinds::BOOLEAN, false),
  12. Token.new(TokenKinds::EOF)
  13. ]
  14. )
  15. end
  16. it 'lexes numbers' do
  17. expect(Lexer.new('1 2.3').scan_all).to eq(
  18. [
  19. Token.new(TokenKinds::NUMBER, 1.0),
  20. Token.new(TokenKinds::NUMBER, 2.3),
  21. Token.new(TokenKinds::EOF)
  22. ]
  23. )
  24. end
  25. it 'lexes strings' do
  26. expect(Lexer.new('"hello world"').scan_all).to eq(
  27. [Token.new(TokenKinds::STRING, 'hello world'), Token.new(TokenKinds::EOF)]
  28. )
  29. end
  30. it 'lexes operators' do
  31. expect(Lexer.new('+-*/<<=>>=== and or').scan_all).to eq(
  32. [
  33. Token.new(TokenKinds::OPERATOR, :+),
  34. Token.new(TokenKinds::OPERATOR, :-),
  35. Token.new(TokenKinds::OPERATOR, :*),
  36. Token.new(TokenKinds::OPERATOR, :/),
  37. Token.new(TokenKinds::OPERATOR, :<),
  38. Token.new(TokenKinds::OPERATOR, :<=),
  39. Token.new(TokenKinds::OPERATOR, :>),
  40. Token.new(TokenKinds::OPERATOR, :>=),
  41. Token.new(TokenKinds::OPERATOR, :==),
  42. Token.new(TokenKinds::OPERATOR, :and),
  43. Token.new(TokenKinds::OPERATOR, :or),
  44. Token.new(TokenKinds::EOF)
  45. ]
  46. )
  47. end
  48. it 'lexes punctuation' do
  49. expect(Lexer.new('{}()[];,.').scan_all).to eq(
  50. [
  51. Token.new(TokenKinds::LBRACE),
  52. Token.new(TokenKinds::RBRACE),
  53. Token.new(TokenKinds::LPAREN),
  54. Token.new(TokenKinds::RPAREN),
  55. Token.new(TokenKinds::LBRACKET),
  56. Token.new(TokenKinds::RBRACKET),
  57. Token.new(TokenKinds::SEMICOLON),
  58. Token.new(TokenKinds::COMMA),
  59. Token.new(TokenKinds::DOT),
  60. Token.new(TokenKinds::EOF)
  61. ]
  62. )
  63. end
  64. it 'lexes if elseif else' do
  65. expect(Lexer.new('if elseif else').scan_all).to eq(
  66. [
  67. Token.new(TokenKinds::IF),
  68. Token.new(TokenKinds::ELSEIF),
  69. Token.new(TokenKinds::ELSE),
  70. Token.new(TokenKinds::EOF)
  71. ]
  72. )
  73. end
  74. it 'lexes =' do
  75. expect(Lexer.new('=').scan_all).to eq(
  76. [Token.new(TokenKinds::EQUALS), Token.new(TokenKinds::EOF)]
  77. )
  78. end
  79. it 'lexes let' do
  80. expect(Lexer.new('let').scan_all).to eq(
  81. [Token.new(TokenKinds::LET), Token.new(TokenKinds::EOF)]
  82. )
  83. end
  84. it 'lexes identifiers' do
  85. expect(Lexer.new('x').scan_all).to eq(
  86. [Token.new(TokenKinds::IDENTIFIER, 'x'), Token.new(TokenKinds::EOF)]
  87. )
  88. end
  89. it 'lexes function' do
  90. expect(Lexer.new('function').scan_all).to eq(
  91. [Token.new(TokenKinds::FUNCTION), Token.new(TokenKinds::EOF)]
  92. )
  93. end
  94. it 'lexes class' do
  95. expect(Lexer.new('class').scan_all).to eq(
  96. [Token.new(TokenKinds::CLASS), Token.new(TokenKinds::EOF)]
  97. )
  98. end
  99. it 'lexes class names' do
  100. expect(Lexer.new('Class').scan_all).to eq(
  101. [Token.new(TokenKinds::CLASS_NAME, 'Class'), Token.new(TokenKinds::EOF)]
  102. )
  103. end
  104. it 'lexes public and private' do
  105. expect(Lexer.new('public private').scan_all).to eq(
  106. [
  107. Token.new(TokenKinds::PUBLIC),
  108. Token.new(TokenKinds::PRIVATE),
  109. Token.new(TokenKinds::EOF)
  110. ]
  111. )
  112. end
  113. end