📄 yacc.bak
字号:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "head.h"
extern int yylex();
void yyerror(char *);
double unary_in(double ,char *);
double assignment_in(double, char *, double );
extern symrec * sym_table;
int ii=0;
int i;
extern FILE * fout;
%}
%union
{
int ext;
double val;
listc * vall;
char * valc;
symrec* tptr;
}
%start input
%token <ext> EXIT_YY
%token <val> CONSTANT
%token <tptr> IDENTIFIER FUNCTION
%token <valc> SIZEOF PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
%token <valc> AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
%token <valc> SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
%token <valc> XOR_ASSIGN OR_ASSIGN
%type <tptr> postfix_expression primary_expression expression unary_expression
%type <tptr> cast_expression multiplicative_expression additive_expression
%type <tptr> shift_expression relational_expression equality_expression and_expression exclusive_or_expression
%type <tptr> inclusive_or_expression logical_and_expression logical_or_expression conditional_expression
%type <tptr> assignment_expression
%type <valc> unary_operator assignment_operator
%type <vall> argument_expression_list
%%
input
: {for(i=0;i<80;i++)printf("-");}
|input line
|input EXIT_YY {return $2;}
;
line
:'\n'
|expression '\n' {if(atof($1->name)==$1->val.var&&$1->val.var!=0)printf("A const!\n");
else if($1->val.var==-1)printf("The var %s is not defined!\n",$1->name);
for(i=0;i<80;i++)printf("-");
}
|error '\n' {yyerrok;}
;
primary_expression
: IDENTIFIER {$1->diff=VAR_TYPE;$$=$1;}
| CONSTANT {$$=(symrec *)malloc(sizeof(symrec));$$->val.var=$1;$$->name=(char *)malloc(10);sprintf($$->name,"%.2f",$1);}
| '(' expression ')' {$$=(symrec *)malloc(sizeof(symrec));$$->val.var=$2->val.var;$$->name=(char *)malloc(5);sprintf($$->name,"%c%d",'t',ii++);printf("%.2f\t\t%s=(%s)\n",$$->val.var,$$->name,$2->name);/*fprintf(fout,"%s=(%s)\n",$$->name,$2->name);fflush(fout);}*/
;
postfix_expression
: primary_expression {$$=$1;}
| postfix_expression '[' expression ']' {if($1->a_val[(int)($3->val.var)]==NULL){$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(255);sprintf($$->name,"%s%s%d%s",$1->name,"[",(int)$3->val.var,"]");$1->diff=ARRAY_TYPE;$1->a_val[(int)($3->val.var)]=$$;$$->val.var=-1;}
else $$=$1->a_val[(int)($3->val.var)];
/*printf("\t\t%s=%s%s%s%s\n",$$->name,$1->name,"[",$3->name,"]");*/
$1->val.var=-1;
}
| FUNCTION '(' ')' {if($1->diff==FUNCTION_OTHER)
{$$=(symrec *)malloc(sizeof(symrec));$$->val.var=($1->val.fnctptr0)();$$->name=(char *)malloc(5);sprintf($$->name,"%c%d",'t',ii++);/*fprintf(fout,"%s=%s(%s)\n",$$->name,$1->name,$1->name);*/printf("%.2f\t\t%s=%s()\n",$$->val.var,$$->name,$1->name);/*fprintf(fout,"%s=%s()",$$->name,$1->name);fflush(fout);*/}
else if($1->diff==FUNCTION_TIME)
{time_t now=($1->val.fnctptr_time)(NULL);printf("%s\n",ctime(&now));YYERROR;}
}
| FUNCTION '('argument_expression_list ')' {$$=(symrec *)malloc(sizeof(symrec));
if($3->count==0)$$->val.var=($1->val.fnctptr)($3->val[0]);
else if($3->count==1)$$->val.var=($1->val.fnctptr2)($3->val[0],$3->val[1]);$$->name=(char *)malloc(5);sprintf($$->name,"%c%d",'t',ii++);printf("%.2f\t\t%s=%s(%s)\n",$$->val.var,$$->name,$1->name,$3->name);/*fprintf(fout,"%s=%s(%s)\n",$$->name,$1->name,$3->name);fflush(fout);*/
}
| postfix_expression INC_OP {$1->val.var++;$$=$1;printf("%.2f\t\t%s%s\n",$$->val.var,$$->name,"++");fprintf(fout,"%s,%s,1,%s\n","+",$$->name,$$->name);fflush(fout);}
| postfix_expression DEC_OP {$1->val.var--;$$=$1;printf("%.2f\t\t%s%s\n",$$->val.var,$$->name,"--");fprintf(fout,"%s,%s,1,%s\n","-",$$->name,$$->name);fflush(fout);}
;
argument_expression_list
: assignment_expression {$$=(listc *)malloc(sizeof(listc));strcpy($$->name,$1->name);$$->count=0;$$->val[$$->count]=$1->val.var;}
| argument_expression_list ',' assignment_expression {strcat($1->name,",");strcat($1->name,$3->name);$1->count++;$$=$1;$$->val[$$->count]=$3->val.var;}
;
unary_expression
: postfix_expression {$$=$1;}
| INC_OP unary_expression {$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(5);sprintf($$->name,"%s%d","t",ii++);$2->val.var++;$$->val.var=$2->val.var;printf("%s%s\n",$1,$2->name);printf("%.2f\t\t%s=%s\n",$$->val.var,$$->name,$2->name);fprintf(fout,"%s,%s,%s,%s\n","+",$2->name,"1",$2->name);fprintf(fout,"%s,%s,%s,%s","=",$2->name," ",$$->name);fflush(fout);}
| DEC_OP unary_expression {$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(5);sprintf($$->name,"%s%d","t",ii++);$2->val.var--;$$->val.var=$2->val.var;printf("%s%s\n",$1,$2->name);printf("%.2f\t\t%s=%s\n",$$->val.var,$$->name,$2->name);fprintf(fout,"%s,%s,%s,%s\n","-",$2->name,"1",$2->name);fprintf(fout,"%s,%s,%s,%s","=",$2->name," ",$$->name);fflush(fout);}
| unary_operator cast_expression {$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(5);sprintf($$->name,"%s%d","t",ii++);$$->val.var=unary_in($2->val.var,$1);printf("%.2f\t\t%s=%s%s\n",$$->val.var,$$->name,$1,$2->name);fprintf(fout,"%s,%s,%s,%s\n",$1,$2->name," ",$$->name);fflush(fout);}
| SIZEOF unary_expression {$$=(symrec *)malloc(sizeof(symrec));$$->name=(char *)malloc(5);sprintf($$->name,"%s%d","t",ii++);$$->val.var=sizeof($2->val.var);printf("%.2f\t\t%s=%s(%s)\n",$$->val.var,$$->name,$1,$2->name);fprintf(fout,"%s,%s,%s,%s\n",$1,$2->name," ",$$->name);fflush(fout);}
;
unary_operator
: '+' {$$=(char *)malloc(255);$$[0]='+';$$[1]='\0';}
| '-' {$$=(char *)malloc(255);$$[0]='-';$$[1]='\0';}
| '~' {$$=(char *)malloc(255);$$[0]='~';$$[1]='\0';}
| '!' {$$=(char *)malloc(255);$$[0]='!';$$[1]='\0';}
;
cast_expression
: unary_expression {$$=$1;}
;
multiplicative_expression
: cast_expression {$$=$1;}
| multiplicative_expression '*' cast_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);}
| multiplicative_expression '/' cast_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);}
| multiplicative_expression '%' cast_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);}
;
additive_expression
: multiplicative_expression {$$=$1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -