| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 408 人关注过本帖
标题:[求助]一道题目的求解
只看楼主 加入收藏
xiaoming1984
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-1-4
收藏
 问题点数:0 回复次数:0 
[求助]一道题目的求解

有一道编译原理试题是关于语法制导与翻译的,我不太懂怎么做考试时候没有做出来.请指点一下,谢谢! (编译原理太难学了,我只会做常规题目,惭愧啊……)
题目如下:
已知一个有向图的描述语言G[S]及其语法制导定义:
产生式 语义规则
S---->S′N N.owner:=S.graph; S′.graph:= S.graph
S---->N N.owner:= S.graph
S---->S′E E.owner:= S.graph; S′.graph:= S.graph
S---->E E.owner:= S.graph
N---->digit AddNode(N.owne,digit.val)
E---->(digit1,digit2) AddEdge(E.owner,digit1.val,digit2.val)

其中,属性S.graph表示与S对应的一个有向图;属性N.owner表示结点N所属的有向图;属性E.owner表示边E所属的有向图;digit.val表示终结符digit的数值;函数AddNode(g,n)表示n为图g的一个结点;函数AddEdge(g,s,t)表示(s,t)为图g的一条边.
例如:1(1,2)(1,3)2(2,3)(3,1)3表示一个有向图.


↙ ↘↖
② → ③


试为文法G[S]写出翻译规程,使得:
(1)在翻译结束的时候,语义栈顶的S.graph属性表示一个翻译出的有向图;
(2)在翻译过程中,如果输入语言中包含重复的结点或边,能够提醒用户并忽略重复的结点或边;
(3)在翻译结束的时候,能够检测有向图中是否存在无效的边并删除,例如1(1,2)中包含一条无效的边(1,2)

附:翻译规程中能够使用的库函数:
(1)GRAPH*CreateGraph();创建一个有向图,并返回该有向图的指针;

(2)void CreateNode(GRAPH*pGraph,int nNode);在图pGraph中创建一个编号为nNode的结点;

(3)bool IsNodeExist(GRAPH*pGraph,int nNode);判断编号为nNode的结点是否存在于图pGraph中;

(4)int GetNodeCount(GRAPH*pGraph);得到图pGraph中的结点数;

搜索更多相关主题的帖子: 求解 
2007-01-04 10:52
快速回复:[求助]一道题目的求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022640 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved