C_Sharp 板


LINE

所谓的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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP