代码分析(100分)

H

hongsen

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家帮我编写一个能够找出单元文件中的类,类中的数据成员列表,过程成员列表
大致数据结构如下://对一个DELPHI单元文件进行扫描,实际上只要分析从‘TYPE’到‘VAR(全局变量)’
之间的源代码。

myclasslist=class //为包含myclass的列表
end;

myclass=class()
name:string;
superclass:string;
datamemberlist;//一种列表
procedurelist;
end;

datamember=class
name:string;
type:string;
visibility:string
取值如下:'private' , 'protected' , 'public' 'published'
end;

proceduremember=class
name:string;
returntype:string;
visibility:string
取值如下:'private' , 'protected' , 'public' 'published'
isfunction:boolean;
isabstract:boolean;
isabstract:boolean;
isoverride;boolean

params://一种列表
end;

param=class
name:string;
type:string;
isvar:boolean;
end;
 
记得在 Delphi 1.0 下面有一个叫做 Object Explorer 的样例程序, 能够作这件事.
你装上 Delphi 1.0 看一看就知道了.
 
我记得有个在D3下显示类树的EXPERT,可以参考
 
你要干什么呢?
 
去DSP,找一个Pas Phaser 的.
 
Delphi类本身带有RTTF(运行时信息),可以得到你要的全部信息,
但必须先指定类名,
如果你想要,写信给我(e.w@263.net),我写段代码给你
 
想做语法分析器?不是那么简单的.建议你先看一看相关专业的书籍.

网上有一些关于编译器的资源,其中很多是有源码的.最著名的当然是
yacc/lex.还有一些专门为DELPHI设计的编译器工具(控件).但是,要
使用这些资源,都必须对编译原理有深入的了解.

编译原理应该是计算机系的基础课程,但好象中国的很多大学没有开,
有些开的也太简单.这不能不说是中国程序员的一大遗憾.
 
编译器的难度其实在优化, 分析很简单, 预处理把表达式转换成特定格式(一般是逆波兰表达式)的
关键字列表, 编译器只要顺序处理这个列表, 通过查表功能把关键字替换成相应的机器码, 然后交
优化程序处理. (主要也是查表)
所以编译器的好坏主要看优化算法与代码对照表的好坏了.
我做过个简单的数学运算解释器(支持40种公式和if-else表达式)其中分析程序把算术表达式转成
逆波兰表达式, 核心很简单, 先分离出关键字, 查表得到优先级, 根据优先级用个递归过程就解
决了. 分析的结果放在一个TStringList中, 其中Strings放关键字, objects做为
integer用来保存一些标志. 执行器顺序扫描这个TStringList的每一行, 根据标志和关键字进
行处理就能得到结果了.
 
编译器的原理其实并不复杂,但是由于每个产生式的描述能力很有限,所以
即使一个很小的语法也要大量的产生式.比如说,C语言的语法基本上是最
简单的了,但是要描述C语言,也需要超过100条的上下文无关文法的产生式.
这些产生式有时可以从别的地方得到,但大部分时候是需要自己构造的.构
造这些产生式的工作无疑是很困难的.在产生式构造好后,如果有辅助工具,
则可以用辅助工具生成部分代码,否则要把每个产生式改写成代码.这是非
常烦琐和冗长的工作,任何人做这样的工作都会心烦意乱,从而降低工作效
率.

构造好产生式并将其转化为代码只完成了Parser的一半(离优化还很遥远).
上面的工作只能分析代码的语法结构,而不能得到语义.要得到语义,必须在
由产生式转化来的代码中插入语义分析的代码.对算术表达式这样的语法,
语义分析是相当简单的,甚至可以不区分语法分析和语义分析.但对于PASCAL
和C这样的程序语言,语义分析的复杂程度远远超过了语法分析,其难度与算术
表达式一类语法的差异不仅仅是数量级的差异了.而且,这一部分没有好的辅
助工具可用.

代码优化显然不仅仅是查表就能解决的.编译原理有半本书专门讲解代码优化
的初级问题,如果仅仅用查表就能很好的解决,不知有多少著名科学家要被打入
骗子的行列了.而且,我所学过的代码优化算法,没有一个能够简化为查表的过程,
而大部分需要查表的算法中,查表所起的作用也是很小的.

另外声明一点就是将算术表达式翻译成值与翻译成程序这两个过程的语义分析的
复杂度差异也是很大的,即使不做优化.
 
大家扯远了吧?洪森只是要分析类说明而已,不是要做编译器啊,两位别侃了。
 
分析类说明就是编译,只是需要的语义信息少一点而已.一般来说,
变量和结构/类的说明部分的语义是一系列的表格.这些表格的管理
和维护是相当复杂的.特别是类,如果还要考虑继承/重载等,这些表
格的内容就相当丰富了,填写和维护的工作都很复杂.而对函数和过
程来说,基本上只是查这些表来生成代码的过程,相对还简单一些.

对变量来说,如果要生成最终的代码,还要涉及内存分配的问题.当然
这个问题比表格的建立和维护是简单很多了.

编译器的语法分析不是一个难题,而且有很多工具可以辅助开发.但
语义分析的问题从来都不是能够简单解决的.由于语义分析不能形式
化,所以没有甚麽工具可以利用.而代码生成和代码优化更是天下大
乱,全靠各公司程序员的水平了.
 
谢谢大家热情的讨论。
我同意LHZ的意见,目前国内关于编译原理的学习实在太肤浅了。
本人当初如不是因为没有学习这门课程,现在恐怕在另外一所学校
就读了。
 

Similar threads

回复
0
查看
858
不得闲
S
回复
0
查看
953
SUNSTONE的Delphi笔记
S
S
回复
0
查看
775
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部