/***************************************
* AI应用环境--AIENV *
* 作者: 马少平 *
* 单位: 智能技术与系统国家重点实验室 *
* 语言: MS C 5.0 *
* 完成: 1996.6.10 *
***************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
#include <stdarg.h>
#include <ctype.h>
#include "aienv.h"
NODE *symbol_list=NULL;
/********************************************
*每个symbol均在symbol_list表中,格式如下: *
* (符号1 符号2 ...) *
********************************************/
int node_num_in_buff=NODE_BUFF_LEN/sizeof(NODE); /* 一个单元缓存区可提供的单元个数 */
NODE *node_buff[NODE_BUFF_NUM]; /* 用数组表示所有单元缓存区 */
NODE *free_node_list=NULL; /* 自由单元表 */
char string_buff[STRING_BUFF_LEN]; /* 原子存储空间, 以字符串形式记录原子名 */
char *string_buff_end=string_buff+STRING_BUFF_LEN; /* 原子存储空间的底指针 */
char *string_buff_ptr=string_buff; /* 生成一个新原子时,其名从该地址开始存放 */
char current_mark='1'; /* 收集无用单元时使用的标记 */
NODE **var_list[VAR_LIST_LEN]; /* 为收集无用单元而设的变量表,
于该表中变量有关的单元不能收集 */
int var_list_end=0; /* 变量表的最大下标 */
char read_buff[READ_BUFF_LENGTH]={0}; /* 键盘输入(或从字符串读入),缓冲区 */
int read_begin=0; /* 配合read_buff使用,每次从read_begin开始读起 */
char term[TERM_LENGTH]; /* 键盘输入(或从字符串读入)时,
下一个分隔符之前的内容放入term中 */
char str_tmp[STR_TMP_LENGTH];
int seos;
/********************************************
*从串中读S表达式时, 若读到串尾, 则seos=1, *
*否则seos=0 *
********************************************/
int varp (NODE *obj)
/****************************************
* 功能: 当obj为变量时为真 *
****************************************/
{
if (obj == NULL) return 0;
else if (obj->type == 'v') return 1;
else return 0;
}
void errors (char *format, ...)
/********************************************
*功能: 输出出错信息, 结束程序运行. *
*参数: 同printf. *
*返回值: 无 *
********************************************/
{
va_list argptr;
va_start(argptr, format);
printf("\n错误!\n ");
vprintf(format, argptr);
printf("\n");
exit(0);
}
void warning (char *format, ...)
/********************************************
*功能: 输出警告信息, 但不结束程序运行. *
*参数: 同printf. *
*返回值: 无 *
********************************************/
{
va_list argptr;
va_start(argptr, format);
printf("\n警告!\n ");
vprintf(format, argptr);
printf("\n");
}
void var_list_safe (int var_list_end)
/********************************************
*功能: 检查堆栈var_list是否溢出 *
*参数: *
* var_list_end: 栈顶 *
*返回值: 无 *
********************************************/
{
if (var_list_end >= VAR_LIST_LEN) errors("var list end error");
}
int atom (NODE *object)
/********************************************
*功能: 当object为原子时为真. *
*参数: *
* object: 原子或表 *
*返回值: 1/0 *
********************************************/
{
if (object == NULL) return 1;
if (object->type == 'l') return 0;
else return 1;
}
void init_node_buff (void)
/********************************************
*功能: 初始化自由单元 *
*参数: 无 *
*返回值: 无 *
********************************************/
{
int i, j;
static int first_p=1;
NODE *ptr, *ptr1;
if (first_p)
{
for (i=0; i<NODE_BUFF_NUM; i++)
{
node_buff[i]=(NODE *)malloc(NODE_BUFF_LEN);
if (! node_buff[i]) errors("内存不够");
}
first_p=0;
}
ptr=NULL;
for (i=0; i<NODE_BUFF_NUM; i++)
{
ptr1=node_buff[i];
for (j=0; j<node_num_in_buff; j++)
{
if (ptr == NULL)
{
ptr=ptr1;
ptr->mark='0';
}
else
{
ptr->head.node_ptr=ptr1;
ptr=ptr1;
ptr->mark='0';
}
ptr1++;
}
}
ptr->head.node_ptr=NULL;
free_node_list=node_buff[0];
}
char *string_malloc (int len)
/**********************************************
*功能: 为存储原子名,申请一个长度为len的空间 *
*参数: len: 申请长度 *
*返回值: 申请到的空间地址 *
**********************************************/
{
char *ptr;
ptr=string_buff_ptr;
string_buff_ptr+=len;
if (string_buff_ptr >= string_buff_end)
errors("原子空间已满");
else return ptr;
}
void add_mark1 (NODE *obj, char old_mark, char new_mark)
/******************************************************
*功能: obj中所有标记为old_mark的单元加上new_mark标记 *
*参数: *
* obj: 原子或表 *
* old_mark: 旧标记, 1/2 *
* new_mark: 新标记, 1/2 *
*返回值: 无 *
******************************************************/
{
if (obj == NULL) return;
if (obj->mark == new_mark) return;
if (obj->mark != old_mark) errors("mark = %d ****", (int)obj->mark);
if (atom(obj))
{
obj->mark=new_mark;
return;
}
else
{
while (obj)
{
obj->mark=new_mark;
add_mark1(car(obj), old_mark, new_mark);
obj=cdr(obj);
if (atom(obj))
{
add_mark1(obj, old_mark, new_mark);
break;
}
}
}
}
void add_mark (char old_mark, char new_mark)
/******************************************************
*功能: 与变量表中变量有关且标记为old_mark的单元加上 *
* new_mark标记 *
*参数: *
* old_mark: 旧标记, 1/2 *
* new_mark: 新标记, 1/2 *
*返回值: 无 *
******************************************************/
{
int i;
char type;
NODE *ptr;
printf("\n无用单元收集...\n");
ptr=symbol_list;
add_mark1(ptr, old_mark, new_mark);
while (ptr)
{
type=car(ptr)->type;
if (type == 'c' || type == 'v')
add_mark1(car(ptr)->tail.t, old_mark, new_mark);
ptr=cdr(ptr);
}
for (i=0; i<var_list_end; i++)
{
ptr=*(var_list[i]);
if (ptr == (NODE *)-1) continue;
add_mark1(ptr, old_mark, new_mark);
}
}
int free_node (char free_mark)
/***********************************
*功能: 收集标志为free_mark的单元 *
*参数: free_mark: 回收标记, 1/2 *
*返回值: 1/0: 收集成功/不成功 *
***********************************/
{
NODE *ptr;
int i, j, n=0;
for (i=0; i<NODE_BUFF_NUM; i++)
{
ptr=node_buff[i];
for (j=0; j<node_num_in_buff; j++)
{
if (ptr->mark == free_mark)
{
n++;
ptr->mark='0';
ptr->head.node_ptr=free_node_list;
free_node_list=ptr;
}
ptr++;
}
}
printf("共收集了%d个单元\n", n);
if (n) return 1;
else return 0;
}
NODE *new_node (void)
/********************************************
*功能: 动态申请一个单元,并进行无用单元收集 *
*参数: 无 *
*返回值: 单元指针 *
********
《人工智能实验》清华课件.7z
版权申诉
95 浏览量
2022-07-14
09:51:08
上传
评论
收藏 13KB 7Z 举报
qq_38220914
- 粉丝: 604
- 资源: 4312
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈