Guest User

Untitled

a guest
Jun 18th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. require 'benchmark'
  2.  
  3. require 'sexpistol'
  4. require 'sxp'
  5.  
  6. class Lexer
  7. def initialize(str)
  8. @str = str
  9. @p = 0
  10. end
  11.  
  12. def next_token
  13. while true
  14. case c
  15. when nil
  16. return @token = nil
  17. when ' ', "\n", "\r", "\t"
  18. @p += 1
  19. next
  20. when '('
  21. @p += 1
  22. return @token = :'('
  23. when ')'
  24. @p += 1
  25. return @token = :')'
  26. when '"'
  27. start = @p
  28. while c! != '"' && c != nil
  29. end
  30. @p += 1
  31. return @token = @str[start + 1 ... @p - 1]
  32. when /[0-9\+\-]/
  33. start = @p
  34. @p += 1
  35. while true
  36. case c
  37. when /[0-9]/
  38. @p += 1
  39. else
  40. break
  41. end
  42. end
  43. return @token = @str[start ... @p].to_i
  44. when /[a-zA-Z\_]/
  45. start = @p
  46. while true
  47. case c
  48. when /[a-zA-Z0-9\_]/
  49. @p += 1
  50. else
  51. break
  52. end
  53. end
  54. return @token = @str[start ... @p].to_sym
  55. else
  56. raise 'Invalid character'
  57. end
  58. end
  59. end
  60.  
  61. def c
  62. x = @str[@p]
  63. end
  64.  
  65. def c!
  66. @p += 1
  67. c
  68. end
  69. end
  70.  
  71. class Parser < Lexer
  72. def self.parse(str)
  73. Parser.new(str).parse
  74. end
  75.  
  76. def parse
  77. exp = []
  78. while true
  79. case next_token
  80. when :'('
  81. exp << parse
  82. raise 'Missing closing parenthesis' if @token != :')'
  83. when :')'
  84. break
  85. when String, Fixnum, Symbol
  86. exp << @token
  87. when nil
  88. break
  89. end
  90. end
  91. exp
  92. end
  93. end
  94.  
  95. example_sexp = <<-EOD
  96. ((display "This is a test string!")
  97.  
  98. (define test (lambda () (begin
  99. (display (+ 1 1))
  100. (display (+ true true))
  101. (display (+ false false))
  102. (display (+ nil nil))
  103. (display (+ 2 1))
  104. (display (+ 26 212))
  105. ))))
  106. EOD
  107.  
  108. Benchmark.bmbm do |b|
  109. b.report("Sexpistol") do
  110. 5000.times do
  111. parser = Sexpistol.new
  112. test = parser.parse_string(example_sexp)
  113. end
  114. end
  115.  
  116. b.report("SXP") do
  117. 5000.times do
  118. test = SXP.read(example_sexp)
  119. end
  120. end
  121.  
  122. b.report("Ary") do
  123. 5000.times do
  124. test = Parser.parse(example_sexp)
  125. end
  126. end
  127. end
Add Comment
Please, Sign In to add comment