CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

编译原理上机,急求代码!

楼主dazern(夏天的零度)2005-04-01 13:29:11 在 C/C++ / C语言 提问

大家好,有没有用C语言实现的编译原理   词法分析器的原代码!  
  请大家帮个忙,有的话麻烦把代码贴一下!  
  谢谢拉 问题点数:0、回复次数:1Top

1 楼dazern(夏天的零度)回复于 2005-04-01 14:21:47 得分 0

#include<stdio.h>  
  #include<stdlib.h>  
  #include<string.h>  
  int   i,j,k,sign,number,flag;  
   
  /*flag   which   is   use   to   judge   the   string   is   keywords   or   not!*/  
   
  char   ch;  
  char   words[10]={"   "};  
  char   program[500];  
  int   scan(char   program[])  
  {  
          char*keywords[13]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf"};  
  number=0;  
  flag=0;  
  j=0;  
   
   
          ch=program[i++];  
   
  /*To   handle   the   lettle   space   ands   tab*/  
   
          while((ch=='   ')||(ch=='\n')||(ch=='\t')||(ch=='\r'))  
  ch=program[i++];  
        /*handle   letters*/  
          if((ch>='a')&&(ch<='z'))  
  {  
  while((ch>='a')&&(ch<='z'))  
  {  
  words[j++]=ch;  
  ch=program[i++];  
  }  
  words[j++]='\0';  
  for(k=0;k<13;k++)  
  if(strcmp(words,keywords[k])==0)  
  switch(k)  
  {  
                                                                  case   0:  
  sign=1;flag=1;break;  
  case   1:  
  sign=2;flag=1;break;  
  case   2:  
  sign=3;flag=1;break;  
  case   3:  
  sign=4;flag=1;break;  
  case   4:  
  sign=5;flag=1;break;  
  case   5:  
  sign=6;flag=1;break;  
  case   6:  
  sign=7;flag=1;break;  
  case   7:  
  sign=8;flag=1;break;  
  case   8:  
  sign=9;flag=1;break;  
  case   9:  
  sign=10;flag=1;break;  
  case   10:  
  sign=11;flag=1;break;  
  case   11:  
  sign=12;flag=1;break;  
  case   12:  
  sign=13;flag=1;break;  
  }  
   
        if   (flag==0)  
  {i--;sign=100;}  
   
  }  
   
  /*handle   digits*/  
   
  else   if((ch>='0')&&(ch<='9'))  
  {  
  number=0;  
  while((ch>='0')&&(ch<='9'))  
  {  
  number=number*10+(ch-'0');  
  ch=program[i++];  
  }  
  sign=200;i--;  
  }  
   
  /*opereation   and   edge   handle*/  
   
  else   switch(ch)  
  {  
  case'=':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=401;  
  }  
  else  
  {  
  i--;sign=402;  
  }  
  break;  
  case'>':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=403;  
  }  
  else  
  {  
  i--;sign=404;  
  }  
  break;  
  case'<':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=405;  
  }  
  else  
  {  
  i--;sign=406;  
  }  
  break;  
  case'!':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=407;  
  }  
  else  
  {  
  i--;sign=408;  
  }  
  break;  
  case'+':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=409;  
  }  
  else   if(ch=='+')  
  {  
  words[j++]=ch;  
  sign=410;  
  }  
  else  
  {  
  i--;sign=411;  
  }  
  break;  
  case'-':  
  words[j++]=ch;  
  ch=program[i++];  
  if(ch=='=')  
  {  
  words[j++]=ch;  
  sign=412;  
  }  
  else   if(ch=='-')  
  {  
  words[j++]=ch;  
  sign=413;  
  }  
  else  
  {  
  i--;sign=414;  
  }  
  break;  
  case'*':  
  words[j]=ch;  
  sign=415;  
  break;  
  case'/':  
  words[j]=ch;  
  sign=415;  
  break;  
  case';':  
  words[j]=ch;  
  sign=501;  
  break;  
  case'(':  
  words[j]=ch;  
  sign=502;  
  break;  
  case')':  
  words[j]=ch;  
  sign=503;  
  break;  
  case'[':  
  words[j]=ch;  
  sign=504;  
  break;  
  case']':  
  words[j]=ch;  
  sign=505;  
  break;  
  case'{':  
  words[j]=ch;  
  sign=506;  
  break;  
  case'}':  
  words[j]=ch;  
  sign=507;  
  break;  
  case':':  
  words[j]=ch;  
  sign=508;  
  break;  
  case'"':  
  words[j]=ch;  
  sign=509;  
  break;  
  case'%':  
  words[j]=ch;  
  sign=510;  
  break;  
  case',':  
  words[j]=ch;  
  sign=511;  
  break;  
  case'#':  
  words[j]=ch;  
  sign=511;  
  break;  
  case'@':  
  words[j]='#';  
          sign=0;  
  break;  
  default:sign=-1;  
  }  
   
  return   sign;  
  return   number;  
  }  
   
  void   main()  
  {  
  i=0;  
          printf("please   input   a   program   end   with   @:\n");  
  do  
  {  
    ch=getchar();   program[i++]=ch;  
  }while(ch!='@');  
  i=0;  
      do  
  {  
  sign=scan(program);  
  if(sign==200)  
  {  
  printf("(%2d,%4d)\n",sign,number);  
  }  
  else   if(sign==-1)  
  {  
  printf("(%d,error)\n",sign);  
  }  
  else  
  {  
  printf("(%2d,%4s)\n",sign,words);  
  }  
  }   while(sign!=0);  
   
  }  
  Top

相关问题

  • <<编译原理及实践>>比<<编译原理>>好?哪里有<<编译原理及实践>>源代码?
  • 急! 网上哪里有编译原理的学习资料??
  • 编译原理好难,这个东西就是不对,救急!
  • 编译原理
  • 编译原理问题~!对asp原代码分析、读取,然后用数组接收。详情(请进帖子看)
  • 问编译原理题
  • 我要学编译原理。。。
  • 求助!!!!编译原理
  • 求助!!!编译原理
  • 编译原理问题?

关键词

  • 代码
  • program
  • ch
  • flag
  • sign
  • words
  • include
  • char

得分解答快速导航

  • 帖主:dazern

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo