3 October Evaluating static ParseTree subtrees
Posted by
Willem van Bergen in Uncategorized
ParseTree is a very useful to gem that can translate Ruby code into a syntax tree. I recently needed to evaluate a static part of this tree to return the original hash it represented. I wrote a simple method called ParseTree.eval_static_tree for this purpose.
The method can only evaluate trees that have a static value composed of hashes, arrays, strings, symbols and numerics. You can however pass a block to the function that will be called for every dynamic part the method encounters (function calls, etc.)
A quick sample on how to use it:
code = '{ :static_array => ["str", 123, 4.5], :dynamic => method_call }' tree = ParseTree.translate(code) # => [:hash, [:lit, :static_array], [:array, [:str, "str"], # [:lit, 123], [:lit, 4.5]], [:lit, :dynamic], [:vcall, :method_call]] ParseTree.eval_static_tree(tree) # => RuntimeError: tree is not static: :vcall ... # Pass a block to simply return nil for every dynamic item in the tree. ParseTree.eval_static_tree(tree) { |dynamic_subtree| nil } # => {:dynamic=>nil, :static_array=>["str", 123, 4.5]}
No Comments - Tags: evaluate, ParseTree, ruby, syntax tree


