Vincent Chan 的巴士站 🚉

编译原理学习笔记 2:赋值操作

上文中,提到如果解析一个数学表达式,并把它变成一棵树,我们把这个程序称为解释器,这次我要为这个解释器加一个功能:赋值操作

let a = 3 * 4

这里我们要区分左值(left-value)和右值(right-value) 右值是临时结果,而左值是一个变量。至于右面是一个表达式,表达式如何解析在上一篇文章已经详细说了,所以这里就不多说。

parseLet

解析(parsing)后,得到的是这样一棵树,那么我们要如何实现赋值(Assign)操作呢?

在这里我们使用Environment实现,我们只需要一个map哈希表就可以了

把3 + 4计算的结果放到a里面就行了,eval函数里面可以这样写:

		else if (root->asAssignment())
		{
			auto _node = root->asAssignment();
			env.setValue(_node->Identifier(), _node->Expression());
			return 0;
		
 

这里的env里面其实是一个Map而已。

在这里附上这个程序的源码:https://github.com/vincentdchan/CalculatorParser