document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-200607\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"k\">class<\/span> <span class=\"nc\">ParseTree<\/span><\/div><div class=\"line\" id=\"LC2\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC3\">&nbsp;&nbsp;<span class=\"c1\"># Evaluates a static part of the tree that ParseTree.translate returns.<\/span><\/div><div class=\"line\" id=\"LC4\">&nbsp;&nbsp;<span class=\"c1\"># You can pas a block that will be used to get a value that is not static.<\/span><\/div><div class=\"line\" id=\"LC5\">&nbsp;&nbsp;<span class=\"c1\"># A simple example:<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;&nbsp;<span class=\"c1\">#<\/span><\/div><div class=\"line\" id=\"LC7\">&nbsp;&nbsp;<span class=\"c1\">#   &gt;&gt; code = &#39;{ :array =&gt; [&quot;str&quot;, 123, 4.5], :dynamic =&gt; method_call }&#39;<\/span><\/div><div class=\"line\" id=\"LC8\">&nbsp;&nbsp;<span class=\"c1\">#   &gt;&gt; tree = ParseTree.translate(code)<\/span><\/div><div class=\"line\" id=\"LC9\">&nbsp;&nbsp;<span class=\"c1\">#   =&gt; [:hash, [:lit, :array], [:array, [:str, &quot;str&quot;], [:lit, 123], [:lit, 4.5]], <\/span><\/div><div class=\"line\" id=\"LC10\">&nbsp;&nbsp;<span class=\"c1\">#              [:lit, :dynamic], [:vcall, :method_call]]<\/span><\/div><div class=\"line\" id=\"LC11\">&nbsp;&nbsp;<span class=\"c1\">#   &gt;&gt; ParseTree.eval_static_tree(tree)<\/span><\/div><div class=\"line\" id=\"LC12\">&nbsp;&nbsp;<span class=\"c1\">#   RuntimeError: tree is not static: :vcall ...<\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;&nbsp;<span class=\"c1\">#   &gt;&gt; ParseTree.eval_static_tree(tree) { nil }<\/span><\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;<span class=\"c1\">#   =&gt; {:dynamic=&gt;nil, :array=&gt;[&quot;str&quot;, 123, 4.5]}<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;<span class=\"c1\">#<\/span><\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;<span class=\"c1\"># &lt;tt&gt;tree&lt;/tt&gt;::   The (sub)tree to evaluate. Should be (a part of) the<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;<span class=\"c1\">#                   array ParseTree.translate(str) returns<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;<span class=\"c1\"># &lt;tt&gt;&amp;block&lt;/tt&gt;:: A handler block for non-static elements.<\/span><\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nc\">self<\/span><span class=\"o\">.<\/span><span class=\"nf\">eval_static_tree<\/span><span class=\"p\">(<\/span><span class=\"n\">tree<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">block<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">case<\/span> <span class=\"n\">node_type<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">shift<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">when<\/span> <span class=\"ss\">:lit<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:str<\/span> <span class=\"k\">then<\/span> <span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">last<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">when<\/span> <span class=\"ss\">:array<\/span>     <span class=\"k\">then<\/span> <span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span> <span class=\"p\">{<\/span> <span class=\"o\">|<\/span><span class=\"n\">child<\/span><span class=\"o\">|<\/span> <span class=\"n\">eval_static_tree<\/span><span class=\"p\">(<\/span><span class=\"n\">child<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">block<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">when<\/span> <span class=\"ss\">:hash<\/span><\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nb\">hash<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span><\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nb\">hash<\/span><span class=\"o\">[<\/span><span class=\"n\">eval_static_tree<\/span><span class=\"p\">(<\/span><span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">shift<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">block<\/span><span class=\"p\">)<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">eval_static_tree<\/span><span class=\"p\">(<\/span><span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">shift<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">block<\/span><span class=\"p\">)<\/span> <span class=\"k\">until<\/span> <span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">empty?<\/span><\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"nb\">hash<\/span><\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">else<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"nb\">block_given?<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">yield<\/span><span class=\"p\">(<\/span><span class=\"n\">tree<\/span><span class=\"o\">.<\/span><span class=\"n\">unshift<\/span><span class=\"p\">(<\/span><span class=\"n\">node_type<\/span><span class=\"p\">))<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">else<\/span><\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span> <span class=\"s2\">&quot;Tree node is not static: <\/span><span class=\"si\">#{<\/span><span class=\"n\">node_type<\/span><span class=\"o\">.<\/span><span class=\"n\">inspect<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC35\"><span class=\"k\">end<\/span><\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/200607/8b37d87e659e8b24d36aca5d4c2aa7281ab592a2/ParseTree.eval_static_tree.rb\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/200607#file_parse_tree.eval_static_tree.rb\" style=\"float:right;margin-right:10px;color:#666\">ParseTree.eval_static_tree.rb<\/a>\n          <a href=\"http://gist.github.com/200607\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
