|
OpenADFortTk (basic)
|
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