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

📄 yacc.bak

📁 C语言表达式语法分析器
💻 BAK
📖 第 1 页 / 共 2 页
字号:
        | additive_expression '+' multiplicative_expression 								{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var+$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"+",$3->name);fprintf(fout,"%s,%s,%s,%s\n","+",$1->name,$3->name,$$->name);fflush(fout);}
        | additive_expression '-' multiplicative_expression 								{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var-$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"-",$3->name);fprintf(fout,"%s,%s,%s,%s\n","-",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
shift_expression 							
        : additive_expression 						{$$=$1;}
        | shift_expression LEFT_OP additive_expression 											{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=(int)$1->val.var<<(int)$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"<<",$3->name);fprintf(fout,"%s,%s,%s,%s\n","<<",$1->name,$3->name,$$->name);fflush(fout);}
        | shift_expression RIGHT_OP additive_expression 										{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=(int)$1->val.var>>(int)$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,">>",$3->name);fprintf(fout,"%s,%s,%s,%s\n",">>",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
relational_expression 							
        : shift_expression 																									{$$=$1;}
        | relational_expression '<' shift_expression 												{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var<$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"<",$3->name);fprintf(fout,"%s,%s,%s,%s\n","<",$1->name,$3->name,$$->name);fflush(fout);}
        | relational_expression '>' shift_expression 												{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var>$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,">",$3->name);fprintf(fout,"%s,%s,%s,%s\n",">",$1->name,$3->name,$$->name);fflush(fout);}
        | relational_expression LE_OP shift_expression 											{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var<=$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"<=",$3->name);fprintf(fout,"%s,%s,%s,%s\n","<=",$1->name,$3->name,$$->name);fflush(fout);}
        | relational_expression GE_OP shift_expression 											{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var>=$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,">=",$3->name);fprintf(fout,"%s,%s,%s,%s\n",">=",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
equality_expression 							
        : relational_expression                                         		{$$=$1;}		
        | equality_expression EQ_OP relational_expression 									{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var==$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"==",$3->name);fprintf(fout,"%s,%s,%s,%s\n","==",$1->name,$3->name,$$->name);fflush(fout);}
        | equality_expression NE_OP relational_expression 									{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var!=$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"!=",$3->name);fprintf(fout,"%s,%s,%s,%s\n","!=",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
and_expression 								
        : equality_expression 																							{$$=$1;}
        | and_expression '&' equality_expression 														{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=(int)($1->val.var)&(int)($3->val.var);printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"&",$3->name);fprintf(fout,"%s,%s,%s,%s\n","&",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
exclusive_or_expression 						
        : and_expression 																										{$$=$1;}
        | exclusive_or_expression '^' and_expression 												{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=(int)($1->val.var)^(int)($3->val.var);printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"^",$3->name);fprintf(fout,"%s,%s,%s,%s\n","^",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
inclusive_or_expression 						
        : exclusive_or_expression 																					{$$=$1;}
        | inclusive_or_expression '|' exclusive_or_expression 							{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=(int)($1->val.var)|(int)($3->val.var);printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"|",$3->name);fprintf(fout,"%s,%s,%s,%s\n","|",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
logical_and_expression 							
        : inclusive_or_expression 																					{$$=$1;}
        | logical_and_expression AND_OP inclusive_or_expression 						{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var&&$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"&&",$3->name);fprintf(fout,"%s,%s,%s,%s\n","&&",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
logical_or_expression 							
        : logical_and_expression 					{$$=$1;}
        | logical_or_expression OR_OP logical_and_expression 								{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var||$3->val.var;printf("%.2f\t\t%s=%s%s%s\n",$$->val.var,$$->name,$1->name,"||",$3->name);fprintf(fout,"%s,%s,%s,%s\n","||",$1->name,$3->name,$$->name);fflush(fout);}
        ; 
 
conditional_expression 							
        : logical_or_expression 																						{$$=$1;}
        | logical_or_expression '?' expression ':' conditional_expression 	{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$1->val.var?$3->val.var : $5->val.var;printf("%.2f\t\t%s=%s%s%s%s%s\n",$$->val.var,$$->name,$1->name,"?",$3->name,":",$5->name);/*fprintf(fout,"%s=%s%s%s%s%s\n",$$->name,$1->name,"?",$3->name,":",$5->name);fflush(fout);*/}
        ; 
 
assignment_expression 							
        : conditional_expression                                        		{$$=$1;}
        | unary_expression assignment_operator assignment_expression 				{$1->val.var=assignment_in($1->val.var,$2,$3->val.var);$$=$1;printf("%.2f\t\t%s%s%s\n",$$->val.var,$$->name,$2,$3->name);fprintf(fout,"%s,%s,%s,%s\n",$2,$3->name," ",$$->name);fflush(fout);}
        ; 
 
assignment_operator 
        : '=' 																															{$$=(char * )malloc(255);$$[0]='=';$$[1]='\0';}
        | MUL_ASSIGN 																												{$$=$1;}
        | DIV_ASSIGN 																												{$$=$1;}
        | MOD_ASSIGN 																												{$$=$1;}
        | ADD_ASSIGN 																												{$$=$1;}
        | SUB_ASSIGN 																												{$$=$1;}
        | LEFT_ASSIGN 																											{$$=$1;}
        | RIGHT_ASSIGN 																											{$$=$1;}
        | AND_ASSIGN 																												{$$=$1;}
        | XOR_ASSIGN 																												{$$=$1;}
        | OR_ASSIGN 																												{$$=$1;}
        ; 
 
expression 
        : assignment_expression 																						{$$=$1;}
        | expression ',' assignment_expression 															{$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%d","t",ii++);$$->val.var=$3->val.var;fflush(fout);}
        ; 
%% 



void yyerror(char *s) 
{ 
  printf("%s\n",  s); 
} 
double unary_in(double v1,char *s)
{
	switch (s[0])
{
	case '+' : return  v1;
	case '-' : return (-v1);
	case '~' : return (~(int)v1);
	case '!'  : return (!v1);
 }
}
double assignment_in(double v1, char * s, double v2)
{
	if(strcmp(s,"=")==0) return v2;
	if(strcmp(s,"+=")==0) return (v1+v2);
	if(strcmp(s,"-=")==0) return (v1-v2);
	if(strcmp(s,"*=")==0) return (v1*v2);
	if(strcmp(s,"/=")==0 && v2!=0)return (v1/v2);
	if(strcmp(s,"%=")==0) return ((int)v1%(int)v2);
	if(strcmp(s,"<<=")==0) return ((int)v1<<(int)v2);
	if(strcmp(s,">>=")==0)return ((int)v1>>(int)v2);
	if(strcmp(s,"&=")==0) return ((int)v1&(int)v2);
	if(strcmp(s,"^=")==0) return ((int)v1^(int)v2);
	if(strcmp(s,"|=")==0) return ((int)v1|(int)v2);
	return 0.;
}

⌨️ 快捷键说明

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