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

📄 xlexanal.cpp

📁 一个我自己写的X语言词法分析器,X语言(1~9,+-*/() )
💻 CPP
字号:
/*direct by wxd 2006.6.5 in China
 程序说明:X语言词法分析程序
 使用方法:在D盘下新建一个名为Xin.txt的文件
          作为X程序输入,运行此程序即有一个
		  ScanOut.txt 扫描输出文件
**************************/

#include<stdio.h> 
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
#include<string.h>

/***************
    
	  宏定义

****************/

#define EOI 0 			/*输入结束*/
#define SEMI 1 			/*;*/
#define PLUS 2			/*+*/
#define SUB 3				/*-*/
#define TIMES 4			/* * */
#define DIV 5       		/* / */
#define LP 6        		/* ( */
#define RP 7				/* ) */
#define NUM 8			/*十进制数*/
#define OTHERS 9        /*其它字符*/
#define NumIN 1
#define NumOUT 0
#define MAXNUM 100  //定义最长的单元

/*************** 
 
   出错函数定义

****************/

void error() //出错报告
{
	printf(" error!  \
		Unreference character!\n ");
	exit(1);
}


/**************
 
  清空数组函数

***************/
void ClearArray(char *p) //清空数组
{
    int len = strlen(p), i;
  
    for (i = 0; i < len -1; i++)
	   p[i] = NULL;
}


void main()
{
	FILE *ReadX,*ScanX;
	char a[MAXNUM], s;		/*数组用于存入单元 s用于存入从X程序读入的字符*/
    int i = 0;				/*标记单元中字符个数*/
	int TOKE;				/*记号*/
	int NumState;			/*读入字符状态即是否在一个类型的单元内*/
    char *TokeA[] = {"EOI","SEMI","PLUS",
		"SUB","TIMES","DIV","LP","RP","NUM"};

	ReadX = fopen("d:/Xin.txt","r+"); //读入X程序文件
	ScanX = fopen("d:/ScanOut.txt","w+");//新建并打开扫描输出文件以便写入扫描文件

	s = fgetc(ReadX);
    while(isspace(s)) //跳过空格 制表符等
	 s = fgetc(ReadX);

	while(s != EOF){
    
	  switch(s) //如果为非数字符
	  {
	    case '+' :
			a[i++] = s;
			TOKE = PLUS;
			NumState = NumOUT;
		
			break;
		case '-' :
			a[i++] = s;
			TOKE = SUB;
			NumState =  NumOUT;
		
			break;
        case '*' :
			a[i++] = s;
			TOKE = TIMES;
			NumState =  NumOUT;
		
			break;
		case '/' :
			a[i++] = s;
			TOKE = DIV;
			NumState =  NumOUT;
		
			break;
		case ';' :
			a[i++] = s;
			TOKE = SEMI;
			NumState =  NumOUT;
		
			break;
        case '(' :
			a[i++] = s;
			TOKE = LP;
			NumState =  NumOUT;
		
			break;
		case ')' :
			a[i++] = s;
			TOKE = RP;
			NumState =  NumOUT;
		
			break;
		default :
			
			if(isspace(s)) //碰到空格即退出数字单元
			{   

		      NumState =  NumOUT;
              TOKE = OTHERS;
			  
		 
			} 

			else if(isdigit(s) )//如果读入字符为数字时要判断下一字符是否为数字 且完成后要把读指针回撤
			{   
			  a[i++] = s;
			  TOKE = NUM;
			  s = fgetc(ReadX);
			  
			  if( isdigit(s))
				{ 
				 NumState = NumIN;
			   
				}
			  else
				NumState =  NumOUT;
                if(s == EOF)
					break;
				fseek(ReadX, -1L,SEEK_CUR);   
			
			}
			else
			{
				error();//报错处理
			}
			

			break;

	  }// end switch
	       
	 if(NumState==NumOUT && TOKE >=1 && TOKE<=8 )//完成一个单元的扫描就输出
	 {  
         a[i] = '\0'; 
		 fprintf( ScanX, "%s     %s\n",a,TokeA[TOKE]);
		 ClearArray(a);
		 i = 0;    //数组清空
	 } //end if

     s = fgetc(ReadX); //取下一个字符

} //end while
    
	fprintf( ScanX, "%s\n",TokeA[0]);//给扫描程序追加输入结束标志
	fclose(ReadX);
	fclose(ScanX); //关闭文件


}//end main

⌨️ 快捷键说明

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