[llvm-commits] [hlvm] r38031 - in /hlvm/trunk: hlvm/AST/Block.cpp hlvm/AST/Function.cpp hlvm/AST/Node.cpp hlvm/AST/Node.h hlvm/AST/Operator.cpp hlvm/AST/Program.cpp hlvm/AST/Type.cpp hlvm/AST/Variable.cpp hlvm/Reader/XML/XMLReader.cpp hlvm/Writer/Writer.h hlvm/Writer/XML/XMLWriter.cpp hlvm/Writer/XML/XMLWriter.h tools/hlvm-xml2xml/Makefile

Reid Spencer reid at x10sys.com
Sat Jul 7 16:59:08 PDT 2007


Author: reid
Date: Sat Jul  7 18:59:07 2007
New Revision: 38031

URL: http://llvm.org/viewvc/llvm-project?rev=38031&view=rev
Log:
Initial cut at implementing a skeletal framework for writing XML AST files.

Modified:
    hlvm/trunk/hlvm/AST/Block.cpp
    hlvm/trunk/hlvm/AST/Function.cpp
    hlvm/trunk/hlvm/AST/Node.cpp
    hlvm/trunk/hlvm/AST/Node.h
    hlvm/trunk/hlvm/AST/Operator.cpp
    hlvm/trunk/hlvm/AST/Program.cpp
    hlvm/trunk/hlvm/AST/Type.cpp
    hlvm/trunk/hlvm/AST/Variable.cpp
    hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp
    hlvm/trunk/hlvm/Writer/Writer.h
    hlvm/trunk/hlvm/Writer/XML/XMLWriter.cpp
    hlvm/trunk/hlvm/Writer/XML/XMLWriter.h
    hlvm/trunk/tools/hlvm-xml2xml/Makefile

Modified: hlvm/trunk/hlvm/AST/Block.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Block.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Block.cpp (original)
+++ hlvm/trunk/hlvm/AST/Block.cpp Sat Jul  7 18:59:07 2007
@@ -32,4 +32,7 @@
 namespace hlvm {
 namespace AST {
 
+Block::~Block()
+{
+}
 }}

Modified: hlvm/trunk/hlvm/AST/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Function.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Function.cpp (original)
+++ hlvm/trunk/hlvm/AST/Function.cpp Sat Jul  7 18:59:07 2007
@@ -32,4 +32,7 @@
 namespace hlvm {
 namespace AST {
 
+Function::~Function() 
+{
+}
 }}

Modified: hlvm/trunk/hlvm/AST/Node.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Node.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Node.cpp (original)
+++ hlvm/trunk/hlvm/AST/Node.cpp Sat Jul  7 18:59:07 2007
@@ -28,11 +28,14 @@
 //===----------------------------------------------------------------------===//
 
 #include <hlvm/AST/Node.h>
-#include <hlvm/AST/Conditionable.h>
-#include <hlvm/AST/ContainerType.h>
 
 namespace hlvm { namespace AST {
 
+Node::Node(NodeIDs id, Node* parent, const std::string& name)
+  : id_(id), parent_(parent), kids_(), name_(name)
+{
+}
+
 Node::~Node()
 {
   removeFromTree();
@@ -45,7 +48,8 @@
 
 #ifndef _NDEBUG
 void 
-Node::dump() const {
+hlvm::AST::Node::dump() const 
+{
 }
 #endif
 

Modified: hlvm/trunk/hlvm/AST/Node.h
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Node.h?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Node.h (original)
+++ hlvm/trunk/hlvm/AST/Node.h Sat Jul  7 18:59:07 2007
@@ -197,12 +197,12 @@
     /// @name Constructors
     /// @{
     public:
-      Node(NodeIDs id, Node* parent = 0, const std::string& name = "") 
-        : id_(id), parent_(parent), kids_(), name_(name) {}
-      virtual ~Node();
+      Node(NodeIDs id, Node* parent = 0, const std::string& name = ""); 
+
 #ifndef _NDEBUG
       virtual void dump() const;
 #endif
+      virtual ~Node();
 
     /// @}
     /// @name Accessors

Modified: hlvm/trunk/hlvm/AST/Operator.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Operator.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Operator.cpp (original)
+++ hlvm/trunk/hlvm/AST/Operator.cpp Sat Jul  7 18:59:07 2007
@@ -32,4 +32,8 @@
 namespace hlvm {
 namespace AST {
 
+Operator::~Operator()
+{
+}
+
 }}

Modified: hlvm/trunk/hlvm/AST/Program.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Program.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Program.cpp (original)
+++ hlvm/trunk/hlvm/AST/Program.cpp Sat Jul  7 18:59:07 2007
@@ -39,4 +39,8 @@
 }
 SignatureType* Program::SignatureTy = Program::initSignature();
 
+Program::~Program()
+{
+}
+
 }}

Modified: hlvm/trunk/hlvm/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Type.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Type.cpp (original)
+++ hlvm/trunk/hlvm/AST/Type.cpp Sat Jul  7 18:59:07 2007
@@ -32,4 +32,8 @@
 namespace hlvm {
 namespace AST {
 
+Type::~Type()
+{
+}
+
 }}

Modified: hlvm/trunk/hlvm/AST/Variable.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/Variable.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/Variable.cpp (original)
+++ hlvm/trunk/hlvm/AST/Variable.cpp Sat Jul  7 18:59:07 2007
@@ -32,4 +32,8 @@
 namespace hlvm {
 namespace AST {
 
+Variable::~Variable()
+{
+}
+
 }}

Modified: hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp (original)
+++ hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp Sat Jul  7 18:59:07 2007
@@ -360,7 +360,6 @@
     return 1;
   }
 
-/// @}
 };
 
 AST::AST*
@@ -415,7 +414,8 @@
       const std::string* pubid = 0;
       elem.find_attrs(TKN_pubid,pubid);
       if (pubid) {
-        elem.node = new AST::Bundle(static_cast<AST::Bundle*>(0),*pubid);
+        elem.node = 
+          new hlvm::AST::Bundle(static_cast<hlvm::AST::Bundle*>(0),*pubid);
       }
       break;
     }
@@ -508,7 +508,7 @@
 }
 
 XMLReader* 
-XMLReader::create(const llvm::sys::Path& path)
+hlvm::XMLReader::create(const llvm::sys::Path& path)
 {
   return new XMLReaderImpl(path);
 }

Modified: hlvm/trunk/hlvm/Writer/Writer.h
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Writer/Writer.h?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Writer/Writer.h (original)
+++ hlvm/trunk/hlvm/Writer/Writer.h Sat Jul  7 18:59:07 2007
@@ -30,17 +30,15 @@
 #ifndef XPS_WRITER_WRITER_H
 #define XPS_WRITER_WRITER_H
 
-#include <llvm/System/Path.h>
-
 namespace hlvm {
-namespace AST { class AST; }
+namespace AST { class Node; }
 
   class Writer
   {
   public:
     /// This method writes the entire content of the AST to the writer's
     /// destination
-    virtual void write(AST::AST* source) = 0;
+    virtual void write(AST::Node* source) = 0;
   };
 }
 #endif

Modified: hlvm/trunk/hlvm/Writer/XML/XMLWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Writer/XML/XMLWriter.cpp?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Writer/XML/XMLWriter.cpp (original)
+++ hlvm/trunk/hlvm/Writer/XML/XMLWriter.cpp Sat Jul  7 18:59:07 2007
@@ -28,46 +28,257 @@
 //===----------------------------------------------------------------------===//
 
 #include <hlvm/Writer/XML/XMLWriter.h>
-#include <hlvm/AST/AST.h>
+#include <hlvm/AST/Node.h>
 #include <hlvm/AST/Bundle.h>
 #include <iostream>
-#include <fstream>
+#include <cassert>
 
 using namespace hlvm;
 
 namespace {
 
-class XMLWriterImpl : public XMLWriter {
-  llvm::sys::Path path_;
-  std::fstream* out_;
-  AST::AST* ast_;
+// An ostream that automatically indents and provides methods to control it.
+class ostream_indent
+{
+  uint32_t indent_;
 public:
-  XMLWriterImpl(const llvm::sys::Path& path) :
-    path_(path), out_(0), ast_(0)
+  std::ostream& strm_;
+  ostream_indent(std::ostream& os) : indent_(0), strm_(os) {}
+
+  inline void nl()
+  {
+    strm_ << '\n';
+    strm_.width(indent_);
+    strm_ << ' ';
+  }
+
+  inline void in( bool with_newline = false)
   {
+    indent_++;
+    if (with_newline)
+      nl();
   }
 
+  inline void out( bool with_newline = false)
+  {
+    indent_--;
+    if (with_newline)
+      nl();
+  }
+};
+
+class XMLWriterImpl : public XMLWriter {
+  ostream_indent ind_;
+  std::ostream& out_;
+  AST::Node* node_;
+public:
+  XMLWriterImpl(std::ostream& out)
+    : ind_(out), out_(out), node_(0)
+  { }
+
   virtual ~XMLWriterImpl() 
   { 
-    if (out_) {
-      out_->flush();
-      out_->close();
-      delete out_;
-    }
+    out_.flush();
   }
 
-  virtual void write(AST::AST* ast);
+  virtual void write(AST::Node* node);
+
+private:
+  inline void putHeader();
+  inline void putFooter();
+  inline void put(AST::Node* node);
+  inline void put(AST::Bundle* node);
 };
 
+std::string 
+sanitize(const std::string* input)
+{
+  // Replace all the & in the name with &  and simliarly for < and > 
+  // because XML doesn't like 'em
+  std::string output(*input);
+  std::string::size_type pos = 0;
+  while (std::string::npos != (pos = output.find('&',pos)))
+  {
+    output.replace(pos,1,"&");
+    pos += 5;
+  }
+  pos = 0;
+  while (std::string::npos != (pos = output.find('<',pos)))
+  {
+    output.replace(pos,1,"<");
+    pos += 4;
+  }
+  pos = 0;
+  while (std::string::npos != (pos = output.find('>',pos)))
+  {
+    output.replace(pos,1,">");
+    pos += 4;
+  }
+  return output;
+}
+
+std::string 
+sanitize(const std::string& input)
+{
+  return sanitize(&input);
+}
+
+void
+XMLWriterImpl::putHeader() 
+{
+  out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  out_ << "<!DOCTYPE hlvm PUBLIC \"-//HLVM/DTD HLVM 1.0//EN\" ";
+  out_ << "\"http://hlvm.org/src/hlvm/Reader/XML/HLVM.rng\">\n";
+  out_ << "<hlvm>\n";
+  ind_.in();
+}
+
+void
+XMLWriterImpl::putFooter()
+{
+  ind_.out();
+  out_ << "</hlvm>\n";
+}
+
+inline void 
+XMLWriterImpl::put(AST::Bundle* b)
+{
+  out_ << "<bundle pubId=\"" << b->getName() << "\">\n";
+  ind_.in();
+}
+
 void
-XMLWriterImpl::write(AST::AST* ast) {
-  ast_ = ast;
+XMLWriterImpl::put(AST::Node* node) 
+{
+  switch (node->getID()) 
+  {
+    case hlvm::AST::VoidTypeID:		break;     
+    case hlvm::AST::AnyTypeID:		break;          
+    case hlvm::AST::BooleanTypeID:	break;      
+    case hlvm::AST::CharacterTypeID:	break;    
+    case hlvm::AST::OctetTypeID:	break;        
+    case hlvm::AST::IntegerTypeID:	break;      
+    case hlvm::AST::RangeTypeID:	break;        
+    case hlvm::AST::RealTypeID:		break;         
+    case hlvm::AST::RationalTypeID:	break;     
+    case hlvm::AST::StringTypeID:	break;       
+    case hlvm::AST::PointerTypeID:	break;      
+    case hlvm::AST::ArrayTypeID:	break;        
+    case hlvm::AST::VectorTypeID:	break;       
+    case hlvm::AST::StructureTypeID:	break;    
+    case hlvm::AST::FieldID:		break;            
+    case hlvm::AST::SignatureTypeID:	break;    
+    case hlvm::AST::ArgumentID:		break;         
+    case hlvm::AST::ContinuationTypeID:	break; 
+    case hlvm::AST::InterfaceID:	break;        
+    case hlvm::AST::ClassID:		break;            
+    case hlvm::AST::MethodID:		break;           
+    case hlvm::AST::ImplementsID:	break;       
+    case hlvm::AST::VariableID:		break;         
+    case hlvm::AST::FunctionID:		break;         
+    case hlvm::AST::ProgramID:		break;          
+    case hlvm::AST::BundleID:		
+      put(llvm::cast<hlvm::AST::Bundle>(node)); 
+      break;
+    case hlvm::AST::BlockID:		break;            
+    case hlvm::AST::CallOpID:		break;           
+    case hlvm::AST::InvokeOpID:		break;         
+    case hlvm::AST::DispatchOpID:	break;
+    case hlvm::AST::CreateContOpID:	break;     
+    case hlvm::AST::CallWithContOpID:	break;   
+    case hlvm::AST::ReturnOpID:		break;         
+    case hlvm::AST::ThrowOpID:		break;          
+    case hlvm::AST::JumpToOpID:		break;         
+    case hlvm::AST::BreakOpID:		break;          
+    case hlvm::AST::IfOpID:		break;             
+    case hlvm::AST::LoopOpID:		break;           
+    case hlvm::AST::SelectOpID:		break;         
+    case hlvm::AST::WithOpID:		break;           
+    case hlvm::AST::LoadOpID:		break;           
+    case hlvm::AST::StoreOpID:		break;          
+    case hlvm::AST::AllocateOpID:	break;       
+    case hlvm::AST::FreeOpID:		break;           
+    case hlvm::AST::ReallocateOpID:	break;     
+    case hlvm::AST::StackAllocOpID:	break;     
+    case hlvm::AST::ReferenceOpID:	break;      
+    case hlvm::AST::DereferenceOpID:	break;    
+    case hlvm::AST::NegateOpID:		break;         
+    case hlvm::AST::ComplementOpID:	break;     
+    case hlvm::AST::PreIncrOpID:	break;        
+    case hlvm::AST::PostIncrOpID:	break;       
+    case hlvm::AST::PreDecrOpID:	break;        
+    case hlvm::AST::PostDecrOpID:	break;       
+    case hlvm::AST::AddOpID:		break;            
+    case hlvm::AST::SubtractOpID:	break;       
+    case hlvm::AST::MultiplyOpID:	break;       
+    case hlvm::AST::DivideOpID:		break;         
+    case hlvm::AST::ModulusOpID:	break;        
+    case hlvm::AST::BAndOpID:		break;           
+    case hlvm::AST::BOrOpID:		break;            
+    case hlvm::AST::BXOrOpID:		break;           
+    case hlvm::AST::AndOpID:		break;            
+    case hlvm::AST::OrOpID:		break;             
+    case hlvm::AST::NorOpID:		break;            
+    case hlvm::AST::XorOpID:		break;            
+    case hlvm::AST::NotOpID:		break;            
+    case hlvm::AST::LTOpID:		break;             
+    case hlvm::AST::GTOpID:		break;             
+    case hlvm::AST::LEOpID:		break;             
+    case hlvm::AST::GEOpID:		break;             
+    case hlvm::AST::EQOpID:		break;             
+    case hlvm::AST::NEOpID:		break;             
+    case hlvm::AST::IsPInfOpID:		break;         
+    case hlvm::AST::IsNInfOpID:		break;         
+    case hlvm::AST::IsNaNOpID:		break;          
+    case hlvm::AST::TruncOpID:		break;          
+    case hlvm::AST::RoundOpID:		break;          
+    case hlvm::AST::FloorOpID:		break;          
+    case hlvm::AST::CeilingOpID:	break;        
+    case hlvm::AST::PowerOpID:		break;          
+    case hlvm::AST::LogEOpID:		break;           
+    case hlvm::AST::Log2OpID:		break;           
+    case hlvm::AST::Log10OpID:		break;          
+    case hlvm::AST::SqRootOpID:		break;         
+    case hlvm::AST::RootOpID:		break;           
+    case hlvm::AST::FactorialOpID:	break;      
+    case hlvm::AST::GCDOpID:		break;            
+    case hlvm::AST::LCMOpID:		break;            
+    case hlvm::AST::MungeOpID:		break;          
+    case hlvm::AST::LengthOpID:		break;         
+    case hlvm::AST::IntOpID:		break;            
+    case hlvm::AST::RealOpID:		break;           
+    case hlvm::AST::PInfOpID:		break;           
+    case hlvm::AST::NInfOpID:		break;           
+    case hlvm::AST::NaNOpID:		break;            
+    case hlvm::AST::StringOpID:		break;         
+    case hlvm::AST::ArrayOpID:		break;          
+    case hlvm::AST::VectorOpID:		break;         
+    case hlvm::AST::StructureOpID:	break;      
+    case hlvm::AST::MapFileOpID:	break;        
+    case hlvm::AST::OpenOpID:		break;           
+    case hlvm::AST::CloseOpID:		break;          
+    case hlvm::AST::ReadOpID:		break;           
+    case hlvm::AST::WriteOpID:		break;          
+    case hlvm::AST::PositionOpID:	break;       
+    default:
+      assert(!"Invalid Node ID");
+      break;
+  }
+}
+
+void
+XMLWriterImpl::write(AST::Node* node) 
+{
+  node_ = node;
+  putHeader();
+  put(node);
+  putFooter();
 }
 
 }
 
 XMLWriter* 
-XMLWriter::create(const llvm::sys::Path& path)
+hlvm::XMLWriter::create(std::ostream& out)
 {
-  return new XMLWriterImpl(path);
+  return new XMLWriterImpl(out);
 }

Modified: hlvm/trunk/hlvm/Writer/XML/XMLWriter.h
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Writer/XML/XMLWriter.h?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Writer/XML/XMLWriter.h (original)
+++ hlvm/trunk/hlvm/Writer/XML/XMLWriter.h Sat Jul  7 18:59:07 2007
@@ -31,19 +31,17 @@
 #define XPS_WRITER_XML_XMLWRITER_H
 
 #include <hlvm/Writer/Writer.h>
-#include <llvm/System/Path.h>
+#include <ostream>
 
 namespace hlvm {
 
-  class AST::AST;
-
   class XMLWriter: public Writer
   {
   public:
     /// This method instantiates an XMLReader that is prepared to read from
     /// the path provided.
     /// @brief Create a new XmlReader
-    static XMLWriter* create(const llvm::sys::Path& path);
+    static XMLWriter* create(std::ostream& out);
 
     virtual ~XMLWriter() {}
   };

Modified: hlvm/trunk/tools/hlvm-xml2xml/Makefile
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/tools/hlvm-xml2xml/Makefile?rev=38031&r1=38030&r2=38031&view=diff

==============================================================================
--- hlvm/trunk/tools/hlvm-xml2xml/Makefile (original)
+++ hlvm/trunk/tools/hlvm-xml2xml/Makefile Sat Jul  7 18:59:07 2007
@@ -2,7 +2,7 @@
 
 LEVEL = ../..
 TOOLNAME = hlvm-xml2xml
-USEDLIBS = HLVMXMLReader.a HLVMAST.a
+USEDLIBS = HLVMXMLWriter.a HLVMXMLReader.a HLVMAST.a
 LLVMLIBS = LLVMSupport.a LLVMSystem.a
 
 include $(LEVEL)/Makefile.hlvm





More information about the llvm-commits mailing list