我为c ++编译,我到达代码生成级别(通过MIPS),我想生成组合
在YACC中,组成规则是:
variable:
object_access
|.....some rule not important here
;
object_access:
variable '.' name
|.....some rule not important here
;
当输入为:
class screw
{
int number;
screw();
}
class wheel
{
int type;
screw scw;// here composition
wheel();
}
class car
{
string model;
wheel whl;// here composition
}
void main()
{
car vec=new car();
cout<<vec.whl.scw.number;
}
当我访问object_access节点(生成代码)时,我可以得到(变量&amp;&amp; name)
我的问题是:
当我喜欢(vec.whl.scw.number)时,我不知道(vec.whl.scw.number)的长度,因为它会向左递归。我需要长度因为(我们知道如果我加载(vec,whl,scw),我会得到地址但是如果我加载(数字)我会得到一个整数值。
因此,如果我访问了object_access节点递归,我只需要通过vec的地址加载whl的地址并将其放入($ t1 ..例如),然后我按地址加载scw的地址whl并把它放进去($ t1 ..例如),但是(这里的数字不是对象我不能把它保存在($ t1)中)..
我的问题:如何知道object_access节点中的姓氏停止加载地址?我需要$ t1保存object_access节点中的最后一个地址,因为我需要它来进行另一个操作。
答案 0 :(得分:0)
您可以使用符号表来了解您的(对象访问)中每个名称的类型...您需要将所有名称保存为类型的地址(名称(那里的名称)...即...不是int或double ...)只有样本中的变量(数字)有(int或double或 任何类型除了类型名称) 所以你可以知道你是否从符号表
来到它的数字