预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共49页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编译原理课程设计报告 课题名称:C-语言编译器设计 提交文档学生姓名:李杰 提交文档学生学号:0743041240 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2010年6月10日 课程设计目标 实验建立C-编译器。只含有scanner和parser部分。 分析与设计 (1)实现方法: 编程语言为C语言。 编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。 (2)扫描器: C-惯用的词法 1、语言的关键字:elseifintreturnvoidwhile 2、专用符号:+-*/<<=>>===!==;,()[]{}/**/ 3、其他标记是ID和NUM,通过下列正则表达式定义: ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。 5.注释用通常的C语言符号/*...*/围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 各单词的状态转换图(DFA图如下)词法结构见文件"globals.h"中。 (3)分析器:分析树结构见文件"globals.h"中。 C-的BNF语法如下: (4)代码设计说明: 程序结构:语法分析函数parse通过调用词法分析函数getToken实现语法分析。 文件和函数的设计说明:文件main.c包含相应头文件,及main函数的实现;文件golbals.h包含符号表和分析数的数据结构及在其它文件中使用的变量;文件util.h和util.c实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件scan.h和scan.c实现词法分析,主要函数为getToken;文件parse.h和parse.c实现语法分析,函数为与文法规则对应的函数。 关键数据结构 程序代码实现 文件main.c代码如下: //实验建立C-编译器。只含有scanner和parser部分。 #include"globals.h" #include"util.h" #include"scan.h" #include"parse.h" //全局变量和标志 intlineno=0; FILE*source; FILE*listing; FILE*code; intEchoSource=TRUE; intTraceScan=TRUE; intTraceParse=TRUE; intError=FALSE; intmain(intargc,char*argv[]) { TreeNode*syntaxTree; charpgm[120];//代码文件名 if(argc!=2) { fprintf(stderr,"usage:%sC:\source.c\n",argv[0]); return-1; } strcpy(pgm,argv[1]); if(strchr(pgm,'.')==NULL) {strcat(pgm,".tny");} source=fopen(pgm,"r"); if(source==NULL) { fprintf(stderr,"file%snotfound\n",pgm); return-1; } listing=stdout; fprintf(listing,"\nC-COMPILATION:%s\n",pgm); //while(getToken()!=ENDFILE); EchoSource=FALSE; TraceScan=FALSE; syntaxTree=parse(); if(TraceParse) {fprintf(listing,"\nSyntaxtree\n:"); printTree(syntaxTree); } fclose(source); return0; } 文件globals.h代码如下: #ifndef_GLOBALS_H_ #define_GLOBALS_H_ #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #ifndefFALSE #defineFALSE0 #endif #ifndefTRUE #defineTRUE1 #endif #defineMAXR