📄 grammar.cpp
字号:
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) ", 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) ", 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) ", 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\"> 状态 </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> ") + Vt.GetAt(i) + " </td>\n");
out.WriteString("<td nowrap> # </td>\n");
for (i = 0; i < nVn; i++)
out.WriteString(CString("<td nowrap> ") + Vn.GetAt(i) + " </td>\n");
out.WriteString("</tr>\n");
for (int x = 0; x < nC; x++)
{
out.WriteString("<tr>\n<td>");
temp.Format("%3d", x);
temp.Replace(" "," ");
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> " + temp + " </td>\n";
}
else
{
temp = "<td nowrap> </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> " + temp + " </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 = " ";
temp = "<td nowrap> " + temp + " </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 + -