1、 int fadr; int ladr; int parameter; bool parameterIsDefined; proRecord;/*文法产生式如下*A:程序 A-BB:分程序 B-begin C;M endC:说明与句表 C-DCC-;|D:说明语句 D-E|JE:变量说明 E-integer FF:变量 F-GG:标识符 G-HGG|IGH:字母 H-a|.|z|A|.|ZI:数字 I-0|1|.|9J:函数说明 J-integer function G(K);LK:参数 K-FL:函数体 L-M:执行语句表 M-NMMN:执行语句 N-O|P|Q|WO:读语句 O-read(
2、F)P:写语句 P-write(F)Q:赋值语句 Q-F:=RR:算术表达式 R-SRR-SRS:项 S-TSS*TST:因子 T-F|U|ZU:常数 U-VV:无符号整数 V-IVVW:条件语句 W-if X then N else NX:条件表达式 X-RYRY:关系运算符 Y-|=|=|Z:函数调用 Z-G(R)*/void A();void B();void C();void C_();void D();void E();void F();void G();void J();void K();void L();void M();void M_();void N();void O();v
3、oid P();void Q();void R();void R_();void S();void S_();void T();void U();void W();void X();void Y();void Z();/*初始化函数:从输入文件读取数据,建立各个文件,初始化全局变量*/bool init(int argc, char* argv);/*结束处理函数,将var和pro数组中的元素输出到相应文件,填充输出文件*/bool final();/*错误处理函数,参数分别为行号、错误码和错误符号*/bool error(int lineNum, int errNum, const char
4、* sign);/*获得所处目录路径,包括最后斜杠,或者为空*/void getPath(char* in, char* out);/*获得文件名,不包括扩展*/void getFilename(char* in, char* out);/*获得下一符号,true表示已到队尾,false表示还未到队尾*/bool nextToken();/*获得当前符号的下一字符,true表示已到0*/bool nextChar();/*判断变量是否已存在*/bool isVarExisted(char* vname, char* vproc, bool vkind);/*判断过程是否已存在,参数为过程名*/
5、bool isProExisted(char* vname);/*获得下一符号,指针不变*/int getNextToken();char inputMAX_COUNT17;/存放输入文件所有符号的数组int kindMAX_COUNT;int inputCount;/输入符号的数量int pToken;/指向当前输入符号int pChar;/指向当前输入符号中的当前字符varRecord currentVar;/存放当前变量的信息proRecord currentPro;/存放当前过程的信息int lineNum;/当前行号varRecord varMAX_COUNT;/存放变量名表项数组p
6、roRecord proMAX_COUNT;/存放过程名表项数组int varCount;/变量的数量int proCount;/过程的数量FILE* inFile;/输入文件句柄FILE* outFile;/输出文件句柄FILE* errFile;/错误文件句柄FILE* varFile;/变量文件句柄FILE* proFile;/过程文件句柄/*主函数*/int main(int argc, char* argv) if (init(argc, argv) A(); final(); return 0;bool init(int argc, char* argv) if (argc !=
7、2) return false; else char* inFilename = argv1; char outFilenameMAX_COUNT = char errFilenameMAX_COUNT = char varFilenameMAX_COUNT = char proFilenameMAX_COUNT = char filenameMAX_COUNT = char pathMAX_COUNT = /获得文件名(不包括扩展名)和路径 getFilename(inFilename, filename); getPath(inFilename, path); /生成输出文件全部路径 st
8、rcat(outFilename, path); /strcat(outFilename, ); strcat(outFilename, filename); strcat(outFilename, .dys /生成错误文件全部路径 strcat(errFilename, path); /strcat(errFilename, strcat(errFilename, filename); strcat(errFilename, .err /生成变量文件全部路径 strcat(varFilename, path); /strcat(varFilename, strcat(varFilename,
9、 filename); strcat(varFilename, .var /生成过程文件全部路径 strcat(proFilename, path); /strcat(proFilename, strcat(proFilename, filename); strcat(proFilename, .pro /打开文件句柄 if (inFile = fopen(inFilename, r) & (outFile = fopen(outFilename, w (errFile = fopen(errFilename, (varFile = fopen(varFilename, (proFile =
10、fopen(proFilename, ) /初始化单词指针、字符指针、行号、层次 inputCount = 0; pToken = 0; pChar = 0; lineNum = 1; /level = 0;/当前层次 /varCountInPro = 0; strcpy(currentPro.pname, currentPro.plev = 0; currentPro.varNum = 0; currentPro.parameter = -1; varCount = 0; proCount = 0; /读取输入文件内容,初始化input数组 while (!feof(inFile) char
11、 stringOfLineMAX_COUNT; if (fgets(stringOfLine, MAX_COUNT, inFile) char lineString20 = strncpy(lineString, stringOfLine, 19); char* kindString = strrchr(lineString, kindinputCount = atoi(kindString+1); char string17 = strncpy(string, stringOfLine, 16); char* lastString = strrchr(string, strcpy(inputinputCount, lastString + 1); inputCount+; return true; else fclose(inFile); fclose(outFile); fclose(errFile); fclose(varFile); fclose(proFile
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1