資源簡介
編譯原理實驗 語義分析與中間代碼生成
Sample語言的語義和代碼生成規則,熟悉Sample語言的語義分析和代碼生成過

代碼片段和文件信息
/*
??文法G(S)
??S-->DGWE
??G-->c=R
??R-->dTe|d
??T-->+|-|*|/
??E-->aFb
??F-->?>|<
*/
#include?
#include
#include
#include
char?a[50]g[50][50];?//a[50]保存輸入串g[50][50]保存四元式
char?ch;
int?i1=0i2=0i3=0;?//i1通過自加來取得a[i1]輸入串中的字符?i2用來選擇用哪種四元式i3用來選擇用‘W‘的報錯
int?total=0;??
void?S();
void?D();
void?G();
void?W();
void?E();
void?R();
void?T();
void?F();
void?main()
{???
???int?pj=0;
???char?str[20];
???
??
????printf(“請輸入do-while語句(D代表doW代表while)并以#結束:\n“);
do{
??scanf(“%s“str);
??
??if(strcmp(str“do“)==0)
??{?
??a[j]=‘D‘;
??j++;
??}
??else?if(strcmp(str“while“)==0)
??{?
??a[j]=‘W‘;
??j++;
??}
??else?if(strcmp(str“c=d+e“)==0)
??{?
??a[j]=‘c‘;
??a[j+1]=‘=‘;
??a[j+2]=‘d‘;
??a[j+3]=‘+‘;
??a[j+4]=‘e‘;
??j=j+5;
??continue;
??}
??else?if(strcmp(str“c=d-e“)==0)
??{
??a[j]=‘c‘;
??a[j+1]=‘=‘;
??a[j+2]=‘d‘;
??a[j+3]=‘-‘;
??a[j+4]=‘e‘;
??j=j+5;
??continue;
??}
??else?if(strcmp(str“c=d*e“)==0)
??{
??a[j]=‘c‘;
??a[j+1]=‘=‘;
??a[j+2]=‘d‘;
??a[j+3]=‘*‘;
??a[j+4]=‘e‘;
??j=j+5;
??continue;
??}
??else?if(strcmp(str“c=d/e“)==0)
??{
??a[j]=‘c‘;
??a[j+1]=‘=‘;
??a[j+2]=‘d‘;
??a[j+3]=‘/‘;
??a[j+4]=‘e‘;
??j=j+5;
??continue;
??}
??else?if(strcmp(str“a>b“)==0)
??{
??a[j]=‘a‘;
??a[j+1]=‘>‘;
??a[j+2]=‘b‘; ?
??j=j+3;
??continue;
??}
??else?if(strcmp(str“a ??{
??a[j]=‘a‘;
??a[j+1]=‘>‘;
??a[j+2]=‘b‘; ?
??j=j+3;
??continue;
??}
??else?{
????????for(unsigned?int?i=0;i {
???a[j+i]=str[i];
}
?????j=j+strlen(str);
??
??}
?
}while(strcmp(str“#“)!=0);
?????printf(“\n“);
printf(“輸入串變為%s\n“a);
printf(“\n“);
ch=a[0];
??
???????S();
???????
??????
???if?(ch==‘#‘)??
???????{???printf(“accept\n“);
??????????????printf(“四元式為:\n“);
??????????????p=0;
??????????????for(;p ??{
????printf(“10%d?%s\n“pg[p]); ??
??}???????????????????????????????
??????????????
???????}
???????else?{
??????????????printf(“error\n“);
??????????????printf(“回車返回\n“);
??????????????getchar();getchar();?
??????????????return;?
???????}
???????printf(“\n“);
???????printf(“回車返回\n“);
???????getchar();
???????getchar();
}
void?S()
{
?
???printf(“%d\tS-->DGWE\n“total);total++;//total用來記數
?????
???D();
???G();
???
???
???
}
void?D()
{?
?if(ch!=‘D‘)
?{?printf(“第%d個字符%c為有非法字符請按回車返回!!“i1+1ch);
??getchar();
??????getchar();
??exit(1);}
???????ch=a[++i1];
}
?
void?G()
{??int?i=i1+1;
??
??if(ch!=‘c‘)
?{?printf(“第%d個字符%c為有非法字符請按回車返回!!“i1+1ch);
??getchar();
??????getchar();
??exit(1);}
??if(a[i]!=‘=‘)
?{?printf(“第%d個字符%c為有非法字符請按回車返回!!“i+1a[i]);
??getchar();
??????getchar();
??exit(1);}
??printf(“%d\tG-->c=R\n“total);total++;
??
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????33792??2010-06-27?17:09??語義分析\Debug\vc60.idb
?????文件??????45056??2010-06-27?16:58??語義分析\Debug\vc60.pdb
?????文件?????192626??2010-06-27?16:58??語義分析\Debug\語義.exe
?????文件?????189700??2010-06-27?16:58??語義分析\Debug\語義.ilk
?????文件??????23491??2010-06-27?16:58??語義分析\Debug\語義.obj
????I.A....????227508??2010-06-27?16:58??語義分析\Debug\語義.pch
?????文件?????369664??2010-06-27?16:58??語義分析\Debug\語義.pdb
????I.A....??????5729??2010-06-27?16:54??語義分析\語義.cpp
?????文件???????3379??2010-06-27?16:58??語義分析\語義.dsp
?????文件????????533??2010-06-27?17:11??語義分析\語義.dsw
?????文件??????41984??2010-06-27?17:39??語義分析\語義.ncb
?????文件??????48640??2010-06-27?17:39??語義分析\語義.opt
?????文件????????744??2010-06-27?16:58??語義分析\語義.plg
?????目錄??????????0??2010-06-27?16:58??語義分析\Debug
?????目錄??????????0??2010-06-27?17:39??語義分析
-----------?---------??----------?-----??----
??????????????1182846????????????????????15
- 上一篇:通用電動車充電器的設計
- 下一篇:紅外對管測量液滴速度藥液不足報警+仿真
評論
共有 條評論