{"id":1587,"date":"2013-02-23T19:19:52","date_gmt":"2013-02-24T03:19:52","guid":{"rendered":"http:\/\/boost-spirit.com\/home\/?p=1587"},"modified":"2013-02-23T23:22:14","modified_gmt":"2013-02-24T07:22:14","slug":"spirit-x3-on-github","status":"publish","type":"post","link":"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/","title":{"rendered":"Spirit X3 on Github"},"content":{"rendered":"<p>Oh, in case anyone wants to follow the development of X3, here are the Github links:<\/p>\n<blockquote><p><a href=\"https:\/\/github.com\/djowel\/spirit_x3\">https:\/\/github.com\/djowel\/spirit_x3<\/a><br \/>\n<a href=\"https:\/\/github.com\/djowel\/spirit_x3.git\">https:\/\/github.com\/djowel\/spirit_x3.git<\/a><br \/>\n<a href=\"git@github.com:djowel\/spirit_x3.git\">git@github.com:djowel\/spirit_x3.git<\/a><\/p><\/blockquote>\n<p>The full attribute mechanism works + basic C++lambda support. I&#8217;ve ported one example (calc4.cpp) which parses to an AST. The AST remains the same. Only the way the grammars are written had to change.<\/p>\n<p>For a teaser: here&#8217;s GCC times:<\/p>\n<p>SpiritX3: TOTAL :\u00a0\u00a0 4.27 secs<br \/>\nSpirit2:\u00a0 TOTAL :\u00a0 10.00 secs<\/p>\n<p>Even faster at CT than the first Spirit3 attempt. Runtime speed? I expect it to be faster than Spirit-2. The rules have changed (pun intentional). Now, there&#8217;s no longer the need for virtual functions and auto is used extensively. I expect code size to be smaller too because the compiler can generate more efficient code.<\/p>\n<p>Here&#8217;s the calculator grammar (based on calc3.cpp):<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/  The calculator grammar\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\nnamespace calculator_grammar\r\n{\r\n    using x3::uint_;\r\n    using x3::char_;\r\n\r\n    x3::rule&lt;class expression, ast::program&gt; const expression;\r\n    x3::rule&lt;class term, ast::program&gt; const term;\r\n    x3::rule&lt;class factor, ast::operand&gt; const factor;\r\n\r\n    auto const expression_def =\r\n        term\r\n        &gt;&gt; *(   (char_('+') &gt;&gt; term)\r\n            |   (char_('-') &gt;&gt; term)\r\n            )\r\n        ;\r\n\r\n    auto const term_def =\r\n        factor\r\n        &gt;&gt; *(   (char_('*') &gt;&gt; factor)\r\n            |   (char_('\/') &gt;&gt; factor)\r\n            )\r\n        ;\r\n\r\n    auto const factor_def =\r\n            uint_\r\n        |   '(' &gt;&gt; expression &gt;&gt; ')'\r\n        |   (char_('-') &gt;&gt; factor)\r\n        |   (char_('+') &gt;&gt; factor)\r\n        ;\r\n\r\n    auto const calculator = x3::grammar(\r\n            expression = expression_def,\r\n            term = term_def,\r\n            factor = factor_def\r\n        );\r\n}\r\n\r\nusing calculator_grammar::calculator;\r\n<\/pre>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>Share<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-1587\" class=\"share-facebook sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\" ><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-1587\" class=\"share-twitter sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\" ><span>Twitter<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-pinterest\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-pinterest-1587\" class=\"share-pinterest sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=pinterest\" target=\"_blank\" title=\"Click to share on Pinterest\" ><span>Pinterest<\/span><\/a><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-1587\" class=\"share-linkedin sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\" ><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-reddit\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\" ><span>Reddit<\/span><\/a><\/li><li class=\"share-tumblr\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-tumblr sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=tumblr\" target=\"_blank\" title=\"Click to share on Tumblr\" ><span>Tumblr<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Oh, in case anyone wants to follow the development of X3, here are the Github links: https:\/\/github.com\/djowel\/spirit_x3 https:\/\/github.com\/djowel\/spirit_x3.git git@github.com:djowel\/spirit_x3.git The full attribute mechanism works + basic C++lambda support. I&#8217;ve ported one example (calc4.cpp) which parses to an AST. The AST remains the same. Only the way the grammars are written had to change. For a [&hellip;]<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>Share<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-1587\" class=\"share-facebook sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\" ><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-1587\" class=\"share-twitter sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\" ><span>Twitter<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-pinterest\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-pinterest-1587\" class=\"share-pinterest sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=pinterest\" target=\"_blank\" title=\"Click to share on Pinterest\" ><span>Pinterest<\/span><\/a><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-1587\" class=\"share-linkedin sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\" ><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-reddit\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\" ><span>Reddit<\/span><\/a><\/li><li class=\"share-tumblr\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-tumblr sd-button share-icon\" href=\"http:\/\/boost-spirit.com\/home\/2013\/02\/23\/spirit-x3-on-github\/?share=tumblr\" target=\"_blank\" title=\"Click to share on Tumblr\" ><span>Tumblr<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_s2mail":"yes","spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[32,33],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pIHdZ-pB","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/posts\/1587"}],"collection":[{"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/comments?post=1587"}],"version-history":[{"count":6,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/posts\/1587\/revisions"}],"predecessor-version":[{"id":1595,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/posts\/1587\/revisions\/1595"}],"wp:attachment":[{"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/media?parent=1587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/categories?post=1587"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/boost-spirit.com\/home\/wp-json\/wp\/v2\/tags?post=1587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}