编译原理课程设计C-语言编译器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译原理课程设计报告课题名称:C-语言编译器设计提交文档学生姓名:李杰提交文档学生学号:0743041240同组成员名单:无指导教师姓名:金军N不指导教师评阅意见:..提交报告时间:2010年6月10日1.课程设计目标实验建立C-编译器。只含有scanner和parser部分。STARTINNUMdigitINIDletterwhitespaceINASSIN,,=,!digitletterDONE[other][other]other=-*,;[]{}()ZHU/[other]INCOMMENT*otherZZHU*other*/2.分析与设计(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实现语法分析,函数为与文法规则对应的函数。关键数据结构3.程序代码实现文件main.c代码如下://实验建立C-编译器。只含有scanner和parser部分。#includeglobals.h#includeutil.h#includescan.h#includeparse.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_#includestdio.h#includestdlib.h#includectype.h#includestring.h#ifndefFALSE#defineFALSE0#endif#ifndefTRUE#defineTRUE1#endif#defineMAXRESERVED6typedefenum{ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,//关键字ID,NUM,ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,BT,LQ,BQ,UEQ,DOU,LZGH,RZGH,LDGH,RDGH,//特殊字符}TokenType;externFILE*source;externFILE*listing;externFILE*code;externintlineno;//语法分析树typedefenum{Stmtk,Expk}Nodekind;typedefenum{IfK,ElseK,IntK,ReturnK,VoidK,WhileK,AssignK,HanK,HanshutiK}Stmtkind;typedefenum{Opk,Constk,Idk,Vark}Expkind;typedefenum{Void,Integer,Boolean}ExpType;#defineMAXCHILDREN3typedefstructtreeNode{structtreeNode*child[MAXCHILDREN];structtreeNode*sibling;intlineno;Nodekindnodekind;union{Stmtkindstmt;Expkindexp;}kind;union{TokenTypeop;intval;char*name;}attr;ExpTypetype;}TreeNode;externintEchoSource;externintTraceScan;externintTraceParse;externintError;#endif文件util.h代码如下:#ifndef_UTIL_H_#define_UTIL_H_voidprintToken(TokenType,constchar*);//为分析树TreeNode*newStmtNode(Stmtkind);TreeNode*newExpNode(Expkind);char*copyString(char*);voidprintTree(TreeNode*);#endif文件util.c代码如下:#includeglobals.h#includeutil.hvoidprintToken(TokenTypetoken,constchar*tokenString){switch(token){caseIF:caseINT:caseELSE:caseRETURN:caseVOID:caseWHILE:fprintf(listing,reservedword:%s\n,tokenString);break;caseASSIGN:fprintf(listing,=\n);break;caseLT:fprintf(listing,\n);break;caseEQ:fprintf(listing,==\n);break;caseLPAREN:fprintf(listing,(\n);break;caseRPAREN:fprintf(listing,)\n);break;caseSEMI:fprintf(listing,;\n);break;casePLUS:fprintf(listing,+\n);break;caseMINUS:fprintf(listing,-\n);break;caseTIMES:fprintf(listing,*\n);break;caseOVER:fprintf(listing,/\n);break;caseBT:fprintf(listing,\n);break;caseLQ:fprintf(listing,=\n);break;caseBQ:fprintf(listing,=\n);break;caseUEQ:fprintf(listing,!=\n);break;caseDOU:fprintf(listing,,\n);break;caseLZGH:fprintf(listing,[\n);break;caseRZGH:fprintf(listing,]\n);break;caseLDGH:fprintf(listing,{\n);break;caseRDGH:fprintf(listing,}\n);break;caseENDFILE:fprintf(listing,EOF\n);break;caseNUM:fprintf(listing,NUM,val=%s\n,tokenString);break;caseID:fprintf(listing,ID,name=%s\n,tokenString);break;caseERROR:fprintf(listing,ERROR:%s\n,tokenString);break;default:/*shouldneverhappen*/fprintf(listing,Unknowntoken:%d\n,token);}}TreeNode*newStmtNode(Stmtkindkind){TreeNode*p=(TreeNode*)malloc(sizeof(TreeNode));intk;if(p==NULL){fprintf(listing,outofmemoryerroratline%d\n,lineno);}else{for(k=0;kMAXCHILDREN;k++){p-child[k]=NULL;}p-sibling=NULL;p-nodekind=Stmtk;p-kind.stmt=kind;p-lineno=lineno;}returnp;}TreeNode*newExpNode(Expkindkind){TreeNode*p=(TreeNode*)malloc(sizeof(TreeNode));intk;if(p==NULL){fprintf(listing,outofmemoryerroratline%d\n,lineno);}else{for(k=0;kMAXCHILDREN;k++){p-child[k]=NULL;}p-sibling=NULL;p-nodekind=Expk;p-kind.exp=kind;p-lineno=lineno;p-type=Void;}returnp;}char*copyString(char*s){inti;char*p;if(s==NULL){returnNULL;}i=strlen(s)+1;p=malloc(i);if(p==NULL){fprintf(listing,outofmemoryerroratline%d\n,lineno);}else{strcpy(p,s);}returnp;}staticindentno=0;#defineINDENTindentno+=2#defineUNINDENTindentno-=2staticvoidprintSpace(void){intk;for(k=0;kindentno;k++){fprintf(listi

1 / 49
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功