开源编译器学习笔记01(VC6 词法扫描器)——2014_1_28

开源程序介绍来自(含linux版本下载)

http://www.zengl.com/html/genlanmu/zenglbianchengyuyan/article-2.html

程序下载(VC 版本)

http://pan.baidu.com/s/15QuDb#dir/path=%2Fzengl_language_for_VC_6.0

和VC版本说明

http://bbs.zengl.com/thread-9-1-1.html


使用该开源程序学习的原因:

1、程序是从小长大的,起点可以比较低,适合入门

2、有解释和应用,比较完整。


当然目前看到的缺点是,

排版不太好,阅读感差。




笔记01 主要关注词法扫描器,这里使用 VC6 编译。


对我来说,程序最难的部分不是词法分析器,而是动态分配内存,看了一些内存分配的资料后,感觉比较难,觉得不适合在这里分析。动态分配内存将被作为黑盒子看待。


首先看主函数


void main(int argc,char * argv[])
{
	int len;
	enum TOKENTYPE token;

	if(argc != 2)
	{
		printf("usage: %s <filename> \n",argv[0]);
		exit(-1);
	}

	initdata();
	len = strlen(argv[1]);
	source.filename = zl_malloc(len+1);
	strncpy(source.filename,argv[1],len);
	source.filename[len] = STRNULL;

	while((token=getToken())!=ENDFILE)
	{
		printToken(token);
		freeToken();
	}

	system ("pause"); //vs2008下为了能看到结果,需要暂停,否则就一闪而过,什么都看不到咯。

	myexit(NULL);
}

******************************************

理解为下面的格式


void main(int argc,char * argv[])

{

      初始化();


      字符串扫描和显示();


    system ("pause"); //vs2008下为了能看到结果,需要暂停,否则就一闪而过,什么都看不到咯。

    myexit(NULL);
}


**************************************

需要理解TOKENTYPE 的定义

enum TOKENTYPE{
	ID,NUM,PLUS,MINIS,TIMES,DIVIDE,ASSIGN,ENDFILE,ERROR
};

不是很多,根据字面也能大猜出大概意思。


初始化 主要是 动态分配内存,并把文件 test.zl 的内容读到内存中。

初始化是怎样实现的,目前还不理解,这里不是学习目的,也不影响对词法扫描器的学习。所以继续。


********************************************

学习的重点:

字符串扫描和显示();

    while((token=getToken())!=ENDFILE)
    {
        printToken(token);
        freeToken();
    }


被扫描的文件内容,

abc = 100
c = abc * 10 - 2 / 33 + bb
zengl == hello + world


执行结果


下一步就是理解 getToken() 函数。









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值