📄 compiler.cpp
字号:
return FILEEND;
}
return SyntaxAnalysis_Statement();
}
//为Call语句
if(!strcmp("call",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句后过程名
{
seTemp.iSyntaxErrCode=SE_FE_CALLNOID;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:关键字call所调用的过程名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_CALLPROCFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:关键字call所调用的过程名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_CALLPROCMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句后无表达式
{
seTemp.iSyntaxErrCode=SE_FE_CALLNOEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
//过程调用带参数
if(!strcmp("(",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时'('后面必须有表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_CALLNOEXPRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时后面必须有')'
{
seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句调用过程时'('后面必须有表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_CALLNOEXPRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句调用过程时后面必须有')'
{
seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时后面必须有')'
{
seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Call语句调用过程时后面必须有')'
{
seTemp.iSyntaxErrCode=SE_CALLEND;
m_vectorSyntaxErr.push_back(seTemp);
}
return 1;
}
return 1;
}
//为Read语句
if(!strcmp("read",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:read语句后无'('和变量和')'
{
seTemp.iSyntaxErrCode=SE_FE_READNOLSYMIDRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:read语句没有'('
{
seTemp.iSyntaxErrCode=SE_READNOLSYM;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句后无变量和')'
{
seTemp.iSyntaxErrCode=SE_FE_READNOIDRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:关键字read后的变量的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_READIDFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:关键字read后的变量的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_READIDMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:read语句后无')'
{
seTemp.iSyntaxErrCode=SE_FE_READNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句中逗号','后无变量
{
seTemp.iSyntaxErrCode=SE_FE_READNOID;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:关键字read后的变量的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_READIDFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:关键字read后的变量的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_READIDMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句后无')'
{
seTemp.iSyntaxErrCode=SE_FE_READNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句后')'
{
seTemp.iSyntaxErrCode=SE_FE_READNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Read语句没有')'
{
seTemp.iSyntaxErrCode=SE_READNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
}
return 1;
}
//为write语句
if(!strcmp("write",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无'(',表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_WRITENOLSYMEXPRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Write语句没有'('
{
seTemp.iSyntaxErrCode=SE_WRITENOLSYM;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_WRITENOEXPRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无')'
{
seTemp.iSyntaxErrCode=SE_FE_WRITENORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句中逗号','后无变量
{
seTemp.iSyntaxErrCode=SE_FE_WRITENOID;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:关键字Write后的变量的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_WRITEIDFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:关键字Write后的变量的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_WriteIDMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无')'
{
seTemp.iSyntaxErrCode=SE_FE_WRITENORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
}
if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Write语句后没有')'
{
seTemp.iSyntaxErrCode=SE_WRITENORSYM;
m_vectorSyntaxErr.push_back(seTemp);
}
return 1;
}
return SyntaxAnalysis_Body();
}
int CCompiler::SyntaxAnalysis_Exp()
{
SYNTAXERR seTemp;
if(!strcmp("+",m_vectorSymbol[m_iCurPointer].szStr))
m_iCurPointer++;
else
{
if(!strcmp("-",m_vectorSymbol[m_iCurPointer].szStr))
m_iCurPointer++;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后无项
{
seTemp.iSyntaxErrCode=SE_FE_EXPNOTERM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Term()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//文件结束
return FILEEND;
while(SyntaxAnalysis_Aop())
{
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式中'+'或'-'后无项
{
seTemp.iSyntaxErrCode=SE_FE_EXPSYMNOTERM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Term()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//文件结束
return FILEEND;
}
return 1;
}
int CCompiler::SyntaxAnalysis_Lexp()
{
SYNTAXERR seTemp;
if(!strcmp("odd",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Odd应有表达式
{
seTemp.iSyntaxErrCode=SE_FE_ODDNOEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
return 1;
}
if(SyntaxAnalysis_Exp()==1)
{
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后应有运算符和表达式
{
seTemp.iSyntaxErrCode=SE_FE_LEXPNOEXPLOPEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(!SyntaxAnalysis_Lop())//语法出错:表达式之间无运算符号
{
seTemp.iSyntaxErrCode=SE_LEXPNOLOP;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后应有运算符和表达式
{
seTemp.iSyntaxErrCode=SE_FE_LEXPNOEXPLOPEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
return 1;
}
return 0;
}
bool CCompiler::SyntaxAnalysis_Lop()
{
if(strcmp("=",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("<>",m_vectorSymbol[m_iCurPointer].szStr) &&
strcmp("<",m_vectorSymbol[m_iCurPointer].szStr) && strcmp(">",m_vectorSymbol[m_iCurPointer].szStr) &&
strcmp("<=",m_vectorSymbol[m_iCurPointer].szStr) && strcmp(">=",m_vectorSymbol[m_iCurPointer].szStr))
return 0;
m_iCurPointer++;
return 1;
}
bool CCompiler::SyntaxAnalysis_Aop()
{
if(strcmp("+",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("-",m_vectorSymbol[m_iCurPointer].szStr))
return 0;
m_iCurPointer++;
return 1;
}
int CCompiler::SyntaxAnalysis_Term()
{
SYNTAXERR seTemp;
if(SyntaxAnalysis_Factor()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)
return FILEEND;
while(SyntaxAnalysis_Mop())
{
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:项无'(',表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_TERMNOFACTOR;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Factor()==FILEEND)
return FILEEND;
}
return 1;
}
int CCompiler::SyntaxAnalysis_Factor()
{
if(SyntaxAnalysis_Id())
return 1;
m_iCurPointer--;
if(SyntaxAnalysis_Integer())
return 1;
SYNTAXERR seTemp;
m_iCurPointer--;
if(!strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
{
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:因子无'(',表达式和')'
{
seTemp.iSyntaxErrCode=SE_FE_FACTORNOLSYMEXPRSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:因子后没有')'
{
seTemp.iSyntaxErrCode=SE_FACTORNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
}
}
return 0;
}
bool CCompiler::SyntaxAnalysis_Mop()
{
if(strcmp("*",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("/",m_vectorSymbol[m_iCurPointer].szStr))
return 0;
m_iCurPointer++;
return 1;
}
char* CCompiler::JumpNoMatterChar(char *szStr)
{
//跳过空格,回车,换行符,Tab
while(*szStr==' ' || *szStr=='\r' || *szStr=='\n' || *szStr==9)
szStr++;
return szStr;
}
void CCompiler::OutSymbolTab(char *szFile)
{
ofstream ofs(szFile,ios::binary);
int nLen=m_vectorSymbol.size();
for(int i=0;i<nLen;i++)
ofs.write((char*)&m_vectorSymbol[i],sizeof(LEXPROPERTYVS)-sizeof(char*));
ofs.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -