FOR循环语句翻译程序设计简单优先法三地址码JAVA
WHILE循环语句的翻译程序设计(简单优先法,三地址输出)

目录1 问题域描述 (3)2 文法及属性文法的描述 (3)2.1 WHILE循环语句的文法 (3)2.2 WHILE循环语句的属性文法 (4)3 语法分析方法及中间代码形式的描述 (4)3.1语法分析方法 (4)3.2中间代码形式描述 (6)4 编译系统的概要设计 (7)4.1词法分析 (7)4.2语法制导翻译 (8)5 详细的算法描述 (8)5.1 文法设计 (8)5.2 算法描述 (8)5.3 源程序代码 (9)6 软件的调试过程和结果测试 (19)6.1调试过程 (19)6.2结果测试 (19)7 使用说明 (20)8 课设总结 (20)9 参考文献 (22)WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1 问题域描述while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1)用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。
(2)求能正确进行词法分析,语法分析,并能正确的输出预期结果。
(3)根据指定的文法,判定程序的正确性。
本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。
通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。
while循环语句的格式为:while(P){do A},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。
while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。
该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。
通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。
编译原理报告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.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
java 循环语句用法

java 循环语句用法Java是一种面向对象的编程语言,它提供了多种循环语句来帮助程序员实现重复执行某些代码的功能。
循环语句是Java编程中最常用的语句之一,它可以让程序重复执行某些代码,直到满足某个条件为止。
在本文中,我们将介绍Java中常用的循环语句及其用法。
1. for循环for循环是Java中最常用的循环语句之一,它可以让程序重复执行某些代码,直到满足某个条件为止。
for循环的语法如下:for (初始化; 条件; 更新) {// 循环体}其中,初始化语句用于初始化循环变量,条件语句用于判断循环是否继续执行,更新语句用于更新循环变量的值。
for循环的执行过程如下:1. 执行初始化语句;2. 判断条件语句的值,如果为true,则执行循环体,然后执行更新语句;3. 再次判断条件语句的值,如果为true,则重复执行步骤2,否则退出循环。
2. while循环while循环是Java中另一种常用的循环语句,它可以让程序重复执行某些代码,直到满足某个条件为止。
while循环的语法如下:while (条件) {// 循环体}其中,条件语句用于判断循环是否继续执行。
while循环的执行过程如下:1. 判断条件语句的值,如果为true,则执行循环体;2. 再次判断条件语句的值,如果为true,则重复执行步骤1,否则退出循环。
3. do-while循环do-while循环是Java中另一种常用的循环语句,它可以让程序重复执行某些代码,直到满足某个条件为止。
do-while循环的语法如下:do {// 循环体} while (条件);其中,条件语句用于判断循环是否继续执行。
do-while循环的执行过程如下:1. 执行循环体;2. 判断条件语句的值,如果为true,则重复执行步骤1,否则退出循环。
4. 增强for循环增强for循环是Java中一种简化版的for循环,它可以遍历数组或集合中的元素。
增强for循环的语法如下:for (元素类型元素变量 : 数组或集合) {// 循环体}其中,元素类型用于指定数组或集合中元素的类型,元素变量用于指定当前循环中的元素。
for循环的基本语法

for循环的基本语法好啦,今天我们来聊聊一个编程中的小角色——`for`循环。
你别看它长得这么简单,其实它可是个大忙人,每天都得干不少活,帮助程序完成各种重复的任务。
你想想,如果没有它,我们要手动去写一堆重复的代码,那得累死!就像咱们打扫卫生一样,一天扫一次地,咱不可能每天都把扫帚拿起来扫五遍对吧?这时候,`for`循环就好像是我们手中的扫帚,帮我们自动重复地干这些事儿。
得告诉你,`for`循环长啥样。
其实它就是这么几句话:`for` 后面跟着一个小括号,里面写着初始条件、判断条件和更新条件,接着后面是大括号,里面放你要反复执行的代码。
听起来很抽象对不对?别急,咱来举个例子。
比如,你想打印从 1 打到 5,咋办呢?就写这么几行代码:`for (int i = 1; i <= 5; i++) {`` System.out.println(i);` 。
``是不是特别简单?看着就像是一颗小糖果,诱人又好懂。
它的意思是:先从 1 开始,看看 1 是不是小于等于 5,如果是就继续干,执行一遍打印,然后加一,接着再来一次,直到 `i` 大于 5。
好啦,最后打印的就是 1,2,3,4,5,按部就班,一点儿也不乱。
你瞧,这个 `for`循环,不仅工作能力强,还特有规律。
就像咱们做事一样,条理清晰,分步走,结果也很美好。
要是把 `for`循环比作做饭,那就是你准备好材料,放锅里,掌控火候,一步一步完成。
就不怕错,没跑。
那有时候呢,咱得调皮点,搞点小变动。
比如,你想打印偶数,咋办呢?那就把判断条件改一下,变成 `i % 2 == 0`,这样,`for`循环就会只打印偶数啦。
嘿,这是不是有点像是你平常挑食,今天就吃肉,明天只吃素,偶尔还要点甜的,反正想吃啥,`for`循环都能满足你。
想一想,如果没有这个循环,你一个个手动打印,那得多麻烦?不但时间长,关键还容易出错。
用 `for`循环,你就能游刃有余,轻松完成任务。
简述for循环语句的执行顺序,举例说明

For循环是一种常用的控制流语句,用于重复执行特定的代码块。
它的执行顺序如下所述:1. 程序先执行for循环的初始化部分,例如for(int i=0; i<5; i++)中的i=0。
2. 程序会检查循环条件是否为真,即i<5是否成立。
3. 如果循环条件为真,则程序执行循环体内的代码块。
4. 循环体执行完毕后,程序会执行for循环的更新部分,例如i++。
5. 然后程序会再次检查循环条件,如果仍然为真,则重复执行循环体内的代码块;否则,退出for循环,继续执行下一条语句。
举例说明:假设有如下的for循环语句:```for(int i=0; i<5; i++) {System.out.println("Hello, world!");}```根据上述的执行顺序,该for循环的执行流程如下:1. 初始化部分: i=02. 检查循环条件: i<53. 循环体内执行: 打印"Hello, world!"4. 更新部分: i++5. 再次检查循环条件: i<56. 循环体内执行: 打印"Hello, world!"7. 更新部分: i++8. 再次检查循环条件: i<59. 循环体内执行: 打印"Hello, world!"10. 更新部分: i++11. 再次检查循环条件: i<512. 循环体内执行: 打印"Hello, world!"13. 更新部分: i++14. 再次检查循环条件: i<515. 循环体内执行: 打印"Hello, world!"16. 更新部分: i++17. 再次检查循环条件: i<5 (此时不成立,跳出for循环)上述的for循环语句将会执行5次,分别打印出5次"Hello, world!"。
java 三层for循环编译

java 三层for循环编译
(实用版)
目录
1.Java 三层循环概述
2.Java 三层 for 循环的语法结构
3.Java 三层 for 循环的编译过程
4.示例代码及运行结果
正文
一、Java 三层循环概述
在 Java 语言中,三层循环是指嵌套了三个循环结构的循环语句。
它可以让程序员更方便地编写复杂的循环逻辑,从而实现对数据的多维处理和运算。
二、Java 三层 for 循环的语法结构
Java 三层 for 循环的语法结构如下:
```
for (初始化表达式; 循环条件; 步进表达式) {
for (初始化表达式; 循环条件; 步进表达式) {
for (初始化表达式; 循环条件; 步进表达式) {
// 循环体
}
}
}
```
其中,初始化表达式用于给循环变量赋初值;循环条件用于判断循环是否继续执行;步进表达式用于更新循环变量。
三、Java 三层 for 循环的编译过程
Java 三层 for 循环的编译过程与普通 for 循环类似,都是按照从内层到外层的顺序依次执行。
在编译时,Java 编译器会将嵌套的循环语句转换为对应的字节码,最终生成可执行的 Java 字节码文件。
编译原理课程设计-For语句的翻译程序设计(简单优 先法、输出三地址码)

学号:0121410870922课程设计课程编译原理题目For语句的翻译程序设计(简单优先法、输出三地址码)学院计算机科学与技术学院专业计算机科学与技术班级计算机1404姓名王承禹指导教师林泓2016年12月27日;目录1 系统描述 (4)1.1设计目的 (4)1.2设计内容描述 (4)2 文法及属性文法的描述 (4)3 语法分析方法描述及语法分析表设计 (6)3.1语法分析方法描述 (6)3.2分析法操作步骤 (6)3.3优先关系矩阵 (8)4 中间代码形式的描述及中间代码序列的结构设计 (9)4.1中间代码形式 (9)5 编译系统的概要设计 (10)5.1数据结构 (10)5.2模块设计 (11)5.2.1词法分析模块 (11)5.2.2语法、语义分析模块 (12)5.2.3主控模块 (18)6 详细的算法描述 (19)6.1词法分析算法 (19)26.2语法分析算法 (19)6.3语义分析算法 (20)7 软件的测试方法和测试结果 (21)8 本设计的评价、特点、 (22)9 收获与体会 (23)10 核心代码 (25)成绩评定表 (45)3For语句的翻译程序设计(简单优先法、输出三地址码)1 系统描述1.1设计目的通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
1.2设计内容描述FOR循环语句的基本格式如下:FOR i=E step E until E do Stmt根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。
设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。
2 文法及属性文法的描述根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:4F1 -> 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时再回填*/}53 语法分析方法描述及语法分析表设计3.1语法分析方法描述本次课内实践要求使用简单优先关系方法。
java for循环用法

java for循环用法
java for循环是一种用来重复执行语句的语句结构。
for循环通
常用于重复执行固定次数的语句,在循环次数确定的前提下,可以节
省编程的时间和工作量,更加简洁高效。
本文将对java for循环进行
详细介绍。
java for循环的基本语法:
for(初始化语句; 条件判断; 循环后要执行的语句) {
//代码段
}
for循环共分为3个部分,初始化语句,条件判断,循环后要执
行的语句。
•初始化语句:在for循环开始之前,需要对变量进行初始化,通常是声明变量并赋值,用于在循环过程中保存循环次数。
•条件判断:在循环内部,会不断的判断某个变量的值,当
变量的值满足条件,就继续循环,否则跳出循环。
•循环后要执行的语句:在每一次循环结束后,都会执行的
语句,通常是改变变量的值,以便开始下一轮循环。
for循环的好处在于,不管循环次数是多少,都可以通过相同的
方式来实现,大大节省了编程的工作量,对于简单重复性操作很有用。
此外,java中还有另一种for循环——foreach循环,此循环用
于遍历集合中的元素,当拥有一个元素的集合时,可以使用foreach
循环来遍历元素,节省更多的时间和工作量。
总之,java for循环是一种非常实用的语句结构,能够减少编程的工作量,简化程序流程,是不可或缺的编程技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号: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节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名:年月日系主任(或责任教师)签名:目录1 系统描述(问题域描述)41.1设计目的41.2设计内容描述42.文法的描述53 语法分析方法描述及语法分析表设计63.1语法分析方法描述63.2 分析法操作步骤73.3优先关系矩阵84 中间代码形式的描述105 编译系统的概要设计(主要函数)106 详细的算法描述(流程图)126.1词法分析过程126.2语法分析过程136.3三地址码的输出137 测试方法和测试结果148.心得体会189.代码(完整)1910.本科生课内实践成绩评定表37FOR循环语句的翻译程序设计(简单优先法、输出三地址码)1 系统描述(问题域描述)1.1设计目的通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
1.2设计内容描述FOR循环语句的基本格式如下:FOR(表达式1;表达式2;表达式3){赋值语句}根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。
设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。
2.文法的描述根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:H->f(G;A;B){S;}G O T O H->f(G;C;D){S;}G O T O G->i1=i 2 i1.C O D E=i2.C O D E A->i1<i2I F i1.C O D E>=i2.C O D E G O T O O V E R B->i d i.C O D E=i.C O D E+1 C->i1>i2I F i1.C O D E<=i2.C O D E G O T O O V E R D->i a i.C O D E=i.C O D E-1 S->j=M j.C O D E=M.C O D E M-> E M.C O D E=E.C O D E E->W E.C O D E=W.C O D E W->W+UW.C O D E=W.C O D E+U.C O D E W->W-U W.C O D E=W.C O D E-U.C O D E W->U W.C O D E=U.C O D E U->T U.C O D E=T.C O D E T->T* F T.C O D E=T.C O D E”F.C O D E T->T/ F T.C O D E=T.C O D E/F.C O D E T-> F T.C O D E=F.C O D E F->(E) F.C O D E=(E.C O D E) F->j F.C O D E=j.C O D E (备注:其中d表示--,a表示++)3 语法分析方法描述及语法分析表设计3.1语法分析方法描述本次课内实践要求使用简单优先关系方法。
简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。
一个文法是简单优先文法必须满足以下条件(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;(2)在文法中任意两个产生式没有相同的右部。
三种优先关系及其判定方法如下所示:(1)X=Y 表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;(2)X<Y表示X的优先性比Y的优先性小,当且仅当G中存在产生式规则A→…XB…,且B Y…;(3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则A→…BD…,且B…X和D Y…;(4)对任何X,若文法开始符号S→X...,则#<X,若S→ (X)则X>#。
3.2 分析法操作步骤由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号数组S:(1)将输入符号串a1a2…a n# 依次逐个保存符号数组S中,直到遇到数组中第一个符号a i的优先性>下一个待输入符号a j为止。
(2)数组当前符号a i为句柄尾,由此向左在数组中找句柄的头符号a k,即找到a k-1<a k为止。
(3)由句柄a k…a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。
(4)重复(1)(2)(3),直到归约完输入符号串,数组中只剩文法的开始符号为止。
3.3优先关系矩阵空白表示,没有优先级关系4 中间代码形式的描述三地址码是由下面一般形式的语句构成的序列:x:=y op z其中,xyz为名字、常数或变量;op代表运算符。
对于本程序的具体三地址码输出,预计显示结果如下:给定输入程序for(i=0;i<10;i++){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> end5 编译系统的概要设计(主要函数)主要函数及对应实现的功能如下表所示:6 详细的算法描述(流程图)6.1词法分析过程给定输入程序for(i=0;i<10;i++){j=b+c;}词法分析结果为关键字为:1;标识符为:2;常数为:3;运算符为:4;界符为:5<for 1><( 5><i 2><= 4><0 3><; 5><i 2><< 4><10 3><; 5><i 2><++ 4><) 5><{ 5> <j 2> <= 4><b 2><+ 4><c 2><; 5><} 5>6.2语法分析过程6.3三地址码的输出给定输入程序for(i=0;i<10;i++){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> end7 测试方法和测试结果计算机系统:Windows 7编译调试环境:Eclipse程序语言:JAVA设计测试用例:(1)data.txt中保存如下程序段for(i=0;i<10;i++){j=b+c;}输出如下结果(2)data.txt 中保存如下程序段for(i=5;i>0;i--){j=a*(h+c);} 输出如下结果8.心得体会经过这次课内实践,使我更加扎实的掌握了有关编译原理方面的知识,在编写程序的过程中遇到了许多问题,但经过一遍遍的调试终于使得程序可以顺利运行。
但是程序中存在着很大的不足:例如在for 循环语句的循环体中只能有一个赋值语句。
对for()括号中的格式也有着严格的输入要求等等,这些都是以后要改进的地方。
过而能改,善莫大焉。
在课内过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课内实践终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!回顾这次课内实践,是一个痛并快乐的过程,在构造简单优先文法的矩阵时我尝试了5次构造,花费了许多时间,但是当成功构造出来时那种喜悦也是难以言表的。
学习是个不断提升自我的过程。
9.代码(完整)package lxy;import java.io.;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import java.util.*;publicclass Bianyiyuanlikeshe{publicstatic String sy[]=new String[100];staticint js=0;static String m[]=new String[4];publicstatic String sh=new String(); publicstaticvoid main(String[] args) {String s[]=new String[19];s[0]="f(G;A;B){S;}";s[1]="f(G;C;D){S;}";s[2]="i=i";s[3]="i<i";s[4]="id";s[5]="i>i";s[6]="ia";s[7]="j=M";s[8]="E";s[9]="W";s[10]="W+U";s[11]="W-U"; s[12]="U";s[13]="T";s[14]="T*F";s[15]="T/F";s[16]="F";s[17]="(E)";s[18]="j";char ss[]=newchar[19];ss[0]='H';ss[1]='H';ss[2]='G';ss[3]='A';ss[4]='B';ss[5]='C';ss[6]='D';ss[7]='S';ss[8]='M';ss[9]='E';ss[10]='W';ss[11]='W';ss[12]='W';ss[13]='U';ss[14]='T';ss[15]='T';ss[16]='T';ss[17]='F';ss[18]='F';cifafenxi();String pp=new String();pp="";for(int i=0;i<sh.length();i++){if(!sy.equals("null"))pp=pp+sy[i];}String[] re=pp.split(";|\\{|r");m[0]=re[1];char tt[]=m[0].toCharArray();m[0]="";for(int i=1;i<m.length;i++)m[0]=m[0]+String.valueOf(tt[i]);m[1]=re[2];m[2]=re[3];char ttt[]=m[2].toCharArray();m[2]="";for(int i=0;i<m.length-1;i++)m[2]=m[2]+String.valueOf(ttt[i]); m[3]=re[4];String n=new String();System.out.println ("采用文法:");for(int i=0;i<s.length;i++)System.out.println(ss[i]+"->"+s[i]);//输出文法System.out.println ("语法分析结果");String str=new String();str=sh+"#";char r[]=str.toCharArray();char ru[]=newchar[r.length];int l=r.length;for(int i=0;i<r.length;i++){ru[i]=r[l-1];l--;}char fu[]=newchar[ru.length ];fu[0]='#';int coutru=ru.length-1;int coutfu=0;int coutbi=0;char bi[]=newchar[ru.length];while(fu[1]!='H'){//System.out.println(fu[coutfu]+" "+ru[coutru]);int b=bijiao(fu[coutfu],ru[coutru]);if(b==-1){System.out.println("wrong");System.out.println(coutf u+"wrong"+coutru);return ;}if(b==0||b==1){if(b==0){ coutfu++;//System.out.println(coutfu);fu[coutfu]=ru[coutru];for(int i=0;i<coutfu;i++){System.out.print(fu[i]);} System.out.print(" ");for(int i=coutru;i>=0;i--){System.out.print(ru[i]);} System.out.println();System.out.println(ru[coutru]+" 移入");bi[coutbi]='0';coutbi++;coutru--;}if(b==1){coutfu++;fu[coutfu]=ru[coutru];for(int i=0;i<coutfu;i++){System.out.print(fu[i]);} System.out.print(" ");for(int i=coutru;i>=0;i--){System.out.print(ru[i]);} System.out.println();System.out.println(ru[coutru]+" 移入");bi[coutbi]='1';coutbi++;coutru--;}}if(b==2){int m=0;for (int i=coutbi-1;i>=0;i--){if(bi[i]=='1')break;else m++;}for(int j=0;j<=coutfu;j++){System.out.print(fu[j]);}System.out.print(" ");for(int j=coutru;j>=0;j--){System.out.print(ru[j]);}System.out.println();coutbi=coutbi-m;String str2=new String();String str3=new String();for(int i=0;i<=m;i++){str3=String.valueOf(fu[coutfu])+str3;if(fu[coutfu]!=';'&&fu[coutfu]!='f'&&fu[coutfu]!='>'&&fu[coutfu] !='<'&&fu[coutfu]!='B'&&fu[coutfu]!='C'&&fu[coutfu]!='D'&&fu [coutfu]!='H'&&fu[coutfu]!='G'&&fu[coutfu]!='A'&&fu[coutfu]!= 'i'&&fu[coutfu]!='S'&&fu[coutfu]!='M'&&fu[coutfu]!='W'&&fu[c outfu]!='U'&&fu[coutfu]!='T'&&fu[coutfu]!='F'&&fu[coutfu]!='='&&fu[coutfu]!='+'&&fu[coutfu]!='-'&&fu[coutfu]! ='*'&&fu[coutfu]!='/'&&fu[coutfu]!='('&&fu[coutfu]!=')'&&fu[co utfu]!='E'&&fu[coutfu]!='#'&&fu[coutfu]!='j'&&fu[coutfu]!='#'& &fu[coutfu]!='j'&&fu[coutfu]!='a'&&fu[coutfu]!='d'&&fu[coutfu ]!='{'&&fu[coutfu]!='}')str2="i"+str2;elsestr2=String.valueOf(fu[coutfu])+str2;coutfu--;}for(int i=0;i<s.length;i++){if(str2.equals(s[i])){fu[++coutfu]=ss[i];System.out.println(ss[i]+"->"+s[i]+" 规约");n=n+Sandizhima(s[i]);}}int t=bijiao(fu[coutfu-1],fu[coutfu]);if(t==0)bi[coutbi-1]='0';elseif(t==1)bi[coutbi-1]='1';else bi[coutbi-1]='2';}}if(fu[1]=='H')System.out.println("成功!");System.out.println("生成的三地址为:");String m[]=n.split(",");for(int k=0;k<m.length;k++)System.out.println(m[k]);}publicstaticint bijiao(char f,char r){int rr=0,ff=0;charz[]={'H','G','A','B','S','C','D','M','E','W','U','T','F','f','(',';',')','{','}','i','= ','<','d','>','a','j','+','-','*','/','#'};int fc=0;int rc=0;for(int i=0;i<z.length;i++){if(f!=z[i])fc++;if(r!=z[i])rc++;}if(fc==16)f='i';if(rc==16)r='i';for (int i=0;i<z.length;i++){if(r==z[i])rr=i;if(f==z[i])ff=i;}int a[][]={{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 0, 0, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, 0, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, 0, 0, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},{-1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1,0,{-1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1,0, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},{1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1,};//-1表示没关系,0表示等于,2表示大于,1表示小于return a[ff][rr];}publicstatic String Sandizhima(String p){char a;int j=0;String s[]=new String[19];s[0]="f(G;A;B){S;}";s[1]="f(G;C;D){S;}";s[2]="i=i";s[3]="i<i";s[4]="id";s[5]="i>i";s[6]="ia";s[7]="j=M";s[8]="E";s[9]="W";s[10]="W+U";s[11]="W-U";s[12]="U";s[13]="T";s[14]="T*F";s[15]="T/F";s[16]="F";s[17]="(E)";s[18]="j";for(int i=0;i<19;i++)if(p.equals(s[i]))j=i;char ss[]=newchar[19];ss[0]='H';ss[1]='H';ss[2]='G';ss[3]='A';ss[4]='B';ss[5]='C';ss[6]='D';ss[7]='S';ss[8]='M';ss[9]='E';ss[10]='W';ss[11]='W';ss[12]='W';ss[13]='U';ss[14]='T';ss[15]='T';ss[16]='T';ss[17]='F';ss[18]='F';if(j==7){String f=new String();f=",<5> "+m[3]+",<6> goto<3>"+",<7> end";return f;}if(j==4){String f=new String();f=",<3> "+m[2]+",<4> if "+m[1]+" goto<5> else goto<7>"; return f;}if(j==6){String f=new String();f=",<3> "+m[2]+",<4> if "+m[1]+" goto<5> else goto<7>"; return f;}if(j==2){String f=new String();f="<1> "+m[0]+",<2> "+"goto <5>";return f;}return"";}publicstaticvoid sansidzhima(String m){char b[]=m.toCharArray();String a[]=new String[b.length];for(int i=0;i<a.length;i++){a[i]=String.valueOf(b[i]);}String f[]={"+","-","*","/","="};int c2=1;int bc=0;int t=0;for(int i=0;i<a.length;i++){int cc=0;for(int j=0;j<f.length;j++){if(a[i].equals(f[j])){System.out.print("("+String.valueOf(c2)+")"+"("+a[i]+",");a[i]=nu ll;for(int k=i-1;k>=0;k--){if(a[k]!=null&&cc<2){if(cc==0)System.out.print(a[k]+",");if(cc== 1)System.out.print(a[k]);cc++;a[k]=null;}}System.out.print(")");System.out.println();a[i]="("+String.valueOf(c2)+")";c2++;break;}}}}publicstaticint yunsuanfu(char a){boolean b;if(a=='i')return 0;char p[]={'+','-','*','/',')','('};for(int i=0;i<p.length;i++){if(a==p[i])return 2;}return 0;}publicstaticvoid cifafenxi(){System.out.println("关键字为:1;" );System.out.println ("标识符为:2;" );System.out.println ("常数为:3;" );System.out.println("运算符为:4;");System.out.println ("界符为:5");System.out.println ("词法分析结果");read("c:/data.txt");char x[]=sh.toCharArray();for(int i=13;i<sh.length();i++){if(x[i]=='i')x[i]='j';}sh="";for(int i=0;i<x.length;i++){sh=sh+x[i];}}publicstaticvoid read(String ) {Reader reader = null;try {char[] tempchars = newchar[3000];int charread = 0;String str1=new String();String str3=new String();int c=0;reader = new InputStreamReader(new ());// 读入多个字符到字符数组中,charread为一次读取字符数while ((charread = reader.read(tempchars)) != -1) {// 屏蔽掉\r不显示if ((charread == tempchars.length)&& (tempchars[tempchars.length - 1] != '\r')) {System.out.print(tempchars);} else {for (int i = 0; i < charread; i++) {if (tempchars[i] == '\r'||tempchars[i] == '\n') {continue;}else {boolean b1,b2,b3,b4;String str = String.valueOf(tempchars[i]);b1=Isjiefu(str);b2=Isyunsuanfu(str);if(!b1&&!b2&&c==0){str1=str1+str;}else{if((str.equals("|")||str.equals("&")||str.equals("=")||str.equal s(">")||str.equals("<")||str.equals("-")||str.equals("!")||str.eq uals("+"))&&c<=1){str3=str3+str;c++;if(c==1)continue;}if(str3.equals(""))str3=str;if(c==1)b2=true;b3=Isguanjianzi(str1);if(b3==true){System.out.println("<"+str1+" 1"+">"); sh=sh+"f";sy[js]=str1;js++;}else{b4=Ischangshu(str1);if(b4==true&&!str1.equals("")){System.out.println("<"+str1+" 3"+">");sh=sh+"i";sy[js]=str1;js++;}else{if(!str1.equals("")){System.out.println("<"+str1+" 2"+">");sh=sh+"i";sy[js]=str1;js++;}}}shuchu(b1,b2,str3);if(c==1)str1=str;else str1="";str3="";c=0;b1=b2=true;}}}}}}catch (Exception e1) {e1.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}}publicstaticboolean Isjiefu(String a){String jiefu []=new String[]{";",",","'","\"","//","(",")"," ","{","}","[","]","#"};boolean p=false;for (int i=0;i<12;i++)if (a.equals(jiefu[i]))p=true;return p;}publicstaticboolean Isyunsuanfu(String a){String yunsuanfu []=newString[]{"+","-","*","/","<",">","<=",">=","=","!=","%","++","--","==" ,"&&","||"};boolean p=false;for (int i=0;i<14;i++)if (a.equals(yunsuanfu[i]))p=true;return p;} publicstaticboolean Isguanjianzi(String a){String guanjianzi []=newString[]{"include","iostream","using","namespace","std","void", "main","return","int","bool","long","char","double","string","ne w","const","if","elseif","else","while","for"};boolean p=false;for (int i=0;i<guanjianzi.length;i++)if (a.equals(guanjianzi[i]))p=true;return p;} publicstaticboolean Ischangshu(String a){for (int i = a.length();--i>=0;){if (!Character.isDigit(a.charAt(i))){if(a.charAt(i)!='.')returnfalse;}}returntrue;}publicstaticvoid shuchu(boolean a,boolean b,String st){if(a==true&&!st.equals(" ")){System.out.println("<"+st+" 5"+">");sh=sh+st;sy[js]=st;js++;}elseif(st.equals(" "))System.out.print(""); else{ System.out.println("<"+st+" 4"+">"); if(st.equals("++"))sh=sh+"d";elseif(st.equals("--"))sh=sh+"a";else sh=sh+st;sy[js]=st;js++;}} }10.本科生课内实践成绩评定表班级:计算机1201班姓名:李潇颖学号:27注:最终成绩以五级分制记。