OpenADFortTk (basic)
src/xaif2whirl/XAIF_SAXHandler.cxx
Go to the documentation of this file.
00001 #include <iostream>
00002 
00003 #include <xercesc/sax2/Attributes.hpp>
00004 #include <xercesc/sax2/XMLReaderFactory.hpp>
00005 #include <xercesc/sax2/SAX2XMLReader.hpp>
00006 
00007 #include "XAIF_SAXHandler.h"
00008 #include "XAIF_SAXErrorHandler.h"
00009 #include "XAIFStrings.h"
00010 #include "XAIF_DOMFilters.h"
00011 #include "PUXlationContext.h"
00012 #include "xaif2whirl.h"
00013 
00014 #include "Open64IRInterface/IFDiagnostics.h"
00015 
00016 namespace xaif2whirl { 
00017 
00018   XAIF_SAXHandler::XAIF_SAXHandler(PU_Info* pu_forest, const XMLCh* implementationFeatures) :
00019         myPUForest_p (pu_forest),
00020         myPUXlationContext ("TranslateIR", pu_forest),
00021         myParser_p (xercesc::XMLReaderFactory::createXMLReader()),
00022         myDOMImplementation_p (xercesc::DOMImplementationRegistry::getDOMImplementation(implementationFeatures)),
00023         myDOMDocument_p (NULL),
00024         inDOMMode (false) {
00025   }
00026 
00027   XAIF_SAXHandler::~XAIF_SAXHandler() {
00028   }
00029 
00030   void XAIF_SAXHandler::initialize(bool validateAgainstSchema) {
00031 
00032     if (validateAgainstSchema)
00033       FORTTK_MSG(1, "progress: parsing with schema validation");
00034 
00035     // set features for SAX2 parser (copied from xaifBooster - XMLParser.cpp)
00036     myParser_p->setFeature(xercesc::XMLUni::fgSAX2CoreValidation,validateAgainstSchema);
00037     myParser_p->setFeature(xercesc::XMLUni::fgXercesDynamic,false);
00038     // we need the following for schema processing:
00039     myParser_p->setFeature(xercesc::XMLUni::fgSAX2CoreNameSpaces,true);
00040     myParser_p->setFeature(xercesc::XMLUni::fgSAX2CoreNameSpacePrefixes,true);
00041     // we need the following to support default values coming from the schema:
00042     myParser_p->setFeature(xercesc::XMLUni::fgXercesSchema,true);
00043     myParser_p->setFeature(xercesc::XMLUni::fgXercesSchemaFullChecking,validateAgainstSchema);
00044 
00045     // set content and error handlers
00046     myParser_p->setContentHandler(this);
00047     static XAIF_SAXErrorHandler anErrorHandler;
00048     myParser_p->setErrorHandler(&anErrorHandler);
00049 
00050     Diag_Set_Phase("XAIF to WHIRL: translate IR");
00051 
00052 /* some stuff from TranslateIR()
00053     //IntrinsicTable.DDump();
00054     if (!pu_forest) { return; }
00055 */
00056     WNIdToWNTableMap.Create(myPUForest_p); // Note: could make this local
00057 
00058     DeclareActiveTypes(); // sets a static variable (global) in PUXlation...
00059 
00060   } // end XAIF_SAXHandler::initialize()
00061 
00062   void XAIF_SAXHandler::parse(std::string theXMLFileName) {
00063     myParser_p->parse(theXMLFileName.c_str());
00064   } // end XAIF_SAXHandler::parse()
00065 
00066   bool XAIF_SAXHandler::getParserErrorStatus() { 
00067     return (dynamic_cast<const XAIF_SAXErrorHandler*>(myParser_p->getErrorHandler()))->getErrors();
00068   } 
00069 
00070   void XAIF_SAXHandler::startElement(const XMLCh* const uri,
00071                                      const XMLCh* const localname,
00072                                      const XMLCh* const qname,
00073                                      const xercesc::Attributes& attrs) {
00074     if (inDOMMode) {
00075       if (XMLString::equals(qname, XAIFStrings.elem_CFG_x())) {
00076         FORTTK_DIE("start of CFG element while already in DOM mode");
00077       }
00078       // create new DOMElement, set its attributes, and add it to the document tree and the stack
00079       xercesc::DOMElement* theNewDOMElement = myDOMDocument_p->createElement(qname);
00080       copyAttributes(theNewDOMElement, attrs);
00081       myElementStack.top()->appendChild(theNewDOMElement);
00082       myElementStack.push(theNewDOMElement);
00083     } // end DOM mode
00084 
00085     else { // SAX mode
00086       // start of callgraph element: extract the prefix attribute
00087       if (XMLString::equals(qname, XAIFStrings.elem_CallGraph_x())) {
00088         const XMLCh* prefixX = attrs.getValue(XAIFStrings.attr_prefix_x());
00089         PUXlationContext::setPrefix(XercesStrX(prefixX).c_str());
00090       }
00091 
00092       // start of ScopeHierarchy or CFG element: switch to DOM mode
00093       else if (XMLString::equals(qname, XAIFStrings.elem_ScopeHierarchy_x())
00094                || 
00095                XMLString::equals(qname, XAIFStrings.elem_CFG_x())
00096                ||
00097                XMLString::equals(qname, XAIFStrings.elem_ReplaceList_x())) {
00098         inDOMMode = true;
00099         // create new DOMDocument with root element
00100         myDOMDocument_p = myDOMImplementation_p->createDocument(uri,    // root element namespace URI.
00101                                                                 //0,    // root element namespace URI.
00102                                                                 qname,  // root element name
00103                                                                 0);     // document type object (DTD).
00104         // set attributes for the root element of the new document and push it to the stack
00105         copyAttributes(myDOMDocument_p->getDocumentElement(), attrs);
00106         myElementStack.push(myDOMDocument_p->getDocumentElement());
00107       }
00108     } // end SAX mode
00109 
00110   } // end XAIF_SAXHandler::startElement()
00111 
00112   void XAIF_SAXHandler::endElement(const XMLCh* const uri,
00113                                    const XMLCh* const localname,
00114                                    const XMLCh* const qname) {
00115     if (inDOMMode) {
00116       myElementStack.pop(); //remove the element from the stack
00117 
00118       // end of a CFG / ReplacementList element
00119       if (XMLString::equals(qname, XAIFStrings.elem_CFG_x())
00120           ||
00121           XMLString::equals(qname, XAIFStrings.elem_ReplaceList_x())) {
00122         if (!myElementStack.empty()) FORTTK_DIE("stack not empty after popping CFG element");
00123         inDOMMode = false;
00124         // translate the DOM subtree for the CFG
00125         TranslateCFG (myPUForest_p, myDOMDocument_p->getDocumentElement(), myPUXlationContext);
00126         delete myDOMDocument_p;
00127       } // end CFG element
00128 
00129       // end of a ScopeHierarchy element
00130       else if (XMLString::equals(qname, XAIFStrings.elem_ScopeHierarchy_x())) {
00131         if (!myElementStack.empty()) FORTTK_DIE("stack not empty after popping ScopeHierarchy element");
00132         inDOMMode = false;
00133         // populate the symbol map for myPUXlationContext
00134         XAIF_ScopeElemFilter filt;
00135         for (xercesc::DOMElement* elem = GetChildElement(myDOMDocument_p->getDocumentElement(), &filt); (elem); elem = GetNextSiblingElement(elem, &filt))
00136           xlate_Scope(elem, myPUXlationContext);
00137         delete myDOMDocument_p;
00138       } // end ScopeHierarchy element
00139 
00140     } // end DOM mode
00141     else { // in SAX mode
00142       if (XMLString::equals(qname, XAIFStrings.elem_CFG_x()) || XMLString::equals(qname, XAIFStrings.elem_ScopeHierarchy_x()))
00143         FORTTK_DIE("end of CFG reached while not in DOM mode");
00144     } // end SAX mode
00145 
00146   } // end XAIF_SAXHandler::endElement()
00147 
00148   void XAIF_SAXHandler::deleteParser() {
00149     delete myParser_p;
00150   }
00151 
00152   void XAIF_SAXHandler::copyAttributes(xercesc::DOMElement* theElement, const xercesc::Attributes& theAttributes) {
00153     unsigned int n = theAttributes.getLength();
00154     for (int i = 0; i < n; i++)
00155       theElement->setAttributeNS(theAttributes.getURI(i),
00156                                  theAttributes.getQName(i),
00157                                  theAttributes.getValue(i));
00158   } // end XAIF_SAXHandler::copyAttributes()
00159 
00160 } // end namespace xaif2whirl
00161 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines