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

📄 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;

struct CShengming
{
	char m_name[30];
	char m_token[30];		//Array or Value
	char m_type[30];		//int, float, char
	int m_weishu;
	int m_xiangqing;
};

struct CShengming JiLu[100];

struct CArrayInfo
{
	char m_name[30];
	int m_lenth;
};

struct CArrayInfo Array[100];

char CurrentType[30];
char CurrentValName[30];
int nCurrentWeishu;
int nTotalJiLu=0;
int nTotalArray=0;

%}
%union{                     /*单词值*/
   char chr;
   char *str;
   int integer;
   float real;
   double dbl;
   char name[30];
   struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID K_INT K_FLOAT K_BEGIN K_CHAR
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%left '[' ']'
%%
sentence: expr ';'
					{
						//printf("sentence\n");
					}
					| sentence expr ';'
					{
					}
					| sentence '\n'
					{
					}
					;
expr:   K_INT ID
		{
		  strcpy(CurrentType, "int");
		  strcpy(CurrentValName, lexeme);
		  nCurrentWeishu=0;
		  strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
		  strcpy(JiLu[nTotalJiLu].m_token, "Value");		  
		  strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
		  JiLu[nTotalJiLu].m_weishu=0;
		  JiLu[nTotalJiLu].m_xiangqing=-1;
		  nTotalJiLu++;
		  
		}
		| K_FLOAT ID
		{
			strcpy(CurrentType, "float");
		  strcpy(CurrentValName, lexeme);
		  nCurrentWeishu=0;
		  strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
		  strcpy(JiLu[nTotalJiLu].m_token, "Value");		  
		  strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
		  JiLu[nTotalJiLu].m_weishu=0;
		  JiLu[nTotalJiLu].m_xiangqing=-1;
		  nTotalJiLu++;
		}
		| K_CHAR ID
		{
			strcpy(CurrentType, "char");
		  strcpy(CurrentValName, lexeme);
		  nCurrentWeishu=0;
		  strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
		  strcpy(JiLu[nTotalJiLu].m_token, "Value");		  
		  strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
		  JiLu[nTotalJiLu].m_weishu=0;
		  JiLu[nTotalJiLu].m_xiangqing=-1;
		  nTotalJiLu++;
		}
		| expr '[' INUMBER ']'
		{
			strcpy(JiLu[nTotalJiLu-1].m_token, "Array");
			JiLu[nTotalJiLu-1].m_weishu++;
			if(JiLu[nTotalJiLu-1].m_xiangqing==-1){
				JiLu[nTotalJiLu-1].m_xiangqing=nTotalArray;
			}
			nCurrentWeishu++;
			strcpy(Array[nTotalArray].m_name, CurrentValName);
			Array[nTotalArray].m_lenth=atoi(lexeme);
			nTotalArray++;
		  	
		}
		| expr ',' ID
		{
			
		  strcpy(CurrentValName, lexeme);
		  nCurrentWeishu=0;
		  strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
		  strcpy(JiLu[nTotalJiLu].m_token, "Value");		  
		  strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
		  JiLu[nTotalJiLu].m_weishu=0;
		  JiLu[nTotalJiLu].m_xiangqing=-1;
		  nTotalJiLu++;
		}
		;

%%
int yyerror(char *s)
{
  fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
  return 0;
}

⌨️ 快捷键说明

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