编译原理 编译器的实现(C语言实现)
chap1 词法语法语义的实现
绪论
根据输入Context-free Grammar(上下文无关法)构建分析器,
实现类似于yacc,lex的功能。
例如输入:
S'->S
S->BB
B->bB|a
下面说明,可选择阅读,是构建分析器的主线。
首先构建词法分析器,识别文法,然后把文法储存在文法表中,
然后利用Canonical LR(规范LR)算法,构建项目集,用现有的项目集
构建分析表。前端分析完成。
读者最好知道语法分析,词法分析,语义分析。理论的东西
请参考龙书<<编译原理>>,实践的也可参考虎书
<<现代编译原理 -C语言实现>>
电子版,可在http:://ebook.00083.com
http://www.netyi.net下载,搜索一下就有。推荐
龙书,有详尽的叙述,虽然有很多pascal代码。
还有一本<<现代编译程序设计>>(Modern complier design)
偏重实践,只不过内容有点凌乱。龙书虎书有很多很好的习题,
只是没有答案,有点遗憾,现代编译程序设计,有答案,只不过
很难读进去。
国内的教材,清华编译原理的偏重理论,并且一些理论还不健全,
缺乏实践。国防科大的陈火旺<<现代编译原理>>,惨不忍睹,读完
以首抢地,血流如注,不知所云。科大陈意云,完全抄袭龙书,
稍微改了一些示例程序的代码中的符号,并且翻译的很差,很重要的
必须理解的东西一笔带过,适合读完龙书,然后利用这本书来温习。
别的教材不甚了了。
小弟主修空间物理,毕业后在家卧床养病两年,前途无望,无所事事,
每日坐在樟树下,数数蚂蚁而已。有空写点编译原理的东西,如果有
高洁之士,请不吝指教。zh291@mail.ustc.edu.cn
$1 词法分析
词法分析,有两种实现方法,一个是利用正规表达式构建DFA,
再根据DFA实现程序,一个是预测分析,利用输入符号,用一系列
的case和if判断语句,来构建函数。手工第二种方法较多,第一种
方法多用于词法分析工具构造如lex;
本文构建一个yacc类似程序的读取文法表达式的词法分析器。
读取合法的context-free文法。
下篇根据这个程序构建语法分析;
词法分析,可以从控制台输入中一个一个读取,调用getchar()
读取一个word,然后分析这个读取的word,也可以一次性读取所有输入,
例如控制台输入,文件输入,然后将读取的date存储在一个全局数组中。
例如:这是一个简单函数,没有优化的。
char buffer[1024];
void read()
{
FILE *f;
int index=0;
char c;
f=fopen("date.dat");
while((c=fread(f))!=EOF)buffer[index++]=c;
}
词法分析首先读入字符。首先构建读入date函数。
本文的词法分析,采用读取控制台输入,每次读入一个字符,如果字符
是backspace,tab(' ','/t'),则忽略。因为是空白分隔符。构建读取控制台
输入函数;
char getToken()
{
char c=getchar();
while(c==' '||c=='/t')//如果读入字符是空白符,则忽略读取下一个
//字符,'/n'不忽略的原因是因为,当读入'/n'
//本程序约定则表示一个文法表达式结束。开始
chap1 词法语法语义的实现
绪论
根据输入Context-free Grammar(上下文无关法)构建分析器,
实现类似于yacc,lex的功能。
例如输入:
S'->S
S->BB
B->bB|a
下面说明,可选择阅读,是构建分析器的主线。
首先构建词法分析器,识别文法,然后把文法储存在文法表中,
然后利用Canonical LR(规范LR)算法,构建项目集,用现有的项目集
构建分析表。前端分析完成。
读者最好知道语法分析,词法分析,语义分析。理论的东西
请参考龙书<<编译原理>>,实践的也可参考虎书
<<现代编译原理 -C语言实现>>
电子版,可在http:://ebook.00083.com
http://www.netyi.net下载,搜索一下就有。推荐
龙书,有详尽的叙述,虽然有很多pascal代码。
还有一本<<现代编译程序设计>>(Modern complier design)
偏重实践,只不过内容有点凌乱。龙书虎书有很多很好的习题,
只是没有答案,有点遗憾,现代编译程序设计,有答案,只不过
很难读进去。
国内的教材,清华编译原理的偏重理论,并且一些理论还不健全,
缺乏实践。国防科大的陈火旺<<现代编译原理>>,惨不忍睹,读完
以首抢地,血流如注,不知所云。科大陈意云,完全抄袭龙书,
稍微改了一些示例程序的代码中的符号,并且翻译的很差,很重要的
必须理解的东西一笔带过,适合读完龙书,然后利用这本书来温习。
别的教材不甚了了。
小弟主修空间物理,毕业后在家卧床养病两年,前途无望,无所事事,
每日坐在樟树下,数数蚂蚁而已。有空写点编译原理的东西,如果有
高洁之士,请不吝指教。zh291@mail.ustc.edu.cn
$1 词法分析
词法分析,有两种实现方法,一个是利用正规表达式构建DFA,
再根据DFA实现程序,一个是预测分析,利用输入符号,用一系列
的case和if判断语句,来构建函数。手工第二种方法较多,第一种
方法多用于词法分析工具构造如lex;
本文构建一个yacc类似程序的读取文法表达式的词法分析器。
读取合法的context-free文法。
下篇根据这个程序构建语法分析;
词法分析,可以从控制台输入中一个一个读取,调用getchar()
读取一个word,然后分析这个读取的word,也可以一次性读取所有输入,
例如控制台输入,文件输入,然后将读取的date存储在一个全局数组中。
例如:这是一个简单函数,没有优化的。
char buffer[1024];
void read()
{
FILE *f;
int index=0;
char c;
f=fopen("date.dat");
while((c=fread(f))!=EOF)buffer[index++]=c;
}
词法分析首先读入字符。首先构建读入date函数。
本文的词法分析,采用读取控制台输入,每次读入一个字符,如果字符
是backspace,tab(' ','/t'),则忽略。因为是空白分隔符。构建读取控制台
输入函数;
char getToken()
{
char c=getchar();
while(c==' '||c=='/t')//如果读入字符是空白符,则忽略读取下一个
//字符,'/n'不忽略的原因是因为,当读入'/n'
//本程序约定则表示一个文法表达式结束。开始