C编写的词法分析器

#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
int i,j,k,flag,number,status;
/*status which is use to judge the string is keywords or not!*/
char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{
	char *keywords[13] = {"void","main","if","then","break","int",
	"char","float","include","for","while","printf",
	"scanf"};
	number = 0;
	status   = 0;
	j      = 0;
	ch     = program[i++];
       /* To handle the lettle space ands tab*/

      /*handle letters*/
	if ((ch >= 'a') && (ch <= 'z' ))
	{
		while ((ch >= 'a') && (ch <= 'z' ))
		{
			words[j++]=ch;
			ch=program[i++];
		}
		i--;
		words[j++] = '\0';
		for (k = 0; k < 13; k++)
		{
			if (strcmp (words,keywords[k]) == 0)
			{
				switch(k)
				{
					case 0:{
					 flag = 1;
					 status = 1;
					 break;
					}
					case 1:{
					 flag = 2;
					 status = 1;
					 break;
					}
					case 2:{
					 flag = 3;
					 status = 1;
					 break;
					}
					case 3:{
					 flag = 4;
					 status = 1;
					 break;
					}
					case 4:{
					 flag = 5;
					 status = 1;
					 break;
					}
					case 5:{
					 flag = 6;
					 status = 1;
					 break;
						   }
					case 6:{
					 flag = 7;
					 status = 1;
					 break;
						   }
					case 7:{
					 flag = 8;
					 status = 1;
					 break;
						   }
					case 8:{
					 flag = 9;
					 status = 1;
					 break;
						   }
					case 9:{
					 flag = 10;
					 status = 1;
					 break;
						   }
					case 10:{
					 flag = 11;
					 status = 1;
					 break;
					}
					case 11:{
					 flag = 12;
					 status = 1;
					 break;
					}
					case 12:{
					 flag = 13;
					 status = 1;
					 break;
					}
				}
			}
		}
	   if (status == 0)
	   {
		  flag = 100;
	   }
	}
	/*handle digits*/
	else if ((ch >= '0') && (ch <= '9'))
	{
		number = 0;
		while ((ch >= '0' ) && (ch <= '9' ))
		{
			number = number*10+(ch-'0');
			ch     = program[i++];
		}
		flag = 200;
		i--;
	}
	/*opereation and edge handle*/
	else switch (ch)
	{
		case '=':{
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 401;
			}
			else
			{
				i--;
				flag       = 402;
			}
			break;
		}
		case'>':{
			if (ch == '>')
			{
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
		   if (ch == '=')
		   {
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 403;
		   }
		   else
		   {
			   i--;
			   flag       = 404;
		   }
			break;
		}
		case'<':{
			if (ch == '<'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 405;
			}
			else
			{
				i--;
				flag       = 406;
			}	
			break;
		}
		case'!':{
			if (ch == '!'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 407;
			}
			else
			{
				i--;
				flag       = 408;
			}
			break;
		}
		case'+':{
			if (ch == '+'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 409;
			}
			else if (ch == '+')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 410;
			}
			else
			{
				i--;
				flag       = 411;
			}
		   break;
		}
		case'-':{
			if (ch == '-'){
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 412;
			}
			else if( ch == '-')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 413;
			}
			else
			{
				i--;
				flag       = 414;
		   }
		   break;
		}
		case'*':{
			if (ch == '*'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 415;
			}
			else
			{
			   i--;
			   flag       = 416;
			}
			break;
		 }
		case'/':{
			if (ch == '/'){
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			}
			if (ch == '=')
			{
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 417;
			}
			else
			{
			   i--;
			   flag       = 418;
			}
			break;
		}
		case';':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 501;
		  break;
		 }
		case'(':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 502;
		  break;
		 }
		case')':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 503;
		  break;
		}
		case'[':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 504;
		  break;
		 }
		case']':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 505;
		  break;
		 }
		case'{':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 506;
		  break;
		 }
		case'}':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 507;
		  break;
		 }
		case':':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 508;
		  break;
		}
		case'"':{
		  words[j] = ch;
		  words[j+1] = '\0';
		  flag = 509;
		  break;
		}
		case'%':{
		   if (ch == '%')
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			   if (ch == '=')
			   {
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 510;
			   }
			   else
			   {
			   i--;
			   flag       = 511;
			   }
			 break;
		}
		case',':{
		 words[j] = ch;
		 words[j+1] = '\0';
		 flag = 512;
		 break;
		}
		case'#':{
		 words[j] = ch;
		 words[j+1] = '\0';
		 flag = 513;
		 break;
		}
		case'@':{
		 words[j] = '#';
		 flag = 0;
		 break;
		}
		default:{
		 flag = -1;
		 break;
		}
	}
	return flag;
}
void main()
{
	i=0;
	printf("please input a program end with @");
	do
	{
	  ch           = getchar();
	  program[i++] = ch;
	}while(ch != '@');
	i = 0;
	do{
		flag = Scan(program);
		if (flag == 20)
		{
			printf("(%2d,%4d)",flag,number);
		}
		else if (flag == -1)
		{
			printf("(%d,error)",flag);
		}
		else
		{
			printf("(%2d,%4s)",flag,words);
		}
	}while (flag != 0);
    system("pause");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一:词法分析程序 一、实验目的     通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的类型码及单词符号的自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 用C或C++一个简单词法分析程序程序可以满足下列要求: 1、能分析如下几种简单语言词法 (1) 标识符: ID=letter(letter|digit)* (2) 关键字(全部小) main int float double char if then else switch case break continue while do for (3)整型常量:NUM=digit digit* (4)运算符 = + - * / < <= == != > >= ; ( )? : (5)空格由空白、制表符和换行符组成,用以分隔ID、NUM、运算符等,字符分析时被忽略。 2、单词符号和相应的类别码 假定单词符号和相应的类别码如下: 单词符号 种别码 int 1 = 17 float 2 < 20 if 3 <= 21 switch 4 == 22 while 5 != 23 Do 6 > 24 标识符 10 >= 25 整型常量 11 ; 26 + 13 ( 27 - 14 ) 28 * 15 ? 29 / 16 : 30 3、词法分析程序实现的功能 输入:单词序列(以文件形式提供),输出识别的单词的二元组序列到文件和屏幕 输出:二元组构成: (syn,token或sum) 其中: syn 为单词的种别码 token 为存放的单词自身符号串 sum 为整型常数 例: 源程序: int ab; float ef=20; ab=10+ef; 输出: (保留字--1,int) (标识符--10,ab) (分号--26,;) (保留字--2,float) (标识符--10,ef) (等号--17,=) (整数--11,20) (分号--26,;) (标识符--10,ab) (等号--17,=) (整数--11,10) (加号--13,+) (标识符--10,ef) (分号--26,;) 4、自己准备测试数据存放于TestData.txt文件中,测试数据中应覆盖有以上5种数据,测试结果要求以原数据与结果对照的形式输出并保存在Result.txt中,同时要把结果输出到屏幕。 5、提前准备 ① 实验前,先编制好程序,上机时输入并调试程序。 准备好多组测试数据(存放于文件TestData.txt中)。 6、出实验报告 报告格式:要求有实验名称、实验目的、实验要求、实验内容、实验小结。 其中实验内容包括算法分析、程序流程图及程序代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值