«December 2019»
1234567
891011121314
15161718192021
22232425262728
293031


公告

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

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(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
访问次数:1349183
建立时间: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首页    管理页面    写新日志    退出


[【技术文档】][转]词法分析器
既瑜(224499) 发表于 2005-11-25 21:40:20

/*****************************C_minus词法分析器 1.0版 **********************************  作者:温铭*  Email: moonbingbing@gmail.com*  版权所有(C) 2005.11***************************************************************************************/#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h> //****************************************char * change(char *ps,char *pt);      //处理路径中的反斜杠问题。因为在字符串中要用\\表示\ int  searchkey(char *word,struct key tab[],int n);//二分法查找关键字int  searchsymbol(char c,struct symbol tab[],int n);void getword(int c,FILE * p);//****************************************//用到的结构数组:struct  key{          //关键字表    char*   word;    int     value;}keytab[] = {         "else",  0,         "if",    1,         "int",   2,         "return",3,         "void",  4,         "while", 5,};//****struct   symbol{        //符号表      char  c;      int   value;}symboltab[] = {        '(', 0,        ')', 1,        '*', 2,        '+', 3,        ',', 4,        '-', 5,        '/', 6,        ';', 7,        '<', 8,        '=', 9,        '>', 10,        '[', 11,        ']', 12,        '{', 13,        '}', 14,};//***************************************** //用到的常量enum{MAX = 50,     NKEYS = sizeof keytab / sizeof keytab[0],     NSYMBOL = sizeof symboltab / sizeof symboltab[0]};//***************************************** //用到的全局变量int flagnum = 0;  //用来防止出现10t这种情况被当作数字处理。这种情况程序报错int countnum = 0;int countid  = 0;int countfault = 0;int type[] = {0,1,2,3,4};            //词法分析中的类型  依次为 关键字,数字,id,符号char array[MAX];           //存放getword中的字符串 //***************************************** main(){ int c; int flag;     //判断搜索函数是否成功返回    char s[MAX];       //数组s,t用来存放读取文件的路径 char t[2 * MAX]; char *ps = s; char *pt = t;    FILE * p = NULL;     printf("input the path of the file\n"); scanf("%s",s);    p = fopen( change(ps,pt),"r" );     //打开文件    if( p == NULL ){                   //如果输入的文件路径不对或文件不存在        printf("open fail!\n");        exit(0);    }   printf("data \t (type,value)\n");    while( ( c = fgetc(p) ) != EOF ){  if ( isspace(c) )       // 如果是空白字符   continue;  else if ( isalpha(c) ){    getword(c,p);             flag = searchkey(array,keytab,NKEYS);    if ( flag >= 0 )                      //如果是关键字     printf("%s\t(%d,%d)\n",array,type[0],flag);    else{                                 //如果以字母开头,但不是关键字     printf("%s\t(%d,%d)\n",array,type[2],countid);                 countid ++;    }  }else if ( isdigit(c) ){         //如果是数字              flagnum = 0;        /*解决getword中的一个bug。如果一个数字之前有超过1个的字符串,如in 2。则后面所有的数字都不能被正确分析*/      getword(c,p);     if ( flagnum == 0 )      printf("%s\t(%d,%d)\n",array,type[1],countnum);     else      printf("%s\t(%d,%d)\t illegal input \n",array,type[4],countfault);  }else if ( ispunct(c) ){        //如果是符号              flag = searchsymbol(c,symboltab,NSYMBOL);     if ( flag >= 0 )      printf("%c\t(%d,%d)\n",c,type[3],flag);     else{     printf("%c\t(%d,%d)\n",c,type[4],countfault);  //出错处理                 countfault ++;     }  }else{   printf("%c\t(%d,%d)\n",c,type[4],countfault);       //出错处理   countfault ++;  } } return 0;} //*******************************************char * change(char *ps,char *pt)     /*处理反斜杠的问题*/{ char *p = pt; char c;  while( (c = *pt++ = *ps++) != '\0' )  if( c == '\\' )   *pt = '\\'; return p;} //******************************************int  searchkey(char *word,struct key tab[],int n){ int cond; int low,high,mid;  low = 0; high = n -1; while ( low <= high ){  mid = (low +high) / 2;  if ( ( cond = strcmp(word,tab[mid].word) ) < 0 )   high = mid - 1;  else if ( cond > 0 )   low = mid + 1;  else    return mid; } return -1;} //**********************************************int  searchsymbol(char c,struct symbol tab[],int n){     int low,high,mid;     low = 0; high = n -1; while ( low <= high ){  mid = (low +high) / 2;  if ( c < tab[mid].c)   high = mid - 1;  else if(c > tab[mid].c)   low = mid + 1;  else    return mid; } return -1;}//*******************************************void getword(int c,FILE * p){ int i = 0; array[i] = c; while( (c = fgetc(p)) != ' ' && c != '\n'){  if ( isalpha(c) | ispunct(c) )             //如果数字中有字母或字符,则报错   flagnum = 1;                                 /*一个可能引起错误的地方。已经解决(在读入数字后,把flagnum置0,再进入getword)*/  array[++i] = c; } array[++i] = '\0';} Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=526675

阅读全文(8841) | 回复(5) | 编辑 | 精华

回复:[转]词法分析器
fewag(游客)发表评论于2009-3-31 13:22:38

 蛋糕、礼盒、水果礼盒、西点、元祖 、室内空气检测、快递、速递、快件、国际快递、快递公司、黄金投资、黄金交易、黄金T+D、外国人就业许可、外国人签证转签延期、外国人工作签证

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:[转]词法分析器
ewaefg(游客)发表评论于2009-3-25 11:03:18

电动车维修、蓄电池修复机、电瓶修复、电瓶修复机、电瓶修复仪、电动车维修培训班、治疗近视、近视治疗、喷码机 考察 商务考察、公务考察、螺杆压缩机、机柜、台湾液压、台湾液压元件、液压元件
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:[转]词法分析器
abc(游客)发表评论于2007-5-16 10:07:58

写得太乱了,而且扩展性不好,望继续改进
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:[转]词法分析器
YY(游客)发表评论于2006-4-15 13:39:56

为什么关键字重新定义以后都不好用了??
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:[转]词法分析器
dodo(游客)发表评论于2006-1-9 20:08:42

好好好好好好
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

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

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

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