编译原理课程设计-For语句的翻译程序设计(简单优 先法、输出三地址码)

编译原理课程设计-For语句的翻译程序设计(简单优 先法、输出三地址码)
编译原理课程设计-For语句的翻译程序设计(简单优 先法、输出三地址码)

课程设计

课程编译原理

题目For语句的翻译程序设计(简单优

先法、输出三地址码)

学院计算机科学与技术学院

专业计算机科学与技术

班级计算机1404

姓名王承禹

指导教师林泓

2016 年12 月27 日

目录

1 系统描述 (2)

1.1设计目的 (2)

1.2设计内容描述 (2)

2 文法及属性文法的描述 (2)

3 语法分析方法描述及语法分析表设计 (3)

3.1语法分析方法描述 (3)

3.2分析法操作步骤 (4)

3.3优先关系矩阵 (5)

4 中间代码形式的描述及中间代码序列的结构设计 (5)

4.1中间代码形式 (5)

5 编译系统的概要设计 (6)

5.1数据结构 (6)

5.2模块设计 (6)

5.2.1词法分析模块 (7)

5.2.2语法、语义分析模块 (7)

5.2.3主控模块 (11)

6 详细的算法描述 (11)

6.1词法分析算法 (11)

6.2语法分析算法 (12)

6.3语义分析算法 (12)

7 软件的测试方法和测试结果 (13)

8 本设计的评价、特点、 (14)

9 收获与体会 (14)

10 核心代码 (16)

成绩评定表 (27)

For语句的翻译程序设计

(简单优先法、输出三地址码)

1 系统描述

1.1设计目的

通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。

1.2设计内容描述

FOR循环语句的基本格式如下:

FOR i=E step E until E do Stmt

根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。

2 文法及属性文法的描述

根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:

F1 -> for i = E1

{emit(entry(i) , ' = ' , E1.place);

F1.place = entry(i);/*保存控制变量在符号表中的位置*/

F1.chain = nextstat;

emit('goto'--);/*goto OVER*/

F1.codebegin = nextstat;/*保存AGAIN的地址*/}

F2 -> F1 step E2

{F2.codebegin = F1.codebegin;

F2.place = F1.place;

emit(F1.place '=' E2.place '+' F1.place);

backatch(F1.chain,nextstat);}

F3 -> F2 until E3

{F3.codebegin = F2.codebegin;

q = nextstat;

emit('if' F2.place, '<=' E3.place, 'goto' q+2);

/*若i<=E3 转去执行循环体的第一个三地址码*/

F3.chain = nextstat;

emit('goto'--)/*转离循环*/}

S -> F3 do Stmt

{emit ('goto' F3.codebegin)/*goto AGAIN*/

backpatch(Stmt.chain,F3.codebegin);

Stmt.chain = F3.chain/*转离循环的转移目标留待外层S时再回填*/}

3 语法分析方法描述及语法分析表设计

3.1语法分析方法描述

本次课内实践要求使用简单优先关系方法。

简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。一个文法是简单优先文法必须满足以下条件

(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;

(2)在文法中任意两个产生式没有相同的右部。

三种优先关系及其判定方法如下所示:

(1)X=Y 表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;

(2)X

A→…XB…,且B Y…;

(3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则

A→…BD…,且B…X和D Y…;

(4)对任何X,若文法开始符号S→X…,则##。

3.2分析法操作步骤

(1)由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号数组S:

(2)将输入符号串a1a2…an # 依次逐个保存符号数组S中,直到遇到数组中第一个符号ai的优先性>下一个待输入符号aj为止。

(3)数组当前符号ai为句柄尾,由此向左在数组中找句柄的头符号ak,即找到ak-1

由句柄ak…ai在文法的产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。

重复(1)(2)(3),直到归约完输入符号串,数组中只剩文法的开始符号为止。

3.3优先关系矩阵

4 中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式

三地址码是由下面一般形式的语句构成的序列:

x:=y op z

其中,xyz为名字、常数或变量;op代表运算符。

对于本程序的具体三地址码输出,预计显示结果如下:给定输入程序for i=0 step 1 until 10 do {j=b+c;} 三地址码输出为

<1> i=0

<2> goto <5>

<3> i++

<4> if i<10 goto<5> else goto<7>

<5> j=b+c

<6> goto<3>

<7> end

5 编译系统的概要设计

5.1数据结构

单词种别:

struct Token

{

//单词种别

int num;

//词素(单词的值)

string lexeme;

};

产生式结构:

struct Term

{

//1为状态,2为产生式

int kind;

//如果是状态保存格子里的内容

string action;

};

5.2模块设计

本系统分为四大模块:词法分析模块、语法分析模块、语义分析模块以及主控模块,其中主控模块负责协调前三个模块。词法分析模块为语法分析模块以及语义分析模块提供单词序列。

5.2.1词法分析模块

void LexicalScanner()

{

//词法分析

FILE *fp;

char ch;

errno_t _err2 = fopen_s(&fp, "d:\\123.txt", "rb");

if (fp == NULL)

//取当前目录下的tk.txt文件的第一个字符

{

fprintf(stderr, "error opening!\n");

//格式化输出到流

//错误打印到屏幕上

exit(1);

}

do{

ch = fgetc(fp);

if (ch == '$')

break;

//作为文件结尾

else if (ch == ' ')

scanner(fp);

//空格略过

else

{

fseek(fp, -1, 1);

scanner(fp);

}

//扫描

} while (ch != '$');

strings[arrTop] ="(1,$)";

}

5.2.2语法、语义分析模块

void Semantic()

{

Token t1;

t1.lexeme ="#";

t1.num = 100;

tokens[tokenTop] = t1;

for (int i = 0;i < 20;i++)

{

cout << tokens[i].lexeme <<" ";

}

cout << endl;

string product1 = "fori=E1";

string product2 = "F1stepE2";

string product3 = "F2untilE3";

string product4 = "F3doS1";

stack tokenStack;

for (int i = 0;i < 15;i++)

{

for (int j = 0;j < 15;j++)

{

priorityTable[i][j] = 2;

}

}

tokenStack.push("#");

map_.insert(map::value_type("S", 0)); map_.insert(map::value_type("F1", 1)); map_.insert(map::value_type("F2", 2)); map_.insert(map::value_type("F3", 3)); map_.insert(map::value_type("for", 4)); map_.insert(map::value_type("step", 5)); map_.insert(map::value_type("until", 6)); map_.insert(map::value_type("do", 7)); map_.insert(map::value_type("i", 8)); map_.insert(map::value_type("=", 9)); map_.insert(map::value_type("E1", 10)); map_.insert(map::value_type("E2", 11)); map_.insert(map::value_type("E3", 12)); //map_.insert(map::value_type("#", 13)); map_.insert(map::value_type("S1", 13)); map_.insert(map::value_type("#", 14));

priorityTable[map_["for"]][map_["i"]] = 0; priorityTable[map_["i"]][map_["="]] = 0;

priorityTable[map_["="]][map_["E1"]] = 0;

priorityTable[map_["F1"]][map_["step"]] = 0; priorityTable[map_["step"]][map_["E2"]] = 0; priorityTable[map_["F2"]][map_["until"]] = 0; priorityTable[map_["until"]][map_["E3"]] = 0; priorityTable[map_["F3"]][map_["do"]] = 0; priorityTable[map_["do"]][map_["S1"]] = 0;

priorityTable[map_["do"]][map_["F3"]] = -1;

priorityTable[map_["do"]][map_["F2"]] = -1;

priorityTable[map_["do"]][map_["F1"]] = -1;

priorityTable[map_["do"]][map_["for"]] = -1;

priorityTable[map_["#"]][map_["S"]] = -1;

priorityTable[map_["#"]][map_["F1"]] = -1;

priorityTable[map_["#"]][map_["F2"]] = -1;

priorityTable[map_["#"]][map_["F3"]] = -1;

priorityTable[map_["#"]][map_["for"]] = -1;

priorityTable[map_["E1"]][map_["step"]] = 1;

priorityTable[map_["E2"]][map_["until"]] = 1;

priorityTable[map_["E3"]][map_["do"]] = 1;

priorityTable[map_["S"]][map_["#"]] = 1;

for (int i = 0;i < 15;i++)

{

for (int j = 0;j < 15;j++)

{

cout << priorityTable[i][j]<<" ";

}

cout << endl;

}

int i = 0;

while (strcmp("#",tokens[i].lexeme.c_str())!=0)

{

while (priorityTable[map_[tokenStack.top()]][map_[tokens[i].lexeme.c_str()]]<1)

{

tokenStack.push(tokens[i].lexeme);

//cout << tokenStack.top() << endl;

i++;

}

if

(priorityTable[map_[tokenStack.top()]][map_[tokens[i].lexeme.c_str()]]==2&&!strcmp(tokens[i].lexem e.c_str()," "))

{

cout <<"error"<< endl;

system("pause");

//error

}

else

{

//cout << "enter" << endl;

string tempStr = "";

string top = tokenStack.top();

tempStr = tokenStack.top() + tempStr;

tokenStack.pop();

while (priorityTable[map_[tokenStack.top()]][map_[top]]==0)

{

top = tokenStack.top();

tempStr = top + tempStr;

tokenStack.pop();

//cout << tempStr << endl;

}

if (priorityTable[map_[tokenStack.top()]][map_[top]] == 2)

{

//error

cout <<"error2"<< endl;

system("pause");

}

else

{

if (!strcmp(tempStr.c_str(), product1.c_str()))

{

tokenStack.push("F1");

cout <<"i=E1"<< endl;

cout <<"goto OVER"<< endl;

}

if (!strcmp(tempStr.c_str(), product2.c_str()))

{

tokenStack.push("F2");

cout <<"AGAIN:i=i+E2"<< endl;

}

if (!strcmp(tempStr.c_str(), product3.c_str()))

{

tokenStack.push("F3");

cout <<"OVER: if i

}

if (!strcmp(tempStr.c_str(), product4.c_str()))

{

tokenStack.push("S");

cout <<"begin S1;"<< endl <<"goto AGAIN end;"<< endl;

}

}

//cout << tempStr << endl;

}

//tokenStack.push(tokens[i].lexeme);

//i++;

}

}

5.2.3主控模块

int main()

{

File.open("d:\\1233.txt", ios::out);

//词法分析

LexicalScanner();

//词法分析完成后会将Token序列输出到中间文件

//语法分析

SyntaxScanner();

//语义分析

Semantic();

File.close();

cout << translation << endl;

return 0;

}

6 详细的算法描述

6.1词法分析算法

6.2语法分析算法

6.3语义分析算法

语法分析与语义分析同步完成,在规约的过程中,每使用一个产生式则调用其对应的动作

7 软件的测试方法和测试结果

编译调试环境:Visual Studio 2015 Community 程序语言:C++

测试用例:

采用如下形式双重循环作为测试用例之一

首先输出的是词法分析结果:

然后是语法以及语义分析结果:

8 本设计的评价、特点、

本系统可以完成Fortran语言的For语句的语法制导翻译,在词法分析的基础上先后进行语法分析和语义分析。

在完成这些功能的基础上,我认为此系统仍然不能算一个合格的产品,还有很多需要改进之处。例如,词法分析可以进一步改进成为词法分析器的自动生成器。语法分析和语义分析也应改为自动生成简单优先文法生成器。

特点:本系统可以完成Fortran语言的子集(For语句)的制导翻译,但是没有优化过程,符号表的控制也很简单,很多代码采用了硬编的方法,改变文法将导致巨大的工作量。因此本系统的一大特点是不易扩展和变更。

9 收获与体会

经过这次课内实践,使我更加扎实的掌握了有关编译原理方面的知识,在编写程序的过程中遇到了许多问题,但经过一遍遍的调试终于使得程序可以顺利运行。但是程序中存在着很大的不足:程序可扩展性差。

过而能改,善莫大焉。在课内过程中,我不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课内实践终于顺利完成了,在设计中遇到了很多问题,最后终于游逆而解。在今后发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上

【教学】For循环语句

【关键字】教学 《F o r循环语句》教学设计 池州市第八中学杜亦麟 课题 For循环语句 教学内容 粤教版信息技术(选修1)《算法与程序设计》第二章《程序设计根底》第四节《程序的循环结构》第一小节《For循环语句》 教学目标 知识与能力: 1.理解循环结构的基本思想及For语句的执行过程。 2.培养和提高学生逻辑思维能力,使其可以独立完成简单循环结构算法的设计。 3.能够利用For循环语句实现循环结构,解决实际问题。 过程与方法: 1.通过简单的数学问题的分析、讲解,让学生掌握For循环语句语法知识,及其执行原理。 2.以任务驱动,学生分组合作探究的方式,进一步让学生理解For循环语句的基本思想,同时培养学生自主探究和合作学习的能力。 3.通过自评和互评活动,培养学生语言表达能力和归纳总结能力。 情感态度与价值观: 1.提高学生学习兴趣,培养学习的主动性和探究性。 2.培养学生团结协作精神,体验成功的快乐。 教学重点 1.掌握For循环语句的格式和功能; 2.理解For循环语句的执行过程。 教学难点 控制循环的条件、确定循环体的内容 教材分析 第二章是程序设计根底,也是全书的根底。它沿着分析问题、设计算法、编写程序等运用计算机解决问题之路,开始学习如何使用VB程序设计编写程序解决问题。本节课的主要内容For语句的基本格式、执行过程及语句的实际应用。又是本章的重点和难点内容。而循环结构是程序设计的三种基本结构之一,其作用是使一段程序反复执行。For循环语句在程序设计中频繁出现,也是三种结构中较难的一种,因此,学好本节课非常重要,本节课的学习会使学生对算法有一个更深刻的理解,为以后的程序设计打下一个良好的根底,也可以培养学生的创新能力、分析问题和解决问题的能力以及探究精神。 学生分析 1、知识储备根底 在前面的学习中,同学们已经初步掌握了VB编程环境和VB程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)

课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日

FOR循环语句的翻译程序设计

目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17)

FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程

IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2

IF-ELSE条件语句的翻译程序设计 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n

3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规 则的形式为:b:=f(c 1,c 2 ,…,c k )其中f是一个函数,而且或者①b是A的一个综合属性 并且c 1,c 2 ,…,c k 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有 继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: if(VT[opr]=='=') //{"="判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{">"判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; }

c语言for循环的嵌套题(含解析和答案)

第33、34课时for循环的嵌套 实验题一: 1、下面有关for循环的正确描述是: D A) for循环只能用于循环次数已经确定的情况 B) for循环是先执行循环体语句,后判断表达式 C) 在for循环中,不能用break语句跳出循环体 D) for循环的循环体语句中, 可以包含多条语句,但必须用花括号括起来 2、对for(表达式1;;表达式3)可理解为:B A) for(表达式1; 0;表达式3) B) for(表达式1;1;表达式3) C) for(表达式1;表达式1;表达式3) D) for(表达式1;表达式3;表达式3) 3、若i为整型变量,则以下循环执行次数是:B for (i=2;2==0;) printf("%d",i-- ); A)无限次B) 0次 C) 1 次 D) 2次 4、以下for循环的执行次数是:C for (x=0,y=0; (y=123)&&(x<4); x++) ; A)是无限循环 B)循环次数不定C)执行4次 D)执行3次

成立,x++x=2 第三次:(y=123)&&(2<4)成立,x++x=3 第四次:(y=123)&&(3<4)成立,x++x=4 第五次:(y=123)&&(4<4)不成立,退出循环。 5、以下不是无限循环的语句为:A A) for (y=0,x=1;x > ++y;x =i++) i=x ; B) for (;1; x++=i); C) while (1) {x ++;} D) for(i=10;1 ;i--) sum+=i; 6、下面程序段的运行结果是:C for (y=1;y<10;) y=((x=3* y,x+1),x-1); printf ("x=%d,y=%d",x,y); A)x=27,y=27 B)x=12,y=13 C)x=15,y=14 D)x=y=27 第一次:1<10为真,x=3,x+1=3+1=4, y=(4,x-1) y=(4,2)=2 第二次: 2<10为真, x=3*2=6,7 y=(7,x-1)=(7,5) y=5 第三次:5<10为真,x=3*5=15 16 y=(16,x-1)=(16,14) y=14 第四次: 14<10为假,

DO-WHILE循环语句的翻译程序设计

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日

DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述

JavaScript流程控制语句

第5章流程控制语句 JavaScript程序是由若干个语句组成的,每一个语句以分号作为结束符。语句可以很简单,也可以很复杂。其中,改变程序正常流程的语句称为控制语句。流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中基本却又非常关键的部分。流程控制语句可以把单个语句组合成有意义的、能完成一定功能的小逻辑模块。本章内容包括: ?顺序控制语句; ?选择控制语句; ?循环控制语句; ?其他流程控制语句。 通过本章学习,读者应该对几种流程控制语句有很深的理解,并可以利用这几种流程控制语句编写简单的程序。 5.1 顺序控制语句 JavaScript语言中,顺序控制语句是最简单的语句。其有如下特点:所有语句按照一定的顺序执行,每一条语句只执行一遍,不重复执行,也没有语句不执行。JavaScript语言中的顺序控制语句包括表达式语句,函数调用语句,空语句和复合语句等。 5.1.1 表达式语句 表达式后面跟一个分号就构成了一个表达式语句。最常见的表达式语句为赋值语句。赋值语句是在一个赋值表达式后跟一个分号形成的,程序中很多计算都由赋值语句完成。 【示例5-1】演示几个表达式语句。其代码如下所示。 var m=4; //把4赋给变量m var n=”hello world”; //把字符串hello world赋值给n i=m+n; //把变量m和n的和赋值给变量i 实际上,任何表达式都可以加上分号而成为语句。 【示例5-2】变量i自增1。 i++; //变量i的值加1 注意:有些语句写法虽然是合法的,但是由于其没有保留计算结果,因而并没有实际意义。如以下代码: a-b; i++-1;

for循环语句的翻译

课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日

for循环语句

for循环语句 for循环语句也称为计次循环语句,一般用于循环次数已知的情况。例如,要计算1到100之间所有整数的和,就可以使用for循环语句。具体代码如下: int sum=0; for(int i=1;i<=100;i++){ sum+=i; } System.out.println("1到100之间所有整数的和是: "+sum); 在对for循环语句有一个初步的认识后,下面给出for循环语句的语法格式。for循环语句的语法格式如下: for(初始化语句;循环条件;迭代语句){ 语句序列 } 初始化语句:为循环变量赋初始值的语句,该语句在整个循环语句中只执行一次。 循环条件:决定是否进行循环的表达式,其结果为boolean类型,也就是其结果只能是true或false。 迭代语句:用于改变循环变量的值的语句。 语句序列:也就是循环体,在循环条件的结果为true时,重复执行。 说明: for循环语句执行的过程是:先执行为循环变量赋初始值的语句~然后判断循环条件~如果循环条件的结果为true~则执行一次循环体~否则直接退出循环~最

后执行迭代语句~改变循环变量的值~至此完成一次循环,接下来将进行下一次循环~直到循环条件的结果为false~才结束循环。 for循环语句的执行过程如图1所示。 初始化语句 N循环条件 Yfor(初始化语句;循环条件;迭代语句) 语句序列(循环体) 语句序列(循环体) 执行迭代语句 改变循环变量的值 N-S结构化流程图 传统流程图 图1 for循环语句的执行流程图 注意: 在使用for语句时~一定要保证循环可以正常结束~也就是必须保证循环条件的结果存在为false的情况~否则循环体将无休止的执行下去~从而形成死循环。例如~下面的循环语句就会造成死循环~原因是i永远大于等于1。 for(int i=1;i>=1;i++){ System.out.println(i); } 为了使读者更好的理解for语句,下面将以一个具体的实例介绍for语句的应用。本实例主要实现计算100以内所有奇数的和。具体步骤如下。 (1)选择“开始”/“所有程序”/“附件”/“记事本”命令,打开一个无标题的记事本文档。

程序流程控制语句

程序流程控制语句:选择语句 https://www.360docs.net/doc/ff5563579.html,网站制作 2011年9月1日 Java语言中的程序流程控制语句有三种:顺序结构、选择结构和循环结构。其中顺序结构最简单,程序依次执行各条语句。Java的每条语句一般以分号(“;”)作为结束标志。所以本章重点讲解选择结构和循环结构。 1、选择语句 在程序设计时,经常需要使用选择结构在程序中完成逻辑判断和选择功能,这就需要使用到选择语句。Java中的选择语句包括if语句、if-else语句和switch语句。选择语句用来控制选择结构,对选择条件进行判断,并根据判断结果选择要执行的程序语句,改变程序执行流程。 2、if选择语句 在实际生活中,经常会需要做一些逻辑判断,并根据逻辑判断结果做出选择。例如,当一个男孩子向一个非常理智的女孩子求婚时,这个女孩子思考的逻辑可能是这样的: 如果你有100万 那么,我就嫁给你!

在这里,女孩子嫁给男孩子这个过程的实施,必须以“你有一百万”为前提。只有逻辑判断“你有一百万”这一前提条件为真时,“那么,我就嫁给你!”这个行为才能得到执行。在生活当中,类似这样的情形是很常见的。 相应地,在Java程序设计语言中,也有相应的条件语句来完成类似的逻辑判断和有选择地执行这样的功能,这就是if语句。if语句的语法格式如下: if(条件表达式) 语句 或者 if(条件表达式){ 一条或多条语句 } if语句执行的过程如下: 1.对if后面括号里的条件表达式进行判断。 2.如果条件表达式的值为true,就执行表达式后面的语 句或后面大括号里的多条语句。 3.如果条件表达式的值为false,则跳过if语句,执行 下一条语句。

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将

文法的产生式保存,设置符号栈S,步骤如下: (1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。 (2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1

WHILE循环语句的翻译程序设计.

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示) 1 系统描述 按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。 该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。词法分析器应能识别关键字,标示 符,常量,操作符等。 该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。 该程序的语义分析器就是对分析结果进行输出,要求输出结果是 三地址形式的。 2 文法及属性文法的描述 2.1文法描述 语句 > ::= while (< 条件表达式 > (< 赋值语句 > | 语句 > <条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数> <标识符> ::= <字母> (<字母>|<数字> <条件运算符> ::= > | < | = <无符号整数> ::= <数字>(<数字>

<赋值语句> ::= <标识符>=(<标识符> | <数字> <算术运算符> (<标识符> | <数字> <算术运算符> ::= + | - | * | / <赋值语句> ::= <标识符>=<标识符> | <数字> 2.2递归文法 while语句文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> E+E | E-E | E*E | E/E | (E | i | n 在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得 到如下的递归文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> (E F | iF | nF F -> +EF | -EF | *EF | /EF | ε 2.3属性文法的描述 产生式属性文法 S -> while (B S1S.begin:=newlabel;

流程控制结构

流程控制结构 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

(单元教案首页) 单元标题第3章流程控制结构 教学时数:()学时,其中理论()学时、实验()学时、上机()其它()学时,其它是指: 教学目的与要求: 1.理解程序的的三大控制结构。 2.掌握选择结构实现语句的用法编程应用 3.掌握循环结构实现语句的用法及其编程应用。 4.理解并掌握各种跳转语句的使用方法。 主要教学内容: 1.程序的控制结构:顺序、选择、循环。 2.选择结构语句:if语句(两种格式)和switch语句、程序举例。 3.循环结构语句:for语句、while、语句、do-while语句、三种循环语句的互相转化、程序举例。 4.控制结构跳转语句:break语句、continue语句、return语句 教学重点与难点: 重点:if语句、switch语句、for语句、while语句、do-while语句 难点: switch语句、选择结构编程应用、循环结构编程应用、跳转语句的编程应用课后作业: 1.课本P66 综合练习三:第一题~第四题 2.上机实习:实习3:Java流程控制 课后体会:

兰州资源环境职业技术学院教师授课教案

—————————————————————— 第3章流程控制结构 一、本章主要内容: 本章主要讲述Java程序的基本控制结构和控制语句,使得学生能利用这三种结构来解决一些比较复杂的问题。 Java程序的基本控制结构有三种:顺序结构、选择结构、循环结构。 二、具体授课内容: 概述 选择结构 循环结构 跳转语句 三、本章授课思路: 1. 回顾C语言中结构化程序设计方法所所用的程序三大控制结构(顺序结构、选择结构、循环结构)语法知识,以复习回顾的方式引入讲解Java语言的程序控制结构知识(和 C语言用法一致),学生易于理解记忆。 2.具体讲解选择结构(if、switch)和循环结构语法(while、for、do-while)及其编程用法的典型程序编写举例,使学生理解掌握Java语言中控制结构的使用特点及编程技巧。 将两种输入数据的编程方法融入到控制结构用法的编程举例的程序中,使学生对输入数据方法的能够有一定的理解掌握和编程使用,结合在后续第4章面向对象的程序设计的方法的具体学习中再加强理解和掌握。 4.课堂上通过练习和讲解第3章课后习题,加强和巩固学生对所学知识的理解和掌握使用。

WHILE循环语句的翻译程序设计课设报告

1.题目:将WHILE语句转换成四元式的程序实现 设计内容及要求:设计一个语法制导翻译器,将WHILE语句翻译成四元式。要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的WHILE语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。 1、系统描述 通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法 及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。用语法 制导完成语义分析,并将形成的中间代码以四元式的形式输出。 2 、文法及属性文法的描述 。 2.1 文法的描述 该文法的产生式如下所示: (1)S->while(B){E} (2)E->AE (3)E->A (4)A->iPA (5)A->i (6)B->iTi & (7)B->i 其中while、( 、) 、{ 、} 、P、T 、;和i均为终结符,而S、A、B、E这些大写字母均为非终结符。T表示比较运算符,P表示算术运算符,i表示合法标识符。 2.2 属性文法的描述 对该文法的属性文法描述如下: (1) S->while(B){E} prinf(if B goto E else goto next) (2) E->AE print = · (3) E->A print =

(4) A->i P A print(A= P (5) A->i; = i; (6) B->i T i print(B = T (7) B->i = i 3 、语法分析方法描述及语法分析表设计 | 3.1 语法分析表设计 3.1.1 文法的DFA

兼语句

兼语句 ●林秀琴 你发现没有,在生活里一个人可以身兼不同的角色,比如你的妈妈,她既是你的妈妈,也是你爸爸的妻子,又是你外婆的女儿,还是你姨的姐妹。再比如你自己,你是你妈妈的孩子,又是你老师的学生,还是你弟弟的哥哥。有意思吧?汉语的句子也有这样的能力。有时候,一个句子中有一个部分,既是主语,又是宾语,它身兼两种角色,具有两个能力,这种句子就叫“兼语句”。比如“朋友请我看电影”这个句子,“朋友”“请”的是“我”,谁“看电影”呢?也是“我”,——“我”是前边主语的宾语,又是后边谓语的主语,就好像你是你妈妈的孩子、你弟弟的哥哥一样。 有点复杂,是不是?没关系,聪明的你,学习以后就明白了。 1、表示使令意义(英文翻译)的兼语句 汉语里有一类词表示让别人做什么,我们说这类词具有使令意义,如“请、让、叫、要求、同意、派、邀请、约”。 (1)肯定式(请加英文) 主语+动词1+兼语+动词2+宾语 朋友请我去看电影。 妈妈让我快写作业。

老师叫我去他的办公室。 老板要求他三点到公司。 (2)否定式(英文) 主语+不/没+动词1+兼语+动词2+宾语 妈妈不同意我去中国。 他没邀请汤姆参加生日晚会。 老板没派他去纽约。 2、第一个动词是“有”的兼语句 (1)肯定式(请加英文) 主语+ 有+ 兼语+ 谓语(动词/形容词) 我有一个朋友去中国留学了。 我有一个同学很幽默。 (2)否定式(英文) 主语+ 没有+ 兼语+ 谓语(动词/形容词) 那个学校没有人会说中文。 我们班没有人去打球。 3、第一个动词是表示喜好意义的兼语句 主语+(不)动词1+兼语+动词/形容词 老师夸我很聪明。 我喜欢他很幽默。 我讨厌他总开玩笑。 我不喜欢他总迟到。

第六课for循环语句

第六课for循环语句 在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。 一、for语句的一般格式 for <控制变量>:=<表达式1> to <表达式2> do <语句>; for <控制变量>:=<表达式1> downto <表达式2> do <语句>; 其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值也称为初值和终值。 二、For语句执行过程 ①先将初值赋给左边的变量(称为循环控制变量); ②判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤⑥; ③如果末超过终值,则执行do后面的那个语句(称为循环体); ④循环变量递增(对to)或递减(对downt o)1; ⑤返回步骤②; ⑥循环结束,执行for循环下面的一个语句。 三、说明 ①循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。 ②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。 ③所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。 ④循环体可以是一个基本语句,也可以是一个复合语句。 ⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。 ⑥for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 四、应用举例

编译原理报告for循环语句的翻译程序

学号:0120810680326 课程设计 题目f or循环语句的翻译程序 学院计算机学院 专业软件工程 班级0803 姓名徐泽前 指导教师何九周 2011 年 6 月日

目录 1设计目的 (4) 2设计环境与工具 (4) 3设计任务要求与说明 (4) 4设计时间 (4) 5设计地点 (4) 6系统描述 (4) 7文法及属性文法的描述 (5) 7.1文法描述 (5) 7.1.1 FOR语句相关的产生式: (5) 7.1.2 布尔表达式: (5) 7.1.3 赋值表达式: (5) 7.2属性文法的描述 (5) 8 语法分析方法描述及语法分析表设计 (7) 8.1语法分析方法描述 (7) 8.2系统中使用的action和goto表(见附录1) (9) 9 给出中间代码形式的描述及中间代码序列的结构设计 (9) 10简要的分析与概要设计 (10) 11 详细的算法描述 (11) 11.1词法分析的数据结构设计与详细的流程图 (11) 11.2词法分析流程图 (11) 11.3语法制导翻译的数据结构与详细的设计图 (12) 11.3.1数据结构的设计 (12) 11.3.2算法描述 (13) 11.3.3程序流程图 (13) 12给出软件的测试方法和测试结果 (14) 12.1 FOR循环语句的测试 (14) 12.2词法分析出错处理 (15) 12.3语法分析出错处理 (16) 13收获与体会 (16) 14 参考文献 (17)

课程设计任务书 学生姓名:徐泽前专业班级:软件0803班 指导教师:何九周工作单位:计算机学院 题目: for循环语句的翻译程序 初始条件: 程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。算法:可以根据《编译原理》课程所讲授的算法进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求) 1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会 设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。 2.主要功能包括:利用算符优先分析方法和思想对某些语句进行语法分析与语义分析,生成相 应的中间代码。正确运用语法规则,并能应用所学的方法解决存在的问题。语法分析方法及中间代码形式的描述、文法和属性文法的设计。 2.进行总体设计,详细设计:包括算法的设计和数据结构设计。系统实施、调试,合理使用出错 处理程序。 3.设计报告:要求层次清楚、整洁规范、不得相互抄袭。正文字数不少于0.3万字。包含内容: ①课程设计的题目。 ②目录。 ③正文:包括引言、需求分析、总体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收获与体会等。 ④结束语。 ⑤参考文献。 ⑥附录:软件清单(或者附盘)。 时间安排: 消化资料、系统调查、形式描述1天 系统分析、总体设计、实施计划3天 撰写课程设计报告书1天 指导教师签名: 2010年 6月 11日 系主任(或责任教师)签名: 2010年 6月 11日

For循环语句

五、For循环语句 有时候需要处理的是反复进行的工作,这时候使用循环语句是很好的方法,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'xun huan for i= 1 to 10 print i; next print for i= 1 to 10 s= s+ i next print " s="; s end 2)for循环包括三行,第一行是循环条件,i=1 to 10表示从1到10,这样就会循环10次; 中间一行是执行的语句,每循环一次,就执行一下这一句, 第三行next表示继续,这时候i会自动加1,然后回到第一行去判断是否超过了循环条件; 3)第二个循环中的s=s+i是累加运算,就像盖楼房一样,一层一层往上加,这样s就会存上每次相加的和; 以 xunhuan 为文件名,保存一下文件,按F5运行一下程序,看一下程序运行的结果,如果有错误,就检查一下是否是拼写和标点错误;

六、Do循环 我们继续来看另一中循环,它跟前面的For循环区别在于,For循环一般知道循环次数,在第一行里头就指明了,而Do循环一般不知道循环次数,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'do xun huan do input "chengji"; chj s= s+ chj loop while chj> 0 print "zongfen="; s end 2)input是输入一个成绩,然后把成绩加起来,放到变量s当中 在loop一行里头,检查一下chj的大小,如果大于0,就继续循环,等于0或小于0,就退出循环;

do-while语句翻译程序

DO-WHILE循环语句的翻译程序设计 (LR方法、输出三地址表示) 1.系统描述 1.1设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2设计内容及步骤 对循环语句:DO〈赋值语句〉WHILE 〈表达式〉 按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (1)按给定的题目给出语法分析方法的思想及分析表设计。 (2)按给定的题目给出中间代码序列的结构设计。 (3)完成相应的词法分析、语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2文法的描述 本程序所用的文法如下: G[S]: (1)S->do{E;}while(B) {if B.true goto B.true else goto B.false;} (2)B->I1 rop I2 {B.type=bool;B.val=I1.val rop I2.val;} (3)E->I1=I2 op I3 {I1.val=I2.val op I3.val;} (4)I->id {I.val=id.val;} 注意:rop is < or >,op is +,-,*,/, id is any number or identifier 由上可知,非终结符B表示布尔表达式,E表示赋值表达式 3.语法分析方法描述及语法分析表设计 3.1语法分析方法描述 本实验采用LR分析方法对DO-WHILE语句进行语法分析。LR分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范过程。 一个LR分析器由3个部分组成: 总控程序,也可以称为驱动程序。对所有的LR分析器,总控程序是相同的。 分析表或分析函数。不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。 分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。

FOR循环语句翻译程序设计简单优先法三地址码JAVA

学 号: 27 课内实践报告课程名称编译原理 题目FOR循环语句的翻译程序设计(简单优先法、输出三地址码) 学院计算机科学及技术专业计算机科学及技术班级1201 姓名李潇颖 指导教师林泓

2014年12月9日 课内实践任务书 学生姓名:李潇颖专业班级:计算机1201班 指导教师:林泓工作单位:计算机科学及技术学院 题目: FOR循环语句的翻译程序设计(简单优先法、输出三地址码) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课内实践工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址码的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分

析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课内实践报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序 列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、 收获及体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课内实践报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

相关文档
最新文档