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

📄 lex.cpp

📁 词法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

			result_tuple.flag=o_comma;
			break;
		case ';':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_semicolon;
			break;
		case '*':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_time;
			break;
		case '/':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_div;
			break;
		case ')':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_rbracket;
			break;
		case '[':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_lparent;
			break;
		case ']':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_rparent;
			break;
		case '+':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_plus;
			break;
		case '-':
			rc=LEX_SUCCESS;
			result_tuple.flag=o_minus;
			break;
		case ':':
			c=yyinput();
			if(c!='='){
				result_tuple.flag=o_colon;
				yyunput(c,yytext);
			}else result_tuple.flag=o_becomes;
			rc=LEX_SUCCESS;
			break;
		case '<':
			c=yyinput();
			if(c=='=')result_tuple.flag=o_le;
			else if(c=='>')result_tuple.flag=o_ne;
			else{
				result_tuple.flag=o_ls;
				yyunput(c,yytext);
			}
			rc=LEX_SUCCESS;
			break;
		case '>':
			c=yyinput();
			if(c!='='){
				result_tuple.flag=o_gt;
				yyunput(c,yytext);
			}else result_tuple.flag=o_ge;
			rc=LEX_SUCCESS;
			break;
		case '.':
			c=yyinput();
			if(!isdigit(c)){
				if(c=='.'){
					result_tuple.flag=o_range;
				}else{
					result_tuple.flag=o_period;
					yyunput(c,yytext);
				}
				rc=LEX_SUCCESS;
			}else{
				rc=act_number(c,3);
			}
			break;
		case '\r':
		case '\n':
		case '\t':
		case ' ':
			break;
		default:
			fprintf(stderr,"%-8d非法字符%c\n",yy_linenum,c);
		}
	}
	return rc;
}
/////////////////////////////////
static int frw[11]={
	0,	0,	0,	5,	16,
	25,	31,	35,	39,	40,
	41};
struct s_keyword{char * s;keyword f;} 
	t_keyword[]={
		{"if",k_if},//0
		{"of",k_of},
		{"do",k_do},
		{"to",k_to},
		{"or",k_or},
		{"var",k_var},//5
		{"for",k_for},
		{"end",k_end},
		{"not",k_not},
		{"and",k_and},
		{"div",k_div},//10
		{"mod",k_mod},
		{"abs",f_abs},
		{"sqr",f_sqr},
		{"ord",f_ord},
		{"chr",f_chr},//15
		{"odd",f_odd},
		{"type",k_type},
		{"then",k_then},
		{"else",k_else},
		{"true",c_true},//20
		{"char",t_char},
		{"succ",f_succ},
		{"pred",f_pred},
		{"read",f_read},
		{"const",k_const},//25
		{"begin",k_begin},
		{"while",k_while},
		{"array",k_array},
		{"false",c_false},
		{"write",f_write},//30
		{"downto",k_downto},
		{"record",k_record},
		{"maxint",c_maxint},
		{"readln",f_readln},
		{"program",k_program},//35
		{"integer",t_integer},
		{"boolean",t_boolean},
		{"writeln",f_writeln},
		{"function",k_function},
		{"procedure",k_procedure}};//40
char * t_identity[LEX_MAX_IDENTITY+1];
int    t_id_index;
void local_init(){
	char stringfile[FILENAME_LENGTH+2];
	strcpy(stringfile,sourcefile);
	strcat(stringfile,".str");
	yystr=fopen(stringfile,"w");
	yy_stringpos=0;
	memset(t_identity,0,sizeof(t_identity));
	t_id_index=1;
}
void local_end(){
	int i;
	if(yystr!=NULL)fclose(yystr);
	fprintf(yyout,"\n下面是标志符表\n\n");
	for(i=1;i<=LEX_MAX_IDENTITY;i++){
		if(t_identity[i]!=0){
			fprintf(yyout,"%-8d%s\n",i,t_identity[i]);
			delete[] t_identity[i];
		}
	}
}
static int _stdcall act_identity(char&c){
	do{
		c=yyinput();
		if(c==EOF)break;
	}while(isalpha(c)||(c=='_')||isdigit(c));
	yyunput(c,yytext);
	//现在yytext就是所发现的标志符
	int i,j,k;
	k=strlen(yytext);
	if(k<10){
		i=frw[k];j=frw[k+1]-1;
		while((i<=j)&&(strcmp(yytext,t_keyword[i].s)!=0))i++;
		if(i<=j){
			result_tuple.flag=t_keyword[i].f;
			return LEX_SUCCESS;
		}
	}
	t_identity[0]=yytext;
	i=t_id_index-1;
	while(strcmp(yytext,t_identity[i])!=0)i--;
	if(i==0){
		if(t_id_index>LEX_MAX_IDENTITY)
			yy_fatal_error("标志符表溢出");
		t_identity[i=t_id_index]=new char[k+1];
		strcpy(t_identity[t_id_index++],yytext);
	}
	result_tuple.flag=identity;
	result_tuple.data.i_val.int_val1=i;
	return LEX_SUCCESS;
}
static int _stdcall act_comment2(char&c){
	do{
		c=yyinput();
		if(c==EOF)break;
	}while(c!='}');
	//此处为注释2
	return LEX_NOTUPLE;
}
static int _stdcall act_string(char&c){
	char temp[STRLENGTH+2];
	register int  i=0;
	bool once=true;
loop:
	c=yyinput();
	temp[i++]=c;
	if((c==10)||(c==EOF)){
		fprintf(stderr,"%-8d缺少右单引号,定义字符串:%s\n",yy_linenum-1,yytext);
		once=false;
		goto exit;
	}
	if((i<STRLENGTH)&&(c!='\''))goto loop;
	if(c=='\''){
		c=yyinput();
		if(c=='\''){
			goto loop;
		}else{
			goto exit;
		}
	}
	if(i-->=STRLENGTH){
		if(once){
			fprintf(stderr,"%-8d字符串常量太长:%s\n",yy_linenum-1,yytext);
			once=false;
		}
	}
	goto loop;
exit:
	yyunput(c,yytext);
	temp[i-1]=0;
	//temp中为字符串
	i=strlen(temp);
	if(i==1){//为字符常量
		result_tuple.flag=c_char;
		result_tuple.data.c_val=temp[0];
	}else{
		result_tuple.flag=c_string;
		result_tuple.data.i_val.int_val1=yy_stringpos;
		result_tuple.data.i_val.int_val2=i;
		yy_stringpos+=i+2;
		fprintf(yystr,"%s\n",temp);
	}
	return once?LEX_SUCCESS:LEX_WITH_ERROR;
}
static int _stdcall act_comment1(char&c){
	char c1;
	c=yyinput();
	do{
		c1=c;
		c=yyinput();
		if((c==')')&&(c1=='*')){
			return LEX_NOTUPLE;
		}
	}while(c!=EOF);
	yyunput(c,yytext);
	return LEX_NOTUPLE;
}
static int _stdcall act_chinese(char&c){
	do{
		c=yyinput();
	}while(c<0);
	yyunput(c,yytext);
	fprintf(stderr,"%-8d非法的中文字符:%s\n",yy_linenum,yytext);
	return LEX_NOTUPLE;
}
static int _stdcall act_number(char&c,int state){
	register s=state;
	do{
		switch(s){
		case 1:
			s=2;
			break;
		case 2:
			if(isdigit(c)){
			}else if(c=='.')s=4;
			else if(c=='E'||c=='e')s=6;
			else goto exit;
			break;
		case 3:
			s=5;
			break;
		case 4:
			if(isdigit(c))s=5;
			else if(c=='E'||c=='e')s=6;
			else goto exit;
			break;
		case 5:
			if(isdigit(c));
			else if(c=='E'||c=='e')s=6;
			else goto exit;
		case 6:
			if(isdigit(c))s=8;
			else if(c=='+'||c=='-')s=7;
			else goto exit;
			break;
		case 7:
			if(isdigit(c))s=8;
			else goto exit;
			break;
		case 8:
			if(!isdigit(c))goto exit;
		}
	}while((c=yyinput())!=EOF);
exit:
	yyunput(c,yytext);
	if(s==2||s==4){
		result_tuple.flag=c_integer;
		if(s==4)yyunput('.',yytext);
		result_tuple.data.i_val.int_val1=atoi(yytext);
	}else{
		result_tuple.flag=c_real;
		result_tuple.data.d_val=atof(yytext);
	}
	if(s==7||s==6){
		fprintf(stderr,"%-8d错误的实数定义:%s\n",yy_linenum,yytext);
		return LEX_WITH_ERROR;
	}else 
		return LEX_SUCCESS;
}
#ifdef _DEBUG
void print_result(FILE*o){
	fprintf(o,"%-8d%-8d%s\n",yy_linenum,result_tuple.flag,yytext);
}
#endif

⌨️ 快捷键说明

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