Category Archives: C

词法分析工具flex

今日尝试了一下久仰大名的flex词法分析,发现确实很有意思,很多门语言,特别是一些动态解析的语言都需要借助这个词法分析生成特定的程序运行,我这里主要参考已经写好的例子来尝试一下flex的使用,首先在我们的CentOS环境下安装上这个软件。

[root@vm237148~]#yum install flex.x86_64

安装完成时候,我们就可以使用flex了,flex对于执行的lex源文件有严格的样式规范,词法规则文件一般以.l作为扩展名,flex文件由三个部分组成,三部分之间用%%分割:

定义段
%%
规则段
%%
用户代码段

我们此处用一个样例来统计文件中的字符数、字符的长度以及换行数,lex文件如下:

%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
 
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n  { chars++; lines++; }
.   { chars++; }
%%
 
main(int argc, char **argv)
{
    if(argc > 1) {
        if(!(yyin = fopen(argv[1], "r"))) {
            perror(argv[1]);
            return (1);
        }
        yylex();
        printf("%8d%8d%8d\n", lines, words, chars);
    }
}

现在使用flex来编译我们的lex文件,

flex test1.l

此时就可以看到编译出来一个c文件lex.yy.c

[root@vm237148~/test/flex]#ls -al
total 56
drwxr-xr-x 2 root root  4096 2014/12/04 13:22:52 .
drwxr-xr-x 5 root root  4096 2014/12/04 13:21:47 ..
-rw-r--r-- 1 root root 44209 2014/12/04 13:22:52 lex.yy.c
-rw-r--r-- 1 root root   403 2014/12/04 13:22:39 test1.l

这个文件大概长这样子:

1
2 #line 3 "lex.yy.c"
3
4 #define  YY_INT_ALIGNED short int
5
6 /* A lexical scanner generated by flex */
7
8 #define FLEX_SCANNER
9 #define YY_FLEX_MAJOR_VERSION 2
10 #define YY_FLEX_MINOR_VERSION 5
11 #define YY_FLEX_SUBMINOR_VERSION 37
12 #if YY_FLEX_SUBMINOR_VERSION > 0
13 #define FLEX_BETA
14 #endif
.....

此时编译这个c文件:

gcc -g lex.yy.c -o test1

编译成功,再测试一下,就用我们的lex文件测试吧,

[root@vm237148~/test/flex]#./test1 test1.l
      24      43     403

大功告成。

参考资料:

自学GCC-自动生成Makefile–autotools使用

最近想学习下UNIX下的编程。如是乎就有了以下的教程,在使用以下教程之前,需要确保linux已经安装了gcc、automake、autoconf、m4、perl。随便找一个目录,例如/var/lazy/gcc,touch一个文件,文件名hello.c,文件内容如下:

#include <stdio.h>
int main(void)
{
   printf("hello lazy");
   return 0;
}

下面就需要开始编译了。
第一步:autoscan,此步骤需要执行两次

[root@localhost gcc]# autoscan

第二步:

[root@localhost gcc]#mv configure.scan configure.ac
[root@localhost gcc]#vim configure.ac

此时将文件 configure.ac的内容稍作修改,其中最重要的就是
AC_INIT(lazy, 1.0, leak@hfut.edu.cn)
这一行是声明软件的名称,版本,bug报告的email换成你的,最后改成
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
保存。
第三步:
aclocal,autoconf,autoheader

[root@localhost gcc]# aclocal
[root@localhost gcc]#autoconf
[root@localhost gcc]#autoheader

第四步:
手工创建Makefile.am
文件的内容为:

UTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c

第五步:
反复使用 automake –add-missing
出现

Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found

把以上的文件都补上
touch NEWS
touch README
touch AUTHORS
touch ChangeLog
第六步:

[root@localhost gcc]./confiure
....
[root@localhost gcc]make

此时运行”./hello”就能看到运行结果:
hello lazy了

打包
tar -zcvf /root/hello.tar.gz ./

参考文章可见:

GCC编译步骤入门

初次写C,给自己长点记性

# vi hello.c
#include
int main(void)
{
    printf ("Hello world, Linux programming!\n");
    return 0;
}

编译

# gcc -E hello.c -o hello.i
# gcc -S hello.i
# gcc -c hello.s
# gcc    hello.o -o hello
# ./hello