开源程序介绍来自(含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() 函数。