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

上传人:文库****9 文档编号:174407035 上传时间:2021-03-16 格式:DOC 页数:49 大小:176.50KB
返回 下载 相关 举报
编译原理课程设计C-语言编译器49页_第1页
第1页 / 共49页
编译原理课程设计C-语言编译器49页_第2页
第2页 / 共49页
编译原理课程设计C-语言编译器49页_第3页
第3页 / 共49页
编译原理课程设计C-语言编译器49页_第4页
第4页 / 共49页
编译原理课程设计C-语言编译器49页_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《编译原理课程设计C-语言编译器49页》由会员分享,可在线阅读,更多相关《编译原理课程设计C-语言编译器49页(49页珍藏版)》请在金锄头文库上搜索。

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

2、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图如下)词法结构见文件globals.h中

3、。(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实现词法分析

4、,主要函数为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=TRUE;int Error

5、=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); return -1; listi

6、ng=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_H_#include #i

7、nclude #include #include #ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif#define MAXRESERVED 6typedef enumENDFILE,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;extern FILE*

8、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 MAXCHILDREN 3typedef st

9、ruct treeNodestruct 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;extern int Error;#endif文件uti

10、l.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 token, const char* toke

11、nString ) 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: fprintf(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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号