Guest User

Untitled

a guest
May 23rd, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. class Lex
  2. def initialize(rule)
  3. @rule = rule
  4. @buf = ""
  5. end
  6. attr_accessor :buf
  7. def get
  8. @rule.each do |rule, token, action|
  9. if @buf =~ rule
  10. @buf = $'
  11. return token, action.call($&)
  12. end
  13. end
  14. return nil,nil
  15. end
  16. end
  17.  
  18. class Parse
  19. def initialize(rule)
  20. @rule = rule
  21. @tokens = ""
  22. @values = []
  23. end
  24. attr_accessor :tokens, :values
  25.  
  26. def set(token, value)
  27. @tokens += token
  28. @values.push(value)
  29. end
  30.  
  31. def parse
  32. @rule.each do |rule, to, action|
  33. if ind = (rule =~ @tokens)
  34. @tokens.sub!(rule, to)
  35. action.call(ind, @values)
  36. return true
  37. end
  38. end
  39. return false
  40. end
  41.  
  42. def clear
  43. @tokens = ""
  44. @values = []
  45. end
  46. end
  47.  
  48. lex_rule = [[/exit/, 'e', Proc.new{|val| exit}],
  49. [/^\(/, 'l', Proc.new{|val| val}],
  50. [/^\)/, 'r', Proc.new{|val| val}],
  51. [/^\d+/, 'N', Proc.new{|val| val.to_i}],
  52. [/^\+/, 'o', Proc.new{|val| '+'}],
  53. [/^\-/, 'o', Proc.new{|val| '-'}],
  54. [/^\*/, 'O', Proc.new{|val| '*'}],
  55. [/^\//, 'O', Proc.new{|val| '/'}],
  56. [/^\s+/, 's', Proc.new{|val| val}]]
  57.  
  58. lex = Lex.new(lex_rule)
  59.  
  60. parse_rule = [[/s/, '', Proc.new{|ind, values| values.delete_at(ind)}],
  61. [/NON/, 'N', Proc.new{|ind, values| operator(ind, values)}],
  62. [/([ol])NoN([or])/, '\1N\2', Proc.new{|ind, values| operator(ind+1, values)}],
  63. [/^NoN$/, 'N', Proc.new{|ind, values| operator(ind, values)}],
  64. [/^NoNo/, 'No', Proc.new{|ind, values| operator(ind, values)}],
  65. [/lNr/, 'N', Proc.new{|ind, values| values.delete_at(ind); values.delete_at(ind+1)}]]
  66.  
  67. def operator(ind, values)
  68. val_1 = values[ind]
  69. op = values[ind+1]
  70. val_2 = values[ind+2]
  71. values.delete_at(ind)
  72. values.delete_at(ind)
  73. case op
  74. when '+'
  75. values[ind] = val_1 + val_2
  76. when '-'
  77. values[ind] = val_1 - val_2
  78. when '*'
  79. values[ind] = val_1 * val_2
  80. when '/'
  81. values[ind] = val_1 / val_2
  82. end
  83. end
  84.  
  85. parser = Parse.new(parse_rule)
  86.  
  87. while true
  88. print '> '
  89. lex.buf = gets.chomp
  90.  
  91. t, v = lex.get
  92. while (t)
  93. parser.set(t, v)
  94. t, v = lex.get
  95. end
  96.  
  97. while(parser.parse)
  98. p parser.tokens
  99. p parser.values
  100. end
  101.  
  102. puts parser.values.pop
  103. parser.clear
  104. end
Add Comment
Please, Sign In to add comment