diff -Naur BNFC.orig/formats/cpp/CFtoCPPAbs.hs BNFC/formats/cpp/CFtoCPPAbs.hs
--- BNFC.orig/formats/cpp/CFtoCPPAbs.hs	2004-04-05 17:09:38.000000000 +0300
+++ BNFC/formats/cpp/CFtoCPPAbs.hs	2004-05-22 23:10:46.000000000 +0300
@@ -32,7 +32,7 @@
 
     Created       : 4 August, 2003                           
 
-    Modified      : 15 August, 2003                          
+    Modified      : 22 May, 2004 / Antti-Juhani Kaijanaho
 
    
    ************************************************************** 
@@ -106,7 +106,10 @@
       then concatMap (prRuleH user cat) rules
       else unlines
        [
-        "class" +++ (identCat cat) +++ ": public Visitable { };\n",
+        "class" +++ (identCat cat) +++ ": public Visitable {",
+	"public:",
+	"  virtual" +++ (identCat cat) +++ "*clone() const = 0;",
+	"};\n",
         concatMap (prRuleH user cat) rules
        ]
        
@@ -123,12 +126,16 @@
      "{",
      " public:",
      prInstVars user vs,
+     "  " ++ c' ++ "(const" +++ c' +++ "&);",
+     "  " ++ c' ++ " &operator=(const" +++ c' +++ "&);",
      "  " ++ c' ++ "(" ++ (prConstructorH 1 vs) ++ ");",
      "  " ++ c' ++ "(" ++ mem +++ memstar ++ "p);",
      prDestructorH c',
      "  " ++ c' ++ "* reverse();",
      "  " ++ c' ++ "* reverse(" ++ c' ++ " *l);",
      "  virtual void accept(Visitor *v);",
+     "  virtual " ++ c' ++ " *clone() const;",
+     "  void swap(" ++ c' +++ "&);",
      "};"
     ]
     else --a standard rule
@@ -138,9 +145,13 @@
      "{",
      " public:",
      prInstVars user vs,
+     "  " ++ fun' ++ "(const" +++ fun' +++ "&);",
+     "  " ++ fun' ++ " &operator=(const" +++ fun' +++ "&);",
      "  " ++ fun' ++ "(" ++ (prConstructorH 1 vs) ++ ");",
      prDestructorH fun',
      "  virtual void accept(Visitor *v);",
+     "  virtual " +++ fun' +++ " *clone() const;",
+     "  void swap(" ++ fun' +++ "&);",
      "};\n"
     ]
    where 
@@ -165,6 +176,8 @@
   "class Visitable",
   "{",
   " public:",
+  -- all classes with virtual methods require a virtual destructor
+  "  virtual ~Visitable() {}",
   "  virtual void accept(Visitor *v) = 0;",
   "};\n"
  ]
@@ -177,6 +190,7 @@
   "class Visitor",
   "{",
   " public:",
+  "  virtual ~Visitor() {}",
   (concatMap (prVisitFun) fs),
   footer
  ]
@@ -249,6 +263,7 @@
   header = unlines
    [
     "//C++ Abstract Syntax Implementation generated by the BNF Converter.",
+    "#include <algorithm>",
     "#include \"Absyn.H\""
    ]
 
@@ -266,9 +281,11 @@
     [
      "/********************   " ++ c' ++ "    ********************/",
      prConstructorC user c' vs cats,
+     prCopyC user c' vs,
      prDestructorC user c' vs,
      prListFuncs user c',
-     prAcceptC c', 
+     prAcceptC c',
+     prCloneC user c' vs,
      ""
     ]
     else --a standard rule
@@ -276,8 +293,10 @@
     [
      "/********************   " ++ fun' ++ "    ********************/",
      prConstructorC user fun' vs cats,
+     prCopyC user fun' vs,
      prDestructorC user fun' vs,
      prAcceptC fun,
+     prCloneC user fun' vs,
      ""
     ]
    where 
@@ -346,6 +365,36 @@
        then ""
        else "*"
 
+--Print copy constructor and copy assignment
+prCopyC :: [UserDef] -> String -> [IVar] -> String
+prCopyC user c vs =
+    c ++ "::" ++ c ++ "(const" +++ c +++ "& other) {" +++
+      concatMap doV vs ++++
+      "}" ++++
+      c +++ "&" ++ c ++ "::" ++ "operator=(const" +++ c +++ "& other) {" ++++
+      "  " ++ c +++ "tmp(other);" ++++
+      "  swap(tmp);" ++++
+      "  return *this;" ++++
+      "}" ++++
+      "void" +++ c ++ "::swap(" ++ c +++ "& other) {" ++++
+      concatMap swapV vs ++++
+      "}\n"
+    where  doV :: IVar -> String
+	   doV v@(t, _) 
+	     | isBasic user t = "  " ++ vn v ++ " = other." ++ vn v ++ ";\n"
+	     | otherwise = "  " ++ vn v ++ " = other." ++ vn v ++ "->clone();\n"
+	   vn :: IVar -> String
+	   vn (t, 0) = varName t
+	   vn (t, n) = varName t ++ show n
+	   swapV :: IVar -> String
+	   swapV v = "  std::swap(" ++ vn v ++ ", other." ++ vn v ++ ");\n"
+
+--The cloner makes a new deep copy of the object
+prCloneC :: [UserDef] -> String -> [IVar] -> String
+prCloneC user c vs =
+  c +++ "*" ++ c ++ "::clone() const {" ++++
+    "  return new" +++ c ++ "(*this);\n}"
+
 --The destructor deletes all a class's members.
 prDestructorC :: [UserDef] -> String -> [IVar] -> String
 prDestructorC user c vs  = 

