博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
词法分析程序
阅读量:5940 次
发布时间:2019-06-19

本文共 4085 字,大约阅读时间需要 13 分钟。

词法分析:

编制一个词法分析程序

 

对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。

 

 

各种单词符号对应的种别码。

 

 

 

 

#include
#include
char str[100];char take[8];//存放单词符号的字符串int sum;//存放整数型单词char ch;int zbm;//存放单词字符的种别码int i,p,m=0;//p是缓冲区str的指针,m是take的指针char *keyword[8]={"begin","if","then","while","do","end","l(l|d)*","dd*"};void scanner()//词法扫描程序{ /* for(i=0;i<8;i++) { take[i]=NULL; } ch=str[p++];*/ m=0; while(ch==' ') { ch=str[p++]; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标识符或者是变量名 { m=0; while(ch>='0'&&ch<='9'||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { take[m++]=ch; ch=str[p++]; } take[m++]='\0'; p--; zbm=10; for(i=0;i<6;i++)//将识别出的字符和已定义的标符进行比较 if(strcmp(keyword[i],take==0)) { zbm=i+1; break; } } else if(ch>='0'&&ch<='9') { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=str[p++]; } p--; zbm=11; } else { switch(ch) { case '+': zbm=13; take[0]=ch; ch=str[p++]; break; case '-': zbm=14; take[0]=ch; ch=str[p++]; break; case '*': zbm=15; take[0]=ch; ch=str[p++]; break; case '/': zbm=16; take[0]=ch; ch=str[p++]; break; case '<': m=0; take[m++]=ch; ch=str[p++]; if(ch=='>') { zbm=21; take[m++]=ch; } else if(ch=='=') { zbm=22; take[m]=ch; } else zbm=20; break; case '>': take[0]=ch; ch=str[p++]; if(ch=='=') { zbm=24; take[0]=ch; } else zbm=23; break; case ':': take[0]=ch; ch=str[p++]; if(ch=='=') { zbm=18; take[m++]=ch; ch=str[p++]; } else zbm=17; break; case '=': zbm=25; take[0]=ch; ch=str[p++]; break; case ';': zbm=26; take[0]=ch; ch=str[p++]; break; case '(': zbm=27; take[0]=ch; ch=str[p++]; break; case ')': zbm=28; take[0]=ch; ch=str[p++]; break; case '#': zbm=0; take[0]=ch; ch=str[p++]; break; default: zbm=-1; } }}main(){ int n,i; printf("----------------------------------------\n"); printf("\t编制一个词法分析程序\n\n"); printf("\t要求:\n"); printf("\t输入:源程序字符串\n"); printf("\t输出:二元组(种别,单词本身)\n"); printf("----------------------------------------\n\n"); printf("请输入您要输入的字符:\n"); do//输入一段字符串 { ch=getchar(); str[p++]=ch; }while(ch!='#'); p=0; ch=str[0]; if(ch>='0'&&ch<='9') printf("错误!\n"); else { do { scanner(); switch(zbm) { case 11: printf("(%d,%d)\n",11,sum); break; case -1: printf("错误!\n"); break; default: printf("(%d,%s)\n",zbm,take); } }while(zbm!=0); }}

  

  

转载于:https://www.cnblogs.com/zhiling123/p/5925173.html

你可能感兴趣的文章
JavaScript标准库系列——RegExp对象(三)
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
js深度解析url地址
查看>>
web入门+书籍推荐
查看>>
[转]:xmake插件开发之色彩高亮显示
查看>>
OS X 下在代码中枚举所有进程的方法
查看>>
eventEmitter3源码分析与学习
查看>>
关于缓存命中率的几个关键问题!
查看>>
罗田用好“大数据”力促扶贫更精准
查看>>
IDC: New H3C集团正式启动——中国企业IT新星时代已然来临
查看>>
易传媒CTO程华奕:搭建私有DMP 你必须知道的几件事
查看>>
《数字视频和高清:算法和接口》一第2章 图像的采样和显示
查看>>
冷热分治,DT时代的数据存储必由之路
查看>>
大数据产业正处在蓬勃发展的孕育期与机遇期
查看>>
如何在Ubuntu和CentOS上启用Nginx的HTTP/2 协议支持
查看>>
用Spark机器学习数据流水线进行广告检测
查看>>
Linux 爱好者的飞行棋:sudo
查看>>
ONOS项目首赢11000次下载 Oracle发布云路由
查看>>
大数据的六大人工智能变现方式
查看>>
云计算的三个应用实例
查看>>