作者psvsps2 (Op颖)
看板C_Sharp
标题[心得] Parser
时间Wed Jun 1 20:13:16 2005
所谓的Parser是将符合既定文法(Grammar)的文字转换成结构化,有用资讯的
的工具,通常所有的编译器(Compiler)都会先将原始的程式码经过Parser转为,
特定的资料结构,如分枝叙述,型别定义等等。
除了Compiler外善用Parser可以带给你比Regular Expression更强功能的文字处理
,当然强大功能的背後相对的一定有更复杂的设定和使用方法。
其实最初是因为小弟因工作需要要写一个自动文件产生的程式,首先要支援的是
对C/C++的source code 进行分析,然後产生Word/Html文件,一开始是想利用
Regular Expression配合Word Library COM来做但是发现C/C++语法真是该死的
复杂,只好从新翻书本看看以前混过的Compiler到底是如何处理soure code的,
并在网路上面找到了一个不错的Free产品,在这边分享一些心得。
(其实非常想号招有志同好一起开发这个案子,并以GPL方式发行基於最近工作
较为繁重,带比较轻松时候我会好好研究一下目前网路上面的GPL社群选一个
合适的,再将雏形摆上去到时候有兴趣的在一起研究学习:))
首先产品关网连结
http://www.devincook.com/goldparser/
进入官网後先别急的下载,假如对parser没有概念请先在官网左边浏览一下
列出的Concepts。
简单说明一下相关概念
Token : 对Parser有意义的符号,比如C的关键字,字串等等。
Grammer(文法) : 定义了要分析的程式规则,定义Grammer其实只是定义两种
规则,分别是Terminate和nonterminal,看一下下面
C#程式的例子
int a = 3;
这个叙述(statement)红色部分就是terminate,而绿色部分就属於nonternminate
,通常parser是用DFA Algorithm来解析出Token。简单来说terminate就是明确
清晰的字串,而nonterminate必须依照前後token来决定。
运作方式
Grammar -> Gold Builder -> .gtc file
|
▽
parser engine --> parsed data
△
|
Language source code
各位请先下载C的Grammar
http://www.devincook.com/goldparser/grammars/index.htm
到Programming Language选ANSI C
接着下载Gold Builder
http://www.devincook.com/goldparser/builder/index.htm
一OS不同选择,Windows上的Gold Builder就是第一个。
Gold Builder会分析Grammar产生出parser engine要用的table。
操作方式就开启grammar档案然後最下面的button一直按到不能按,然後
Toolbar上面倒数第二个Icon按下去就可以测试了。
接者请下载Engine,这边假设要用C#在.NET Framework 1.1上面执行
http://www.devincook.com/goldparser/engine/cs-morozov/Morozov-GoldParser.zip
Engine的说明文件
http://www.devincook.com/goldparser/engine/cs-morozov/doc/index.html
Engine下载完了以後开一个Visual Studio的专案,然後reference到刚刚下载的
engine DLL档案即可快乐的测试了。
大约说明一下用法,详细说明还请参考说明档案
建立Parser物件
1.建立Parser要使用的Grammar物件
FileStream fs = new FileStream(garmmarFileName,
FileMode.Open, FileAccess.Read);
BinaryRead reader = new BinaryReader(fs);
GoldParser.Grammar grammar = new GoldParser.Grammar(reader);
2.建立Parser物件
GoldParser.Parser parser = new GoldParser.Parser(sourceCode, grammar);
进行Parser
while (true)
{
ParseMessage response = parser.Parse();
switch (response)
{
case ParseMessage.LexicalError:
//处理token错误,比如int打成itn
//Do some thing 通常是丢出exception
break;
case ParseMessage.SyntaxError:
//语法错误比如少了';'
//Do some thing 通常是丢出exception
break;
case ParseMessage.Reduction:
//规则完成,在Grammar定意的规则符合,必须使用
//parser.CurrentReduction.Count来取得所有子规则继续处理
break;
case ParseMessage.Accept:
//整个source code parse完毕
break;
case ParseMessage.TokenRead:
//读取到token
break;
case ParseMessage.InternalError:
//内部错误
//Do some thing 通常是丢出exception
break;
case ParseMessage.NotLoadedError:
//读取错误
//Do some thing 通常是丢出exception
break;
case ParseMessage.CommentError:
//定义的注解解析错误
//Do some thing 通常是丢出exception
break;
}
}
上面只是大概的架构,建议各位下面几个Class都要看一下说明文件
Symbol
Token
Reduction
Rule
当然要不是我接触到这个案子也不会想去研究这种东西,大部分的情况下
Regular Expression就挫挫有余了,我能想到的优点大概这些
1.考绩不会变差(当然是针对我个人)
2.成就感,许多本科系毕业的在Compiler都是混过去的吧,会Parser的人还
真不多*(单指台湾)。
3.看Programming Language Spec的时候通常都是用Grammar的语法说明,
不信?去MSDN C#的Spec看每个章节(除第一章外)一开始的定义都是Grammar
的写法,会了Grammar就看的懂spec看的懂spec就更不容易写错程式,
还有有争执的时候还可以拿spec来压下属.....(这点到真的满好用的,
好吧我承认我有点GY)。
4.可以创造自己的程式语言,想和python作者一样一举成名?先学好Parser
绝对是必要的。
5.打发无聊时间.....
--
我的Blog :)
http://spaces.msn.com/members/austinjan/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.75.23.122
1F:推 virdust2003:看不太懂 你想要做什麽? 试我太累了吗 140.113.164.7 06/01
2F:→ psvsps2:C/C++ 程式码 ->处理 ->所有function,symbol列表 61.229.12.139 06/02
3F:→ psvsps2:根据列表产生Document,和一些检查的动作 61.229.12.139 06/02
4F:→ psvsps2:比如命名有无符合规范等等. 61.229.12.139 06/02