毕业设计编译原理设计报告c语言词法与语法分析器的实现

  • 格式:doc
  • 大小:234.50 KB
  • 文档页数:35

下载文档原格式

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

编译原理课程设计报告

课题名称:编译原理课程设计

C-语言词法与语法分析器的实现

提交文档学生姓名:

提交文档学生学号:

同组成员名单:

指导教师姓名:

指导教师评阅成绩:

指导教师评阅意见:

.

.

提交报告时间:年月日

C-词法与语法分析器的实现

1.课程设计目标

(1)题目实用性

C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明

①语言的关键字:

else if int return void while

所有的关键字都是保留字,并且必须是小写。

②专用符号:

+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */

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

ID = letter letter*

NUM = digit digit*

letter = a|..|z|A|..|Z

digit = 0|..|9

注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。

小写和大写字母是有区别的。

④空格由空白、换行符和制表符组成。空格通常被忽略。

⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标

能够对一个程序正确的进行词法及语法分析。

2.分析与设计

(1)设计思想

a.词法分析

词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析

语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。

(2)程序流程图

程序主流程图:

词法分析: 语法分析:

读取程序

对输入的字符进行匹配判断

对应输出各行代码的词法分析结果

读取程序

进行递归下降分析匹配或建立树

输出程序对

应的语法树

Start

是否为num

是否为dight

Num

是否为id

是否为alpha

ID

是否为>,<.,!,=

是否为=

单符号

双符号

是否为+,-,*等专用符号

专用符号

是否为/

是否为*

是否为*

是否为/

错误

结果over

是 否

3.程序代码实现

整个词法以及语法的程序设计在一个工程里面,一共包含了8个文件,分别为main.cpp、parse.cpp、scan.cpp、util.cpp、scan.h、util.h、globals.h、parse.h,其中scan.cpp和scan.h为词法分析程序。

以下仅列出各个文件中的核心代码:

Main.cpp

#include "globals.h"

#define NO_P ARSE FALSE

#include "util.h"

#if NO_PARSE

#include "scan.h"

#else

#include "parse.h"

#endif

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];

scanf("%s",pgm);

source=fopen(pgm,"r");

if(source==NULL)

{

fprintf(stderr,"File %s not found\n",pgm);

exit(1);

}

listing = stdout;

fprintf(listing,"\nC COMPILA TION: %s\n",pgm); #if NO_PARSE

while(getToken()!=ENDFILE);

#else

syntaxTree = parse();

if(TraceParse){

fprintf(listing,"\nSyntaxtree:\n");

printTree(syntaxTree);

}

#endif

fclose(source);

return 0;

}

Parse.cpp

#include "globals.h"

#include "util.h"

#include "scan.h"

#include "parse.h"

static TokenType token; /* holds current token */