如何为用C编写的栈式解释型语言添加定义变量功能
实现方案
1. 新增变量存储相关定义
在核心逻辑循环外新增变量存储结构和状态变量:
// 自定义变量配置,可根据需求调整上限 #define MAX_VAR_COUNT 128 #define MAX_VAR_NAME_LEN 32 // 变量键值对结构体 struct CustomVar { char name[MAX_VAR_NAME_LEN]; float value; } var_table[MAX_VAR_COUNT]; int var_count = 0; // 已存储的变量总数 char curr_def_name[MAX_VAR_NAME_LEN] = {0}; // 定义状态下临时存储变量名
2. 修改核心判断逻辑
替换原来空的is_definition == 1分支,以及最后的默认分支:
if (strncmp(op, "+", 1) == 0 && is_definition == 0) { float a = pop(stack); float b = pop(stack); push(stack, a + b); } else if (strncmp(op, "-", 1) == 0 && is_definition == 0) { float a = pop(stack); float b = pop(stack); push(stack, b - a); } else if (strncmp(op, "*", 1) == 0 && is_definition == 0) { float a = pop(stack); float b = pop(stack); push(stack, a * b); } else if (strncmp(op, "/", 1) == 0 && is_definition == 0) { float a = pop(stack); float b = pop(stack); push(stack, b / a); } else if (strncmp(op, "print", 5) == 0 && is_definition == 0) { float a = pop(stack); if(a == (int)a) printf("%d\n", (int)a); else printf("%f\n", a); } else if (strncmp(op, "define", 6) == 0 && is_definition == 0) { is_definition = 1; memset(curr_def_name, 0, sizeof(curr_def_name)); } else if (is_definition == 1) { // 第一个参数为变量名 if (curr_def_name[0] == '\0') { strncpy(curr_def_name, op, MAX_VAR_NAME_LEN - 1); } // 第二个参数为变量值,存入变量表 else { float val = atof(op); int exists = 0; // 变量已存在则覆盖值 for (int i = 0; i < var_count; i++) { if (strcmp(var_table[i].name, curr_def_name) == 0) { var_table[i].value = val; exists = 1; break; } } // 变量不存在则新增 if (!exists && var_count < MAX_VAR_COUNT) { strncpy(var_table[var_count].name, curr_def_name, MAX_VAR_NAME_LEN - 1); var_table[var_count].value = val; var_count++; } } } else if (strncmp(op, "end", 3) == 0 && is_definition == 1) { is_definition = 0; } else { int found = 0; // 先查变量表,命中则压入变量值 for (int i = 0; i < var_count; i++) { if (strcmp(var_table[i].name, op) == 0) { push(stack, var_table[i].value); found = 1; break; } } // 未命中变量表则视为数字压栈 if (!found) { push(stack, atof(op)); } }
3. 效果说明
按你给出的语法define TEST 10 end定义后,执行TEST 5 + print会输出15,符合预期。
其他注意事项:
- 支持重复定义同名变量,新值会覆盖旧值
- 若不需要浮点数支持,可将
atof改为atoi,结构体中的float改为int - 可调整
MAX_VAR_COUNT和MAX_VAR_NAME_LEN适配你的实际需求
内容的提问来源于stack exchange,提问作者Emmie
相关产品推荐
相关产品推荐

