⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grammar.cpp

📁 编译原理LR(0)文法分析器 录入合法的LR(0)文法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	GoData gd;
	for(int i = 0; i < GoSet.size(); i++)
	{
		gd = GoSet[i];
		if ((gd.iFrom == iI) && (gd.cChar == cChar))
			return gd.iTo;
	}
	assert(false);
	return -1;
}

bool Grammar::AddProject(const ProjectSet & ps)
{
	assert(nC == C.size());
	for (int i = 0; i < nC; i++)
	{
		if (C[i] == ps)
			return false;
	}
	C.push_back(ps);
	nC++;
	return true;
}

bool Grammar::FillTable(int nLine, char cChar, Pair p)
{
	int iPos;
	if (cChar == '#')
		iPos = nLine * (nVt + 1 + nVn) + nVt;
	else
		if ((iPos = Vn.FindPos(cChar)) != -1)
			iPos += (nLine * (nVt + 1 + nVn) + nVt + 1);
		else
			if ((iPos = Vt.FindPos(cChar)) != -1)
				iPos += (nLine * (nVt + 1 + nVn));
			else
				assert(false);

	if (pTable[iPos] == Pair(0,0))
		pTable[iPos] = p;
	else
	{
		if(!(pTable[iPos] == p))
			return false;
	}
	return true;
}


string Grammar::OutputHTML()
{
	char szTempPath[MAX_PATH]; 
	char szTempName[MAX_PATH]; 
	::GetTempPath(100,szTempPath);
	::GetTempFileName(szTempPath,"LR0",0,szTempName);
	
	CStdioFile out;
	CString temp;	
	out.Open(szTempName, CFile::modeCreate | CFile::modeWrite);
	out.WriteString("<html>\n");
	out.WriteString("<head>\n");
	out.WriteString("<title>Untitled Document</title>\n");
	out.WriteString("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n");
	out.WriteString("</head>\n");
	out.WriteString("<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n");
	out.WriteString("下面是你输入的文法G:<br>\n");
	temp = "非终结符号集合为:{ ";
	for(int i = 0; i < nVn -1; i++)
	{
		temp += Vn.GetAt(i);
		temp += ", ";
	}
	temp += Vn.GetAt(nVn-1);
	temp += " }<br>\n";
	out.WriteString(temp);
	temp = "终结符符号集合为:{ ";
	for(i = 0; i < nVt -1; i++)
	{
		temp += Vt.GetAt(i);
		temp += ", ";
	}
	temp += Vt.GetAt(nVt-1);
	temp += " }<br>\n";
	out.WriteString(temp);
	temp = "G[";
	temp += cStart;
	temp += "]:<br>\n";
	out.WriteString(temp);
	for(i = 1; i < nP; i ++)
	{
		temp.Format("(%d)&nbsp;", i);
		out.WriteString(temp);
		out.WriteString(P[i].GetLeft().c_str());
		out.WriteString("->");
		out.WriteString(P[i].GetRight().c_str());
		out.WriteString("<br>\n");
	}
	out.WriteString("<br>下面是生成的拓广文法G':<br>\n");
	temp = "非终结符号集合为:{ $, ";
	for(i = 0; i < nVn -1; i++)
	{
		temp += Vn.GetAt(i);
		temp += ", ";
	}
	temp += Vn.GetAt(nVn-1);
	temp += " }<br>\n";
	out.WriteString(temp);
	temp = "终结符符号集合为:{ ";
	for(i = 0; i < nVt -1; i++)
	{
		temp += Vt.GetAt(i);
		temp += ", ";
	}
	temp += Vt.GetAt(nVt-1);
	temp += " }<br>\n";
	out.WriteString(temp);
	temp = "G'[";
	temp += cStart;
	temp += "]:<br>\n";
	out.WriteString(temp);
	for(i = 0; i < nP; i ++)
	{
		temp.Format("(%d)&nbsp;", i);
		out.WriteString(temp);
		out.WriteString(P[i].GetLeft().c_str());
		out.WriteString("->");
		out.WriteString(P[i].GetRight().c_str());
		out.WriteString("<br>\n");
	}
	out.WriteString("<br>该文法的项目如下:<br>\n");
	int nCount = 1;
	for(i = 0; i < nP; i++)
	{
		for(int j = 0; j < P[i].GetRight().length() + 1 ; j++)
		{
			temp.Format("(%d)&nbsp;", nCount);
			temp += (GetProject(Pair(i, j)).GetLeft() + "->" + GetProject(Pair(i, j)).GetRight()).c_str();
			temp += "<br>";
			out.WriteString(temp);
			nCount++;
		}
	}
	out.WriteString("<br>LR(0)项目规范族如下:<br>\n");
	for (i = 0; i < nC; i++)
	{
		temp.Format("I<font size=\"1\">%d</font> = { ", i);
		out.WriteString(temp);
		for (int j = 0; j < C[i].Size() - 1; j++)
		{
//			temp = CString(GetProject(C[i].GetAt(j)).GetLeft().c_str()) + "->" + GetProject(C[i].GetAt(j)).GetRight().c_str() + ", ";
//			out.WriteString(temp);
			temp.Format("%d, ", GetProjectNum(C[i].GetAt(j)) + 1);
			out.WriteString(temp);
		}
//		temp = CString(GetProject(C[i].GetAt(j)).GetLeft().c_str()) + "->" + GetProject(C[i].GetAt(j)).GetRight().c_str() + " }<br>\n";
//		out.WriteString(temp);
		temp.Format("%d }<br>\n", GetProjectNum(C[i].GetAt(j)) + 1);
		out.WriteString(temp);		
	}
	if (IsLegalLR0Grammar())
	{
		out.WriteString("<Br>文法的LR(0)分析表<br>\n");
		out.WriteString("<table border=\"1\"  cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse\" bordercolor=\"#111111\">\n");
		temp.Format("<tr> \n <td nowrap rowspan=\"2\">&nbsp;状态&nbsp;</td><td nowrap colspan=\"%d\">\n", nVt +1);
		out.WriteString(temp);
		out.WriteString("<div align=\"center\">ACTION</div>\n");
		out.WriteString("</td>\n");
		temp.Format("<td nowrap colspan=\"%d\">\n", nVn);
		out.WriteString(temp);  
		out.WriteString("<div align=\"center\">GOTO</div>\n</td>\n</tr>\n<tr>\n");
		for (i = 0; i < nVt; i++)
			out.WriteString(CString("<td nowrap>&nbsp;") + Vt.GetAt(i) + "&nbsp;</td>\n");
		out.WriteString("<td nowrap>&nbsp;#&nbsp;</td>\n");
		for (i = 0; i < nVn; i++)
			out.WriteString(CString("<td nowrap>&nbsp;") + Vn.GetAt(i) + "&nbsp;</td>\n");
		out.WriteString("</tr>\n");
		for (int x = 0; x < nC; x++)
		{
			out.WriteString("<tr>\n<td>");
			temp.Format("%3d", x);
			temp.Replace(" ","&nbsp;");
			temp += "</td>\n";
			out.WriteString(temp);
			for (int y = 0; y < nVt; y++)
			{
				int iPos = x * (nVt + 1 + nVn) + y;
				if (pTable[iPos].one != 0)
				{
					temp.Format("%c<font size=\"1\">%d</font>", pTable[iPos].one, pTable[iPos].two);
					temp = "<td nowrap>&nbsp;" + temp + "&nbsp;</td>\n";
				}
				else
				{
					temp = "<td nowrap>&nbsp;&nbsp;&nbsp;</td>\n";
				}
				out.WriteString(temp);
			}
			int iPos = x * (nVt + 1 + nVn) + nVt;
			if (pTable[iPos].one != 'a')
				temp.Format("%c<font size=\"1\">%d</font>", pTable[iPos].one, pTable[iPos].two);
			else
				temp = "acc";
			temp = "<td nowrap>&nbsp;" + temp + "&nbsp;</td>\n";
			out.WriteString(temp);
			for (y = 0; y < nVn; y++)
			{
				int iPos = x * (nVt + 1 + nVn) + nVt + 1 + y;
				if (pTable[iPos].one != 0)
					temp.Format("%d", pTable[iPos].one);
				else
					temp = "&nbsp;";
				temp = "<td nowrap>&nbsp;" + temp + "&nbsp;</td>\n";
				out.WriteString(temp);
			}
			out.WriteString("</tr>\n");
		}
		out.WriteString("</table>\n");
	}
	else
	{
		out.WriteString("<br><font color= \"#ff0000\"<b>输入的文法不是LR(0)文法,不能生成预测分析表<b></font><br>\n");
	}
	out.WriteString("</body>\n");
	out.WriteString("</html>");
	out.Close();
	return szTempName;
}

void Grammar::Output(char * pFilename)
{
	if (pFilename == 0)
		return;
	CStdioFile OutFile;
	OutFile.Open(pFilename, CFile::modeCreate | CFile::modeWrite);
	CString t;
	OutFile.WriteString("[Terminator]\n");
	for(int i = 0; i < nVt; i++)
	{
		t.Format("%c\n", Vt.GetAt(i));
		OutFile.WriteString(t);
		
	}
	OutFile.WriteString("\n[NonTerminator]\n");
	for(i = 0; i < nVn; i++)
	{
		t.Format("%c\n", Vn.GetAt(i));
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[Starter]\n");
	t.Format("%c", cStart);
	t += "\n\n[Precept]\n";
	OutFile.WriteString(t);
	for(i = 1; i < nP; i++)
	{
		t.Format("%s->%s\n", P[i].GetLeft().c_str(), P[i].GetRight().c_str());
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[Projects]\n");
	
	for(i = 0; i < nP; i++)
	{
		for(int j = 0; j < P[i].GetRight().length() + 1 ; j++)
		{
			OutFile.WriteString((GetProject(Pair(i, j)).GetLeft() + "->" + GetProject(Pair(i, j)).GetRight() + "\n").c_str());
		}
	}
	if (IsLegalLR0Grammar())
	{
		OutFile.WriteString("\n[AnalyzeTable]\n");
		{
			for (int x = 0; x < nC; x++)
			{
				for (int y = 0; y < nVt; y++)
				{
					int iPos = x * (nVt + 1 + nVn) + y;
					if (pTable[iPos].one != 0)
					{
						t.Format("ACTION, %d, %c = %c, %d\n", x, Vt.GetAt(y), pTable[iPos].one, pTable[iPos].two);
						OutFile.WriteString(t);
					}
				}
				int iPos = x * (nVt + 1 + nVn) + nVt;
				if (pTable[iPos].one != 0)
				{
					if (pTable[iPos].one != 'a')
					{
						t.Format("ATCION, %d, # = %c, %d\n", x, pTable[iPos].one, pTable[iPos].two);
						OutFile.WriteString(t);
					}
					else
					{
						t.Format("ACTION, %d, # = Accept\n", x);
						OutFile.WriteString(t);
					}
				}
				for (y = 0; y < nVn; y++)
				{
					int iPos = x * (nVt + 1 + nVn) + nVt + 1 + y;
					if (pTable[iPos].one != 0)
					{
						t.Format("GOTO, %d, %c = %d\n", x, Vn.GetAt(y), pTable[iPos].one);
						OutFile.WriteString(t);
					}
				}
			}
		}
	}
	OutFile.Close();
}

Precept Grammar::GetPrecept(int n)
{
	if (n < nP)
		return P[n];
	else
		return Precept();
}

Pair Grammar::GetAction(int iStatus, char cNext)
{
	if (pTable == 0)
		return Pair(0, 0);
	int iPos;
	if (cNext == '#')
		iPos = iStatus * (nVt + 1 + nVn) + nVt;
	else
		if ((iPos = Vt.FindPos(cNext)) != -1)
			iPos += (iStatus * (nVt + 1 + nVn));
		else
			assert(false);
	return pTable[iPos];
}

int Grammar::GetGoTo(int iStatus, char cChar)
{
	if (pTable == 0)
		return -1;
	int iPos;
	if ((iPos = Vn.FindPos(cChar)) != -1)
		iPos += (iStatus * (nVt + 1 + nVn) + nVt + 1);
	else
		assert(false);
	return pTable[iPos].one;
}

bool Grammar::IsLegalLR0Grammar()
{
	return (iLegal == 1);
}

int Grammar::GetProjectNum(const Pair &p)
{
	int iPos = 0;
	for(int i = 0; i < p.one; i++)
	{
		iPos += (P[i].GetRight().length() + 1);
	}
	iPos += p.two;
	return iPos;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -