0917词法分析
2015-10-14 22:09
369 查看
#include<stdio.h>
#include<string.h>//strcmp()
#include<conio.h>//getch()
#define max 200
char pro[max], lin[20];
int n,i,syn;
char *word[6]={ "begin", "if" , "then", "while", "do" ,"end" }; // 关键字,特殊标识符
char ch ;
scaner( )//扫描
{
int j=0;
for ( n=0; n<20; n++ )
lin
=NULL; //临时数组初始化
ch=pro[i++];//读取字符串
while (ch==' ') //判断,跳过空字符
ch=pro[i++];//读取整个单词
if ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57)) //判断是否是字母或数字
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) //判断标示符和特殊关键字
{
lin[j++]=ch;
ch=pro[i++];//pro[i++]空,关键字
while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))//判断标识符
{
lin[j++]=ch;
ch=pro[i++];
}
lin[j]='\0';//结束标志,回车
i--;
syn=10;//单词种别码
for (n=0;n<6 ;n++ )
if(strcmp(lin,word
)==0)//查找关键字表是否符合
{
syn=n+1;
break ;
}
}
else //判断数字
{
while (ch>=48&&ch<=57)
{
lin[j++]=ch;
ch=pro[i++];
}
i--;
lin[j]='\0';
syn=11;
}
}
else //判断其它符号
{
/////////判断<,<=,<>
if(ch=='<')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=21;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='>')
{
syn=22;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=20;
lin[j]='\0';
i--;
}
}
///////////判断>,>=
else if(ch=='>')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=24;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=23;
lin[j]='\0';
i--;
}
}
////////////判断 :,:=
else if(ch==':')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=18;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=17;
lin[j]='\0';
i--;
}
}
//////////判断其它符号
else if(ch=='+')
{
syn=13;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='-')
{
syn=14;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='*')
{
syn=15;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='/')
{
syn=16;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='=')
{
syn=25;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==';')
{
syn=26;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='(')
{
syn=27;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==')')
{
syn=28;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='#')
{
syn=0;
lin[j++]=ch;
lin[j]='\0';
}
else
syn=-1;
}
return syn;
}
void main()
{
int i=0;
printf( "Please input source code:\n" );
do{
ch=getchar();//读入字符串
pro[i++]=ch;
}while(ch!='#');
i=0;
do
{
scaner();
switch(syn)
{
case 11: printf ("(%d,%s)\n",syn,lin);
break;
case -1: printf("错误符号\n");
break;
default: printf ("(%d,%s)\n",syn,lin);
}
} while (syn!=0);
getch();
}
#include<string.h>//strcmp()
#include<conio.h>//getch()
#define max 200
char pro[max], lin[20];
int n,i,syn;
char *word[6]={ "begin", "if" , "then", "while", "do" ,"end" }; // 关键字,特殊标识符
char ch ;
scaner( )//扫描
{
int j=0;
for ( n=0; n<20; n++ )
lin
=NULL; //临时数组初始化
ch=pro[i++];//读取字符串
while (ch==' ') //判断,跳过空字符
ch=pro[i++];//读取整个单词
if ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57)) //判断是否是字母或数字
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) //判断标示符和特殊关键字
{
lin[j++]=ch;
ch=pro[i++];//pro[i++]空,关键字
while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))//判断标识符
{
lin[j++]=ch;
ch=pro[i++];
}
lin[j]='\0';//结束标志,回车
i--;
syn=10;//单词种别码
for (n=0;n<6 ;n++ )
if(strcmp(lin,word
)==0)//查找关键字表是否符合
{
syn=n+1;
break ;
}
}
else //判断数字
{
while (ch>=48&&ch<=57)
{
lin[j++]=ch;
ch=pro[i++];
}
i--;
lin[j]='\0';
syn=11;
}
}
else //判断其它符号
{
/////////判断<,<=,<>
if(ch=='<')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=21;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='>')
{
syn=22;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=20;
lin[j]='\0';
i--;
}
}
///////////判断>,>=
else if(ch=='>')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=24;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=23;
lin[j]='\0';
i--;
}
}
////////////判断 :,:=
else if(ch==':')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=18;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=17;
lin[j]='\0';
i--;
}
}
//////////判断其它符号
else if(ch=='+')
{
syn=13;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='-')
{
syn=14;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='*')
{
syn=15;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='/')
{
syn=16;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='=')
{
syn=25;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==';')
{
syn=26;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='(')
{
syn=27;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==')')
{
syn=28;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='#')
{
syn=0;
lin[j++]=ch;
lin[j]='\0';
}
else
syn=-1;
}
return syn;
}
void main()
{
int i=0;
printf( "Please input source code:\n" );
do{
ch=getchar();//读入字符串
pro[i++]=ch;
}while(ch!='#');
i=0;
do
{
scaner();
switch(syn)
{
case 11: printf ("(%d,%s)\n",syn,lin);
break;
case -1: printf("错误符号\n");
break;
default: printf ("(%d,%s)\n",syn,lin);
}
} while (syn!=0);
getch();
}
相关文章推荐
- python 生成测试数据点(带有标签的线性可分和线性不可分)
- c语言学习笔记(13)pragma详解,#和##运算符及编译指示字总结
- 【SQL】删除表中重复数据
- PostgreSQL customize inet_aton, inet_ntoa function in text type like MySQL.
- 直方图均衡化原理
- 命名管道
- System 类和日期类
- poco框架:日志相关知识和使用方法
- A20-TVOBX-v2.0.tar.gz 编译问题
- 九度OJ 1002:Grading
- 关于字符串的判空问题
- Service(二):通信
- 九度OJ 1002:Grading
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-04-目标函数
- PostgreSQL json jsonb 支持的value数据类型,如何构造一个jsonb
- 求3-100之间的素数
- Libev源码分析—常用watcher
- 操作系统作业调度实验报告
- 1043_输出PATest
- 支线任务1