/*field_def : field_name : anonymous_type_def [ NUMBER ] ; */ static psrRetVal_t AR_STDCALL on_named_nesting_field_array(psrNode_t **nodes, size_t count, const wchar_t *name, void *ctx) { { psrRetVal_t ret = {AR_S_YES, NULL}; /*搜索g_type_list,有返回Type节点, 否则报告错误程序终止*/ ast_node_t *name = (ast_node_t*)nodes[0]; ast_node_t *type = (ast_node_t*)nodes[2]; ast_node_t *array_size = (ast_node_t*)nodes[4]; AR_ASSERT(name != NULL && type != NULL); AR_ASSERT(name->t == NAME_T && type->t == TYPE_T); insert_type(type->type); ast_node_t *field_node = new ast_node_t; field_node->t = FIELD_T; field_node->field = new Field_t; field_node->field->name = name->name; field_node->field->type = type->type; field_node->field->is_array = true; field_node->field->array_size = array_size->num; if(field_node->field->array_size == 0) { AR_error(AR_ERR_FATAL, L"invalid array size 'anonymous type' : %u\r\n", field_node->field->array_size); AR_abort(); } type->type = NULL; ret.node = (psrNode_t*)field_node; return ret; } }
void create_type_table(Ttable *table) { type t_char = create_type(0,-1,1,-1); insert_type(tabla,t_char); // // // // // // }
/*named_type_def : LEXEME anonymous_type_def ; */ static psrRetVal_t AR_STDCALL on_named_type_def(psrNode_t **nodes, size_t count, const wchar_t *name, void *ctx) { { psrRetVal_t ret = {AR_S_YES, NULL}; ast_node_t *type_name = (ast_node_t*)nodes[0]; ast_node_t *type_node = (ast_node_t*)nodes[1]; AR_ASSERT(type_name != NULL && type_name->t == NAME_T); AR_ASSERT(type_node != NULL && type_node->t == TYPE_T); type_node->type->name = type_name->name; type_node->type->is_anonymous_type = false; insert_type(type_node->type); return ret; } }
void insert() { pdevice prev,cur,p; if((p=creatnode())!=NULL) { printf("请输入设备编号\n"); scanf("%d",&(p->serialNum)); if(find(&prev,&cur,&(p->serialNum))==1) { printf("您输入的编号已存在!\n"); return; } getchar(); printf("请输入设备名称\n"); gets(p->name); printf("请输入设备所在实验室名称\n"); gets(p->position); printf("请输入使用者姓名\n"); gets(p->user); printf("请输入设备价格\n"); scanf("%lf",&(p->price)); getchar(); printf("请输入设备种类\n"); gets(p->Class); insert_type(p->Class); printf("请输入设备购买日期,如20090101\n"); gets(p->date); if(prev==NULL)//头插 { p->next=head; head=p; } else { prev->next=p; p->next=cur; } } }
/*field_def : field_name : anonymous_type_def ; */ static psrRetVal_t AR_STDCALL on_named_nesting_field(psrNode_t **nodes, size_t count, const wchar_t *name, void *ctx) { { psrRetVal_t ret = {AR_S_YES, NULL}; /*搜索g_type_list,有返回Type节点, 否则报告错误程序终止*/ ast_node_t *name = (ast_node_t*)nodes[0]; ast_node_t *type = (ast_node_t*)nodes[2]; AR_ASSERT(name != NULL && type != NULL); AR_ASSERT(name->t == NAME_T && type->t == TYPE_T); insert_type(type->type); ast_node_t *field_node = new ast_node_t; field_node->t = FIELD_T; field_node->field = new Field_t; field_node->field->name = name->name; field_node->field->type = type->type; field_node->field->is_array = false; field_node->field->array_size = 0; type->type = NULL; ret.node = (psrNode_t*)field_node; return ret; } }
void change() { pdevice p=NULL,q=NULL; int num; printf("请输入设备编号\n"); scanf("%d",&num); if(find(&p,&q,&num)==0) { printf("该编号不存在请重新输入"); return; } for(;;) { printf("请选择修改项目(编号不可修改)\n"); printf("修改设备名称输入1\n修改设备所在实验室输入2\n修改使用者姓名输入3\n修改设备价格输入4\n修改设备种类输入5\n修改设备购买日期输入6\n"); printf("不再进行修改输入7\n"); int a; scanf("%d",&a); getchar(); if(a!=7) printf("请输入修改后的信息:\n"); getchar(); switch(a) { case 1:gets(q->name);break; case 2:gets(q->position);break; case 3:gets(q->user);break; case 4:scanf("%lf",&(q->price));getchar();break; case 5:delete_type(q->Class);gets(q->Class);insert_type(q->Class);break;//设备种类 case 6:gets(q->date);break; } if(a==7) return; getchar(); } }