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

📄 myyacc.y.bak

📁 编译原理此法分析一
💻 BAK
字号:
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define MSDOS
int linesCount;
int nextStat=0;
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);

struct CSanyuan
{
	char m_op[30];
	char m_arg1[30];
	char m_arg2[30];
};

struct CSanyuan Jilu[100];

int nCurrentPosition=0;

%}
%union{                     /*单词值*/
   char chr;
   char *str;
   int integer;
   float real;
   double dbl;
   char name[30];
   struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%right '='
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines:	lines expr'\n'
	{
		linesCount++;
	 printf("line %d\n",linesCount);
	}
	|lines'\n'
	{
	 linesCount++;
	}
	|
	;
expr:   expr '+' expr
		{
		  gen("+",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		
		}
		|expr '-' expr
		{
		  gen("-",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);			
		}
		|expr '*' expr
		{
		  gen("*",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		
		}
		| expr '/' expr
		{
		  gen("/",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);		    
		}
		| expr '=' expr
		{
		  gen("=",$3.name,$1.name);
		  strcpy($1.name,tempVal.name);
		  strcpy($$.name,tempVal.name);
		}
		| '(' expr ')'
		{
		  strcpy($$.name,$2.name);		
		}
		| '-' expr %prec UMINUS
		{
		  gen("UMINUS",$2.name,(char *)(-1));
		  strcpy($$.name,tempVal.name);		
		}
		|INUMBER
		{
		  strcpy($$.name,lexeme);
		}
		|FNUMBER
		{
		  strcpy($$.name,lexeme);
		}
		|ID
		{
		  strcpy($$.name,lexeme);
		}
		;
%%
int yyerror(char *s)
{
  fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
  return 0;
}

void gen(char *opr,char *arg1,char *arg2)
{
	int i;
	for(i=0; i<nCurrentPosition; ++i)
  {
  	if(!strcmp(opr, Jilu[i].m_op)&&!strcmp(arg1, Jilu[i].m_arg1)&&!strcmp(arg2, Jilu[i].m_arg2))
  		break;
  }
  if(i<nCurrentPosition)
  	sprintf(tempVal.name,"(%d)", i+1);
  else
  	sprintf(tempVal.name,"(%d)", nextStat+1);
  if(i==nCurrentPosition)
  {
  if((int)arg2 == -1)
  	{
  		
	    fprintf(stdout,"%10d\t(%s,\t%s,\t0)\t\t%d\t(%d)\n",nextStat+1,opr,arg1, nextStat, nextStat+14);
	    nextStat++;
	  }
  else
  	{
	    fprintf(stdout,"%10d\t(%s,\t%s,\t%s)\t\t%d\t(%d)\n",nextStat+1,opr,arg1,arg2, nextStat, nextStat+14);
	    nextStat++;
	  }
	 
	 strcpy(Jilu[nCurrentPosition].m_op, opr);
	 strcpy(Jilu[nCurrentPosition].m_arg1, arg1);
	 strcpy(Jilu[nCurrentPosition].m_arg2, arg2);
	 nCurrentPosition++;
	}    
}

⌨️ 快捷键说明

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