提问:我该如何设计文法?
如果使用递归下降分析方法,有如下运算符,按优先级由低到高排列
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控件开发:属性是一个类,在设计器中如何显示展开的子属性??




