Class: Calvin::Evaluator
- Inherits:
-
Parslet::Transform
- Object
- Parslet::Transform
- Calvin::Evaluator
- Defined in:
- lib/calvin/evaluator.rb
Instance Attribute Summary collapse
-
#env ⇒ Object
Returns the value of attribute env.
Instance Method Summary collapse
-
#initialize ⇒ Evaluator
constructor
A new instance of Evaluator.
Constructor Details
#initialize ⇒ Evaluator
Returns a new instance of Evaluator.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/calvin/evaluator.rb', line 5 def initialize super @env = {} rule assignment: { identifier: simple(:name), expression: subtree(:expression)} do |context| @env[context[:name].to_s] = context[:expression] end rule deassignment: { identifier: simple(:name) } do |context| @env[context[:name].to_s] end rule range: subtree(:range) do if range[:first] range[:first]..range[:last] else 0..(range[:last] - 1) end end rule folded: { binary_operator: simple(:op), folder: simple(:folder), expression: subtree(:expression) } do if folder == "\\" elsif folder == "\\:" expression.reverse! else raise Core::ImpossibleException end case op.to_sym when :+, :-, :%, :*, :/ expression.reduce op.to_sym when :^ expression.reduce :** else raise Core::ImpossibleException end end rule mapped: { monad: { left: { binary_operator: simple(:op) }, integer: simple(:integer) }, mapper: simple(:mapper), expression: subtree(:expression) } do if mapper == "@" else raise Core::ImpossibleException end op = op().to_sym # hack; make it a var if op == :^ op = :** end if expression.is_a?(Array) || expression.is_a?(Range) expression.to_a.map {|el| el.send(op, integer.to_i) } else expression.send(op, integer.to_i) end end rule mapped: { monad: { right: { binary_operator: simple(:op) }, integer: simple(:integer) }, mapper: simple(:mapper), expression: subtree(:expression) } do if mapper == "@" else raise Core::ImpossibleException end op = op().to_sym # hack; make it a var if op == :^ op = :** end if expression.is_a?(Array) || expression.is_a?(Range) expression.to_a.map {|el| integer.to_i.send(op, el) } else integer.to_i.send(op, expression) end end rule expression: subtree(:expression) do expression end rule mapped: { monad: { left: { comparison_operator: simple(:op) }, integer: simple(:integer) }, mapper: simple(:mapper), expression: subtree(:expression) } do if mapper == "@" else raise Core::ImpossibleException end op = op().to_sym # hack; make it a var if op == :"<>" op = :!= elsif op == :"=" op = :"==" end if expression.is_a?(Array) || expression.is_a?(Range) expression.to_a.select {|el| el.send(op, integer.to_i) } else expression.send(op, integer.to_i) end end rule mapped: { monad: { right: { comparison_operator: simple(:op) }, integer: simple(:integer) }, mapper: simple(:mapper), expression: subtree(:expression) } do if mapper == "@" else raise Core::ImpossibleException end op = op().to_sym # hack; make it a var if op == :"<>" op = :!= elsif op == :"=" op = :"==" end if expression.is_a?(Array) || expression.is_a?(Range) expression.to_a.select {|el| integer.to_i.send(op, el) } else expression.send(op, integer.to_i) end end end |
Instance Attribute Details
#env ⇒ Object
Returns the value of attribute env.
3 4 5 |
# File 'lib/calvin/evaluator.rb', line 3 def env @env end |