📄 compiler.cpp
字号:
}
if(SyntaxAnalysis_Const()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)
return 1;
}
return 1;
}
int CCompiler::SyntaxAnalysis_Vardecl()
{
SYNTAXERR seTemp;
if(strcmp("var",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
{
m_iCurPointer--;
return 0;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Var后面必须有变量名
{
seTemp.iSyntaxErrCode=SE_FE_VAREND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是变量定义
}
switch(SyntaxAnalysis_Id())//语法出错:定义变量的变量名的第一个字符必须为字母
{
case ID_FIRSTERR://语法出错:定义变量的变量名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_VARNAMEFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:定义变量的变量名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_VARNAMEMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)
return 1;
while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:定义变量还未结束
{
seTemp.iSyntaxErrCode=SE_FE_VARNOEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
switch(SyntaxAnalysis_Id())//语法出错:定义变量的变量名的第一个字符必须为字母
{
case ID_FIRSTERR://语法出错:定义变量的变量名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_VARNAMEFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:定义变量的变量名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_VARNAMEMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)
return 1;
}
return 1;
}
int CCompiler::SyntaxAnalysis_Proc()
{
SYNTAXERR seTemp;
if(strcmp("procedure",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
{
m_iCurPointer--;
return 0;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Procedure后面必须有过程名
{
seTemp.iSyntaxErrCode=SE_FE_PROCNONAME;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
//检查过程名
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:定义过程名的变量名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_PROCNAMEFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:定义过程名的变量名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_PROCNAMEMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后无括号和参数
{
seTemp.iSyntaxErrCode=SE_FE_NOPROCSYMARG;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
{
seTemp.iSyntaxErrCode=SE_PROCLSYMBOL;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后参数
{
seTemp.iSyntaxErrCode=SE_FE_PROCNOARG;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
//检查过程参数
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:定义过程参数的变量名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:定义过程参数的变量名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后无参数
{
seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数还未写完
{
seTemp.iSyntaxErrCode=SE_FE_PROCAGRNOEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
//检查过程参数
switch(SyntaxAnalysis_Id())
{
case ID_FIRSTERR://语法出错:定义过程参数的变量名的第一个字符必须为字母
seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEFIRST;
m_vectorSyntaxErr.push_back(seTemp);
break;
case ID_MIDERR://语法出错:定义过程参数的变量名的中间字符或为字母或为数字
seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEMID;
m_vectorSyntaxErr.push_back(seTemp);
break;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数后应有')'
{
seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数后应有')'
{
seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
{
seTemp.iSyntaxErrCode=SE_PROCRSYMBOL;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:定义完过程后必须以分号结束
{
seTemp.iSyntaxErrCode=SE_FE_PROCEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;//应该是过程定义
}
if(strcmp(";",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:定义完过程后必须以分号结束
{
seTemp.iSyntaxErrCode=SE_PROCEND;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程无块
{
seTemp.iSyntaxErrCode=SE_FE_PROCNOBLOCK;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Block()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)
return 1;
while(!strcmp(";",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:另一个过程还未定义
{
seTemp.iSyntaxErrCode=SE_FE_PROCNOPROC;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Proc()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)
return 1;
}
return 1;
}
int CCompiler::SyntaxAnalysis_Body()
{
SYNTAXERR seTemp;
if(strcmp("begin",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:程序体必须以关键字Begin开头
{
seTemp.iSyntaxErrCode=SE_BEGINHEAD;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体无语句
{
seTemp.iSyntaxErrCode=SE_FE_BODYNOSTATE;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Statement()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
{
seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
while(!strcmp(";",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:语句后面的分号后面应该还有语句
{
seTemp.iSyntaxErrCode=SE_FE_BODYSYMNOSTATE;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Statement()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
{
seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
{
seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp("end",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:程序体应该以关键字End结束
{
seTemp.iSyntaxErrCode=SE_BODYEND;
m_vectorSyntaxErr.push_back(seTemp);
}
return 1;
}
bool CCompiler::SyntaxAnalysis_Integer()
{
int iSize=strlen(m_vectorSymbol[m_iCurPointer].szStr);
for(int i=0;i<iSize;i++)
{
if(!isdigit(m_vectorSymbol[m_iCurPointer].szStr[i]))//语法出错
{
m_iCurPointer++;
return 0;
}
}
m_iCurPointer++;
return 1;
}
int CCompiler::SyntaxAnalysis_Const()
{
SYNTAXERR seTemp;
if(!SyntaxAnalysis_Id())
{
seTemp.iSyntaxErrCode=SE_ID_CONSTNAME;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:必须给常量赋值
{
seTemp.iSyntaxErrCode=SE_FE_CONSTIDEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp(":=",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:常量赋值符号应为:=
{
seTemp.iSyntaxErrCode=SE_CONSTSYMBOL;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:常量赋值符号":="后应有常量
{
seTemp.iSyntaxErrCode=SE_FE_CONSTSYMBOLEND;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(!SyntaxAnalysis_Integer())
{
seTemp.iSyntaxErrCode=SE_INT_CONST;
m_vectorSyntaxErr.push_back(seTemp);
}
return 1;
}
int CCompiler::SyntaxAnalysis_Statement()
{
SYNTAXERR seTemp;
//为赋值语句
if(SyntaxAnalysis_Id()==-1 && !IsKeyWord(m_vectorSymbol[m_iCurPointer-1].szStr))
{
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:赋值语句没有赋值符号与表达式
{
seTemp.iSyntaxErrCode=SE_FE_EVELUATENOSYMEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp(":=",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:赋值符号应未:=
{
seTemp.iSyntaxErrCode=SE_VAREVELUATE;
return 0;
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:赋值语句没有表达式
{
seTemp.iSyntaxErrCode=SE_FE_EVELUATENOEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Exp()==FILEEND)
return FILEEND;
return 1;
}
m_iCurPointer--;
//为if语句
if(!strcmp("if",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句后没有表达式,关键字then和表达式
{
seTemp.iSyntaxErrCode=SE_FE_IFNOLEXPTHENLEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Lexp()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句后没有关键字then和表达式
{
seTemp.iSyntaxErrCode=SE_FE_IFNOTHENLEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp("then",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:if语句没有关键字then
{
seTemp.iSyntaxErrCode=SE_NOTHEN;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句没有表达式
{
seTemp.iSyntaxErrCode=SE_FE_IFNOLEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Statement()==FILEEND)
return FILEEND;
if(!strcmp("else",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句的关键字else后面没有表达式
{
seTemp.iSyntaxErrCode=SE_FE_IFELSENOLEXP;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
return SyntaxAnalysis_Statement();
}
return 1;
}
//为While语句
if(!strcmp("while",m_vectorSymbol[m_iCurPointer].szStr))
{
m_iCurPointer++;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句后没有表达式,关键字do和语句
{
seTemp.iSyntaxErrCode=SE_FE_WHILENOLEXPDOSTATE;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(SyntaxAnalysis_Lexp()==FILEEND)
return FILEEND;
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句后没有表达式,关键字do和语句
{
seTemp.iSyntaxErrCode=SE_FE_WHILENODOSTATE;
m_vectorSyntaxErr.push_back(seTemp);
return FILEEND;
}
if(strcmp("do",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:while语句没有关键字then
{
seTemp.iSyntaxErrCode=SE_NODO;
m_vectorSyntaxErr.push_back(seTemp);
}
if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句没有表达式
{
seTemp.iSyntaxErrCode=SE_FE_WHILENOSTATE;
m_vectorSyntaxErr.push_back(seTemp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -