ImageVerifierCode 换一换
格式:DOCX , 页数:59 ,大小:39.14KB ,
资源ID:2052359      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2052359.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理课程设计c语言编译器 1.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译原理课程设计c语言编译器 1.docx

1、编译原理课程设计c语言编译器 1编译原理课程设计报告课题名称: C-语言编译器设计 提交文档学生姓名: 李杰 提交文档学生学号: 0743041240 同组 成 员 名 单: 无 指导 教 师 姓 名: 金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2010年 6 月 10日1.课程设计目标实验建立C-编译器。只含有scanner和parser部分。2.分析与设计(1)实现方法:编程语言为C语言。编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。(2)扫描器:C惯用的词法1、语言的关键字:else

2、if int return void while 2、专用符号:+ - * / = = != = ; , ( ) /* */ 3、其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|94、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套各单词的状态转换图(DFA图如下)词法结

3、构见文件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

4、 和scan.c实现词法分析,主要函数为getToken;文件parse.h 和parse.c实现语法分析,函数为与文法规则对应的函数。关键数据结构3.程序代码实现文件main.c代码如下:/实验建立C-编译器。只含有scanner和parser部分。#includeglobals.h#include util.h#include scan.h#include parse.h/全局变量和标志int lineno=0;FILE*source;FILE*listing;FILE*code;int EchoSource=TRUE;int TraceScan=TRUE;int TraceParse=T

5、RUE;int Error=FALSE;int main(int argc,char*argv) TreeNode*syntaxTree; char pgm120; /代码文件名 if(argc!=2) fprintf(stderr,usage:%s C:source.c n,argv0); return -1; strcpy(pgm,argv1); if (strchr(pgm,.)=NULL) strcat(pgm,.tny); source=fopen(pgm,r); if(source=NULL) fprintf(stderr,file %s not found n,pgm); ret

6、urn -1; listing=stdout; fprintf(listing,n C-COMPILATION: %sn,pgm); / while (getToken()!=ENDFILE); EchoSource=FALSE;TraceScan=FALSE; syntaxTree=parse(); if(TraceParse) fprintf(listing,nSyntax treen:); printTree(syntaxTree); fclose(source); return 0;文件globals.h代码如下:#ifndef _GLOBALS_H_#define _GLOBALS_

7、H_#include #include #include #include #ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif#define MAXRESERVED 6typedef enum 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,/特殊字符 Token

8、Type;extern FILE* source ;extern FILE* listing;extern FILE* code;extern int lineno;/语法分析树typedef enum Stmtk,Expk Nodekind;typedef enum IfK,ElseK,IntK,ReturnK,VoidK,WhileK,AssignK,HanK,HanshutiK Stmtkind;typedef enum Opk,Constk,Idk,Vark Expkind;typedef enum Void,Integer,Boolean ExpType; #define MAXCH

9、ILDREN 3typedef struct treeNode struct treeNode*childMAXCHILDREN; struct treeNode*sibling; int lineno; Nodekind nodekind; union Stmtkind stmt; Expkind exp; kind; union TokenType op; int val; char*name; attr; ExpType type; TreeNode;extern int EchoSource;extern int TraceScan;extern int TraceParse;exte

10、rn int Error;#endif文件util.h代码如下:#ifndef _UTIL_H_#define _UTIL_H_void printToken( TokenType, const char*) ;/为分析树TreeNode*newStmtNode(Stmtkind);TreeNode*newExpNode(Expkind);char*copyString( char*);void printTree( TreeNode*);#endif文件util.c代码如下:#include globals.h#include util.hvoid printToken( TokenType

11、 token, const char* tokenString ) switch (token) case IF: case INT: case ELSE: case RETURN: case VOID: case WHILE: fprintf(listing, reserved word: %sn,tokenString); break; case ASSIGN: fprintf(listing,=n); break; case LT: fprintf(listing,n); break; case LQ: fprintf(listing,=n); break; case UEQ: fpri

12、ntf(listing,!=n); break; case DOU: fprintf(listing,n); break; case LZGH: fprintf(listing,n); break; case RZGH: fprintf(listing,n); break; case LDGH: fprintf(listing,n); break; case RDGH: fprintf(listing,n); break; case ENDFILE: fprintf(listing,EOFn); break; case NUM: fprintf(listing, NUM, val= %sn,t

13、okenString); break; case ID: fprintf(listing, ID, name= %sn,tokenString); break; case ERROR: fprintf(listing, ERROR: %sn,tokenString); break; default: /* should never happen */ fprintf(listing,Unknown token: %dn,token); TreeNode*newStmtNode(Stmtkind kind) TreeNode*p=(TreeNode*)malloc(sizeof(TreeNode

14、); int k; if(p=NULL) fprintf(listing,out of memory error at line %dn,lineno); else for(k=0;kchildk=NULL; p-sibling=NULL; p-nodekind=Stmtk; p-kind.stmt=kind; p-lineno=lineno; return p;TreeNode*newExpNode(Expkind kind) TreeNode*p=(TreeNode*)malloc(sizeof(TreeNode); int k; if(p=NULL) fprintf(listing,ou

15、t of memory error at line %dn,lineno); else for(k=0;kchildk=NULL; p-sibling=NULL; p-nodekind=Expk; p-kind.exp=kind; p-lineno=lineno; p-type=Void; return p;char*copyString( char*s) int i; char*p; if(s=NULL) return NULL; i=strlen(s)+1; p=malloc(i); if(p=NULL) fprintf(listing,out of memory error at lin

16、e %dn,lineno); else strcpy(p,s); return p;static indentno=0;#define INDENT indentno+=2#define UNINDENT indentno-=2static void printSpace(void) int k; for(k=0;knodekind=Stmtk) switch (t-kind.stmt) case IfK: fprintf(listing,Ifn); break; case IntK: fprintf(listing,Intn); break; case VoidK: fprintf(list

17、ing,Voidn); break; case ReturnK: fprintf(listing,Returnn); break; case WhileK: fprintf(listing,Whilen); break; case AssignK: fprintf(listing,Assign to: %sn,t-attr.name); break; case HanK: fprintf(listing,Hanshun); break; case HanshutiK: fprintf(listing,Hanshutin); break; default: fprintf(listing,Unk

18、nown stmt kindn); break; else if(t-nodekind=Expk) switch (t-kind.exp) case Opk: fprintf(listing,Op:); printToken(t-attr.op,0); break; case Constk: fprintf(listing,Const: %dn,t-attr.val); break; case Idk: fprintf(listing,Id: %sn,t-attr.name); break; case Vark: fprintf(listing,Vark: %dn,t-attr.val); b

19、reak; default: fprintf(listing,Unknown exp kindn); break; else fprintf(listing,Unknown exp kindn); for(i=0;ichildi); t=t-sibling; UNINDENT;文件scan.h代码如下:#ifndef _SCAN_H_#define _SCAN_H_#define MAXTOKENLEN 40extern char tokenStringMAXTOKENLEN+1;TokenType getToken(void);#endif文件scan.c代码如下:#includegloba

20、ls.h#include util.h#include scan.h/DFA中的状态typedef enumSTART,INID,INNUM,DONE,INASSIGN,INCOMMENT,ZHU,ZZHU StateType;char tokenStringMAXTOKENLEN+1;#define BUFLEN 256 /代码文件的行数static char lineBufBUFLEN; /保存当前行static int linepos=0; /lineBuf中的当前位置static int bufsize=0; /buffer 串的大小static int EOF_Flag=FALSE;

21、/获取字符从lineBufBUFLEN中static int getNextChar(void) if(!(linepos bufsize) lineno+; /新一行 if(fgets(lineBuf,BUFLEN-1,source) /取新一行 if(EchoSource) fprintf(listing,%4d: %s,lineno,lineBuf); bufsize=strlen(lineBuf); linepos=0; return lineBuflinepos+; /先返回lineBuflinepos,后linepos加1. else EOF_Flag=TRUE; return E

22、OF; else return lineBuflinepos+;/没有取得字符。static void ungetNextChar(void) if(!EOF_Flag) linepos-;/关键字的查找表static struct char* str; TokenType tok; reservedWordsMAXRESERVED= if,IF,else,ELSE,void,VOID,return,RETURN,int,INT,while,WHILE;/关键字的查找static TokenType reserveLookup(char*s) int i; for(i=0;i:1、) f1=1

23、; state=INASSIGN; else if(c=) f1=2; state=INASSIGN; else if(c=) f1=3; state=INASSIGN; else if(c=!) f1=4; state=INASSIGN; else if(c= )|(c=t)|(c=n) save=FALSE; else if (c=/) save=FALSE; state=ZHU; else state=DONE; switch (c) case EOF: save=FALSE; currentToken=ENDFILE; break; case +: currentToken=PLUS;

24、 break; case -: currentToken=MINUS; break; case *: currentToken=TIMES; break; case (: currentToken=LPAREN; break; case ): currentToken=RPAREN; break; case : currentToken=LZGH; break; case : currentToken=RZGH; break; case : currentToken=LDGH; break; case : currentToken=RDGH; break; case ;: currentToken=SEMI; break

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2