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

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

#include<stdio.h>

#include<string.h>
void Fenxi(char c,char b);
void word(char a[]);
void number(char a[]);
int i; //定义全局变量i
int s=1; //用来记录是否存在非法字符
main(){
char a[50];
printf("请输入源程序:");
gets(a);
printf("您要分析的源程序为:");
printf("%s",a);
printf("\n");
for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++)
{
if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
word(a);
else if(a[i]>='0' && a[i]<='9')
number(a);
else
Fenxi(a[i],a[i+1]);
}
printf("\n");
}

void number(char a[]) //对数字字符进行扫描分析

{
char b[50];
int m,k=0,t;
m=i;
while(a[m]>='0' && a[m]<='9')
{
b[k]=a[m]; //用数组b存放数组a中的数字
k++;
m++;
}
i=m-1;
printf("(11,");
for(t=0;t<k;t++)
printf("%c",b[t]);
printf(")");
}

void word(char a[]) //对字母字符进行扫描分析,并识别保留字

{
int k=0,m,flag=0,t;
char b[50];
char *key[6]={"begin","if","then","while","do","end"};
m=i;
while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
{
b[k]=a[m];
k++;
b[k]='\0';
m++;
}
i=m-1;
for(t=0;t<6;t++)
{
if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
{
printf("(%d,%s)",t+1,key[t]); //输出关键字
flag=1;
}
}
if(flag==0)
{
printf("(10,%s)",b); //输出标识符
}
}
void Fenxi(char c,char b) //对特殊字符进行扫描分析
{
switch(c){
case ' ':
break;
case '+':
printf("(13,+)");
break;
case '-':
printf("(14,-)");
break;
case '*':
printf("(15,*)");
break;
case '/':
printf("(16,/)");
break;
case ':':
if(b=='=')
{
i++;
printf("(18,:=)");
}
else
printf("(17,:)");
break;
case '<':
if(b=='>')
{
i++;
printf("(21,<>)");
}
else if(b=='=')
{
i++;
printf("(22,<=)");
}
else
printf("(20,<)");
break;
case '>':
if(b=='=')
{
printf("(24,>=)");
i++;
}
else
printf("(23,>)");
break;
case '=':
printf("(25,=)");
break;
case ';':
printf("(26,;)");
break;
case '(':
printf("(27,()");
break;
case ')':
printf("(28,))");
break;
case '#':
printf("(20,#)");
break;
default:
{
printf("\n存在字符 '%c',无法继续识别!\n",c);
s=0; //用s=0记录存在非法字符
break;
}
}
}

转载于:https://www.cnblogs.com/xjy-gg/p/4827868.html

你可能感兴趣的文章
iOS中ARC内部原理
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>
你不得不了解的应用容器引擎---Docker
查看>>
easyui datagrid 弹出页面会出现两个上下滚动条处理办法!
查看>>
迭代器和生成器
查看>>
MYSQL分区表功能测试简析
查看>>
codevs 1080 线段树练习
查看>>
JS模块化库seajs体验
查看>>
Android内核sysfs中switch类使用实例
查看>>
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
POJ3250 Bad Hair Day(单调栈)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
查看>>
struts2中<s:form>的应用
查看>>
QML学习笔记之一
查看>>
7NiuYun云存储UploadPicture
查看>>