如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
编译原理课程设计报告课题名称:C-语言编译器设计提交文档学生姓名:李杰提交文档学生学号:0743041240同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2010年6月10日课程设计目标实验建立C-编译器。只含有scanner和parser部分。分析与设计(1)实现方法:编程语言为C语言。编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。(2)扫描器:C-惯用的词法1、语言的关键字:elseifintreturnvoidwhile2、专用符号:+-*/<<=>>===!==;,()[]{}/**/3、其他标记是ID和NUM,通过下列正则表达式定义:ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|94、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开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