static void PrintOutputInterface(std::wostream& os, Grammar& g) { std::wstring ws(STR_HEADER); std::wstring upperfile = MakeUpper(g.GetModuleName() + L".h"); FindReplace(upperfile, L".", L"_"); PrintGeneratedFileHeader(os); os << L"#ifndef " << upperfile << "" << std::endl; os << L"#define " << upperfile << "" << std::endl; os << std::endl; os << std::endl; find_replace(ws, L"{DATE}", __WDATE__); find_replace(ws, L"{GRAMMAR}", g.GetLanguageName()); os << L"#include \"Result.h\"\n"; os << L"#include " << "\"" << g.GetLanguageName() << ".h\"\n"; std::wostringstream ss; PrintActions(ss, g, false); find_replace(ws, L"{ACTIONS}", ss.str()); os << ws; os << std::endl; os << L"#endif" << std::endl; }
static void GenerateDescRec3(std::wostream& os, Grammar& g, MMap& map, const std::wstring& tokenPrefix) { if (map.empty()) { return; } PrintGeneratedFileHeader(os); PrintGeneratedFileLicense(os); os << L"#pragma once\n"; os << L"\n"; os << L"#include <string.h>\n"; os << L"#include \"" << g.GetModuleName() << L"Lex.h\"\n"; os << L"\n"; os << L"\n"; //PrintOutputClass(os, g); PrintFowardDeclarations(os, g, map); int i = 0; int sub = 0; int currentRuleIndex = -1; auto it = map.begin(); for (; it != map.end();) { int currentRuleIndex = it->m_pNotTerminal->GetIndex(); //Faz todos desta regra (até ela mudar) os << TAB_1 << L"int " << GetFunctionName(g, it->m_pNotTerminal->GetName()) << L"( " << g.GetLanguageName() << L"_Context* ctx)\n"; os << TAB_1 << L"{\n"; int sub = 0; bool allsame = false; bool firstPrinted = false; if (PreAnalise(map, it, allsame) == 1) { //se so tem um nao precisa testar pelo token pois sempre haver um teste //a seguir de qualquer forma const Production& production = g.GetProduction(it->m_RuleIndex); os << TAB__2 << L"//"; Print(os, production); os << L"\n"; PrintProduction(os, production, g, tokenPrefix, TAB__2); it++; } else { while (it->m_pNotTerminal->GetIndex() == currentRuleIndex) { //se todos forem iguais nao testa pelo token //e so imprimi o primeiro que eh igual aos outros if (!allsame) { if (sub == 0) { os << TAB__2 << L"if (IsToken(ctx, " << tokenPrefix << it->m_pTerminal->GetName() << L"))\n"; } else { os << TAB__2 << L"else if (IsToken(ctx, " << tokenPrefix << it->m_pTerminal->GetName() << L"))\n"; } } const Production& production = g.GetProduction(it->m_RuleIndex); if (!allsame) { os << TAB__2 << L"{\n"; } if (!allsame || (allsame && !firstPrinted)) { os << (!allsame ? TAB___3 : TAB__2); os << L"/*"; Print(os, production); os << L"*/\n"; PrintProduction(os, production, g, tokenPrefix, !allsame ? TAB___3 : TAB__2); if (!allsame) { os << TAB__2 << L"}\n"; } } sub++; it++; if (it == map.end()) { break; } firstPrinted = true; } } os << TAB_1 << L"}\n\n"; } }
void GenerateDescRecC(std::wostream& os, Grammar& g, MMap& map, const std::wstring& tokenPrefix, const std::wstring& parserFileSuffix) { if (map.empty()) { return; } PrintGeneratedFileHeader(os); PrintGeneratedFileLicense(os); os << L"\n"; os << L"#include \"stdafx.h\"\n"; os << L"#include <assert.h>\n"; os << L"\n"; os << L"#include \"" << g.GetModuleName() << L"Lex.h\"\n"; os << L"#include \"" << g.GetModuleName() << parserFileSuffix << L".h\"\n"; os << L"\n"; os << L"\n"; //os << L"#include \"sstream.h\"\n"; //os << L"#include \"errors.h\"\n"; os << L"\n"; os << L"\n"; PrintActionsNames(os, g, false); //PrintActions(os, g, false); os << L"\n"; PrintFowardDeclarations(os, g, map); std::wstring ws(SourceCode); find_replace(ws, L"{GRAMMAR}", g.GetLanguageName()); find_replace(ws, L"{MODULE}", g.GetLanguageName()); os << ws; int i = 0; int currentRuleIndex = -1; auto it = map.begin(); int rulecount = 0; for (; it != map.end();) { int currentRuleIndex = it->m_pNotTerminal->GetIndex(); //Faz todos desta regra (até ela mudar) os << L"Result " << GetFunctionName(g, it->m_pNotTerminal->GetName()) << L"( " << g.GetLanguageName() + L"_Context* ctx)\n"; os << L"{\n"; os << TAB_1 << L"Result result = RESULT_OK;\n"; os << TAB_1 << L"" << g.GetLanguageName() << L"_Tokens token = ctx->token; \n"; os << L"\n"; int sub = 0; rulecount = 0; while (it->m_pNotTerminal->GetIndex() == currentRuleIndex) { int currentResultIndex = it->m_RuleIndex; //faz todos que resultam na mesma producao int count = 0; while (currentResultIndex == it->m_RuleIndex) { if (count == 0) { os << TAB_1; if (rulecount > 0) { os << L"else "; } os << L"if (token == " << tokenPrefix << it->m_pTerminal->GetName(); } else { os << L" ||\n"; os << TAB_1 << L" token == " << tokenPrefix << it->m_pTerminal->GetName(); } auto itcopy = it; it++; count++; if (it == map.end() || currentResultIndex != it->m_RuleIndex) { os << L")\n"; //fecha if const Production& production = g.GetProduction(itcopy->m_RuleIndex); os << TAB_1 << L"{\n"; os << TAB__2; os << L"/*"; Print(os, production); os << L"*/\n"; PrintProduction(os, production, g, tokenPrefix, TAB__2); os << TAB_1 << L"}\n"; break; } if (it == map.end()) { break; } } /* if (it != map.end()) { it++; } */ if (it == map.end()) { break; } rulecount++; } //regra os << TAB_1 << L"else\n"; os << TAB_1 << L"{\n"; os << TAB__2 << g.GetLanguageName() << L"_OnAction(ctx, " << g.GetLanguageName() << L"_OnError); \n"; os << TAB__2 << L"return RESULT_FAIL;\n"; os << TAB_1 << L"}\n"; os << L"\n"; os << TAB_1 << L"return result;\n"; os << L"}\n\n"; } }