编译原理课程设计C-语言编译器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;