$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r73567 - in trunk/libs/spirit/example/qi/compiler_tutorial: conjure3 conjure_samples
From: joel_at_[hidden]
Date: 2011-08-06 00:27:51
Author: djowel
Date: 2011-08-06 00:27:35 EDT (Sat, 06 Aug 2011)
New Revision: 73567
URL: http://svn.boost.org/trac/boost/changeset/73567
Log:
unary ops + tests
Text files modified: 
   trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp         |    23 ++++++++++++++++++++---                 
   trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/lexer_def.hpp        |     3 +++                                     
   trunk/libs/spirit/example/qi/compiler_tutorial/conjure_samples/operators.cnj |    14 ++++++++++++--                          
   3 files changed, 35 insertions(+), 5 deletions(-)
Modified: trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp	(original)
+++ trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp	2011-08-06 00:27:35 EDT (Sat, 06 Aug 2011)
@@ -67,6 +67,17 @@
         return builder.CreateLoad(value, x.name.c_str());
     }
 
+    namespace
+    {
+        llvm::Value*
+        neg1(llvm::LLVMContext& context, llvm::IRBuilder<>& builder)
+        {
+            llvm::Value* one = llvm::ConstantInt::get(context,
+                llvm::APInt(int_size, 1));
+            return builder.CreateNeg(one, "neg1");
+        }
+    }
+
     llvm::Value* compiler::operator()(ast::unary const& x)
     {
         llvm::Value* operand = boost::apply_visitor(*this, x.operand_);
@@ -75,9 +86,15 @@
 
         switch (x.operator_)
         {
-            case token_ids::minus: return builder.CreateNeg(operand, "negtmp");
-            case token_ids::not_: return builder.CreateNot(operand, "nottmp");
-            case token_ids::plus: return operand;
+            case token_ids::compl_:
+                return builder.CreateXor(
+                    operand, neg1(context(), builder), "compltmp");
+            case token_ids::minus:
+                return builder.CreateNeg(operand, "negtmp");
+            case token_ids::not_:
+                return builder.CreateNot(operand, "nottmp");
+            case token_ids::plus:
+                return operand;
             default: BOOST_ASSERT(0); return 0;
         }
     }
Modified: trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/lexer_def.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/lexer_def.hpp	(original)
+++ trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/lexer_def.hpp	2011-08-06 00:27:35 EDT (Sat, 06 Aug 2011)
@@ -57,6 +57,9 @@
                 ("\\*",     token_ids::times)
                 ("\\/",     token_ids::divide)
                 ("%",       token_ids::mod)
+                ("\\+\\+",  token_ids::plus_plus)
+                ("\\-\\-",  token_ids::minus_minus)
+                ("~",       token_ids::compl_)
                 ("!",       token_ids::not_)
             ;
 
Modified: trunk/libs/spirit/example/qi/compiler_tutorial/conjure_samples/operators.cnj
==============================================================================
--- trunk/libs/spirit/example/qi/compiler_tutorial/conjure_samples/operators.cnj	(original)
+++ trunk/libs/spirit/example/qi/compiler_tutorial/conjure_samples/operators.cnj	2011-08-06 00:27:35 EDT (Sat, 06 Aug 2011)
@@ -118,7 +118,17 @@
     return l;
 }
 
+int zero() { return 0; }
+
+int unary()
+{
+    int i = ~zero();    // -1
+    int j = -i;         // 1
+    return j;
+}
+
 int main()
 {
-    return assign() ^ binary();     // 0
-}
\ No newline at end of file
+    return (assign() ^ binary()) + unary(); // -1
+}
+