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

📄 yacc.bak

📁 C语言表达式语法分析器
💻 BAK
📖 第 1 页 / 共 2 页
字号:
%{
#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 + -