永发信息网

编译原理:令文法G为DL->DL;D;|D D->Tid T->int|real 写一个翻译模式,打印每个id的数据类型。

答案:1  悬赏:80  手机版
解决时间 2021-11-24 20:53
  • 提问者网友:战魂
  • 2021-11-24 10:45
编译原理:令文法G为DL->DL;D;|D D->Tid T->int|real 写一个翻译模式,打印每个id的数据类型。
最佳答案
  • 五星知识达人网友:woshuo
  • 2021-11-24 12:08
我来帮你解答,这是一个综合属性,其翻译方案比较简单,这样打印出来的 类似于int id1 int id2 int id3这样的形式。
DL->DL;D;
DL->D
D->T {print T.type} id {print id}
T->int {T.type =int}
T->real {T.type = real}追问用综合属性翻译。而且是打印id的类型,你上面的两个也没写、。追答不需要了,这样就可以完成你的要求了。你的语法属性传递只要一层就够了。打印的就是ID的类型啊。前一个print打类型,第2个print打ID名称。
你可以试一下,例如,int id1; real id2; int id3,构造一个语法树,把花括号里的内容当一个节点,遍历一遍,看看输出的是不是就是你要的。追问这样对吗?
DL->DL1;D; {addtype(DL1.type,D.type)}
DL->D {DL.type:=D.type}
D->Tid {D.type:=T.type}
T->int {T.type: =int}
T->real {T.type: = real}
print(id);追答不对。首先题目有没有要求你将id的属性加入符号表,如果有,才会有addtype,其次addtype不可能将非终结符的属性存入属性表,这样做没有意义。另外,你print (id)放在外面,没有放在花括号里,不符合翻译方案的要求。我给你的是正确的,你要仔细去理解一下翻译方案的含义。追问前两个产生式,不要写什么属性的传递吗?追答你需要用到DL和D传递属性吗?如果没有,就不用了。如果你想打印“;”可以在
DL->DL1;{print ';‘}D;{print ';'}这样,不过纯属美观。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯