📄 yacc.bak
字号:
| 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 + -