資源簡介
這是學習編譯原理時候的大作業,做的是一個表達式的編譯器。

代碼片段和文件信息
#include
#include
#include
#include
#include“LL.h“
/*******************************************
判斷一個字符是否在指定字符串中
********************************************/
unsigned?IsInSet(char?cchar?*p)
{
unsigned?i;
if(strlen(p)==0)
return(0);
for(i=0;;i++)
{
if(p[i]==c)
return(1);???????/*若在,返回1*/
if(i==strlen(p))
return(0);???????/*若不在,返回0*/
}
}
/*******************************************
得到一個不是非終結符的符號
********************************************/
char?getch()
{
char?c=‘A‘;
????while(IsInSet(cvn)==1)
c++;
return(c);
}
/*******************************************
分解含有左遞歸的產生式
********************************************/
void?left_recursion(char?*point)
{?????????????????????/*完整的產生式在point[]中*/
????int?m=0n=3k;
char?temp[20]ch;
ch=getch();???????????/*得到一個非終結符*/
unsigned?j;
k=strlen(vn);
vn[k]=ch;
vn[k+1]=‘\0‘;
for(j=0;j<=strlen(point)-1;j++)
{
if(point[n]==point[0])
{??????????????????????????/*如果‘|‘后的首符號和左部相同*/
for(j=n+1;j<=strlen(point)-1;j++)
{
while(point[j]!=‘|‘&&point[j]!=‘\0‘)
temp[m++]=point[j++];
left[count]=ch;
memcpy(right[count]tempm);
right[count][m]=ch;
right[count][m+1]=‘\0‘;
m=0;
count++;
if(point[j]==‘|‘)
{
n=j+1;
break;
}
}
}
else
{??????????????????????????/*如果‘|‘后的首符號和左部不同*/
left[count]=ch;
right[count][0]=‘@‘;
right[count][1]=‘\0‘;
count++;
for(j=n;j<=strlen(point)-1;j++)
{
if(point[j]!=‘|‘)
temp[m++]=point[j];
else
{
left[count]=point[0];
memcpy(right[count]tempm);
right[count][m]=ch;
right[count][m+1]=‘\0‘;
printf(“?count=%d?“count);
m=0;
count++;
}
}
????????????left[count]=point[0];
memcpy(right[count]tempm);
right[count][m]=ch;
right[count][m+1]=‘\0‘;
count++;
m=0;
}
}
}
/*******************************************
分解不含有左遞歸的產生式
?********************************************/
void?no_left_re(char?*point)
{
????int?m=0;
unsigned?j=0;
char?temp[20];
for(j=3;j<=strlen(point)-1;j++)
{
if(point[j]!=‘|‘)
temp[m++]=point[j];
else
{
left[count]=point[0];
memcpy(right[count]tempm);
right[count][m]=‘\0‘;
m=0;
count++;
}
}
????left[count]=point[0];
????memcpy(right[count]tempm);
????right[count][m]=‘\0‘;
????count++;
m=0;
}
int?OpenFile(char?*filename?char?*vtchar?*vnchar?*leftchar?right[50][50])
{
FILE?*f;
if((f?=?fopen(filename?“r“))?==?NULL)
{
printf(“can?not?open?%s\n“filename);
return?0;
}
char?ch;
char?ch2;
int?count;
int?i;
int?j;
count?=?0;
ch?=?fgetc(f);
while(!feof(f))
{
if?(ch?==?‘-‘)
{
if?(?(ch2=fgetc(f))?==?‘>‘?)
{
count++;??//累計產生式的字符數條數
}
else?
{
fseek(f?-1L?1);
}
}//if
else?if(?ch?==?‘|‘?)
{
count++;
}//else?if
els
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????19??2011-11-27?11:52??YCFC?-?副本\1.txt
?????文件?????????11??2011-12-03?12:33??YCFC?-?副本\2.txt
?????文件?????????11??2011-12-03?11:35??YCFC?-?副本\3.txt
?????文件?????????67??2011-10-01?19:53??YCFC?-?副本\a.txt
?????文件??????41984??2011-12-22?16:53??YCFC?-?副本\Debug\vc60.idb
?????文件??????61440??2011-12-22?16:26??YCFC?-?副本\Debug\vc60.pdb
?????文件?????213096??2011-12-22?16:26??YCFC?-?副本\Debug\YCFC.exe
?????文件?????247180??2011-12-22?16:26??YCFC?-?副本\Debug\YCFC.ilk
?????文件?????284496??2011-12-22?16:26??YCFC?-?副本\Debug\YCFC.pch
?????文件?????435200??2011-12-22?16:26??YCFC?-?副本\Debug\YCFC.pdb
?????文件??????40606??2011-12-22?16:26??YCFC?-?副本\Debug\ycfx.obj
?????文件???????1136??2013-01-04?23:07??YCFC?-?副本\LL.H
?????文件???????4311??2011-12-05?16:43??YCFC?-?副本\YCFC.dsp
?????文件????????531??2011-11-26?20:38??YCFC?-?副本\YCFC.dsw
?????文件??????58368??2011-12-23?23:32??YCFC?-?副本\YCFC.ncb
?????文件??????48640??2011-12-23?23:32??YCFC?-?副本\YCFC.opt
?????文件????????242??2011-12-22?16:53??YCFC?-?副本\YCFC.plg
?????文件??????17989??2011-12-22?16:14??YCFC?-?副本\ycfx.cpp
?????目錄??????????0??2011-12-22?16:53??YCFC?-?副本\Debug
?????目錄??????????0??2011-12-23?23:32??YCFC?-?副本
-----------?---------??----------?-----??----
??????????????1455327????????????????????20
評論
共有 條評論