📄 symbol_table.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 + -