一个词法分析器的简单实现

词法分析器是编译器的前端,作用是将源代码的字符串分解成具有独立意义的最小单位,也就是计算机所认识的单词。这篇文章中,通过一个实验报告来明确这个词法分析器的需求,然后带大家通过代码的方式来实现一个简单的词法分析器(另一个方法是通过flex自动生成词法分析器)。

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

二、实验内容

编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等七大类。并依次输出各个单词的内部编码及单词符号自身文本串(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

注意:单词类型大小写不敏感(即不区分大小写

三、实验要求

1、词法规则

  1. 关键字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not
  2. 标识符: 字母或“_”打头的由字母、数字串或“_”组成的任意长度的符号串。
  3. 整数: 数字串。
  4. 小数: 数字串·数字串
  5. 字符串: 由一对“”括起来的任意长度的符号串。注意:可以多行。
  6. 分隔符: {、}、(、)、;、空格
  7. 运算符: :=、=、<、<=、>、>=、+、-、*、/

2、设计词法分析函数getToken( ),完成以下功能:

  1. getToken( )每调用一次就分析出一个单词;
  2. 返回单词类别、单词自身文本串、单词在源文件中的行列号;

3、编写测试程序,反复调用函数getToken ( ),输出单词信息。

IMG_20150331_222331.304

我的实现思路是:

  1. 先将源程序代码全部读入缓冲区中。这一步可以有三种方法:一个一个字符读,一行一行读,全部读入。其中,1的代码可读性有点差,所以这里不采用。按行读实现起来是最难的,因为要处理换行的字符串问题。全部读入之后,只通过词判断,并没有换行的区别,只要识别出一个单词,就重新开始,识别出下一个单词。
  2. 调用getToken()从缓冲区的第一个字符开始,按照上图的状态转换图往后读,直到分析出一个单词;
  3. 输出这个单词的判定类别,返回,继续读取一个字符。

源代码如下:

参考:一条鱼、尹雁铃(更详细的词法分析器讲解)

 

怎样才算健康的生活方式

一个朋友问我这样的问题,很巧的是,我最近正好很认真地想了这个问题。

我的观点是,按照自己想要的方式生活,就算健康。你可能会觉得这是一种享乐主义,但那又怎样呢?人生只有900个月,掐指一算,能干的事情真的不多。

而且我心中的乐,是分等级的。我一直认为,只有素质越高,能享受的娱乐就越多,是一个良性循环。比如读书,网络小说有网络小说的乐趣,言情有言情的乐趣,但是读的书越多,从这里得到的乐趣就越少,从经典著作中得到的乐趣就更多。这里说的乐趣不是“韬光养晦”这种高尚的情操,我说的就是站在“消费者”的角度讲。不是说你读了一本晦涩难懂的名著,心里得到了满足感,成就感,坚持读完不容易,而是宏伟著作所带来的一种真正的,精神上的快感。而对于同一本书就有可能有的人得到了“读完的艰辛”、“没怎么看懂”,有的人却得到了启发和快感,这就是素质的区别。

再比如说,打游戏。我从小时候就崇拜过身边的游戏高手:有个拳皇玩家手很快,快到看不清;隔壁宿舍玩弹幕游戏跟神一样,再密集的弹幕都能躲开;楼上星际2到白金用了一个周。相反的是,我还遇到过打了两万场的黄金玩家。

这只是天赋差别吗?我认为不是。玩游戏玩的好的人,都有一个特点:思考。看录像,或者不断练习,提升。读书也是,走马观花,和认真地读,区别很大。所以我认为,即使是按照自己想要的方式生活,也不是一件简单的事情。你可能会说,如果一个人喜欢玩游戏,那他不停地输,也会很开心啊。我不否认,但是如果他能多动动脑子,玩的越来越厉害,会更开心吧!

如果你非要说到吸毒的话,我只能说:这是一种廉价的快感。

在这篇文章变成”鼓励思考“的励志鸡汤文之前,我要强调一下上文中那900个月。我不喜欢鸡汤文的原因就是它们只会说你要去努力却不会说你为了什么努力,它们告诉你要过追寻自己的梦想却不告诉你如何找到自己的梦想。答案很简单,人生苦短,就是你喜欢的事情呗。可能你现在学的吐血只为将来做一个好医生/程序员/老师,那么不如就现在开始。用现在的苦难时光希望换来将来的梦想,我觉得得不偿失。若真成功,你可能会感谢现在的自己,但是肯定也会对不起现在的自己,那么何不让现在成为不错的回忆?

我把这些写出来,是因为晚上我看到传智播客培训出来的程序员工作只要四个月,不是黑他们,也不是做广告,其实我看过他们的培训课,私以为也差不多。于是我想,我在象牙塔里四年,是为什么?

制作东西让我感到快乐和成就感。软件在我看来是最简单(不需要很多材料),能力最大的了。所以我对各种各样的计算机技术感兴趣。觉得很多东西实现地很巧妙,就像一种信仰的崇拜。有人跟我说,杂而不精,没什么用的。没关系,我了解他们不是为了有用。有人说,将来硬件发展比软件要好,工资更高,工作好找。我知道我还是更喜欢软件开发。我做的事情让现在的我感到快乐,这就足够了。同理,我玩游戏花的时间,也从来没有后悔过。

不要把太多的希望寄托在未来,不要想着将来某一天过上多好多好的生活,就从现在开始吧!还记得”上了大学就能 XX“的话吗?多愚蠢的骗局啊!

 

MacVim 配置攻略

网络上对于 Vim 的配置较为杂乱,所以我整理了一下我用到的所有配置,写了一个一站式的教程。这篇教程将从零开始,一步一步将你的 Vim 打造成一个好用的编辑器。本文包括:

  1. Vim 的安装;
  2. Vim 颜色主题配置;
  3. 编程友好的字体——SourceCodePro 的安装和配置;
  4. gcc,gdb 的编译安装和一键编译配置;
  5. 我的 vimrc,供参考。

这是现在我的 Vim 使用界面:

myvim

1.Vim 的安装。

GVim(图形界面)的安装:关于 Vim 的安装,你可以直接从 Vim.org 指定的链接来下载最新的版本。下载之后直接将其拖动到你的 /Application 目录中,就可以在应用程序界面看到 Vim 图标了。

Vi 的安装:Mac OS 系统的终端中自带了 vi,不需要再进行安装了。本文主要以配置 GVim 为主,但是原理都差不多。

2.Vim 的颜色主题。

Vim 的配色方案多种多样,比较流行的有:tomorrow ,zenburn ,solarized 等。我比较喜欢 molokai,颜色对比不过分,也不刺眼,看起来比较舒服。

打开 vim 的文件夹(即你刚刚拖动的文件夹),右键 MacVim,选择“显示包内容”,依次选择 Contents/Resources/vim/,你将会看到一个 gvimrc 文件,这个就是 vim 的配置文件内容了(vimrc 用于配置终端上的 vi)。右键以文本格式打开,可以在里面设置各种各样的配置参数。配置文件的详细内容将在最后以代码形式给出,供参考和修改。

这个目录下还有一个 runtime 文件夹,保存了一些资源文件,其中 colors 文件夹保存的就是配色方案。使用这些配色方案的方式是,在gvimrc 中添加这样的设置:

重启 vim ,就应用了!

你也可以到 Github 上下载molokai或者其他的配色方案,拷贝到 colors 文件夹下,然后设置他们。请注意,你必须使用你的 colors 文件夹中存在的配色方案。

3.字体的安装和配置

这些都做好了之后,你会发现你的 Vim 和我的还有点不一样,就是字体啦。字体的设置和主题类似(其实,大多数的设置都是这样的)。其中要注意的是,用“_”代替空格。

有可能你会发现你的字体没有改变,这是因为你的系统中不存在这种字体。打开系统自带的“字体册”,你会发现确实没有……字体的安装方法如下(这里就以 SCP 为例啦):

  1. github 上下载字体的源代码到本地。
  2. 下载 Adobe 的字体开发工具(AFDKO)对源代码进行编译。  这个工具的安装方法是:

    其实,你也可以直接双击这个 FinishInstallOSX 执行。
  3. 编译字体的源代码:

    这部分完成后,这个文件夹中将多出来 target 文件夹,里面的 TTF 就是字体,OTF 就是预览啦。
  4. 安装字体。使用系统的字体册,点击“+”号,找到选择 TTF 下的所有文件,安装。这时,你的字体册就出现了新的字体!

现在,你 Vim 的字体应该生效了吧?

4.一键编译。

Vim 是一个编辑器,但仅仅这样而已,经过配置,Vim 完全可以变成一个 IDE!这里,就介绍一下在 Vim 里配置 C/C++ 编译环境。

首先,需要安装编译器 gcc,调试器 gdb。你可以从官网 GNU.org下载源代码,自己动手编译进行安装,或者通过 homebrew 指令进行安装。

编译安装

  1. 以 gdb 为例( gcc 是编译器,不能编译安装)。先从官网的镜像下载源代码。
  2. 解压。然后从终端中进入你的解压目录。执行以下步骤。(由于每个编译步骤之间需要时间,你会看见终端的文字飞快地闪动,耐心等待几分钟就好了。)

Homebrew 安装

如果你没有 Homebrew 的话,需要先在终端中执行这样一句话,完成 Homebrew 的安装。

然后用下面的指令安装 gcc :

安装好以后,经过适当的配置,就可以在 Vim 里面进行 C/C++的编译和调试了,那么“适当的配置”是什么呢?

5.尾声——配置文件。

这是我使用的配置文件,如果你照上述方法安装了编译环境,字体,下载了颜色方案,那么你把 gvimrc 改成我的代码,看到的效果应该是和图一样的了!当然,你也可以更改成自己喜欢的配置,在代码中放入了注释,可以根据需要修改。

 

 

学习培训课程的视频效果好吗?

博客好久没更新了。寒假里拿到了驾照,看完了《绝命毒师》和《破产姐妹》,就过去了,没啥好写的。开学之后有点沉迷于星际争霸2,不过这个周显卡烧掉了,没法再玩了,这才认真了起来。

我想讨论一种编程的学习方法——视频课。这种方法比较流行,因为难度不大,易于入门,学起来也不太会偷懒,因为视频一直在走,进度在那里。我初次学习 Java 的时候,就是看的传智播客的毕向东老师的视频(院老师推荐的)。看的时候我还认真地做了笔记,也谢了不少代码,效果还是有的。

但后来在没了视频写程序的时候,问题就来了。首先,不能看文档。学习的时候写的代码,都是跟着老师写的,他写一行,我写一行,他翻文档,我也跟着翻到那一页。自己写的时候,就不熟悉文档,不知道某个方法应该怎么找。其次,没有思路。学习过程中大多数的时间都是跟着老师,还要加上写代码做笔记,不时地暂停一下,思考的时间就非常少。导致后来不知道怎么思考了。除此之外,我觉得视频课程的缺点还有:浪费时间。培训班的课程是零基础的,很多常识性的东西要解释半天,进度其实也很慢,毕竟是面向社会招生的。所以在这方面时间白白浪费掉了。

看视频的好处就是:难度低。因为跟着视频一步一步做,很少出错。如果自学的话,很可能在配置 Java 编译环境的时候就受到挫折。

其实这种优点在某种程度上可能成为一种缺点。因为难度低了,无形中也削弱了你的自学能力。每当你想学习一门新技术的时候,总想着去看视频,跟不上潮流(必须等流行了才能去学)先不说,当你对某冷门技术感兴趣或者必须用到的时候,就又必须经历上面那种挫折了。

自学最重要的是思考。可以说,方法并不重要。不推荐视频的原因是它不鼓励你去思考,如果你能在看的时候想到很多问题,动手很多,那么视频当然不失为一种好方法。如果你不喜欢思考,那么就是在真正的课堂上,效果也是不好的。学习不就是思考的过程吗?

在我以前一篇文章中提到过我对课堂的认识。而且我认为尤其是计算机,最主要的是自己的思考,老师只是引路人。如果能让我进行教育改革的话,我会取消所有的计算机专业课程,老师们都集中精力写简明易懂的教案或课本,然后建立一个论坛,学生在上面和老师交流,提问等。这样节省资源,效率也高。一个人的提问,能带来所有人的思考。说实话,课堂上老听一个人讲,很没意思,所以这学期很多课我都不上了。

这里,批评的并不是一种方式,毕竟内容才是最重要的,不偷懒,总会有收获的。

 

语言的控制

《嘲笑鸟》中有一幕是斯诺总统说要给反抗军找一个名字,他认为叫他们「反抗军」太看得起他们了。这是国会无处不在的专制统治中的一种体现。

乔治·奥威尔对此早有预言,在他的《1984》中,负责战争的部门叫做「和平部」,负责制造假新闻的部门叫做「真理部」。统治者们在开发一套新的语言词汇,这些词语中不好的词汇(例如反抗,革命)有着另一层意思。直到有一天,人们完全忘记这些词语本来的意思。在这部作品的最后还有一篇详细的论文解释这种语言控制。

这种语言控制真实的发生了:东德的全名是德意志民主共和国,希特勒屠杀犹太人是为了种族主义,美国驻军伊朗是为了打击恐怖主义,朝鲜叫做朝鲜民主主义人民共和国,我国有段荒唐的历史我们现在叫*****。现在的很多词汇已经接近于「禁止使用」了,中国对网络内容的监管尤其严厉。

《嘲笑鸟》原著中的「潘纳姆」国在中国引进的版本中,字幕将其翻译成「施惠国」,这个翻译,太精髓了。

后记,最近网络的监管越来越严重了,3月22日免翻墙镜像网站遭到了DDOS攻击。这个网站由匿名人士创办,为被block的网站提供镜像,使在国内可以流畅访问。从这个网站统计的数据中我们可以看出,现在已经有很多词汇,是不能使用的了。

greatwall