Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
31 lines (18 sloc) 1.91 KB

3.5 节的练习

3.5.1

描述如何对图 3-23 中的 Lex 程序做出如下修改:

  1. 增加关键字 while
  2. 将比较运算符转换成 C 语言中的同类运算符
  3. 允许把下划线当做一个附加的字母
  4. ! 增加一个新的具有词法单元 STRING 的模式。该模式有一个双引号、任意字符创以及结尾处的双引号组成。但是,如果一个双引号出现在上述串中,那么它的前面必须加上一个反斜杠进行转移,因此,在该字符串中的反斜杠将用双反斜杠表示。这个词法单元的词法值是去掉了双引号的字符串,并且其中用于转移的反斜杠已经被删除。识别得到的字符串将被存放到一个字符串表中。

3.5.2

编写一个 Lex 程序。该程序拷贝一个文件,并将文件中的每个非空的空白序列替换成单个空格。

3.5.3

编写一个 Lex 程序。该程序拷贝一个 C 程序,并将程序中关键字 float 的每个实例替换成 double。

3.5.4 !

编写一个 Lex 程序。该程序把一个文件改变成 Pig Latin 文。明确的讲,假设该文件是一个用空白字符分开的单词序列,每当你遇到一个单词时:

  1. 如果第一个字母是辅音字母,则将他移到单词的结尾,并加上 ay。
  2. 如果第一个字母是元音字母,则只在单词的结尾加上 ay。

所有非字母的字符不加处理直接拷贝到输出。

3.5.5 !

在 SQL 中,关键字和标识符都是大小写不敏感的。编写一个 Lex 程序,该程序识别(大小写字母任意组合的) 关键字 select、from 和 where 以及词法单元 id。考虑到这个练习的目的,你可以把 id 堪称是任意以一个字母开头、由字母和数字组成的字符串。你不必将标识符放到一个符号表中,但需要之处这里的 install 函数与图 3-23 中用于描述大小写敏感标识符的函数有何不同。