威的大学生活

好好做人

从yacc,Lex到手工的语法分析与词法分析,编译的作业牢骚

编译原理的作业,写个PASCAL简单语法的编译器,主要就是词法分析器和句法分析器。时间紧,任务重,从第一次上机到验收作业就一周时间。那题目还不在我的课本上,是在旧版的中文版上,反正我手头没那本书,得向同学借着看。这倒没什么关系。可是看了又怎么样呢?很久之前就看了几遍了,一头雾水,就不知道它在说什么。这几天更是反复研究了好几遍,依然不知所云。说实话这本中文版翻译得非常烂,众所公认地烂,我觉得就是用GOOGLE翻译都能翻到这个水平。我研读了那么多遍,就是没明白它要我们做什么,条件和要求混在一起。

 

关于编译器,进行网络搜索之后,的确查到了一些代码。词法分析我是看明白了,但是我写不出来,最多只能修改别人的代码。因为文件读入那部分我实在不会写,表结构的添加扩展我也很难写出来。学C的时候没学过文件操作,C++更是没怎么学,数据结构也没学好……下载到的代码是C#写的,模块化编程显示出了它简洁的魅力,很多我本来以为要很烦琐的部分,它直接调用几个类的方法就搞定了。不过这些都还不是重点,词法终究难度不大。重点是句法分析。PASCAL简单语法的分析得用LALR文法分析,我一直搞不明白SLR,规范LR和LALR的区别,现在也没搞明白。这些也就罢了,反正差别也不大。可是学到现在学的都是抽象的文法,什么S->ABC……之类的,从来没有涉及过具体的语言。我不知道文法规则是怎么来的,以及怎么和具体的语言对应起来。研究了几天的代码,基本上得出了一个大致的流程。首先是根据文法规则建立文法分析表,然后通过读入文法分析表,词法分析表,具体程序,输出句法分析结果。读入这部分单纯凭我个人是肯定写不出来的,但这个可以通过软件解决,实在不行直接用别人的代码也可以,反正读入输出这些是通用的。那么关键就是在建立文法分析表以及如何通过文法分析表进行归约动作了。

 

找到了关键点,就暂时把它隔离起来。我习惯于先做些能做的,简单的部分。于是我决定先解决外围的输入输出,词法分析这些部分,那么等这些都完工后就剩下个关键部分可以集中力量攻关一下。对于lex,yacc这几个工具老师和书本都一直有介绍,于是我也打算用这几个工具来简化下程序编写。我下载了lex,yacc的编译器,还是WINDOWS下可以和VS完美通用的。然而yacc和lex怎么使用呢?

 

我查阅了大量的资料,还下载了几分PDF,当然那本“龙书”上也有一些说明。然而我还是不清楚具体的规则。我发现几乎所有的资料举的例子都是一样的,这让我大汗……一个计算器的编译,一个统计字数的lex,就这么两个例子,出现在所有的资料里。这两个例子如果解释清楚了那其实也没什么问题了,但是并没有解释清楚。的确,我了解了两个工具的三段式写法,了解了每段都写些什么东西,可是作为一个类似于程序语言的工具,它的命令格式并不是这么简单,总还有许多细枝末节在你不经意的地方跳出来困扰你。比如头文件的包含,我就是搞不清楚到底需要包含哪些头文件。

 

晚上的实验课从6点到9点,我认认真真地做了3节课。词法分析我通过修改那份网络上流传的C#写的关于C的词法分析代码完美解决了。然后我研究它的语法分析器,结果不幸地发现那份代码是错误的。既没有调用词法分析的结果,也没有正确区分关键字和普通标识符。这是我努力了两个小时后的结果,不免让我十分沮丧。然后我不死心,又开始搜索新的代码。我不需要关于语法分析的讲解,理论我都知道,我不知道的是怎么把抽象的全是代号的文法和实际的语言联系起来,以及如何进行具体的分析操作。搜寻的结果依然让我失望。我找到了一份C++写的语法分析代码,它的说明是编译原理的一个作业,可是里面的内容却用着非常蠢的做法。它居然把文法手工写在了程序体里面。通过每读入一个字符串,进行判断是不是PROGRAM开头,然后后面是不是标识符,然后是不是括号……没有任何归约动作。接着我又找到了一份说是C#语法分析器的代码,看了之后哑然失笑,居然是个把关键词高亮,把数字标个颜色的“分析器”……我还在同学的机子上看到了一篇“技术文档”,文档写的煞有其事,有引言,有各个部分的内容,还有结语以及开发总结。乍一看,我十分惊喜,以为可以学到点什么东西。仔细阅读了一下后,又失望地发现这是一份拼凑之作。词法分析是用C写的,用了烦琐的过程运算,烦琐的语句读入控制,以及堆栈结构。语法分析居然就是我最早看到的研究了好几个小时的C#写的还是错误的代码!!后面的中间代码生成我已经不屑于看了,不过又是个从网上DOWN的东西罢了,连修改都没。几个部分所分析的目标语言就不是同一个,这样的文档居然也好意思写出来。

 

我们班的没有能做这个东西的。别的班的倒是向老师提交了那么几个。我没能看到他们的代码,不知道是个怎么样的思路。但是刚才在班级的QQ群共享里面找到了一份。明天再仔细看看吧。现在的主要几个问题在于:

1.LALR文法的分析表的建立; 

这个应该属于基础知识,但是我没能很好地掌握,多研读下书本应该可以解决。

2.语法分析调用词法分析的什么内容,如何调用,怎么利用词法分析的结果;

这个我必须分析成功的代码才能弄清楚了。

3.抽象的文法与具体语言之间的关系。

阅读更多
个人分类: 计算机科学与技术
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭