救急!有做过解释程序的朋友请看看,进行语义分析时,如何设计文法的非终结符的属性!
我现在设计产生式的语义子程序,实在有点力不从心,我打算用属性文法,可是不知道该如何下手设计非终结符的属性,可否指点一二:
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
告诉我如何设计非终结符的属性,万分感谢!
不要让我看书,我已经看的头都大了!毕业设计的时间已经不多了!恩人们快来啊!
问题点数:100、回复次数:7Top
1 楼hyllp(nice)回复于 2002-05-21 18:54:29 得分 0
上面是我的一部分产生式,给一些提示也行!Top
2 楼masterz(www.fruitfruit.com)回复于 2002-05-21 21:34:28 得分 30
http://www.codeguru.com/cpp_mfc/pascal.shtml
Mini Pascal CompilerTop
3 楼zorou_fatal(The world and system is even)回复于 2002-05-25 22:16:32 得分 69
在吕映芝的《编译原理》上有一段是:
属性文法的翻译
简单赋值的是:
如
s->id = E {p = lookup(id.name);
if p=nil then
emit(p = E.place)
else error}
在这里的
lookup(id.name)是在你的符号表里面查id的name是否存在。
emit(expression)是个用来在文件里面生成中间代码的函数。
expression 指表达式,如p=E.place.Top
4 楼zorou_fatal(The world and system is even)回复于 2002-05-25 22:18:01 得分 0
而像
E->E1+E2
{
E.place=newtemp;
emit(E.place=E1.place+E2.place)
}
也是类似的。
所有的二元表达式的运算都是类似的。Top
5 楼zorou_fatal(The world and system is even)回复于 2002-05-25 22:18:51 得分 0
对于或的情况,你可以分开来写,但是属性的设置或者用哪类的数据结构可以由你自己来定义。Top
6 楼ajoo(聪明的一猪)回复于 2002-05-26 01:16:29 得分 1
nowadays, people seldom do parser themselves. JavaCC. JLex. are easy to use.
But if your project is just focused on a parser, you probably cannot use a parser generator.
poor guy.Top
7 楼hyllp(nice)回复于 2002-05-27 08:47:15 得分 0
哦,不是这样的,我把贴子贴到这里不是我要做java的解释器,是想多让一些人看到而已。这只是project的一极小部分而已,但是是我现在的主要任务,当作练习编程。understand!Top




