一些实践中的经验分享

Posted by wsxq2 on 2019-05-29
TAGS:  经验分享如何解决问题TODO

本文最后一次编辑时间:2019-06-10 13:26:52 +0800

正所谓授人以鱼不如授人以渔。做项目或者其它计算机相关的实际操作时,我们起初总是处于迷茫状态,不知道从何下手。或者过于着急,总想着早些上手。然而过早上手的后果是相当严重的。比如你遇到问题时常常会一脸懵逼,谷歌后更是不知道别人在说些什么(询问别人时亦是如此)。这就在于你连最基本的东西都没有弄清楚。如果你侥幸完成了(很多情况下只能选择抱大佬的大腿才能完成),最后发现自己却好像一无所获。

因此,为解决这个问题,与其在别人遇到问题时伸出援手,不如分享一下自己面对一个实践操作的思路

下面我将以学习编译原理一课的上机为例,浅谈我的处理思路。当然,我的思路也存在不少问题,比如过于费时间。

下面我们假定一种情形:你正在学习编译原理,要上机实操一下 LEX 词法分析器,那么你可能会按以下步骤进行:

使用维基百科查一下lex。先浏览最前面的概述部分,首先其第一句话就告诉我们了 lex 是啥。如下所示:

  Lex is a computer program that generates lexical analyzers (“scanners” or “lexers”)

  ——引用自 Lex (software) - Wikipedia

即 Lex 是一个用于生成词法分析器的计算机程序

遇到陌生的概念都可以使用维基百科了解大概,并和其它地方遇到的内容相互印证,从而加深印象。然后我们不必看完整个页面,只需在目录中找感兴趣的内容,例如其中放在第一位的 Open source 就很特别。仔细阅读之

  Open source   Though originally distributed as proprietary software, some versions of Lex are now open source. Open source versions of Lex, based on the original AT&T code are now distributed as a part of open source operating systems such as OpenSolaris and Plan 9 from Bell Labs.[clarification needed] One popular open source version of Lex, called flex, or the “fast lexical analyzer”, is not derived from proprietary coding.

  ——引用自 Lex (software) - Wikipedia

其中提到 Lex 并非开源软件,所以下载不到 Lex(我起初就为这个问题感到困惑)。相应的,有一个非常流行的 Lex 的开源版本——flex,于是它就是我们的下一步目标。此外,注意维基百科末尾的 See alse部分,这里通常会提供一些相关的链接,比如其中就有个很重要的 Comparison of parser generators。通常比较类的维基百科页面会让你对你的目标所处的位置有个大概的了解,以及帮助你选择你的目标(即为什么我们要选择使用 flex)。

点开它,看目录,可以看到1 Regular languages2 Deterministic context-free languages5 Context-sensitive grammars,这和书上所说不正好对应起来了吗?DFA(词法分析), CFG(上下文无关语法), CSG(上下文相关语法)之类的,词法分析正好属于1 Regular languages,所以我们重点关注这部分的内容。从中可以看到可用的词法分析器生成器有很多,lexflex都位列其中,可以看到lexLicense一栏有Proprietary(专有)一词,可知其不易获得。除了巨多的词法分析器生成器,还有我们后面可能用到的语法分析器生成器(2 Deterministic context-free languages),而bisonyacc自然也位列其中。但是我们暂时不考虑它。于是下一步我们将使用维基百科了解flex

同样的,细读 Flex (lexical analyser generator) - Wikipedia页面的概述部分,在目录里挑选感兴趣的内容进一步阅读。然后我们前往 flex的官网了解更多信息(其官网网址在维基百科页面的右面方框中的 Website 处可获得,这里是westes/flex: The Fast Lexical Analyzer - scanner generator for lexing in C and C++),发现没有啥有用的信息,star一下走人

然后使用谷歌搜索一下lex发现出来巨多不相关的内容(说明这个词有很多意思),由于lexyacc经常放在一块,所以我们搜索lex yacc试试,果然,结果就比较合我们的心意了。容易看到 The LEX & YACC Page这条搜索结果,其页面介绍看起来很有用,像是一个官方网站(其实不是)。从中可以获得一些有用的信息

好了,现在我们已经了解了很多相关内容了,接下来需要在我们的电脑上安装flex。在安装前,我们先看一下是否自带(MacOS自带)。在 Ubuntu 中,使用lex命令即可看到提示,根据提示安装相应的软件包即可。不自带的话再试试使用默认的包管理器(Ubuntu为apt,CentOS为yum),搜索一下是否直接有flex这个软件包:

1
2
apt search flex #for Ubuntu
yum search flex #for CentOS

结果直接就找到了。事实上,如果没找到,在 CentOS 中可以在通过使用命令yum provides flex查找

找到好后安装就很简单了:

1
2
3
apt install flex #for Ubuntu
yum install flex #for CentOS
brew install flex #for MacOS(如果你不喜欢自带的 flex 的话)

安装好后就可以正式使用它了,按照书上的例子或是直接使用帮助文档(--helpmaninfo

链接

下面总结了本文中使用的所有链接: