CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

提问:我该如何设计文法?

楼主hyllp(nice)2002-05-08 15:12:12 在 C/C++ / C语言 提问

如果使用递归下降分析方法,有如下运算符,按优先级由低到高排列  
  or  
  and  
  not  
  <   <=   >   >=   ==  
  +   -  
  *   /  
  -(负号)  
  ()  
  这个文法该如何设计?  
  书上常常只有很简单的+   *   ()几个运算符的文法,我不知道单目运算符的递归下降文法怎么加进来。  
  我看书看了很久,就是不懂如何把书上的东西应用进来,是在是太苯了,望哥哥姐姐弟弟妹妹们指点迷津,谢谢! 问题点数:100、回复次数:19Top

1 楼shot_big(smile)回复于 2002-05-08 15:33:43 得分 0

找个高年级的叫他把以前的代码给你就行了。  
   
  好久没有用到它了,看到它不过还是感到有点儿亲切感Top

2 楼hyllp(nice)回复于 2002-05-08 15:41:14 得分 0

就是找不到才找你的啊  
  帮忙看看,提个醒也行啊  
  先谢过了,分数可以再加Top

3 楼hyllp(nice)回复于 2002-05-08 15:44:17 得分 0

补充,非终结符再加上一个id,就是标识符  
  高手们快来帮忙,设计停了很多天了!Top

4 楼hyllp(nice)回复于 2002-05-08 17:10:37 得分 0

高手们呢?Top

5 楼heihy(nice)回复于 2002-05-09 09:33:19 得分 0

不是非终结符,是终结符,不好意思,打错了Top

6 楼hongbo_liu(bobo)回复于 2002-05-09 20:06:20 得分 0

gzTop

7 楼liushmh(想开书店:) )回复于 2002-05-09 20:35:12 得分 0

你可以给多少时间?Top

8 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-09 21:08:46 得分 0

不知道对不对,不对不要怪我,呵呵。  
  Z::=Y#  
  Y::=X{AX}  
  X::=W{BW}  
  W::=V{CV}  
  V::=U{DU}  
  U::=T{ET}  
  T::=S{FS}  
  S::=R{GR}  
  R::=HYI  
  A::='or'  
  B::='and'  
  C::='not'  
  D::='<'|'<='|'>'|'>='|'=='  
  E::='+'|'-'  
  F::='*'|'/'  
  G::='-(负号)'  
  H::='('  
  I::=')'Top

9 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-09 21:15:16 得分 0

抱歉得很,错了一个  
  R::=HYI  
  应该是  
  R::=HYI|i  
  i是变量名或数值常量。Top

10 楼hyllp(nice)回复于 2002-05-10 09:00:41 得分 0

s->   a   s1  
  s1->   or   a   s1   |   空  
  a->   b   a1  
  a1->   and   b   a1   |   空  
  b->   c   b1  
  b1->   <c   b1|   <=c   b1   |   >c   b1   |   >=c   b1   |   空  
  c->   d   c1  
  c1->   +d   c1   |   -d   c1   |   空  
  d->   e   d1  
  d1->   *e   d1   |   /e   d1   |   空  
  e->-f   |   f  
  f->(s)   |   id  
  请问这两种写法有什么不同吗?  
  都可以达到目的吧?Top

11 楼hyllp(nice)回复于 2002-05-10 09:12:16 得分 0

另外,我还要再加上处理系统函数的产生式,有一些cos/max/min/avg等函数,函数的参数不确定(max的是肯定不能确定的了),他们的优先级最高,参数用逗号隔开。该如何加呢?  
  谢谢!Top

12 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 12:20:58 得分 0

"::="和"->"含义是一样的,你的文法我没细看,你分析一下应该知道对不对,我很久没接触这东西了,如果你需要和我讨论,等我我再去温习一下,如果有能力回答你的问题再做回答。  
   
  一个疑问:你说函数的优先级最高?比运算符都高?好像不合常理,呵呵。  
   
  现在,根据你的要求,我在我的文法基础上作些修改,给出如下拙见:  
  Z::=Y#|J()#|J({Y,}Y)#  
  J::=cos|max|min|avg               //可以再加其他的。  
   
  说明:  
  对于表达式cos((a+b)*c),cos优先级最低,因此不知道是不是你所需要的。  
   
  如有问题,欢迎讨论。(我不保证我问法的正确性,但是思路是对的,希望谅解。)Top

13 楼hyllp(nice)回复于 2002-05-10 13:35:45 得分 0

我其实也不知道是该怎么确定函数的优先级,只是看着有一个解释器优先级是这么设置的,听你这么一说,好像也对。不过,是不是应该另外看这个问题,里面的操作符是因为括号的原因是优先级变高了?  
  如果cos(a)+   b   *   c,cos的优先级又如何呢?  
  Z::=Y|J()|J({Y,}Y)  
  允许没有参数,如果最少一个参数的话,可以不要中间的产生式吧?  
  Z::=Y|J(Y{,Y})  
  这样写也对,是不是?  
  编译学的太烂了,真不好意思。可以的话,帮我连起来写一个完整的看看。谢谢!  
  Top

14 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 14:23:40 得分 0

最少一个参数,Z::=Y|J(Y{,Y})是对的。  
   
  完整的:  
  Z::=Y#|J(Y{,Y})#  
  Y::=X{orX}  
  X::=W{andW}  
  W::=V|notV  
  V::=U{(<|<=|>|>=|==)U}           //括号是文法里的  
  U::=T{(+|-)T}                             //括号是文法里的  
  T::=S{(*|/)S}                             //括号是文法里的  
  S::=R|-R                                       //这里是负号  
  R::=(Y)                                         //括号是表达式里的  
   
  不能保证完全正确,如果你是学习,可以作为参考,如果你是应用,还要斟酌斟酌。Top

15 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 14:27:19 得分 0

抱歉,“复制&粘贴”上面的回复,最后一条又错了,改正:  
  Z::=Y#|J(Y{,Y})#  
  Y::=X{orX}  
  X::=W{andW}  
  W::=V|notV  
  V::=U{(<|<=|>|>=|==)U}           //括号是文法里的  
  U::=T{(+|-)T}                             //括号是文法里的  
  T::=S{(*|/)S}                             //括号是文法里的  
  S::=R|-R                                       //这里是负号  
  R::=(Y)|i                                     //括号是表达式里的Top

16 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 14:29:40 得分 0

抱歉,“复制&粘贴”上面的回复,最后一条又错了,改正:  
  Z::=Y#|J(Y{,Y})#  
  Y::=X{orX}  
  X::=W{andW}  
  W::=V|notV  
  V::=U{(<|<=|>|>=|==)U}           //括号是文法里的  
  U::=T{(+|-)T}                             //括号是文法里的  
  T::=S{(*|/)S}                             //括号是文法里的  
  S::=R|-R                                       //这里是负号  
  R::=(Y)|i                                     //括号是表达式里的Top

17 楼hyllp(nice)回复于 2002-05-10 15:37:08 得分 0

不好意思,你忘了把处理函数的产生式加进来了Top

18 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 15:52:27 得分 100

还请见谅。  
  Z::=Y#|J(Y{,Y})#  
  Y::=X{orX}  
  X::=W{andW}  
  W::=V|notV  
  V::=U{(<|<=|>|>=|==)U}           //括号是文法里的  
  U::=T{(+|-)T}                             //括号是文法里的  
  T::=S{(*|/)S}                             //括号是文法里的  
  S::=R|-R                                       //这里是负号  
  R::=(Y)|i                                     //括号是表达式里的  
  J::=cos|max|min|avgTop

19 楼hyllp(nice)回复于 2002-05-10 17:22:56 得分 0

怎么样,你变成两个角了吧  
  :)  
  虽然还是没达到我的目的,我总觉得函数的优先级应该最高,不知道你有没有看我上面的回复。  
  不过大致就这样,放分吧!Top

20 楼ydaye(不用记,不用记,根本不用记!)回复于 2002-05-10 22:19:54 得分 0

抱歉我总是改来改去,因为很久没接触了,蛮陌生的,考虑得你的意见,看看下面的改进吧:  
  Z::=Y#  
  Y::=X{orX}  
  X::=W{andW}  
  W::=V|notV  
  V::=U{(<|<=|>|>=|==)U}  
  U::=T{(+|-)T}  
  T::=S{(*|/)S}  
  S::=R|-R  
  R::=(Y)|J(Y{,Y})|i  
  J::=cos|max|min|avg  
  Top

21 楼hyllp(nice)回复于 2002-05-13 15:04:23 得分 0

谢谢,已经差不多了  
  如有问题我会再找你讨论  
  Top

相关问题

  • 如何证明一个文法不是二义文法?
  • 救急!有做过解释程序的朋友请看看,进行语义分析时,如何设计文法的非终结符的属性!
  • 救急!有做过解释程序的朋友请看看,进行语义分析时,如何设计文法的非终结符的属性!
  • 救急!有做过解释程序的朋友请看看,进行语义分析时,如何设计文法的非终结符的属性!
  • 如何判断一个文法是不是二义性的文法?
  • [编译原理问题]如何改造这份文法成为LL(1)文法?
  • 求救,帮忙设计一下表达式文法!
  • 新手提问:如何在vb中设计一个扁平的按钮。----在线等待~!~!!
  • 提问:vb.net开发winform时如何禁止某些代码在设计时执行
  • [提问]web控件开发:属性是一个类,在设计器中如何显示展开的子属性??

关键词

  • 括号
  • 函数
  • 文法
  • 优先级
  • 负号
  • andw
  • notvv
  • orx
  • 表达式
  • 运算符

得分解答快速导航

  • 帖主:hyllp
  • ydaye

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo