一、实验目的
通过本教材附录B(词法分析程序)调试,改编一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
2.1 待分析的简单的词法 (1)保留字:if,else, for, while, do, int ,read, write,real,char (2)纯单分界符:+ — * () {} ; : , (3)双分界符:> < = ! ,&&,|| 2.2 实现功能: (1)在命令行中输入源程序文件名(包括文件名路径) (2)输入目标文件名(包括文件名路径) (3)调用所编词法分析代码将分析结果写入目标文件代码(编译完成)
三、词法分析程序的算法思想:
算法的基本任务是从源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,分析与代码中相应的单词符号。 3.1 主程序示意图:
调用子程序 输入串结束 是 结束 否
3.2词法分析示意图:
开始 输入源程序文件否 文件名判断 是 输入目标文件名 否 文件名判断 是 读取一个字符 是否为字母? 是 标识符处理 否 是 是否数字? 数字分界符反斜杠其他组合整数 分界符处理 注释处理 错误处理 四、词法分析程序的C语言程序源代码:
返回
词法分析子程序:
#include #define keywordSum 10 char *keyword[keywordSum]={\"if\添加的保留字char,real; char singleword[50]=\"+ - * () {} ; , : \"; char doubleword[10]=\"> < = ! \"; char doubleword1[10]=\"& &\"; char doubleword2[10]=\"||\"; extern char Scanin[300],Scanout[300]; extern FILE * fin,*fout; int TESTscan() { char ch,token[40]; int es=0,j,n; printf (\"请输入源程序文件名(包括路径):\"); scanf (\"%s\ printf (\"请输入词法分析输出文件名(包括路径):\"); scanf (\"%s\ if ((fin=fopen(Scanin,\"r\"))==NULL) { printf(\"\\n打开词法分析输入文件出错!\\n\"); return(1); } if((fout=fopen(Scanout,\"w\"))==NULL) { printf(\"\\n创建词法分析输出文件出错!\\n\"); return(2); } ch=getc(fin); while(ch!=EOF) { while (ch==' '|| ch=='\\n'|| ch=='\')ch=getc(fin); if(isalpha(ch)) { token[0]=ch;j=1; ch=getc(fin); while(isalnum(ch)) { token[j++]=ch; ch=getc(fin); } token[j]='\\0'; n=0; while ((n token[0]=ch;j=1; ch=getc(fin); while (isdigit(ch)) { token[j++]=ch; ch=getc(fin); } token[j]='\\0'; fprintf(fout,\"%s\%s\\n\ }else if (strchr(singleword,ch)>0) { token[0]=ch;token[1]='\\0'; ch=getc(fin); fprintf(fout,\"%s\%s\\n\ }else if (strchr(doubleword,ch)>0) { token[0]=ch; ch=getc(fin); if (ch==' = ') { token[1]=ch;token[2]='\\0'; ch=getc(fin); }else token[1]='\\0'; fprintf(fout,\"%s\%s\\n\ } //所加代码; else if (strchr(doubleword1,ch)>0)//判断&& { token[0]=ch; ch=getc(fin); if(ch=='&') { token[1]=ch; token[2]='\\0'; ch=getc(fin); }else token[1]='\\0'; fprintf(fout,\"%s\%s\\n\ } //所加代码 else if (strchr(doubleword2,ch)>0)//判断|| { token[0]=ch; ch=getc(fin); if(ch=='|') { token[1]=ch; token[2]='\\0'; ch=getc(fin); }else token[1]='\\0'; fprintf(fout,\"%s\%s\\n\ } /所加代码 else if (ch=='/') { ch=getc(fin); if (ch=='*') { char ch1; ch1=getc(fin); do { ch=ch1;ch1=getc(fin);} while ((ch!='*'||ch1!='/')&&ch1!=EOF); ch=getc(fin); }else { token[0]=ch;token[1]='\\0'; fprintf(fout,\"%s\%s\\n\ } }else { token[0]=ch;token[1]='\\0'; ch=getc(fin); es=3; fprintf(fout,\"%s\%s]\\n\ } } fclose(fin); fclose(fout); return(es); } 主程序: #include char Scanin[300],Scanout[300]; FILE *fin,*fout; void main(){ int es=0; es=TESTscan(); if(es>0) printf(\"词法分析有错,编译停止!\"); else printf(\"词法分析成功! \\n\"); } 五、结果分析: 当源代码文件为“a.t”:{ int a; a=10; read; & } 编译结果: 当源文件为a.t:{ int a; real; for(a=10||a=1){ return 0;} } 结果为: b.t的结果为: 六、总结: 词法分析的基本任务是从字符串表示的源程序中识别出具有意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 本组成员:阳京,黄菁华,龙功成 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务