[C++] Implement export and unexport
diff --git a/parser.cc b/parser.cc
index d9611f9..9e3ec85 100644
--- a/parser.cc
+++ b/parser.cc
@@ -183,6 +183,8 @@
 
   void ParseRule(StringPiece line, size_t sep) {
     if (current_directive_ != AssignDirective::NONE) {
+      if (IsInExport())
+        return;
       if (sep != string::npos) {
         sep += orig_line_with_directives_.size() - line.size();
       }
@@ -386,21 +388,45 @@
     }
   }
 
-  void ParseOverride(StringPiece line, StringPiece directive) {
+  bool IsInExport() const {
+    return (static_cast<int>(current_directive_) &
+            static_cast<int>(AssignDirective::EXPORT));
+  }
+
+  void CreateExport(StringPiece line, bool is_export) {
+    ExportAST* ast = new ExportAST;
+    ast->set_loc(loc_);
+    ast->expr = ParseExpr(line);
+    ast->is_export = is_export;
+    out_asts_->push_back(ast);
+  }
+
+  void ParseOverride(StringPiece line, StringPiece) {
     current_directive_ =
         static_cast<AssignDirective>(
             (static_cast<int>(current_directive_) |
              static_cast<int>(AssignDirective::OVERRIDE)));
     if (HandleDirective(line, assign_directives_))
       return;
-
+    if (IsInExport()) {
+      CreateExport(line, true);
+    }
     ParseRuleOrAssign(line);
   }
 
   void ParseExport(StringPiece line, StringPiece) {
+    current_directive_ =
+        static_cast<AssignDirective>(
+            (static_cast<int>(current_directive_) |
+             static_cast<int>(AssignDirective::EXPORT)));
+    if (HandleDirective(line, assign_directives_))
+      return;
+    CreateExport(line, true);
+    ParseRuleOrAssign(line);
   }
 
   void ParseUnexport(StringPiece line, StringPiece) {
+    CreateExport(line, false);
   }
 
   void CheckIfStack(const char* keyword) {