www.gusucode.com > 一个VC++语法分析模块程序实例源码程序 > 一个VC++语法分析模块程序实例/CompileSys/CompileSys/PL/Compiler.cpp
// Compiler.cpp: implementation of the CCompiler class. // Download by http://www.codesc.net ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Compiler.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define LEN_KEYWORDTAB 15//关键字表长 #define LEN_OPRSYMTAB 11//运算符表长 #define LEN_BNDSYMTAB 4 //界符表长 //关键字表 const char tabKeyWord[LEN_KEYWORDTAB][10]= { "program", "const", "var", "procedure", "begin", "end", "if", "then", "else", "while", "do", "call", "read", "write", "odd", }; //运算符表 const char tabOprSym[LEN_OPRSYMTAB][3]= { "+", "-", "*", "/", "=", "<", ">", "<>", "<=", ">=", ":=", }; //界符表 const char tabBndSym[LEN_BNDSYMTAB][2]= { ";", ",", "(", ")", }; CCompiler::CCompiler() { } CCompiler::~CCompiler() { //下面这段释放内存的代码不知道为什么出错 // for(int i=0;i<m_iVecotrSymbolSize;i++) // delete m_vectorSymbol[i].szStr; } bool CCompiler::LexAnalysis(char *szStr) { SYNTAXERR seTemp; if(!strcmp(szStr,"")) { seTemp.iSyntaxErrCode=SE_FE_NOCODE; m_vectorSyntaxErr.push_back(seTemp); return 0; } int nLen; char *szTemp; LEXPROPERTYVS lpvTemp; char *szStrBU=szStr; strlwr(szStr);//小写字符串 while(*szStr!='\0') { szStr=JumpNoMatterChar(szStr); if(*szStr=='\0') break; nLen=0; if(isalpha(*szStr)) { lpvTemp.nStrPos=szStr-szStrBU; while(isalpha(*szStr) || isdigit(*szStr)) { nLen++; szStr++; } szTemp=new char[nLen]; memcpy(szTemp,szStr-nLen,nLen); szTemp[nLen]='\0'; lpvTemp.nStrLen=nLen; if(IsKeyWord(szTemp)) lpvTemp.lpProperty=KeyWord;//该字符串为关键字 else lpvTemp.lpProperty=Id; //该字符串可能为变量,过程名,常量 lpvTemp.szStr=szTemp; m_vectorSymbol.push_back(lpvTemp); } else { if(isdigit(*szStr)) { lpvTemp.nStrPos=szStr-szStrBU; while(isdigit(*szStr)) { nLen++; szStr++; } szTemp=new char[nLen]; memcpy(szTemp,szStr-nLen,nLen); szTemp[nLen]='\0'; lpvTemp.nStrLen=nLen; lpvTemp.lpProperty=Const; lpvTemp.szStr=szTemp; m_vectorSymbol.push_back(lpvTemp); } else { lpvTemp.nStrPos=szStr-szStrBU; szTemp=new char[2]; if(!isalpha(*szStr) && !isdigit(*szStr) && *szStr!='\r' && *szStr!='\n' && *szStr!='\0' && *szStr!=' ' && *szStr!=9) { szTemp[0]=*szStr; szStr++; } switch(szTemp[0]) { case '<': if(*szStr=='=' || *szStr=='>') { szTemp[1]='='; szTemp[2]='\0'; lpvTemp.lpProperty=OprSym; lpvTemp.nStrLen=2; szStr++; } else { szTemp[1]='\0'; lpvTemp.lpProperty=OprSym; lpvTemp.nStrLen=1; } break; case '>': if(*szStr=='=') { szTemp[1]='='; szTemp[2]='\0'; lpvTemp.lpProperty=OprSym; lpvTemp.nStrLen=2; szStr++; } else { szTemp[1]='\0'; lpvTemp.lpProperty=OprSym; lpvTemp.nStrLen=1; } break; case ':': if(*szStr=='=') { szTemp[1]='='; szTemp[2]='\0'; lpvTemp.lpProperty=OprSym; lpvTemp.nStrLen=2; szStr++; } else { szTemp[1]='\0'; lpvTemp.lpProperty=IllegalChar; lpvTemp.nStrLen=1; seTemp.iSyntaxErrCode=SE_ILLEGALCHAR; m_vectorSyntaxErr.push_back(seTemp); } break; default: szTemp[1]='\0'; if(IsOprSym(szTemp)) { lpvTemp.nStrLen=1; lpvTemp.lpProperty=OprSym; } else { if(IsBndSym(szTemp)) { lpvTemp.nStrLen=1; lpvTemp.lpProperty=BndSym; } else//有错误产生 { lpvTemp.nStrLen=1; lpvTemp.lpProperty=IllegalChar; seTemp.iSyntaxErrCode=SE_ILLEGALCHAR; m_vectorSyntaxErr.push_back(seTemp); } } break; } lpvTemp.szStr=szTemp; m_vectorSymbol.push_back(lpvTemp); } } } return 1; } bool CCompiler::IsKeyWord(char *szStr) { for(int i=0;i<LEN_KEYWORDTAB;i++) { if(!strcmp(szStr,tabKeyWord[i])) return 1; } return 0; } bool CCompiler::IsBndSym(char *szStr) { for(int i=0;i<LEN_BNDSYMTAB;i++) { if(!strcmp(szStr,tabBndSym[i])) return 1; } return 0; } bool CCompiler::IsOprSym(char *szStr) { for(int i=0;i<LEN_OPRSYMTAB;i++) { if(!strcmp(szStr,tabOprSym[i])) return 1; } return 0; } bool CCompiler::IsInSymbolTab(char *szStr) { for(int i=0;i<m_iVecotrSymbolSize;i++) { if(!strcmp(m_vectorSymbol[i].szStr,szStr)) return 1; } return 0; } void CCompiler::SyntaxAnalysis() { SyntaxAnalysis_Prog(); } void CCompiler::Compile(char *szFile) { char *szStr; int nLength; CFile file(szFile,0); CString str; CString strLeft,strRight; int nPos; m_iCurPointer=0; //复位符号表指针 m_vectorSyntaxErr.clear();//清空语法错误向量 m_vectorSymbol.clear(); //清空符号表向量 nLength=file.GetLength(); szStr=new char[nLength]; file.Read(szStr,nLength); szStr[nLength]='\0'; if(!LexAnalysis(szStr))//词法分析 return; //-----------输出符号表----------- str.Format("%s",szFile); nPos=str.ReverseFind('\\'); strLeft=str.Left(nPos+1); strRight=str.Right(str.GetLength()-nPos-1); if(strRight.Right(4)==".pas") str=strLeft+strRight.Left(strRight.GetLength()-4)+"_LexAnanlysisResult.dat"; else str=strLeft+strRight+"_LexAnanlysisResult.dat"; OutSymbolTab((LPSTR)(LPCSTR)str); //-------------------------------- m_iVecotrSymbolSize=m_vectorSymbol.size(); SyntaxAnalysis();//语法分析 } void CCompiler::SyntaxAnalysis_Prog() { SYNTAXERR seTemp; if(strcmp("program",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:程序必须以Program开头 { seTemp.iSyntaxErrCode=SE_PROGHEAD; m_vectorSyntaxErr.push_back(seTemp); } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Program后应有程序名,分号和程序块 { seTemp.iSyntaxErrCode=SE_FE_PROGNEEDIDSYMBLOCK; m_vectorSyntaxErr.push_back(seTemp); return; } switch(SyntaxAnalysis_Id()) { case ID_FIRSTERR: seTemp.iSyntaxErrCode=SE_ID_PROGNAMEFIRST;//语法出错:定义程序名的变量名的第一个字符必须为字母 m_vectorSyntaxErr.push_back(seTemp); break; case ID_MIDERR: seTemp.iSyntaxErrCode=SE_ID_PROGNAMEMID;//语法出错:定义程序名的变量名的中间字符或为字母 m_vectorSyntaxErr.push_back(seTemp); break; } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序名后必须有分号和程序块 { seTemp.iSyntaxErrCode=SE_FE_NEEDSYMBLOCK; m_vectorSyntaxErr.push_back(seTemp); return; } if(strcmp(";",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:定义程序名的变量名后必须以分号结束 { seTemp.iSyntaxErrCode=SE_PROGTAIL; m_vectorSyntaxErr.push_back(seTemp); } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序必须有程序块 { seTemp.iSyntaxErrCode=SE_FE_NEEDBLOCK; m_vectorSyntaxErr.push_back(seTemp); return; } SyntaxAnalysis_Block(); if(m_iVecotrSymbolSize>m_iCurPointer)//语法出错:多余的文件尾-程序以程序块结束,程序块后面不应再有程序 { seTemp.iSyntaxErrCode=SE_UNWANTEDTAIL; m_vectorSyntaxErr.push_back(seTemp); } } int CCompiler::SyntaxAnalysis_Id() { int iSize=strlen(m_vectorSymbol[m_iCurPointer].szStr); if(!isalpha(m_vectorSymbol[m_iCurPointer].szStr[0])) { m_iCurPointer++; return ID_FIRSTERR; } for(int i=1;i<iSize;i++) { if(!isalpha(m_vectorSymbol[m_iCurPointer].szStr[i]) && !isdigit(m_vectorSymbol[m_iCurPointer].szStr[i]))//语法出错 { m_iCurPointer++; return ID_MIDERR; } } m_iCurPointer++; return -1; } int CCompiler::SyntaxAnalysis_Block() { SYNTAXERR seTemp; if(SyntaxAnalysis_Condecl()==FILEEND) { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序必须有程序体 { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } if(SyntaxAnalysis_Vardecl()==FILEEND) { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序必须有程序体 { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } if(SyntaxAnalysis_Proc()==FILEEND) { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序必须有程序体 { seTemp.iSyntaxErrCode=SE_FE_NEEDBODY; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } return SyntaxAnalysis_Body(); } int CCompiler::SyntaxAnalysis_Condecl() { SYNTAXERR seTemp; if(strcmp("const",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:定义常量时必须以关键字Const开头 { m_iCurPointer--; return 0;//不像是常量定义,返回 } if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Const后面必须有变量名 { seTemp.iSyntaxErrCode=SE_FE_CONSTEND; m_vectorSyntaxErr.push_back(seTemp); return FILEEND;//应该是常量定义 } if(SyntaxAnalysis_Const()==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_CONSTSYMEND; m_vectorSyntaxErr.push_back(seTemp); return FILEEND; } 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); 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(); }