⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 一个用C语言写的词法分析程序
💻
字号:
#include<stdio.h>               /*定义I/O库所用的某些宏和变量 */ 
#include<string.h>              /*定义字符串库函数 */ 
#include<ctype.h>
#include<conio.h>
#include<windows.h>
char prog[80],token[8];      
char ch;
int syn,p,m,n,sum;              /*p是缓冲区prog的指针,m是token的指针 */ 
char *rwtab[6]={"begin","if","then","while","do","end"};  //关键字
void scaner();

void main()
{  
    printf("When input a \'#\' at the beigining of an line,this programe will be over.\n");
    printf("And the programe will output the codes you inputed just now.\n");
    printf("Please input your string:\n");
	do
	{
        ch=getchar();
		prog[p++]=ch;              //输入字符串送人缓冲区prog[]
	}while(ch!='#');
	p=0;
   do
   {
	   scaner();                               /*词法扫描程序*/
	   switch(syn)
	   {
	   case 11:printf("(%d , %d)\n",syn,sum);  //数字二元组输出
            //输出二元组
				   break;
	   case -1:printf("error!!\n");             //输出错误提示
				   break;
	   default:printf("(%d , %s)\n",syn,&token);              //输出其他单词
	   }
   }while(syn!=0);
}

  
/*词法扫描程序*/
void scaner()
{
	  m=0;
	 for(n=0;n<8;n++)
		  token[n]=NULL;

	  ch=prog[p++];  //读入一个字符
	  while(ch==' ')
	  ch=prog[p++];  //读入一个字符
	  if(isalpha(ch))       //ch是否为字母
	  {
		  while(isalpha(ch)||isdigit(ch)) //ch是否为字母或数字
		  {
			  token[m++]=ch;
			  ch=prog[p++];  //读入一个字符
		  }
		  token[m++]='\0';
		  p=p-1; //回退一个字符
		  syn=10;
	   for(n=0;n<6;n++)                                           //判断输入的字符串是否为特殊的单词符号
		{
		 if(strcmp(token,rwtab[n])==0)
		 {
			syn=n+1;//给出syn的值
			break;
		 }
		}
	  }
	  else if(isdigit(ch))       //ch是否为数字
		 {  
			 sum=0;
			 while(isdigit(ch))
			 {   
				 sum=sum*10+ch-'0';    
				 ch=prog[p++];  //读入一个字符
			 }
			  p=p-1; //回退一个字符
			  syn=11;
		}
		 else
			 switch(ch)
		 {
			 case'<':m=0;token[m++]=ch;
					 ch=prog[p++];  //读入一个字符
					if(ch=='>')
					{
						syn=21;
						token[m++]=ch;
					}
					else if(ch=='=')
					{
						syn=22;
						token[m++]=ch;
					}
					else
					{
						 syn=20;
						 p=p-1; //回退一个字符
					}
					break;
			 case'>':m=0;token[m++]=ch;
					ch=prog[p++];  //读入一个字符
					if(ch=='=')
					{
						syn=23;
						token[m++]=ch;
					}
					else
					{
						 syn=24;
						 p=p-1; //回退一个字符
					}
					break;
			 case':':m=0;token[m++]=ch;
				     ch=prog[p++];  //读入一个字符;
					if(ch=='=')
					{
						syn=18;
						token[m++]=ch;
					}
					else
					{
						 syn=17;
						 p=p-1; //回退一个字符;
					}
					break;
			case'+':syn=13;token[0]=ch;  break;
			case'-':syn=14;token[0]=ch;  break;
			case'*':syn=15;token[0]=ch;  break;
			case'/':syn=16;token[0]=ch;  break;
			case'=':syn=25;token[0]=ch;  break;
			case';':syn=26;token[0]=ch;  break;
			case'(':syn=27;token[0]=ch;  break;
			case')':syn=28;token[0]=ch;  break;
			case'#':syn=0;token[0]=ch;   break;
			default:syn=-1;
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -