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

📄 symbol_table.c

📁 一个C语言的词法分析器
💻 C
字号:
/*++
	module name: symbol_table.c
	functions and vars to manage kinds of tables
--*/
#include <string.h>
#include "symbol_table.h"
/***********************************************************/
/* 整型常量表   */
int    cst_num_table   [MAX_NUM];
/* 实型常量表   */
double cst_real_table  [MAX_NUM];
/* 字符常量表   */
char   cst_char_table  [MAX_NUM];
/* 字符串常量表 */
char   cst_str_table   [MAX_NUM][MAX_STR_LENGTH];
/* 标识符表     */
char   identifier_table[MAX_NUM][MAX_LENGTH];
/**************************************************************************/
/*  reserved words table  */
TABLE_NODE	reserve_table[RESERVE_TABLE_LEN] ={
	{ TYPE_INT   ,   "int"     },
	{ TYPE_CHAR  ,   "char"    },
	{ TYPE_DOUBLE,	 "double"  },
	{ TYPE_STRUCT,   "struct"  },

	{ TYPE_VOID  ,	 "void"    },

	{ TYPE_IF    ,	 "if"      },
	{ TYPE_ELSE  ,	 "else"    },
	{ TYPE_SWITCH,   "switch"  },
	{ TYPE_CASE  ,   "case"    },
	{ TYPE_DEFAULT,  "default" },

	{ TYPE_WHILE ,   "while"   },
	{ TYPE_DO    ,   "do"      },
	{ TYPE_FOR   ,   "for"     },

	{ TYPE_BREAK ,   "break"   },
	{ TYPE_CONTINUE, "continue"},
	{ TYPE_RETURN  , "return"  }
};  /*  reserve_table  */	
/******************************************************************************/
/*  specified characters table  */
TABLE_NODE  specifier_table[SPECIFIER_TABLE_LEN] ={
	/* 算术运算符 */
	{ TYPE_PLUS,       "+"  }, 
	{ TYPE_MINUS,      "-"  },
	{ TYPE_MULTI,	   "*"  },
	{ TYPE_DIV,		   "/"  },

	{ TYPE_PLUS_ASIGN, "+=" },
	{ TYPE_MINUS_ASIGN,"-=" },
	{ TYPE_MULTI_ASIGN,"*=" },
	{ TYPE_DIV_ASIGN,  "/=" },
	{ TYPE_ASIGN,	   "="  },
	/* 关系运算符 */
	{ TYPE_L,          "<"  },
	{ TYPE_LE,         "<=" },
	{ TYPE_G,          ">"  },
	{ TYPE_GE,         ">=" },
	{ TYPE_EQUAL,      "==" },
	{ TYPE_NE,		   "!=" },		
	{ TYPE_NOT,        "!"  },
	{ TYPE_AND,        "&&" },
	{ TYPE_OR,	       "||" },
	/* 位运算符 */
	{ TYPE_BIT_NOT,    "~"  },
	{ TYPE_BIT_AND,    "&"  },
	{ TYPE_BIT_OR,	   "|"  },

	{ TYPE_SELF_PLUS,  "++" },
	{ TYPE_SELF_MINUS, "--" },
	{ TYPE_COLON,      ":"  }, 
	{ TYPE_ASK,		   "?"  },
	{ TYPE_DOT,        "."  },
	/* 界符 */
	{ TYPE_FEN,		   ";"  },
	{ TYPE_COMMA,	   ","  },
	{ TYPE_KUO1_L,	   "("  },
	{ TYPE_KUO1_R,	   ")"  },
    { TYPE_KUO2_L,	   "["  },
	{ TYPE_KUO2_R,	   "]"  },
	{ TYPE_KUO3_L,	   "{"  },
	{ TYPE_KUO3_R,     "}"  }

}; /*  specifier_table  */
/*******************************************************************/
/* const tables' length */
int   cst_num_length   =0;
int   cst_real_length  =0;
int   cst_char_length  =0;
int   cst_str_length   =0;

int   identifier_length=0;
/********************************************************************/
/*                 query functions                                  */
/* query certain  int_num in const num table						*/
/* return the int  num's address if found, return NULL if not found */
void *query_cst_num   (int    cst_num   )
{
	int   i;
	void *p = NULL;
	for(i=0; i< cst_num_length; i++ )
		if( cst_num == cst_num_table[i] )
		{
			p = cst_num_table + i;
			break;
		}
	return p;
}
/* query certain  real_num in const num table						*/
/* return the real_num's address if found, return NULL if not found */
void *query_cst_real  (double cst_real  )
{
	int   i;
	void *p = NULL;
	for(i=0; i< cst_real_length; i++ )
		if( cst_real == cst_real_table[i] )
		{
			p = cst_real_table + i;
			break;
		}
	return p;
}
/* query certain char in const char table						*/
/* return the char's address if found, return NULL if not found */
void *query_cst_char  (char   cst_char  )
{
	int   i;
	void *p = NULL;
	for(i=0; i< cst_char_length; i++ )
		if( cst_char == cst_char_table[i] )
		{
			p = cst_char_table + i;
			break;
		}
	return p;
}
/* query certain string in const string table						  */
/* return the string's address if found, return NULL if not found */
void *query_cst_str   (char  *cst_str   )
{
	int   i;
	void *p = NULL;
	for(i=0; i< cst_str_length; i++ )
		if( strcmp(cst_str, cst_str_table[i] ) == 0 )
		{
			p = cst_str_table + i;
			break;
		}
	return p;
}
/* query certain string in identifier table						  */
/* return the string's address if found, return NULL if not found */
void *query_identifier(char *identifier )
{
	int   i;
	void *p = NULL;
	for(i=0; i< identifier_length; i++ )
		if( strcmp(identifier, identifier_table[i] ) == 0 )
		{
			p = identifier_table + i;
			break;
		}
	return p;
}
/* 查询字串是否在保留字表中 若在 返回其属性:类型和地址 */
/* 若不存在 返回值类型为TYPE_UNDEF 地址为NULL          */
ENTRY  query_reserve_table  (char *str )
{
	int i;
	ENTRY entry = { TYPE_UNDEF, NULL };
	for(i=0; i< RESERVE_TABLE_LEN; i++ )
	{
		if( strcmp(reserve_table[i].str, str) == 0 )
		{
			entry.p_item = reserve_table[i].str;
			entry.type   = reserve_table[i].type;
			break;
		}
	}
	return entry;
}
/* 查询字串是否在界符表中 若在 返回其属性:类型和地址 */
/* 若不存在 返回值类型为TYPE_UNDEF 地址为NULL        */
ENTRY  query_specifier_table(char *str )
{
	int   i;
	ENTRY entry = { TYPE_UNDEF, NULL };
	for(i=0; i< SPECIFIER_TABLE_LEN; i++ )
	{
		if( strcmp(specifier_table[i].str, str) == 0 )
		{
			entry.p_item = specifier_table[i].str ;
			entry.type   = specifier_table[i].type;
			break;
		}
	}
	return entry;
}
/************************************************************************/
/*                     add_ functions                                   */
/* 向整型常量表中添加整型数值,如果该常量已存在于表中仅返回其地址        */
/* return the added item's address if successed, return NULL if not		*/
void *add_cst_num   (int    cst_num   )
{
	void *p = query_cst_num(cst_num );
	if( p == NULL )
	{
		cst_num_table[cst_num_length++] = cst_num;
		return cst_num_table + cst_num_length -1;
	}
	else
		return p;
}
/* 向实型常量表中添加实型数值 ,如果该常量已存在于表中仅返回其地址       */
/* return the added item's address if successed, return NULL if not		*/
void *add_cst_real  (double cst_real  )
{
	void *p = query_cst_real(cst_real );
	if( p == NULL )
	{
		cst_real_table[cst_real_length++] = cst_real;
		return cst_real_table + cst_real_length -1;
	}
	else 
		return p;
}
/* 向字符常量表中添加字符,如果该字符已存在于表中仅返回其地址            */
/* return the added item's address if successed, return NULL if not		*/ 
void *add_cst_char  (char   cst_char  )
{
	void *p = query_cst_char(cst_char );
	if( p == NULL )
	{
		cst_char_table[cst_char_length++] = cst_char;
		return cst_char_table + cst_char_length -1;
	}
	else
		return p;
}
/*  向字符串常量表中添加字串,如果该字串已存在于表中仅返回其地址         */
/* return the added item's address if successed, return NULL if not		 */  
void *add_cst_str   (char  *cst_str   )
{
	void *p = query_cst_str(cst_str );
	if( cst_str == NULL )
		return NULL;
	if( p == NULL )
	{
		strcpy(cst_str_table[cst_str_length++], cst_str );
		return cst_str_table + cst_str_length -1;
	}
	else
		return p;
}
void *add_identifier(char  *identifier )
/* 向标识符表中添加标识符 ,如果该字串已存在于表中仅返回其地址           */
/* return the added item's address if successed, return NULL if not		 */ 
{
	void *p = query_identifier(identifier );
	if( identifier == NULL )
		return NULL;
	if( p == NULL )
	{
		strcpy(identifier_table[identifier_length++], identifier );
		return identifier_table + identifier_length -1;
	}
	else 
		return p;
}
/*************************end of file**************************************/ 

⌨️ 快捷键说明

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