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