Ejemplo n.º 1
0
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;

}