文档介绍:编译原理课程设计报告
课题名称: C-语言编译器设计
课程设计目标
实验建立C-编译器。只含有scanner和parser部分。
分析与设计
(1)实现方法:
编程语言为C语言。
编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。
(2)扫描器:
C-惯用的词法
1、语言的关键字:else if int return 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图如下)词法结构见文件""中。
(3)分析器:分析树结构见文件""中。
C-的BNF语法如下:
(4)代码设计说明:
程序结构:语法分析函数parse通过调用词法分析函数getToken实现语法分析。
文件和函数的设计说明:,及main函数的实现;; ,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString; ,主要函数为getToken; ,函数为与文法规则对应的函数。
关键数据结构
程序代码实现
:
//实验建立C-编译器。只含有scanner和parser部分。
#include""
#include ""
#include ""
#include ""
//全局变量和标志
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:\ \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 PILATION: %s\n",pgm);
// while (getToken()!=ENDFILE);
EchoSource=FALSE;
TraceScan=FALSE;
syntaxTree=parse();
if(TraceParse)
{ fprintf(listing,"\nSyntax tree\n:");
printTree(syntaxTree);
}
fclose(source);
return 0;
}
:
#ifndef _GLOBALS_H_
#define _GLOBALS_H_
#include <>
#include <>
#include <>
#include <>
#ifndef FALSE