没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
纯 C 论坛·电子杂志 2004.10(总第 1 期)SP1
- 1 -
·开 篇·
哈尔滨工业大学 计算机科学与技术学院 孙志岗
“计算机科学”是什么?凡混 IT 这碗饭的,恐怕除了做市
场、搞管理的(剩下的也就是做技术、搞研究的了),都会思考
这个问题。如果您还没思考过,那么就马上想想吧,或者立刻阅
读这份刊物,也许它会给你一些思考。
对科学的追求本应该是非功利的,尽管现在评价一个科学家
的尺度往往是看拿了多少奖、戴多少头衔、有多少科研经费。对
于“计算机科学”,我辈才疏,不敢冒然下定义。但我们深知,
真正的科学应该是一种能经受时间考验的东西,它不应该是流行
元素,不应该代表时尚,不应该被炒作。当然,一门科学在转变
为生产力的时候往往成为“热门”,获得更多的关注,从而发挥
更大的功效。但那些不热的科学,那些鲜有人过问的科学,可能
才真的能代表未来,可能才真的是热门科学的基石,可能才真的
是纯粹的科学。
纯 C 论坛的宗旨,是“追求纯粹的 Computer Science”。纯
C 论坛的电子刊物,也是这个宗旨。当四方诸神正在吸引眼球、
创造价值之时,我等凡夫俗子空凭一腔热情、三分才气,曲高和
寡也罢,默默无闻也罢,尽倾所有,妄图撑起一片天空,广引天
下同道,同心协力,给计算机科学一个不华丽、不浮躁、不排他
纯 C 论坛·电子杂志 2004.10(总第 1 期)SP1
- 2 -
的生存空间。
也许无人喝彩,也许窘迫沮丧,也许黔驴技穷,也许热情不
再。但我们今天在这里,我们今天有渴望、有梦想,我们今天就
要实现理想!
计算机科学,万岁!
纯 C 论坛·电子杂志 2004.10(总第 1 期)SP1
- 3 -
目 录
【 卷首语 】
¾ 开篇 孙志岗 1-2
【 编译原理 】
¾ 工欲善其事,必先利其器——lex 和 yacc 工具介绍 高立琦 4-9
¾ 连接器和加载器(Linkers And Loaders) 刘彦博(译) 67-81
【 算法理论 】
¾ ACM/ICPC 试题解析 熊蜀光 13-19
【 病毒研究 】
¾ WinXP SP2 对病毒和加密技术的影响 Killer 20-25
【 C 与 C++ 】
¾ 剖析 Intel IA32 架构下 C 语言及 CPU 浮点数机制 谢煜波 26-40
【 网络安全 】
¾ Linux 下 SOCK_RAW 的原理和应用 肖颖 61-66
【 操作系统 】
¾ 操作系统引导探究(Version 0.02) 谢煜波 41-57
【 特 稿 】
¾ ACM/ICPC 计算机算法大赛简介 熊蜀光 10-12
¾ 有空的时候,多读读书吧 王凯峰 58-60
【 研究方向综述 】
¾ 现代信息检索技术简介 车万翔 82-84
【 编辑部通迅 】
¾ 投稿指南 本刊编辑部 85-86
¾ 读者俱乐部 本刊编辑部 87
¾ 本期信息汇总 本刊编辑部 88
¾ SP1 版对原版的修订说明 本刊编辑部 89
纯 C 论坛·电子杂志 2004.10(总第 1 期)SP1
- 4 -
工欲善其事,必先利其器
lex 和 yacc 工具介绍
哈尔滨工业大学 信息检索实验室 高立琦
在编译过程中,词法分析和语法分析是两个重要阶段。lex 和 yacc 是 Unix 环境下非常
著名的两个工具,可以生成分别完成词法分析和语法分析功能的 C 代码。在学习编译原理
过程中,可以善加利用这两个工具,有利于加深对这两个阶段的理解。即使在平时的工作中,
这两个工具也能发挥重要的作用。
1. 词法分词器生成工具 lex
Lex 是 Lexical compiler 的缩写,主要功能是生成一个词法分析器(scanner)的 C 源码。描
述词法分析器的文件,经过 lex 编译后,生成一个 lex.yy.c 的文件,然后由 C 编译器编译生
成一个词法分析器。词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的
标识符(token),转化后的标识符很容被后续阶段处理。过程如图 1。
图 1
先让我们来看一个简单的例子:
int num_lines = 0, num_chars = 0;
%%
\n {++num_lines; ++num_chars;}
. {++num_chars;}
%%
main()
{
yylex();
printf("# of lines = %d, # of chars = %d\n", num_lines, num_chars);
}
例 1 sample1.l
然后编译,输入一个文本试试:
$ flex sample1.l
$ mv lex.yy.c sample1.c
纯 C 论坛·电子杂志 2004.10(总第 1 期)SP1
- 5 -
$ gcc sample1.c -o sample1 -ll
$ ./sample1 <sample.txt
# of lines = 4, # of chars = 225
不错哦,没多少代码就可以实现一个行数统计程序。让我们再加点功能。
int num_lines = 0, num_chars = 0, num_words = 0;
%%
\n {++num_lines; }
[A-Za-z]* {++num_words; }
. {++num_chars; }
%%
main()
{
yylex();
printf("lines:%d \tchars:%d\twords:%d\n", num_lines, num_chars,
num_words);
}
例 2 sample2.l
现在这个 lex 文件可以用来生成一个统计行数、字符个数和单词个数的工具。
让我们来仔细研究一下这个奇妙的工具吧。先看看 Lex 文件的结构。
Lex 文件结构简单,分为三个部分:
declarations
%%
translation rules
%%
auxiliary procedures
声明
%%
转换规则
%%
其它函数
声明段包括变量的声明、符号常量的声明和正则表达式声明。希望出现在目标 C 源码
中的代码,用%{…%}扩在一起。比如:
%{
#include <stdio.h>
#include "y.tab.h"
typedef char * YYSTYPE;
char * yylval;%}
正则表达式声明如下
/* regular definitions */
delim [ \t\n]
ws {delim}+
letter [A-Za-z]
digit [0-9]
id {letter}({letter}{digit})*
number {digit}+(\.{digit}+)?(E[+\-]?{digit}+}?
这段正则表达式描述识别数(number)、标识符(id)的“规则”。过一会儿我们再细说正则表达
式。
这里要注意几点:…
规则段是由正则表达式和相应的动作组成的。
p
1
{action
1
}
p
2
{action
2
}
……
p
n
{action
n
}
剩余88页未读,继续阅读
资源评论
gainbest
- 粉丝: 1
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功