• 大小: 263KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: 其他
  • 标签: 编译原理  

资源简介

这是学习编译原理时候的大作业,做的是一个表达式的编译器。

资源截图

代码片段和文件信息


#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


评论

共有 条评论