提交 00e86379 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/Debug
/Release
<?xml version="1.0" encoding="gb2312"?>
<OSLProject Version="1.00" Name="SymbolTable" SubjectID="11c951f4-9b13-40e1-8b73-39ba7d73b89b" ProjectTemplateID="c6698357-2804-4f3c-b689-f27a66f41a95">
<Configurations>
<Configuration Name="Debug">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" AdditionalDependencies="&quot;$(CPLInstallDir)Dump\lib\SymbolTable_Demo.o&quot;"/>
<Tool Name="PostBuildEventTool"/>
<VisualContext>
<WatchPoints>
<WatchPoint FunctionName="CreateSymbolTable" ObserverID="7C882560-4CC1-4dc7-8DAA-E67D9D4B3B0D">
</WatchPoint>
</WatchPoints>
</VisualContext>
</Configuration>
<Configuration Name="Release">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\SymbolTable.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\main.c">
</File>
</Filter>
</Files>
</OSLProject>
#ifndef _SYMBOL_TABLE_H_
#define _SYMBOL_TABLE_H_
//
// 在此处包含 C 标准库头文件
//
#include <stdio.h>
//
// 在此处包含其他头文件
//
//
// 在此处定义数据结构
//
#define MAX_STR_LENGTH 64
#define BUCKET_SIZE 5 // 选择一个素数作为桶大小。
typedef struct _Symbol{
char SymbolName[MAX_STR_LENGTH]; // 符号名称
char SymbolType[MAX_STR_LENGTH]; // 符号类型
int ClashCount; // 冲突次数
int RefCount; // 引用次数
struct _Symbol* pNext; // 指向下一个 Symbol
}Symbol;
typedef struct _SymbolTable{
Symbol* Bucket[BUCKET_SIZE]; // 杂凑表(桶)
int Invalid; // 作用域是否无效的标志。1 表示无效,0 表示有效
struct _SymbolTable* pNext; // 指向下一个 SymbolTable
}SymboTable;
//
// 在此处声明函数
//
Symbol* NewSymbol();
SymboTable* NewSymbolTable();
void PushScope();
void PopScope();
void RefSymbol(const char* pSymbolName);
void AddSymbol(const char* pSymbolName, const char* pSymbolType);
int Hush(const char* pSymbolName);
void CreateSymbolTable();
//
// 在此声明全局变量
//
extern SymboTable* pHead;
extern int RefErrorCount;
#endif // _SYMBOL_TABLE_H_
添加文件
#include "SymbolTable.h"
SymboTable* pHead = NULL; // 符号表链表的头指针
int RefErrorCount = 0; // 符号引用失败计数器
int main()
{
//
// 构造符号表
//
CreateSymbolTable();
return 0;
}
/*
功能:
创建一个新的符号。
返回值:
符号的指针。
*/
Symbol* NewSymbol()
{
Symbol* pNewSymbol = (Symbol*)malloc(sizeof(Symbol));
memset(pNewSymbol, 0, sizeof(Symbol));
return pNewSymbol;
}
/*
功能:
创建一个新的符号表。
返回值:
符号表的指针。
*/
SymboTable* NewSymbolTable()
{
SymboTable* pNewTable = (SymboTable*)malloc(sizeof(SymboTable));
memset(pNewTable, 0, sizeof(SymboTable));
return pNewTable;
}
/*
功能:
在符号表链表的表头添加一个作用域。
*/
void PushScope()
{
//
// TODO: 在此添加代码
//
}
/*
功能:
将符号表链表中最内层的作用域设置成无效。
*/
void PopScope()
{
//
// TODO: 在此添加代码
//
}
/*
功能:
对 Symbol 进行一次引用。
参数:
pSymbolName -- 符号名称字符串指针。。
*/
void RefSymbol(const char* pSymbolName)
{
//
// TODO: 在此添加代码
//
}
/*
功能:
向符号表中添加一个 Symbol。
参数:
pSymbolName -- 符号名称字符串指针。
pSymbolType -- 符号类型字符串指针。
*/
void AddSymbol(const char* pSymbolName, const char* pSymbolType)
{
//
// TODO: 在此添加代码
//
}
/*
功能:
求 Symbol 的哈希值。
参数:
pSymbolName -- 符号名称字符串指针。
*/
int Hush(const char* pSymbolName)
{
int HashValue = 0, i;
for(i = 0; pSymbolName[i] != '\0'; i++)
{
HashValue = ((HashValue << 4) + pSymbolName[i]) % BUCKET_SIZE;
}
return HashValue;
}
/*
功能:
创建符号表。
*/
void CreateSymbolTable()
{
PushScope();
AddSymbol("i", "int");
AddSymbol("j", "int");
AddSymbol("f", "funciton");
{
PushScope();
AddSymbol("i", "char");
AddSymbol("size", "int");
AddSymbol("temp", "char");
{
PushScope();
AddSymbol("j", "char*");
AddSymbol("j", "long");
RefSymbol("j");
RefSymbol("i");
RefSymbol("f");
RefSymbol("size");
RefSymbol("new");
PopScope();
}
RefSymbol("j");
PopScope();
}
PopScope();
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论