• 大小: 10KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-07-21
  • 语言: C/C++
  • 标签: 控件  源码  资源  

资源简介

这是学《编译原理》时的上机实验。可实现对C语言的词法分析,关键字32个,包含了C的绝大部分运算、限界符,主要是对文件进行读、写操作,节省内存消耗,自以为是一个不错的词法分析程序。运行环境为VC++6.0。

资源截图

代码片段和文件信息

/*******************************************
 词法分析程序
 作者:龚勋
 学号:200131500342
 计科系 13班
********************************************/
#include
#include
#include

/*******************************************
 初始化函数
********************************************/
void init()
{             
    char *key[]={“ ““auto““break““case““char““const““continue““default““do““double“
                 “else““enum““extern““float““for““goto““if““int““long““register“
                 “return““short““signed““sizeof““static““struct““switch““typedef“
                 “union““unsigned““void““volatile““while“};     /*C语言所有关键字,共32个*/
    char *limit[]={“ ““(““)““[““]““->““.““!““++““--““&““~“
                   “*““/““%““+““-““<<““>>““<““<=““>““>=““==““!=““&&““||“
                  “=““+=““-=““*=““/=““““;““{““}““#““_““‘“};/*运算、限界符*/
    FILE *fp;
    int i;
    char c;
    fp=fopen(“k.txt““w“);
    for(i=1;i<=32;i++)
       fprintf(fp“%s\n“key[i]);
    fclose(fp);               /*初始化关键字表*/
    fp=fopen(“l.txt““w“);
    for(i=1;i<=38;i++)
       fprintf(fp“%s\n“limit[i]);
    c=‘“‘;
    fprintf(fp“%c\n“c);
    fclose(fp);               /*初始化运算、限界符表*/
    fp=fopen(“i.txt““w“);
    fclose(fp);               /*初始化标识符表*/
    fp=fopen(“c.txt““w“);
    fclose(fp);               /*初始化常数表*/
    fp=fopen(“output.txt““w“);
    fclose(fp);               /*初始化输出文件*/
}

/*******************************************
 十进制转二进制函数
********************************************/
char * dtb(char *buf)
{          
    int temp[20];
char *binary;
int value=0i=0j;
for(i=0;buf[i]!=‘\0‘;i++)
value=value*10+(buf[i]-48);       /*先将字符转化为十进制数*/
    if(value==0)
    {
binary=malloc(2*sizeof(char));
binary[0]=‘0‘;
binary[1]=‘\0‘;
return(binary);
}
i=0;
while(value!=0)
    {
temp[i++]=value%2;
value/=2;
}
temp[i]=‘\0‘;
binary=malloc((i+1)*sizeof(char));
for(j=0;j<=i-1;j++)
       binary[j]=(char)(temp[i-j-1]+48);
    binary[i]=‘\0‘;
    return(binary);
}

/*******************************************
 根据不同命令查表或造表函数
********************************************/
int find(char *bufint typeint command)
{             
    int number=0;
    FILE *fp;
    char c;
    char temp[30];
    int i=0;
    switch(type)
    {
        case 1: fp=fopen(“k.txt““r“);break;
        case 2: fp=fopen(“i.txt““r“);break;
        case 3: fp=fopen(“c.txt““r“);break;
        case 4: fp=fopen(“l.txt““r“);
    }
    c=fgetc(fp);
    while(c!=EOF)
    {
        while(c!=‘\n‘)
        {
            temp[i++]=c;
            c=fgetc(fp);
        }
        temp[i]=‘\0‘;
        i=0;
        number++;
        if(strcmp(tempbuf)==0)
        {  
    fclose(fp);
return(number);        /*若找到,返回在相应表中的序号*/
        }
        else
           c=fgetc(fp);
     }
     if(command==1)
     {   
     f

评论

共有 条评论