c - 我将如何为我的语言添加定义?
问题描述
我用 C 编写了一种基于堆栈的解释语言。解释器可以逐行读取文件并根据操作执行该行。print(1 + 1)
在 python 中会变成1 1 + print
.
这是检查操作是什么并将其推送到堆栈或对其执行操作的函数:
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;
}
else if (is_definition == 1)
{
}
else if (strncmp(op, "end", 3) == 0 && is_definition == 1)
{
is_definition = 0;
}
else
{
push(stack, atoi(op));
}
这是在一个循环中迭代代码中每个空格分隔的操作。
我想添加一个有点像 C 中的定义系统。这是我想要的语法
define TEST 10 end
我想使用它有点像一个变量系统,你可以在其中使用TEST
.
解决方案
在伪代码中,您应该执行以下操作:
- 读取一行源码
- 如果是定义,则解析+存储并跳过其余部分
- (这不是定义)执行,就像您发布的代码一样
关于“解析+存储”定义,您需要 - 例如 - 几个数组或结构数组。您需要存储每个“名称”(别名或定义的名称)以及每个名称的值。
然后,在您发布的代码中,您应该实现 push() 指令(您只提到 pop())。push() 指令读取一个操作数并确定它是否是别名(定义):
(推伪代码)
- 获取操作数
- 确定它是否是一个定义。基本上,您迭代所有存储的定义以找到对应关系
- 得到最终值,入栈
有几件事可以说……其中几件事,以稀疏的顺序排列:
推入的操作数是一个数字?在这种情况下,您可以跳过定义检查,假设说“define 10 20”是非法的
你会允许(重新)定义运算符吗?
你会允许一个定义引用其他定义吗?
...
推荐阅读
- html - 动态生成的 SVG 不随容器调整大小
- nginx - 如果 www 已经在请求中,则排除重定向到 www 的条件 nginx 重写规则
- javascript - 在函数内抛出多个异常
- android - 启动画面加载程序动画没有动画
- http - nginx:我无法访问端口 80 上的默认虚拟主机。而是从错误的 server_name 获得响应
- python - 在文本分析中,分类器模型的*密度*是什么意思?
- php - LearnPress 4.x 版,如何移除钩子
- c - CS50 pset3 Check50 正在工作,但是当我测试我的代码时出现问题
- python - 将 django 从 3.0.4 升级到 3.2.6 导致测试时缺少 content_type 对象
- express - 使用nodejs express将gltf结果加载到404(未找到)的threejs