欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:2052359       资源大小:39.14KB        全文页数:59页
    • 资源格式: DOCX        下载积分:1金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要1金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理课程设计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


    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


    收起
    展开