{"id":151,"date":"2009-02-06T08:00:45","date_gmt":"2009-02-06T06:00:45","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=151"},"modified":"2009-02-25T08:30:29","modified_gmt":"2009-02-25T06:30:29","slug":"evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/","title":{"rendered":"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree"},"content":{"rendered":"<p>\n<b><a href=\"http:\/\/mariusbancila.ro\/blog\/?p=148\">Evaluate Expressions &#8211; Part 1: The Approaches<\/a><\/b><br \/>\n<b><a href=\"http:\/\/mariusbancila.ro\/blog\/?p=149\">Evaluate Expressions &#8211; Part 2: Parse the Expression<\/a><\/b><br \/>\n<b><a href=\"http:\/\/mariusbancila.ro\/blog\/?p=150\">Evaluate Expressions &#8211; Part 3: Building the Abstract Syntax Tree<\/a><\/b><br \/>\n<b>Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree<\/b>\n<\/p>\n<p>So far we have managed to parse the text representing an expression and build an abstract syntax tree. The only thing left, and the simplest of them all, is traversing this abstract syntax tree and evaluating the expression is represents.<\/p>\n<p>In pseudo code, this would look like this:<\/p>\n<pre class=\"prettyprint\">\r\ndouble Evaluate(subtree)\r\n{\r\n   if(subtree is numeric)\r\n      return value;\r\n   else\r\n   {\r\n      op = subtree.operator\r\n      v1 = Evaluate(subtree.left)\r\n      v2 = Evaluate(subtree.right)\r\n      return v1 op v2;\r\n   }\r\n}\r\n<\/pre>\n<p>We actually have to check for one more type of node, the one representing an unary expression. However, the evaluation function is as simple as this:<\/p>\n<pre class=\"prettyprint\">\r\nclass Evaluator \r\n{\r\n   double EvaluateSubtree(ASTNode* ast)\r\n   {\r\n      if(ast == NULL) \r\n         throw EvaluatorException(\"Incorrect syntax tree!\");\r\n\r\n      if(ast->Type == NumberValue)\r\n         return ast-&gt;Value;\r\n      else if(ast-&gt;Type == UnaryMinus)\r\n         return -EvaluateSubtree(ast-&gt;Left);\r\n      else \r\n      {\r\n         double v1 = EvaluateSubtree(ast-&gt;Left);\r\n         double v2 = EvaluateSubtree(ast-&gt;Right);\r\n         switch(ast-&gt;Type)\r\n         {\r\n         case OperatorPlus:  return v1 + v2;\r\n         case OperatorMinus: return v1 - v2;\r\n         case OperatorMul:   return v1 * v2;\r\n         case OperatorDiv:   return v1 \/ v2;\r\n         }\r\n      }\r\n\r\n      throw EvaluatorException(\"Incorrect syntax tree!\");\r\n   }\r\n\r\npublic:\r\n   double Evaluate(ASTNode* ast)\r\n   {\r\n      if(ast == NULL)\r\n         throw EvaluatorException(\"Incorrect abstract syntax tree\");\r\n\r\n      return EvaluateSubtree(ast);\r\n   }\r\n};\r\n<\/pre>\n<p>The exception class is defined as:<\/p>\n<pre class=\"prettyprint\">\r\nclass EvaluatorException : public std::exception\r\n{\r\npublic:\r\n   EvaluatorException(const std::string&amp; message):\r\n      std::exception(message.c_str())\r\n      {\r\n      }\r\n};\r\n<\/pre>\n<p>So let&#8217;s try it:<\/p>\n<pre class=\"prettyprint\">\r\nvoid Test(const char* text)\r\n{\r\n   Parser parser;\r\n\r\n   try \r\n   {\r\n      ASTNode* ast = parser.Parse(text);\r\n\r\n      try \r\n      {\r\n         Evaluator eval;\r\n         double val = eval.Evaluate(ast);\r\n\r\n         std::cout &lt;&lt; text &lt;&lt; \" = \" &lt;&lt; val &lt;&lt; std::endl;\r\n      }\r\n      catch(EvaluatorException&amp; ex)\r\n      {\r\n\t\t  std::cout &lt;&lt; text &lt;&lt; \" t \" &lt;&lt; ex.what() &lt;&lt; std::endl; \r\n      }\r\n\r\n      delete ast;\r\n   }\r\n   catch(ParserException&amp; ex)\r\n   {\r\n      std::cout &lt;&lt; text &lt;&lt; \" t \" &lt;&lt; ex.what() &lt;&lt; std::endl; \r\n   }   \r\n}\r\n\r\nint main()\r\n{\r\n   Test(\"1+2+3+4\");\r\n   Test(\"1*2*3*4\");\r\n   Test(\"1-2-3-4\");\r\n   Test(\"1\/2\/3\/4\");\r\n   Test(\"1*2+3*4\");\r\n   Test(\"1+2*3+4\");\r\n   Test(\"(1+2)*(3+4)\");\r\n   Test(\"1+(2*3)*(4+5)\");\r\n   Test(\"1+(2*3)\/4+5\");\r\n   Test(\"5\/(4+3)\/2\");\r\n   Test(\"1 + 2.5\");\r\n   Test(\"125\");\r\n   Test(\"-1\");\r\n   Test(\"-1+(-2)\");\r\n   Test(\"-1+(-2.0)\");\r\n\r\n   Test(\"   1*2,5\");\r\n   Test(\"   1*2.5e2\");\r\n   Test(\"M1 + 2.5\");\r\n   Test(\"1 + 2&amp;5\");\r\n   Test(\"1 * 2.5.6\");\r\n   Test(\"1 ** 2.5\");\r\n   Test(\"*1 \/ 2.5\");\r\n\r\n   return 0;\r\n}\r\n<\/pre>\n<p>The output of this test program is:<\/p>\n<pre class=\"prettyprint\">\r\n1+2+3+4 = 10\r\n1*2*3*4 = 24\r\n1-2-3-4 = -8\r\n1\/2\/3\/4 = 0.0416667\r\n1*2+3*4 = 14\r\n1+2*3+4 = 11\r\n(1+2)*(3+4) = 21\r\n1+(2*3)*(4+5) = 55\r\n1+(2*3)\/4+5 = 7.5\r\n5\/(4+3)\/2 = 0.357143\r\n1 + 2.5 = 3.5\r\n125 = 125\r\n-1 = -1\r\n-1+(-2) = -3\r\n-1+(-2.0) = -3\r\n   1*2,5         Unexpected token ',' at position 6\r\n   1*2.5e2       Unexpected token 'e' at position 8\r\nM1 + 2.5         Unexpected token 'M' at position 0\r\n1 + 2&amp;5          Unexpected token '&amp;' at position 5\r\n1 * 2.5.6        Unexpected token '.' at position 7\r\n1 ** 2.5         Unexpected token '*' at position 4\r\n*1 \/ 2.5         Unexpected token '*' at position 1\r\n<\/pre>\n<p>And that&#8217;s it. Define the grammar, build the parser, insert semantic actions and build the abstract syntax tree and then traverse it and evaluate the expression. If you are interested in understanding the grammar, and the parsing in a deeper manner than I presented in this posts, I suggest you read more articles. The purpose was not to teach compilers theory, but put it to a practical purpose.<\/p>\n<p><a href=\"http:\/\/www.mariusbancila.ro\/archives\/cpp\/EvalExpression.zip\">Here<\/a> you can download a Visual Studio 2008 project with the code contained in this tutorial.<\/p>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Evaluate Expressions &#8211; Part 1: The Approaches Evaluate Expressions &#8211; Part 2: Parse the Expression Evaluate Expressions &#8211; Part 3: Building the Abstract Syntax Tree Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree So far we have managed to parse the text representing an expression and build an abstract syntax tree. The only &#8230; <a title=\"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/\" aria-label=\"Read more about Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[9,7],"tags":[58,451,66,65,59],"class_list":["post-151","post","type-post","status-publish","format-standard","hentry","category-articles_and_tutorials","category-c","tag-ast","tag-c","tag-expressions","tag-grammar","tag-parser"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"ast,c++,expressions,grammar,parser\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2009-02-06T06:00:45+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2009-02-25T06:30:29+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#article\",\"name\":\"Evaluate Expressions \\u2013 Part 4: Evaluate the Abstract Syntax Tree\",\"headline\":\"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2009-02-06T08:00:45+02:00\",\"dateModified\":\"2009-02-25T08:30:29+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":7,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#webpage\"},\"articleSection\":\"Articles &amp; Tutorials, C++, AST, C++, expressions, grammar, parser\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#listItem\",\"name\":\"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#listItem\",\"position\":5,\"name\":\"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/\",\"name\":\"Evaluate Expressions \\u2013 Part 4: Evaluate the Abstract Syntax Tree\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2009\\\/02\\\/06\\\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2009-02-06T08:00:45+02:00\",\"dateModified\":\"2009-02-25T08:30:29+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/","robots":"max-image-preview:large","keywords":"ast,c++,expressions,grammar,parser","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#article","name":"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree","headline":"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2009-02-06T08:00:45+02:00","dateModified":"2009-02-25T08:30:29+02:00","inLanguage":"en-US","commentCount":7,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#webpage"},"articleSection":"Articles &amp; Tutorials, C++, AST, C++, expressions, grammar, parser"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#listItem","name":"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#listItem","position":5,"name":"Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/","name":"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2009-02-06T08:00:45+02:00","dateModified":"2009-02-25T08:30:29+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree","og:url":"https:\/\/mariusbancila.ro\/blog\/2009\/02\/06\/evaluate-expressions-%e2%80%93-part-4-evaluate-the-abstract-syntax-tree\/","article:published_time":"2009-02-06T06:00:45+00:00","article:modified_time":"2009-02-25T06:30:29+00:00","twitter:card":"summary","twitter:title":"Evaluate Expressions \u2013 Part 4: Evaluate the Abstract Syntax Tree"},"aioseo_meta_data":{"post_id":"151","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:16:02","updated":"2025-12-12 07:24:40","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":7,"uagb_excerpt":"Evaluate Expressions &#8211; Part 1: The Approaches Evaluate Expressions &#8211; Part 2: Parse the Expression Evaluate Expressions &#8211; Part 3: Building the Abstract Syntax Tree Evaluate Expressions &#8211; Part 4: Evaluate the Abstract Syntax Tree So far we have managed to parse the text representing an expression and build an abstract syntax tree. The only&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/articles_and_tutorials\/\" class=\"advgb-post-tax-term\">Articles &amp; Tutorials<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Articles &amp; Tutorials<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">AST<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">expressions<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">grammar<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">parser<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">AST<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">expressions<\/span>","<span class=\"advgb-post-tax-term\">grammar<\/span>","<span class=\"advgb-post-tax-term\">parser<\/span>"]}},"comment_count":"7","relative_dates":{"created":"Posted 18 years ago","modified":"Updated 18 years ago"},"absolute_dates":{"created":"Posted on February 6, 2009","modified":"Updated on February 25, 2009"},"absolute_dates_time":{"created":"Posted on February 6, 2009 8:00 am","modified":"Updated on February 25, 2009 8:30 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-2r","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=151"}],"version-history":[{"count":1,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/151\/revisions\/191"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}