«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406572
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]c语言词法分析器
既瑜(224499) 发表于 2005/7/19 0:01:29

 //BY fertiland #include<stdio.h>#include<ctype.h>#include<string.h> void  main(void);int reserver(char *); void main(void){ FILE *input,*output; char ch,*token=""; int i=0,isReserver=0; int count=0; /*打开文件*/ if((input=fopen("input.txt","rt"))==NULL) { printf("file open in readonly mode,but an error generate!\n");  exit(0); } if((output=fopen("output.txt","wt"))==NULL) {  printf("file open in new_create mode,but an error generate!\n");  exit(0); }  fprintf(output,"%4s\t\%8s\t %-16s)\t%4s\n","位置","符号类型","识别符","长度"); ch=fgetc(input); while(ch!=EOF) {  i=0;  /*去掉前导空格,换行符*/  while((ch==' '||ch=='\n'||ch=='\t')&&ch!=EOF)   ch=fgetc(input);  /*字母开头*/  if(isalpha(ch))  {  while(isalpha(ch)||isdigit(ch))   {   token[i++]=ch;   ch=fgetc(input);   }   token[i]='\0';  isReserver=reserver(token);  if(isReserver==1)   {count++;fprintf(output,"%4d\t(标识符\t\t,%-16s)\t%4d\n",count,token,i);}  else if(isReserver==0)   {count++;fprintf(output,"%4d\t(保留字\t\t,%-16s)\t%4d\n",count,token,i);}  else if(isReserver==2)   {count++;fprintf(output,"%4d\t(算符\t\t,%-16s)\t%4d\n",count,token,i);}  continue;     }  /*识别数字*/  else if(isdigit(ch))   {    while(isdigit(ch))    {    token[i++]=ch;    ch=fgetc(input);    }   /*出现非数字且为点时*/      if (ch=='.')    {    token[i++]=ch; /*将点加入*/    ch=fgetc(input);/*读入下一个字符*/    if (isdigit(ch))     {      while(isdigit(ch)) /*是数字时,收入,并将加一*/      {      token[i++]=ch;      ch=fgetc(input);      }      /*如果是数字加点再加数字再出现字母时,就是错误*/             if(isalpha(ch))      {       while(isdigit(ch)||isalpha(ch)||ch=='.')       {        token[i++]=ch;        ch=fgetc(input);       }       token[i]='\0';       count++;fprintf(output,"%4d\t(标识错误\t,%-16s)\t%4d\n",count,token,i);       continue;       }      /*当出现结束符时,就收入为实数内*/      else      {      token[i]='\0';      count++;fprintf(output,"%4d\t(实数\t\t,%-16s)\t%4d\n",count,token,i);      continue;      }     }    }      /*如果是字符,则判断为标识错误*/   else if(isalpha(ch))    {     while(isdigit(ch)||isalpha(ch)||ch=='.')           {     token[i++]=ch;     ch=fgetc(input);     }     token[i]='\0';     count++;fprintf(output,"%4d\t(标识错误\t,%-16s)\t%4d\n",token);     continue;     }   /*如果是单词段结束符时,就判断为常数*/     else    {     token[i]='\0';     count++;fprintf(output,"%4d\t(常数\t\t,%-16s)\t%4d\n",count,token,i);     continue;    }   }       else if(ch=='(')   {    token[i++]=ch;    ch=fgetc(input);    token[i]='\0';    count++;fprintf(output,"%4d\t(右括号运算符\t,%-16s)\t%4d\n",count,token,i);    continue;   }  else if(ch==')')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(左括号运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='[')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(右中括号运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch==']')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(左中括号运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='-')   {   token[i++]=ch;   ch=fgetc(input);   if(ch=='-')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   else if (ch=='>')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(指针运算符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(负运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='.')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(点运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='&')     {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(地址与运算符\t,%-16s)\t%4d\n",count,token,i);   continue;      }  else if(ch=='!')     {   token[i++]=ch;   ch=fgetc(input);   if(ch=='=')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(不等于比较符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(取反运算符\t,%-16s)\t%4d\n",count,token,i);   continue;      }  else if(ch=='~')     {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(按位运算符\t,%-16s)\t%4d\n",count,token,i);   continue;      }  else if(ch=='*')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(乘运算符\t,%-16s)\t%4d\t\n",count,token,i);   continue;      }  else if(ch=='%')     {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(求余运算符\t,%-16s)\t%4d\n",count,token,i);   continue;      }  else if(ch=='/')     {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(除法运算符\t,%-16s)\t%4d\t\n",count,token,i);   continue;      }    else if(ch=='<')   {   token[i++]=ch;   ch=fgetc(input);   if(ch=='=')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(小于等于比较符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   if(ch=='<')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(左移运算符\t,%-16s)\t%4d\t\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(小于比较符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='>')   {   token[i++]=ch;   ch=fgetc(input);   if(ch=='=')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(大于等于比较符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   if(ch=='>')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(右移运算符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(大于比较符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='=')   {   token[i++]=ch;   ch=fgetc(input);   if(ch=='=')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(等于比较符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(赋值运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch==',')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(逗号界符\t,%-16s)\t%4d\n",count,token,i);   continue;   }   else if(ch==';')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(分号界符\t,%-16s)\t%4d\n",count,token,i);   continue;   }    else if(ch=='{')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='}')   {   token[i++]=ch;   ch=fgetc(input);   token[i]='\0';   count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='+')   {    token[i++]=ch;   ch=fgetc(input);   if(ch=='+')    {    token[i++]=ch;    token[i]='\0';    count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);    ch=fgetc(input);    continue;    }   token[i]='\0';   count++;fprintf(output,"%4d\t(加运算符\t,%-16s)\t%4d\n",count,token,i);   continue;   }  else if(ch=='"')   {    token[i++]=ch;   ch=fgetc(input);   while(ch!='"'&&ch!=EOF)    {    token[i++]=ch;    ch=fgetc(input);        }   if(ch=='"')    {    token[i++]=ch;    ch=fgetc(input);    token[i]='\0';    count++;fprintf(output,"%4d\t(字符串\t\t,%-16s)\t%4d\n",count,token,i);    continue;    }   else    {    while(ch!=EOF)    {    token[i++]=ch;    ch=fgetc(input);    }    token[i]='\0';    count++;fprintf(output,"%4d\t(字符串错误\t,%-16s)\t%4d\n",count,token,i);    }   }   else   {   while(ch!=' '&&ch!='\t'&&ch!='\n'&&ch!=EOF)   {    token[i++]=ch;    ch=fgetc(input);   }   token[i]='\0';   count++;fprintf(output,"%4d\t(无法识别错误\t,%-16s)\t%4d\n",count,token,i);   continue;   }  } fclose(input); fclose(output);} /*判断是不是关键字: 1,则是标识符 0,则是关键字  2,则是运算符 */ int reserver(char *str){ FILE *fpReserver; char *tmpStr='\0';  if(strcmp(str,"sizeof")==0)  return 2; /*打开关键字文件*/ if((fpReserver=fopen("keyword.txt","r"))==NULL) { printf("file open in readonly mode,but an error generate!\n");  exit(0); } while(fscanf(fpReserver,"%s",tmpStr)!=EOF)  if(strcmp(str,tmpStr)==0)   {fclose(fpReserver);return 0;} fclose(fpReserver); return 1; }  /* 输入文件input.txt #include<stdio.h> void E(char *);void E1(char *);void T(char *);void T1(char *);void F(char *); void main(){ char *str="i+(i*i"; printf("%s\n",str); E(str);} void E(char *str){ T(str); printf("1%s\n",str); E1(str); printf("2%s\n",str);} void E1(char *str){ if (*str=='+') {  str++;  T(str);  E1(str); } } void T(char *str){ F(str); T1(str);}void T1(char *str){ if(*str=='*')  {   str++;   F(str);   T1(str);  }} void F(char *str){ if(*str=='(') {  str++;  E(str);  if(*str==')')   str++;  else  {   printf("lost ')'\n");   exit(0);  } } else if(*str=='i')  str++;      else  {   printf("lost variable\n");   exit(0);  }} */ /* 关键字文件keyword.txt auto  break  case  char  constcontinue default  do  double  elseenum  extern  float  for  gotoif  int  long  register return short  signed  sizeof  static  structswitch  typedef  union  unsigned voidvolatile while */

阅读全文(3866) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144752862 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号