Chervil is a toy Lisp interpreter written in Ruby
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

parser_spec.rb 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module Chervil
  2. RSpec.describe Parser do
  3. def parse(source)
  4. lexer = Lexer.new(source)
  5. parser = Parser.new(lexer)
  6. parser.parse
  7. end
  8. it 'parses a number' do
  9. expect(parse('1').first).to eq(AST::Number.new(1.0))
  10. end
  11. it 'parses a string' do
  12. expect(parse('"hello world"').first).to eq(AST::String.new('hello world'))
  13. end
  14. it 'parses an identifier' do
  15. expect(parse('+').first).to eq(AST::Identifier.new('+'))
  16. end
  17. it 'parses an application' do
  18. expect(parse('(+ 1 2)').first).to eq(
  19. AST::Application.new(
  20. AST::Identifier.new('+'),
  21. [AST::Number.new(1.0), AST::Number.new(2.0)]
  22. )
  23. )
  24. end
  25. it 'parses a definition' do
  26. expect(parse('(define x 5)').first).to eq(
  27. AST::Definition.new(AST::Identifier.new('x'), AST::Number.new(5.0))
  28. )
  29. end
  30. it 'parses a nested expression' do
  31. expect(parse('(+ (+ 1 2) (- 3 4))').first).to eq(
  32. AST::Application.new(
  33. AST::Identifier.new("+"),
  34. [
  35. AST::Application.new(
  36. AST::Identifier.new("+"),
  37. [
  38. AST::Number.new(1.0),
  39. AST::Number.new(2.0),
  40. ]
  41. ),
  42. AST::Application.new(
  43. AST::Identifier.new("-"),
  44. [
  45. AST::Number.new(3.0),
  46. AST::Number.new(4.0),
  47. ]
  48. ),
  49. ]
  50. )
  51. )
  52. end
  53. end
  54. end