布尔表达式的翻译程序设计.docx

上传人:b****1 文档编号:2440841 上传时间:2022-10-29 格式:DOCX 页数:27 大小:296.41KB
下载 相关 举报
布尔表达式的翻译程序设计.docx_第1页
第1页 / 共27页
布尔表达式的翻译程序设计.docx_第2页
第2页 / 共27页
布尔表达式的翻译程序设计.docx_第3页
第3页 / 共27页
布尔表达式的翻译程序设计.docx_第4页
第4页 / 共27页
布尔表达式的翻译程序设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

布尔表达式的翻译程序设计.docx

《布尔表达式的翻译程序设计.docx》由会员分享,可在线阅读,更多相关《布尔表达式的翻译程序设计.docx(27页珍藏版)》请在冰豆网上搜索。

布尔表达式的翻译程序设计.docx

布尔表达式的翻译程序设计

学号:

0120910680328

课程设计

 

题目

布尔表达式的翻译程序设计

学院

计算机学院

专业

软件工程

班级

0903

姓名

陈银

指导教师

何九周

 

2012

1

2

布尔表达式的递归下降翻译程序设计

1引言

“编译原理”是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要的专业基础课。

编译原理这门课程蕴含着计算机学科中解决问题的思路、形式化问题和解决问题的方法,对应用软件和系统软件的设计与开发有一定的启发和指导作用。

“编译原理”是一门实践性较强的课程,要掌握这门课程中的思想,就必须要把所学到的知识付诸实践。

而课程设计是将理论与实践相互联系的一种重要方式。

2概述

2.1设计题目

布尔表达式的递归下降翻译程序设计

2.2设计目的

课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。

通常,设计题中的问题比平时的练习题要复杂,也更接近实际。

编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。

2.3设计任务内容

布尔表达式的文法:

BTB′

B′andTB′|ε

TFT′

T′orFT′|ε

FnotF|true|false|(B)|iropi

设计布尔表达式文法,给出该文法的属性文法,用递归下降分析法实现对布尔表达式的翻译,给出翻译的逆波兰式结果。

3设计环境与工具

VisualC++

4设计原则

4.1基本方法

在本程序中,输入一段布尔语句,使用递归下降的方法得到其推到过程,并利用递归下降翻译的方法的到四元式序列,最终根据生成的四元式序列分析得到逆波兰式。

4.2属性文法

BTB′B’.in=T.type

B′andTB′B’.in=T.typeaddtype(and,entry,B.in)

B′εB’.val=ε

TFTT.in=F.type.

T′orFT′T’.in=F.typeaddtype(or,entry,B.in)

T′εT’val=ε

FnotFF.val=not.F.val

FtrueF.val=true

FfalseF.val=false

F(B)F.val=B.val

FiropiF.val=i.lexvalropi.lexvaladdtype(i,entry,l.in)

5简要的分析与概要设计

在该程序中,总共包括3个主要功能,第一个功能是对输入的布尔语句进行递归下降的分析,从而得出从文法到该布尔语句的推导过程,第二个功能是使用递归下降的方法,该布尔语句的四元式序列,第三个功能对四元式序列进行扫描并分析每个四元式的结构特点,并据此将四元式转化为逆波兰式。

main函数的流程图如下:

在开始进行本次实验中,本来计划在递归下降分析的过程中就得到逆波兰式,但是经过多次尝试之后总是存在错误,所以采用先得到四元式序列,再根据四元式序列生成逆波兰式这种效率比较低的方法。

6详细的算法描述,框图

6.1主要数据结构的设计

四元式类

在该类中,要包含四元式中的四个元素,运算结果,两个运算数以及一个运算符号

classquad

{

public:

charresult[8];

chararg1[8];

charop[8];

chararg2[8];

voidprint()//输出该四元式

{

cout<

}

}q[20];

Word结构体

这个结构体的对要用来存储单个单词,包括一个字符串成员。

structword

{

charw[10];

voidprint()

{

cout<

";

}

}wr[200];

逆波兰式结构体

这个结构体的对象用来存储逆波兰式,它的成员是一个word数组

structnipolan

{

wordnibolan[100];

}n;

翻译器类

用来存储翻译过程中的各个变量以及声明主要的函数:

classinterpreter

{

private:

ifstreamSourceFile;

charbuffercode[200];//存放源码的缓冲区

intsyn;

intcurrent;//buffercode中当前读到的字符下标

chartoken[8];//记录当前读到的单词

public:

voidscaner();

voidB();

voidB1();

voidT();

voidF();

voidT1();

voidrun();

voidread();

voidbolon();

voidtoword();

char*factor();

char*expression();

char*term();

voidbolan();

voidreset()

{

current=0;

};

voidrun1()

{

scaner();

expression();

};

};

源程序:

/*

BTB′

B′andTB′|ε

TFT′

T′orFT′|ε

FnotF|true|false|(B)|iropi

*/

#include

#include

#include

intkk;

inttear=51;

inthead=50;

intnumberoftemp=0;

intnumberofquad=0;

classquad

{

public:

charresult[8];

chararg1[8];

charop[8];

chararg2[8];

voidprint()

{

cout<

}

}q[20];

voidqemit(chara[],charb[],charc[],chard[])

{

strcpy(q[numberofquad].result,a);

strcpy(q[numberofquad].arg1,b);

strcpy(q[numberofquad].op,c);

strcpy(q[numberofquad].arg2,d);

numberofquad++;

}

char*newtemp()

{

char*p;

inttemp=numberoftemp;

p=newchar[8];

p[0]='t';

for(inti=0;;i++)

{

p[++i]=char(temp%10+48);

temp=temp/10;

if(temp==0){p[i+1]='\0';break;}

}

numberoftemp++;

returnp;

};

structword

{

charw[10];

voidprint()

{

cout<

";

}

}wr[200];

structnipolan

{

wordnibolan[100];

}n;

inttcount=0;

intwcount=0;

char*rwtab[9]={"true","not","false","(",")","rop","i","or","and"};

classtuidao

{

public:

chara[10];

charb[10];

charc[10];

chard[10];

voidemit(char*m,char*n,char*p,char*q);

voidprint(){cout<"<

}t[100];

voidtuidao:

:

emit(char*m,char*n,char*p,char*q)

{

strcpy(a,m);

strcpy(b,n);

strcpy(c,p);

strcpy(d,q);

}

classinterpreter

{

private:

ifstreamSourceFile;

charbuffercode[200];

intsyn;

intcurrent;

chartoken[8];

public:

voidscaner();

voidB();

voidB1();

voidT();

voidF();

voidT1();

voidrun();

voidread();

voidbolon();

voidtoword();

char*unit();

char*expression();

char*term();

voidbolan();

voidreset()

{

current=0;

};

voidrun1()

{

scaner();

expression();

};

};

voidbolan()

{

strcpy(n.nibolan[tear].w,q[0].arg1);tear++;

strcpy(n.nibolan[tear].w,q[0].arg2);tear++;

strcpy(n.nibolan[tear].w,q[0].op);tear++;

for(inti=0;i

{

for(intj=i-1;j>=0;j--)

{

if(strcmp(q[i].arg1,q[j].result)==0)

{

if(strcmp(q[i].arg2,q[j+1].result)==0){strcpy(n.nibolan[tear].w,q[i].op);tear++;break;}

else

{

strcpy(n.nibolan[tear].w,q[i].arg2);tear++;

strcpy(n.nibolan[tear].w,q[i].op);tear++;

break;

}

}

if((strcmp(q[i].arg1,q[j].result)!

=0)&&(strcmp(q[i].arg2,q[j+1].result)==0))

{

strcpy(n.nibolan[tear].w,q[i].op);tear++;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1