📄 xlexanal.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 + -