我将如何为我的语言添加定义?

我用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

在伪代码中,应执行以下操作:

  1. 读一行源代码
  2. 如果它是一个定义,则解析+存储它并跳过其余部分
  3. (这不是一个定义)执行,就像你发布的代码一样

关于「;解析+存储“;定义,您需要-例如-一对数组,或一个结构数组。您需要存储每个"名称“;(别名或定义的名称)以及每个名称的值

然后,在您发布的代码中,应该实现push()指令(您只提到pop()。push()指令读取操作数并确定它是否为别名(定义):

(推送伪代码)

  1. 获取操作数
  2. 确定它是否是一个定义。基本上,您迭代所有存储的定义以找到对应关系
  3. 得到最终值后,将其放在堆栈上

有几件事可以说。。。其中的两个,以稀疏的顺序排列:

  • 推式操作数是一个数字?在这种情况下,您可以跳过定义检查,假设说“是”是非法的;定义10 20“

  • 您是否允许(重新)定义运算符

  • 您是否允许定义引用其他定义

发表评论