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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理课程设计报告课题名称: C-语言编译器设计

提交文档学生姓名:李杰

提交文档学生学号:0743041240

同组成员名单:无

指导教师姓名:金军

指导教师评阅成绩:

指导教师评阅意见:

.

.

提交报告时间: 2010年 6 月 10日

1.课程设计目标

实验建立C-编译器。只含有scanner和parser部分。

2.分析与设计

(1)实现方法:

编程语言为C语言。

编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。

(2)扫描器:

C-惯用的词法

1、语言的关键字:else if int r eturn void while

2、专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */

3、其他标记是ID和NUM,通过下列正则表达式定义:

ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9

4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开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部分。

#include"globals.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=FALSE;

int main(int argc,char*argv[])

{

TreeNode*syntaxTree;

char pgm[120]; //代码文件名

if(argc!=2)

{

fprintf(stderr,"usage:%s C:\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 %s not found \n",pgm);

return -1;

}

listing=stdout;

fprintf(listing,"\n C-COMPILA TION: %s\n",pgm); // while (getT oken()!=ENDFILE);

EchoSource=FALSE;

TraceScan=FALSE;

syntaxTree=parse();

if(TraceParse)

{ fprintf(listing,"\nSyntax tree\n:");

printTree(syntaxTree);

}

fclose(source);

return 0;

}

文件globals.h代码如下:

#ifndef _GLOBALS_H_

#define _GLOBALS_H_

#include

#include

#include

#include

#ifndef FALSE

#define FALSE 0

#endif

#ifndef TRUE

#define TRUE 1

#endif

#define MAXRESERVED 6

typedef 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,//特殊字符

} TokenType;

extern FILE* source ;

extern FILE* listing;

extern FILE* code;

extern int lineno;

//语法分析树

typedef enum {Stmtk,Expk} Nodekind;

typedef enum {IfK,ElseK,IntK,ReturnK,V oidK,WhileK,AssignK,Han K,HanshutiK} Stmtkind; typedef enum {Opk,Constk,Idk,V ark} Expkind;

typedef enum {V oid,Integer,Boolean} ExpType;

#define MAXCHILDREN 3

typedef struct treeNode

{

struct treeNode*child[MAXCHILDREN];

struct treeNode*sibling;

int lineno;

Nodekind nodekind;

相关文档
最新文档