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

📄 myyacc.y

📁 编译原理此法分析三
💻 Y
字号:
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define MSDOS
int linesCount;
int nextStat=0;
int i;
extern int yylex();
extern int yyerror();
extern char yytext[];
extern char lexeme[30];
extern char lexlogic[30];
struct lexvalStack
{
union lex{              /*文法符号的属性值*/
  char chr;
  char *str;
  int integer;
  float real;
  double dbl;
  }lexValue;
char name[30];
char type;
}; 
struct lexvalStack tempVal,prevTempVal;
int tempVarCount=0;
void gen(char *opr,char *arg1,char *arg2);
void genjump(char *opr,int a,int b,char *arg);
void genrelation(char *opr,char *arg1,char *arg2,int next);
void treegen(char *opr,char *arg1,char *arg2);
%}
%union{                     /*单词值*/
   char chr;
   char *str;
   int integer;
   float real;
   double dbl;
   char name[30];
   struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID AND OR NOT
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%left '='
%left OR
%left AND
%right NOT
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines:	lines expr'\n'
	{
	tempVarCount=0;	
	linesCount++;
	 printf("line %d\n",linesCount);
	}
	|lines'\n'
	{
	 linesCount++;
	 /*printf("line %d\n",linesCount); */    
	}
	|
	;
expr:   expr '+' expr
		{
		  treegen("+",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		
		}
		|expr '-' expr
		{
		  treegen("-",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);			
		}
		|expr '*' expr
		{
		  treegen("*",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		
		}
		| expr '/' expr
		{
		  treegen("/",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		    
		}
		| expr '=' expr
		{
		  treegen("=",$3.name,$1.name);
		  strcpy($1.name,tempVal.name);
		  strcpy($$.name,tempVal.name);
		}
		/*| expr '>' expr
		{
		  genrelation("j>",$1.name,$3.name,nextStat+3);
		  strcpy($$.name,tempVal.name);
		  genjump("ASSIGN",0,0,$$.name);
		  printf("%d\t(jmp,0,0,%d)\n",nextStat++,nextStat+2);
		  genjump("ASSIGN",1,0,$$.name);		    
		}
		| expr '<' expr
		{
		  genrelation("j<",$1.name,$3.name,nextStat+3);
		  strcpy($$.name,tempVal.name);
		  genjump("ASSIGN",0,0,$$.name);
		  printf("%d\t(jmp,0,0,%d)\n",nextStat++,nextStat+2);
		  genjump("ASSIGN",1,0,$$.name);		    
		}*/
		| '(' expr ')'
		{
		  strcpy($$.name,$2.name);		
		}
		| '-' expr %prec UMINUS
		{
		  treegen("UMINUS",$2.name,(char *)(-1));
		  strcpy($$.name,tempVal.name);		
		}
		|INUMBER
		{
		  strcpy($$.name,lexeme);
		}
		|FNUMBER
		{
		  strcpy($$.name,lexeme);
		}
		|ID
		{
		  strcpy($$.name,lexeme);
		}
		| expr AND expr
		{
		  treegen("And",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);
		}
		| expr OR expr
		{
		  treegen("Or",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);
		}
		| NOT expr
		{
		  treegen("Not",$2.name,(char *)(-1));
		  strcpy($$.name,tempVal.name);
		}
		;
%%
int yyerror(char *s)
{
  fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
  return 0;
}

void gen(char *opr,char *arg1,char *arg2)
{
  sprintf(tempVal.name,"temp%d",tempVarCount++);
  if((int)arg2 == -1)
	    fprintf(stdout,"%10d\t(%s,%s,0,%s)\n",nextStat++,opr,arg1,tempVal.name);
  else
	    fprintf(stdout,"%10d\t(%s,%s,%s,%s)\n",nextStat++,opr,arg1,arg2,tempVal.name);
}

void genjump(char *opr,int a,int b,char *arg)
{
  fprintf(stdout,"%10d\t(%s,%d,%d,%s)\n",nextStat++,opr,a,b,arg);
}

void genrelation(char *opr,char *arg1,char *arg2,int next)
{
  sprintf(tempVal.name,"temp%d",tempVarCount++);
  fprintf(stdout,"%10d\t(%s,%s,%s,%d)\n",nextStat++,opr,arg1,arg2,next);
}


void treegen(char *opr,char *arg1,char *arg2)
{
  sprintf(tempVal.name,"",tempVarCount++);
  if((int)arg2 == -1)
  {
	    fprintf(stdout,"\t%s\n",arg1);
	    for(i=0;i<=tempVarCount;i++)
	    	fprintf(stdout,"\t");
	    fprintf(stdout,"%s",opr);
	}
	    
  else
	    fprintf(stdout,"\t\t%s%s\n",arg1,arg2);
	    for(i=0;i<tempVarCount+1;i++)
	    	fprintf(stdout,"\t");
	    fprintf(stdout,"%s",opr);
}


⌨️ 快捷键说明

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