我用C编写了一个基于堆栈的解释语言。解释器可以逐行读取文件,并根据操作执行该行print(1+1)将变成11+print
以下是检查操作内容并将其推送到堆栈或对其执行操作的函数:
if(strncmp(op,“+”,1)==0&;is_定义==0)
{
浮动a=弹出(堆栈);
浮动b=弹出(堆栈);
推动(堆栈,a+b);
}
else if(strncmp(op,“-”1)==0”和“is”定义==0)
{
浮动a=弹出(堆栈);
浮动b=弹出(堆栈);
推(堆栈,b-a);
}
else if(strncmp(op,“*”,1)==0,is_定义==0)
{
浮动a=弹出(堆栈);
浮动b=弹出(堆栈);
推(堆栈,a*b);
}
else if(strncmp(op,“/”1)==0,is_定义==0)
{
浮动a=弹出(堆栈);
浮动b=弹出(堆栈);
推送(堆栈,b/a);
}
else if(strncmp(op,“print”,5)==0;is_定义==0)
{
浮动a=弹出(堆栈);
如果(a==(int)a)
printf(";%d\n";,(int)a);
其他的
printf(“f\n”,a);
}
else if(strncmp(op,“define”,6)==0“is”定义==0)
{
is_定义=1;
}
else if(is_definition==1)
{
}
else if(strncmp(op,“end”,3)==0”和“is”定义==1)
{
is_定义=0;
}
其他的
{
推(堆栈,原子(op));
}
这是在一个循环内,循环遍历代码中每个空格分隔的操作
我想添加一个有点像C中的定义系统。
这是我想要的语法
定义测试10结束
我想使用这个有点像一个变量系统,在这个系统中可以使用TEST
在伪代码中,应执行以下操作:
- 读一行源代码
- 如果它是一个定义,则解析+存储它并跳过其余部分
- (这不是一个定义)执行,就像你发布的代码一样
关于「;解析+存储“;定义,您需要-例如-一对数组,或一个结构数组。您需要存储每个";名称“;(别名或定义的名称)以及每个名称的值
然后,在您发布的代码中,应该实现push()指令(您只提到pop()。push()指令读取操作数并确定它是否为别名(定义):
(推送伪代码)
- 获取操作数
- 确定它是否是一个定义。基本上,您迭代所有存储的定义以找到对应关系
- 得到最终值后,将其放在堆栈上
有几件事可以说。。。其中的两个,以稀疏的顺序排列:
-
推式操作数是一个数字?在这种情况下,您可以跳过定义检查,假设说“是”是非法的;定义10 20“
-
您是否允许(重新)定义运算符
-
您是否允许定义引用其他定义