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

📄 lex.bak

📁 C语言表达式语法分析器
💻 BAK
字号:
%{
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include "head.h"
#include "yacc.tab.h"
extern void yyerror(char *);
extern symrec * sym_table;
symrec *putsym(char const *,int,double);         
symrec *getsym(char const *);               
symrec *updatesym(char const *,int,double);
void show_all_sym();
void show_all_func();
void showData(char *); 
char file_name[255];
char content[255][80];
FILE * fp;
int i; 
extern FILE * fout;
%} 
%x file_input file_type file_clear
%% 
^("-h"|"--help"|"help") 													{showData("help");}
^("-f"|"--function"|"function") 									{/*show_all_func();*/showData("function");}
^("-s"|"--show"|"show")														{show_all_sym();}
^("-e"|"-q"|"exit"|"quit")												{yylval.ext=-1;return(EXIT_YY);}
^("-clear ")																			{BEGIN(file_clear);
^(("-i"[ \t]+)|("--input="))					 						{BEGIN(file_input);}
<file_input>(([a-zA-Z]+)|([a-zA-Z0-9]+"."[a-zA-Z]+))	{BEGIN(INITIAL);								
																											fp=fopen(yytext,"r");
																											if(!fp)printf("File %s is no exist!\n",yytext);
																											{	if(strcmp(yytext,"out")==0&&strlen("out")==yyleng){fout=freopen("out2","a+",fout);}
																												strcpy(file_name,yytext);
																												/*system("cls");*/
																												printf("You have input file:%s\n",yytext);
																												showData(yytext);
																												yyin=fp;
																											}
																							}
^(("-t"[ \t]+)|("--type="))					 									{BEGIN(file_type);}
<file_type>(([a-zA-Z0-9]+)|([a-zA-Z]+"."[a-zA-Z]+))		{BEGIN(INITIAL);								
																												fp=fopen(yytext,"r");
																												if(!fp)printf("File %s is no exist!\n",yytext);
																												else 
																												{
																												/*system("cls");*/
																												printf("You have input file:%s\n",yytext);
																												showData(yytext);
																												}
																												}
<file_clear>(([a-zA-Z0-9]+)|([a-zA-Z]+"."[a-zA-Z]+))	{BEGIN(INITIAL);
																												char c;
																												printf("do you want to clear it:(Y/N)");
																												if((c=getchar())=='Y'||c=='y')								
																												{fp=fopen(yytext,"w");
																												fclose(fp);
																												printf("file cleared!\n");
																												}
																											}																													
"sizeof"                { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(SIZEOF); }
[a-zA-Z][a-zA-Z0-9]*    { symrec *s;
										      s=getsym(yytext);
													if(s==0)
															{	s=putsym(yytext,IDENTIFIER,-1);
														 		yylval.tptr=s;
														 		return IDENTIFIER;
															}
													else if(s->type==FUNCTION)
															{	yylval.tptr=s;
																return FUNCTION;
															}
													else if(s->type==IDENTIFIER)
															{	yylval.tptr=s;
																return IDENTIFIER;
															}
												} 
 
[0-9]+|[0-9]+"."[0-9]*  { yylval.val=atof(yytext);        
        								 	return(CONSTANT); } 

">>="                   { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(RIGHT_ASSIGN); } 
"<<="                   { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(LEFT_ASSIGN); } 
"+="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(ADD_ASSIGN); } 
"-="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(SUB_ASSIGN); } 
"*="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(MUL_ASSIGN); } 
"/="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(DIV_ASSIGN); } 
"%="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(MOD_ASSIGN); } 
"&="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(AND_ASSIGN); } 
"^="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(XOR_ASSIGN); } 
"|="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(OR_ASSIGN); } 
">>"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(RIGHT_OP); } 
"<<"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(LEFT_OP); } 
"++"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(INC_OP); } 
"--"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(DEC_OP); } 
"->"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(PTR_OP); } 
"&&"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(AND_OP); } 
"||"                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(OR_OP); } 
"<="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(LE_OP); } 
">="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(GE_OP); } 
"=="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(EQ_OP); } 
"!="                    { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(NE_OP); } 
","                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(','); } 
"="                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('='); } 
"("                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('('); } 
")"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(')'); } 
("["|"<:")              { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('['); } 
("]"|":>")              { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(']'); } 
"."                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('.'); } 
"&"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('&'); } 
"!"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('!'); } 
"~"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('~'); } 
"-"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('-'); } 
"+"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('+'); } 
"*"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('*'); } 
"/"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('/'); } 
"%"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('%'); } 
"<"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('<'); } 
">"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('>'); } 
"^"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('^'); } 
"|"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('|'); } 
"?"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('?'); } 
":"                     { yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return(':'); }
"\n"				  					{ yylval.valc=(char *)malloc(255);strcpy(yylval.valc,yytext); return('\n'); }
[ \t\v\f]              
.                       { yyerror("Invalid character!"); } 
<<EOF>> 								{fclose(yyin);printf("File %s end!\n",file_name);if(strcmp(file_name,"out")==0){fout=freopen("out","a+",fout);} for(i=0;i<80;i++)printf("=");yyin=stdin;yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ) );}
%% 
 
yywrap() 
{ 
     return(1); 
} 

symrec * putsym(char const *sym_name,int type,double val)
{
	symrec *ptr;
	ptr=(symrec *)malloc(sizeof(symrec));
	ptr->name=(char*)malloc(strlen(sym_name)+1);
	strcpy(ptr->name,sym_name);
	ptr->type=type;
	if(type==IDENTIFIER)ptr->val.var=val;
	ptr->next=(struct symrec *)sym_table;
	sym_table=ptr;
	return ptr;
	
}

symrec * getsym(char const * sym_name)
{
	symrec *ptr;
	for(ptr=sym_table;ptr!=(symrec *)0;ptr=(symrec *)ptr->next)
		if(strcmp(ptr->name,sym_name)==0)return ptr;
	return 0;
}

symrec * updatesym(char const *sym_name,int type,double val)
{
	symrec * s =getsym(sym_name);
	if(s==0)s=putsym(sym_name,type,val);
	else 
	{s->type=type;
	 s->val.var=val;
	}
	return s;
}

void show_all_sym()
{
	symrec *ptr;
	int i=0;
	for(ptr=sym_table;ptr!=(symrec *)0;ptr=(symrec *)ptr->next)
		{
		if(ptr->type==IDENTIFIER&&ptr->val.var!=-1&&ptr->diff==VAR_TYPE)
		printf("%s=%.2f\t",ptr->name,ptr->val.var);
		}
	printf("\n");
	for(ptr=sym_table;ptr!=(symrec *)0;ptr=(symrec *)ptr->next)
		{
		if(ptr->type==IDENTIFIER&&ptr->diff==ARRAY_TYPE)
			{
			for(i=0;i<255;i++)
			if(ptr->a_val[i])printf("%s%s%d%s=%.2f\t",ptr->name,"[",i,"]",(ptr->a_val[i])->val.var);
			printf("\n");
			}
		}
}
void show_all_func()
{
	symrec *ptr;
	for(ptr=sym_table;ptr!=(symrec *)0;ptr=(symrec *)ptr->next)
		{
		if(ptr->type==FUNCTION)
		printf("%s\t",ptr->name);
		}
	printf("\n");
}

void showData(char * text)
{	
	FILE * fp=fopen(text,"r");
	int i=0,maxline=0;
	while(fgets(content[i], 80, fp)  !=NULL)i++;
	maxline=i;
  for(i=0;i<80;i++)printf("=");
	for(i=0;i<maxline;i++)printf("%s",content[i]);
	printf("\n");
	for(i=0;i<80;i++)printf("-");
	fclose(fp);
}

⌨️ 快捷键说明

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