[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