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

📄 myyacc.y

📁 编译原理词法分析器实现四
💻 Y
字号:
%{
#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];
extern char lexkey[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);

struct CSiYuan
{
	char m_op[30];
	char m_arg1[30];
	char m_arg2[30];
	char m_arg3[30];
};

struct CSiYuan JiLu[100];
int nCurrentPosition=0;
int rem_bool[30];
int rem_exit[30];
int nCurrentXunhuan=-1;

%}
%union{                     /*单词值*/
   char chr;
   char *str;
   int integer;
   float real;
   double dbl;
   char name[30];
   struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID AND OR NOT K_WHILE K_DO K_BEGIN K_END
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%right '='
%left OR
%left AND
%right NOT
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%left '[' ']'
%%
sentence: expr ';'
					{
						//printf("sentence\n");
					}
					| w4
					{
					}
					| sentence expr ';'
					{
					}
					| sentence w4
					{
					}
					| sentence '\n'
					{
					}
					;
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 '>' expr
		{
		  char t[10];
		  genrelation("j>",$1.name,$3.name,nextStat+3);
		  strcpy($$.name,tempVal.name);
		  genjump("ASSIGN",0,0,$$.name);
		  //printf("%10d\t(jmp,\t0,\t0,\t%d)\n",nextStat++,nextStat+1);
		  nextStat++;
		  sprintf(t, "(%d)", nextStat+1);
		  strcpy(JiLu[nCurrentPosition].m_op, "jmp");
			strcpy(JiLu[nCurrentPosition].m_arg1, "0");
			strcpy(JiLu[nCurrentPosition].m_arg2, "0");
			strcpy(JiLu[nCurrentPosition].m_arg3, t);
			nCurrentPosition++;
		  genjump("ASSIGN",1,0,$$.name);		    
		}
		| expr '<' expr
		{
		  char t[10];
		  genrelation("j<",$1.name,$3.name,nextStat+3);
		  strcpy($$.name,tempVal.name);
		  genjump("ASSIGN",0,0,$$.name);
		  //printf("%10d\t(jmp,\t0,\t0,\t%d)\n",nextStat++,nextStat+1);
		  nextStat++;
		  sprintf(t, "(%d)", nextStat+1);
		  strcpy(JiLu[nCurrentPosition].m_op, "jmp");
			strcpy(JiLu[nCurrentPosition].m_arg1, "0");
			strcpy(JiLu[nCurrentPosition].m_arg2, "0");
			strcpy(JiLu[nCurrentPosition].m_arg3, t);
			nCurrentPosition++;
		  genjump("ASSIGN",1,0,$$.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);
		}
		| expr AND expr
		{
		  gen("And",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);
		}
		| expr OR expr
		{
		  gen("Or",$1.name,$3.name);
		  strcpy($$.name,tempVal.name);
		}
		| NOT expr
		{
		  gen("Not",$2.name,(char *)(-1));
		  strcpy($$.name,tempVal.name);
		}
		| expr '[' expr ']'
		{
			sprintf(tempVal.name,"temp%d",tempVarCount++);
			strcpy(JiLu[nCurrentPosition].m_op, "[]");
	    strcpy(JiLu[nCurrentPosition].m_arg1, $1.name);
	    strcpy(JiLu[nCurrentPosition].m_arg2, $3.name);
	    strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
	    strcpy($$.name,tempVal.name);
	    nCurrentPosition++;
	    nextStat++;
		}
		;
w1:	K_WHILE '('
		{
			nCurrentXunhuan++;
			rem_bool[nCurrentXunhuan]=nCurrentPosition;
		}
		;
w2: w1 expr ')' K_DO '\n' K_BEGIN '\n'
		{
			rem_exit[nCurrentXunhuan]=nCurrentPosition;
			strcpy(JiLu[nCurrentPosition].m_op, "bool");
	    strcpy(JiLu[nCurrentPosition].m_arg1, $2.name);
	    strcpy(JiLu[nCurrentPosition].m_arg2, "0");
	    strcpy(JiLu[nCurrentPosition].m_arg3, "NULL");
	    nCurrentPosition++;
	    nextStat++;
		}
		;
w3:	w2 sentence
		{
		}
		;
w4:	w3 K_END
		{
			char t[10];
			sprintf(t, "(%d)", rem_bool[nCurrentXunhuan]);
			strcpy(JiLu[nCurrentPosition].m_op, "jmp");
	    strcpy(JiLu[nCurrentPosition].m_arg1, "0");
	    strcpy(JiLu[nCurrentPosition].m_arg2, "0");
	    strcpy(JiLu[nCurrentPosition].m_arg3, t);
	    nCurrentPosition++;
	    nextStat++;
	    sprintf(t, "(%d)", nCurrentPosition);
	    strcpy(JiLu[rem_exit[nCurrentXunhuan]].m_arg3, t);
	    nCurrentXunhuan--;
		}
		;
%%
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,\t%s,\t0,\t%s)\n",nextStat++,opr,arg1,tempVal.name);
	    strcpy(JiLu[nCurrentPosition].m_op, opr);
	    strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
	    strcpy(JiLu[nCurrentPosition].m_arg2, "0");
	    strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
	    nCurrentPosition++;
	    nextStat++;
	}
  else
  {
	    //fprintf(stdout,"%10d\t(%s,\t%s,\t%s,\t%s)\n",nextStat++,opr,arg1,arg2,tempVal.name);
	    strcpy(JiLu[nCurrentPosition].m_op, opr);
	    strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
	    strcpy(JiLu[nCurrentPosition].m_arg2, arg2);
	    strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
	    nCurrentPosition++;
	    nextStat++;
	}
}

void genjump(char *opr,int a,int b,char *arg)
{
  //fprintf(stdout,"%10d\t(%s,\t%d,\t%d,\t%s)\n",nextStat++,opr,a,b,arg);
  char t1[10];
  char t2[10];
  sprintf(t1, "%d", a);
  sprintf(t2, "%d", b);
  strcpy(JiLu[nCurrentPosition].m_op, opr);
	strcpy(JiLu[nCurrentPosition].m_arg1, t1);
	strcpy(JiLu[nCurrentPosition].m_arg2, t2);
	strcpy(JiLu[nCurrentPosition].m_arg3, arg);
	nCurrentPosition++;
	nextStat++;
}

void genrelation(char *opr,char *arg1,char *arg2,int next)
{
  char t[10];
  sprintf(tempVal.name,"temp%d",tempVarCount++);
  //fprintf(stdout,"%10d\t(%s,\t%s,\t%s,\t%d)\n",nextStat++,opr,arg1,arg2,next);
  
  sprintf(t, "(%d)", next);
  strcpy(JiLu[nCurrentPosition].m_op, opr);
	strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
	strcpy(JiLu[nCurrentPosition].m_arg2, arg2);
	strcpy(JiLu[nCurrentPosition].m_arg3, t);
	nCurrentPosition++;
	nextStat++;
}

⌨️ 快捷键说明

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