dParserCompiler::dParserCompiler(const dString& inputRules, const char* const outputFileName, const char* const scannerClassName) :m_shiftReduceExpectedWarnings(0) { // scan the grammar into a list of rules. int lastTerminalToken; dProductionRule ruleList; dOperatorsPrecedence operatorPrecedence; dTree<dTokenInfo, dCRCTYPE> symbolList; dString userCodeBlock; dString userVariableClass (""); dString endUserCode ("\n"); // scan grammar to a set of LR(1) rules symbolList.Insert(dTokenInfo (DACCEPTING_TOKEN, TERMINAL, DACCEPT_SYMBOL), dCRC64 (DACCEPT_SYMBOL)); symbolList.Insert(dTokenInfo (DERROR_TOKEN, TERMINAL, DERROR_SYMBOL), dCRC64 (DERROR_SYMBOL)); ScanGrammarFile(inputRules, ruleList, symbolList, operatorPrecedence, userCodeBlock, userVariableClass, endUserCode, lastTerminalToken); // convert the rules into a NFA. dString debugFileName (outputFileName); debugFileName += ".txt"; FILE* const debugFile = fopen (debugFileName.GetStr(), "w"); dTree<dState*, dCRCTYPE> stateList; CanonicalItemSets (stateList, ruleList, symbolList, operatorPrecedence, debugFile); fclose (debugFile); // create a LR(1) parsing table from the NFA graphs const dString& startSymbol = ruleList.GetFirst()->GetInfo().m_name; BuildParsingTable (stateList, dCRC64 (startSymbol.GetStr()), operatorPrecedence); //Write Parser class and header file dString className (GetClassName(outputFileName)); GenerateHeaderFile (className, scannerClassName, outputFileName, symbolList, userVariableClass); GenerateParserCode (className, scannerClassName, outputFileName, symbolList, stateList, userCodeBlock, endUserCode, lastTerminalToken); dTree<dState*, dCRCTYPE>::Iterator iter(stateList); for (iter.Begin(); iter; iter ++) { dState* const state = iter.GetNode()->GetInfo(); delete state; } }
ERRORCODE NodeSimCodeGenerator::GenerateCode(std::string pchHeaderFilePath, std::string pchCppFilePath, ICluster* pCluster, INsCodeGenHelper* codeGenHelper) { ETYPE_BUS clusterType; pCluster->GetClusterType(clusterType); if (nullptr == codeGenHelper) { return E_NOTIMPL; } codeGenHelper->SetCluster(pCluster); std::ostringstream omStringStream; std::fstream m_omFileHeader; std::fstream m_omFileCode; std::string strName; std::string strPath; m_omFileHeader.open(pchHeaderFilePath, std::fstream::out|std::fstream::binary); m_omFileCode.open(pchCppFilePath, std::fstream::out|std::fstream::binary); if(m_omFileHeader.is_open() == false || m_omFileCode.is_open() == false) { return EC_FAILURE; } GenerateHeaderFile(m_omFileHeader, codeGenHelper, pCluster); GenerateCppFile(m_omFileCode, codeGenHelper, pCluster); return S_OK; }