You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:24:02