《编译原理作业.doc》由会员分享,可在线阅读,更多相关《编译原理作业.doc(14页珍藏版)》请在金锄头文库上搜索。
1、/*识别 分界符,运算符,赋值运算符,增减运算符,逻辑与逻辑或,关系运算符,科学计数法,实型常数,整形常数,有符号数,字符串常量,关键字,标示符,输入输出流符号*/#include#include#include #includeusing namespace std;string keyword15=int,include,using,namespace,return,void,char,float,double,unsigned,string,break,continue,do,while;/*关键字标示符*/string instruction3=/,/*,*/;/*注释行符号*/分界符
2、 char boundary9=,;,(,),#;/运算符char operation5=+,-,*,/,%;/赋值运算符char equals=; /增减运算符 string in_decrease2=+,-; /逻辑与逻辑或/string and_or2=&,|;/关系运算符 /string relation6=,=,=,=,!=;int i_point=1;/void analy_boundary(char A);void analy_operation(char A);void analy_string(char answer);void analy_keyword(char answ
3、er);void enter_p(int i_pt);void analy(FILE *fp);/void main()/主函数FILE *fp0;fp0=fopen(f:/program.txt,r+);if(fp0=NULL)printf(打开文件错误!n); exit(0);analy(fp0);return;/void analy_boundary(char A)/分析分界符的函数if(A!=EOF)if(A=,|A=;|A=|A=|A=|A=|A=(|A=)|A=#)for(int b=0;b9;b+)/char boundary11=,;,(,),#;if(A=boundaryb)
4、cout【 分界符 A】endl; break;/void analy_operation(char A)/分析运算符的函数int d=0;if(A!=EOF)if(A=+|A=-|A=*|A=/|A=%)/char operation5=+,-,*,/,%while(d5)/char operation5=+,-,*,/,%;if(A=operationd)cout【 运算符 A】endl; break;d+;/void analy_string(char answer)/识别字符串常量cout【 符号串常量 answer】endl;/void analy_keyword(char answ
5、er)/识别关键字和标示符for(int l=0;l15;l+)if(answer=keywordl)cout【 关键字 answer】endl;break; for(int m=0;m15;m+)if(answer!=keywordl)cout【 标示符 answer】endl;break;/void enter_p(int i_pt)/分屏显示操作if(i_pt % 21 = 0) cout,=,=,=,!=;char answer_2100;/识别注释行char ch,ch0,ch1,ch2,ch3,ch4,ch5,ch6;int k=0,k1=0,k2=0,k3=0,k4=0,k5=0
6、,k6=0;ch=fgetc(fp);/fgetc()读字符函数,如果遇到文件结束符号,函数返回文件结束标志EOFwhile(ch!=EOF)if(ch=|ch=!)/关系运算符couti_point+ : ;ch3=ch;ch=fgetc(fp); if(ch=)/判断 = , = ,!= 符号ch4=ch; cout【 关系运算符 ch3ch4】endl;ch3=ch4=0;ch=fgetc(fp);enter_p(i_point);continue;else if(ch=ch3)cout【 输入输出流符 ch3ch】 , 符号cout【 关系运算符 ch3】endl;ch3=ch4=0;
7、 enter_p(i_point);continue;if(ch=)/判断 = 和 = 符号couti_point+ : ;ch5=ch;ch=fgetc(fp);if(ch=ch5)cout【 关系运算符 ch5ch】endl;ch5=0;ch=fgetc(fp);enter_p(i_point);continue;elsecout【 赋值运算符 ch5】endl;ch5=0;enter_p(i_point);continue;if(ch=,|ch=;|ch=|ch=|ch=|ch=|ch=(|ch=)|ch=#)/判断分界符couti_point+ : ;analy_boundary(ch
8、);enter_p(i_point); if(ch=*|ch=/|ch=%)/ ch=+|ch=-|/判断算术运算符ch6=ch;ch=fgetc(fp);if(ch6=/)if(ch=/)/判断 / 注释couti_point+ : ;answer_2k5+=ch6;answer_2k5+=ch;ch=fgetc(fp);while(ch!=n)answer_2k5+=ch;ch=fgetc(fp);answer_2k5=0;cout【 注释语句 , answer_2】endl;k5=0;ch6=0;enter_p(i_point);continue;else if(ch=*)/判断 /*.
9、*/ 注释couti_point+ : ;answer_2k5+=ch6;answer_2k5+=ch;ch=fgetc(fp);while(ch!=/)answer_2k5+=ch;ch=fgetc(fp);answer_2k5+=ch;answer_2k5=0; cout【 注释语句 , answer_2】endl;k5=0;ch6=0;enter_p(i_point);continue; elsecouti_point+ : ; analy_operation(ch6); enter_p(i_point);ch6=0;continue;if(ch=+|ch=-)/判断算术运算符或增减运算符couti_point+ : ; ch0=ch;