📄 lex.cpp
字号:
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 + -