一个优秀的编译程序~

 

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
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"};    
 char *limit[]={" ","(",")","[","]","->",".","!","++","--","&","~",
  "*","/","%","+","-","<<",">>","<","<=",">",">=","==","!=","&&","||",
  "=","+=","-=","*=","/=",",",";","{","}","#","_","'"};
 FILE *fp;
 int i;
 char c;
 fp=fopen("d://k.txt","w");
 for(i=1;i<=32;i++)
  fprintf(fp,"%s/n",key[i]);
 fclose(fp);              
 fp=fopen("d://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("d://i.txt","w");
 fclose(fp);              
 fp=fopen("d://c.txt","w");
 fclose(fp);              
 fp=fopen("d://output.txt","w");
 fclose(fp);              
}
char * dtb(char *buf)
{         
 int temp[20];
 char *binary;
 int value=0,i=0,j;
 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 *buf,int type,int command)
{            
 int number=0;
 FILE *fp;
 char c;
 char temp[30];
 int i=0;
 switch(type)
 {
 case 1: fp=fopen("d://k.txt","r");break;
 case 2: fp=fopen("d://i.txt","r");break;
 case 3: fp=fopen("d://c.txt","r");break;
 case 4: fp=fopen("d://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(temp,buf)==0)
  { 
   fclose(fp);
   return(number);       
  }
  else
   c=fgetc(fp);
 }
 if(command==1)
 {  
  fclose(fp);
  return(0);               
 }
 switch(type)
 {
 case 1: fp=fopen("d://k.txt","a");break;
 case 2: fp=fopen("d://i.txt","a");break;
 case 3: fp=fopen("d://c.txt","a");break;
 case 4: fp=fopen("d://l.txt","a");
 }
 fprintf(fp,"%s/n",buf);
 fclose(fp);
 return(number+1);            
}
void cs_manage(char *buffer)
{            
 FILE *fp;
 char *pointer;
 int result;
 pointer=dtb(buffer);
 result=find(pointer,3,2);      
 fp=fopen("d://output.txt","a");
 fprintf(fp,"%s/t/t/t3/t/t/t%d/n",buffer,result);
 fclose(fp);              
}
void ch_manage(char *buffer)
{                    
 FILE *fp;
 int result;
 result=find(buffer,1,1);          
 fp=fopen("d://output.txt","a");
 if(result!=0)
  fprintf(fp,"%s/t/t/t1/t/t/t%d/n",buffer,result);   
 else
 {
  result=find(buffer,2,2);      
  fprintf(fp,"%s/t/t/t2/t/t/t%d/n",buffer,result);
 }                                
 fclose(fp);
}
void er_manage(char error,int lineno)
{                
 printf("/nerror: %c ,line %d",error,lineno);   
}
void scanner()
{           
 FILE *fpin,*fpout;
 char filename[20];
 char ch;
 int i=0,line=1;
 int count,result,errorno=0;
 char array[30];
 char *word;
 printf("/nthe file name:");
 scanf("%s",filename);
 if((fpin=fopen(filename,"r"))==NULL)
 {
  printf("cannot open file");
  return;
 }
 ch=fgetc(fpin);
 while(ch!=EOF)
 {                
  i=0;
  if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_'))
  {          
   while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||((ch>='0')&&(ch<='9')))
   {
    array[i++]=ch;
    ch=fgetc(fpin);
   }
   word=(char *)malloc((i+1)*sizeof(char));
   memcpy(word,array,i);
   word[i]='/0';
   ch_manage(word);
   if(ch!=EOF)
    fseek(fpin,-1L,SEEK_CUR);
  }
  else if(ch>='0'&&ch<='9')
  {         
   while(ch>='0'&&ch<='9')
   {
    array[i++]=ch;
    ch=fgetc(fpin);
   }
   word=(char *)malloc((i+1)*sizeof(char));
   memcpy(word,array,i);
   word[i]='/0';
   cs_manage(word);
   if(ch!=EOF)
    fseek(fpin,-1L,SEEK_CUR);
  }
  else if((ch==' ')||(ch=='/t'))
   ;          
  else if(ch=='/n')
   line++;          
  else if(ch=='/')
  {                
   ch=fgetc(fpin);
   if(ch=='=')
   {             
    fpout=fopen("d://output.txt","a");
    fprintf(fpout,"/=/t/t/t4/t/t/t32/n");
    fclose(fpout);
   }
   else if(ch!='*')
   {             
    fpout=fopen("d://output.txt","a");
    fprintf(fpout,"//t/t/t4/t/t/t13/n");
    fclose(fpout);
    fseek(fpin,-1L,SEEK_CUR);
   }
   else if(ch=='*')
   {             
    count=0;
    ch=fgetc(fpin);
    while(count!=2)
    {         
     count=0;
     while(ch!='*')
      ch=fgetc(fpin);
     count++;
     ch=fgetc(fpin);
     if(ch=='/')
      count++;
     else
      ch=fgetc(fpin);
    }
   }
  }
  else if(ch=='"')
  {                
   fpout=fopen("d://output.txt","a");
   fprintf(fpout,"%c/t/t/t4/t/t/t37/n",ch);
   ch=fgetc(fpin);
   while(ch!='"')
    ch=fgetc(fpin);
   fprintf(fpout,"%c/t/t/t4/t/t/t37/n",ch);
   fclose(fpout);
  }
  else
  {        
   array[0]=ch;
   ch=fgetc(fpin);      
   if(ch!=EOF)
   {          
    array[1]=ch;
    word=(char *)malloc(3*sizeof(char));
    memcpy(word,array,2);
    word[2]='/0';
    result=find(word,4,1);     
    if(result==0)
    {                          
     word=(char *)malloc(2*sizeof(char));
     memcpy(word,array,1);
     word[1]='/0';
     result=find(word,4,1);     
     if(result==0)
     {                          
      er_manage(array[0],line);
      errorno++;
      fseek(fpin,-1L,SEEK_CUR);
     }
     else
     {    
      fpout=fopen("d://output.txt","a");
      fprintf(fpout,"%s/t/t/t4/t/t/t%d/t/n",word,result);
      fclose(fpout);
      fseek(fpin,-1L,SEEK_CUR);
     }
    }
    else
    {            
     fpout=fopen("d://output.txt","a");
     fprintf(fpout,"%s/t/t/t4/t/t/t%d/n",word,result);
     fclose(fpout);
    }
   }
   else
   {              
    word=(char *)malloc(2*sizeof(char));
    memcpy(word,array,1);
    word[1]='/0';
    result=find(word,4,1);      
    if(result==0)               
     er_manage(array[0],line);
    else
    {                           
     fpout=fopen("d://output.txt","a");
     fprintf(fpout,"%s/t/t/t4/t/t/t%d/n",word,result);
     fclose(fpout);
    }
   }
  }
  ch=fgetc(fpin);
 }
 fclose(fpin);
 printf("/nThere are %d error(s)./n",errorno);        
}
main()
{          
 init();           
 scanner();        
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
附录c 编译程序实验 实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 语法分析 C2.1 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. C2.2 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析. C2.2.1待分析的简单语言的语法 实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 实验的输入和输出 输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。 例如:对于语句串 begin a:=2+3*4;x:=(a+b)/c end# 输出的三地址指令如下: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思想 1设置语义过程 (1) emit(char *result,char *arg1,char *op,char *ag2) 该函数功能是生成一个三地址语句送到四元式表中。 四元式表的结构如下: struct {char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2)char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…. Char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } (2)主程序示意图如图c.10所示。 (2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 语义分析程序的C语言程序框架 int lrparser() { int schain=0; kk=0; if(syn=1) { 读下一个单词符号; schain=yucu; /调用语句串分析函数进行分析/ if(syn=6) { 读下一个单词符号; if(syn=0 && (kk==0)) 输出(“success”); } else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;} else{输出’begin’错误;kk=1;} } return(schain); int yucu() { int schain=0; schain=statement();/调用语句分析函数进行分析/ while(syn=26) {读下一个单词符号; schain=statement(); /调用语句分析函数进行分析/ } return(schain); } int statement() { char tt[8],eplace[8]; int schain=0; {switch(syn) {case 10: strcpy(tt,token); scanner(); if(syn=18) {读下一个单词符号; strcpy(eplace,expression()); emit(tt,eplace,””,””); schain=0; } else {输出’缺少赋值号’的错误;kk=1; } return(schain); break; } } char *expression(void) {char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12);/分配空间/ ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt =(char )malloc(12); strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/ while(syn=13 or 14) { 操作符 tt= ‘+’或者‘—’; 读下一个单词符号; strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/ strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/ emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/ strcpy(eplace,tp); } return(eplace); } char *term(void)/仿照函数expression编写/ char *factor(void) {char *fplace; fplace=(char *)malloc(12); strcpy(fplace, “ ”); if(syn=10) {strcpy(fplace,,token);/将标识符token的值赋给fplace/ 读下一个单词符号; } else if(syn=11) {itoa(sum,fplace,10); 读下一个单词符号; } else if (syn=27) {读下一个单词符号; fplace=expression();/调用expression分析返回表达式的值/ if(syn=28) 读下一个单词符号; else{输出‘}’错误;kk=1; } } else{输出‘(’错误;kk=1; } return(fplace); }
《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1) 编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语 言,则此翻译程序称为编译程序。 (2) 源程序:源语言编写的程序称为源程序。 (3) 目标程序:目标语言书写的程序称为目标程序。 (4) 编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与 目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段, 即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语 义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和 错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表 中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 盛威网(www.snwei.com)专业的计算机学习网站1 《编译原理》课后习题答案第一章 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的 中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指 出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译 程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误 进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。 注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。 第 3 题 何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案: 翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程 序和汇编程序等。 编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编 写的目标程序的翻译程序。 解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是, 源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词, 则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功 能的实现,完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、执行,如此 反复;另一种方式是,一边翻译一边执行,即每读出源程序的一条语句,解释程序就将其翻 译成一段机器指令并执行之,然后再读人下一条语句继续进行解释、执行,如此反复。无论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值