7C00.ME/houmu 2011-11-03

在Windows平台使用flex和tcc进行编译原理-词法分析的实验环境搭建

昨天发了篇《Windows平台flex+gcc词法分析实验工具包》,可能是被博客园团队认为是广告或者软件发布给撤下了首页,很伤心啊,毕竟自己是花了一些功夫才整理出这些东西的。这篇文章将避免出现上述问题的嫌疑,所以不再提供下载了,详细讲讲怎么自己动手完成实验环境的搭建。另外,使用tcc代替gcc,主要是因为从网上获得的那个gcc程序,是从dev-cpp中提取的,而提取的人做的不完善,竟然没有给出string.h头文件,这可是c语言标准库函数的头文件,而且做词法分析,和文件和字符串打交道,一些字符串操作函数是很容易就要用到的。我也试图从dev-cpp中提取出string.h和对应的.a、.o库文件,但是可能是dev-cpp编译版本不对应的原因,没有找到匹配的相关文件,暂时放弃了。又试图找个独立实现的string.h+string.cpp,但是没有如愿,也暂时放弃了。后来,发现有人提到了另一款c语言编译器Tiny C Compiler(TCC),果断下了下来。这个c编译器确实tiny,我下载了Windows下的binary安装包,解压后(不用安装直接可用)连带doc和examples一共只有900多kb!实验了下自己在mingw+gcc+flex下测试通过的代码,编译通过,程序运行正确。所以,tcc可以作为之前提到的gcc的替代。下面简单说明一下,搭建flex+tcc做词法分析实验的环境,其实非常简单。

首先要下载我们要使用到的工具。有两个,一个是flex,Windows平台上可用版本下载地址是http://gnuwin32.sourceforge.net/packages/flex.htm;另一个是tcc,地址是http://bellard.org/tcc/,建议选择Windows binary distribution对应的文件下载。flex是个exe的安装程序,这个程序其实应该只是做了解压的事;tcc下载得到一个压缩包,解压到合适的目录,建议解压后目录层次是这样的:

这样基本上就可以了。flex和tcc都是命令行工具,为了以后使用的方便,不必经常切换目录,可以把flex和tcc所在的目录 \flex\bin 和 \tcc加入到环境变量path中,当然,和我前一篇文章中的做法一样,可以写一个start.bat的批处理,这样做的好处是用bat添加的path只有在当前进程有效,实际上没有修改环境变量path,path太多看着也不舒服,下面是start.bat的源代码,用notepad保存为start.bat(注意拓展名)下来,存到图上flex_tcc的目录下即可:

@echo off
path = %path%;%cd%\flex\bin;%cd%\tcc;
cmd /k cls

这样双击之后,会启动一个命令行,输入path,会发现最后面带上了 \flex\bin 和 \tcc两个目录。输入flex –version,会显示当前的flex的版本,同样tcc -version会显示当前tcc的版本。这两个命令有效,也就是说flex和tcc可用了。之后,找一段代码来测试,下面给一段自己写的代码:

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *fout1;   

void ttype(char* type,char* text,FILE *stream)
{
	fputs("(",stream);	
	fputs(type,stream);
	fputs(",",stream);
	fputs(text,stream);
	fputs(")\n",stream);
}

%}

digit          [0-9]
number         {digit}+
letter         [a-zA-Z]
identifier     {letter}({digit}|{letter}|_)*

%%

{identifier}   {ttype("ident",yytext,fout1);}
{number}       {ttype("num",yytext,fout1);}
.              {/*未匹配的字符,不作处理*/}

%%

int main()
{
	if((fout1=fopen("output.txt","w"))==NULL)
	{
		printf("can not create the file.\n");
		exit(0);
	}
	yylex();
	fclose(fout1);
	return 0;
}

int yywrap(){return 1;}

用notepad把代码保存为sample.l(标准拓展名是.l,不过貌似flex是不管的),放到flex_tcc目录下。下面进行生成和编译, 双击start.bat,在命令行窗口输入flex sample.l ,这时flex_tcc目录下生成一个lex.yy.c的文件;接着输入 tcc lex.yy.c,这时生成了一个lex.yy.exe的可执行文件。

这样生成和编译就完成了,接下来来测试一下这程序,随机输入一些单词和数字,按Ctrl+Z结束输入。这时flex_tcc目录下会生成一个output.txt的文本文件,内容是对刚才输入的单词和数字的判断。

这样我们就完成了使用flex和tcc搭建Windows平台上进行词法分析实验的环境。

后记:编译原理课的第一次实验作业是词法分析,助教老师布置的作业难度不算太大,只是要用linux系统,本人不排斥linux,但是电脑太破,禁不起虚拟机、双系统等方案的折腾,只好在Windows上找替代方案,目前这个是我感觉最小的方案。另外tcc是一款开源的编译器,既然在学编译原理,那么考虑到合适的时机,开始研究tcc的代码。