编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告

合集下载

编译原理—pl0实验报告

编译原理—pl0实验报告

PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字实验项目编号(1)PL/0编译程序的分析指导教师鞠传香实验目的1.熟悉pl/0语言并能编写小程序2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等)实验仪器(编号)材料、工具PC机、VC++6.0(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。

词法分析和代码生成作为独立的子程序供语法分析程序调用。

语法分析的同时,提供了出错报告和出错恢复的功能。

在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。

PL/0语言文法的EBNF表示EBNF表示的符号说明。

〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。

∷= :该符号的左部由右部定义,可读作'定义为'。

| :表示'或',为左部可由多个右部定义。

{ } :花括号表示其内的语法成分可以重复。

在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。

如:{*}表示*重复任意次,{*}38表示*重复3-8次。

[ ] :方括号表示其内的成分为任选项。

( ) :表示圆括号内的成分优先。

例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/// 栈顶指针减一相关过程:base(),interpret()。

if-elif-else语句 -回复

if-elif-else语句 -回复

if-elif-else语句-回复if-elif-else语句是一种条件语句,用于根据不同的条件执行不同的代码块。

它允许我们在程序中进行多个条件的判断,并根据不同的条件执行相应的代码。

在本文中,我们将逐步讨论if-elif-else语句的使用方法和实际应用场景。

在Python中,if-elif-else语句的基本语法如下:if 条件1:代码块1elif 条件2:代码块2else:代码块3让我们以一个例子来解释if-elif-else语句的用法。

假设我们要写一个程序,根据用户输入的成绩输出相应的评语。

我们可以按照以下步骤来完成:步骤1:使用input函数获取用户输入的成绩,并将其存储在一个变量中。

pythonscore = int(input("请输入你的成绩: "))在这个例子中,我们使用int函数将输入的成绩转换为整数类型,以便与后续的条件判断进行比较。

步骤2:使用if-elif-else语句根据不同的条件输出相应的评语。

假设,成绩在90及以上为优秀,80至89为良好,70至79为中等,60至69为及格,60以下为不及格。

pythonif score >= 90:print("优秀")elif score >= 80:print("良好")elif score >= 70:print("中等")elif score >= 60:print("及格")else:print("不及格")在这个例子中,根据用户输入的成绩,程序会逐个判断每个条件,并执行相应的代码块。

如果没有任何一个条件满足,则执行else语句的代码块。

通过这个例子,我们可以看到if-elif-else语句的工作原理。

程序将按顺序检查每个条件,并执行条件为True的代码块。

一旦某个条件被满足,剩下的条件将不再被检查。

C语言程序设计-第四章简单计算器小程序-分支程序设计

C语言程序设计-第四章简单计算器小程序-分支程序设计

P1 逻辑运算符 P2

逻辑运算符 P2
课堂练习: 求下面逻辑表达式的值: 2>1 && 4 && 7<3+!0
值为0
等价于((2>1)&&4)&&(7<(3+(!
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算的重要规则
a&&b:当a为0时,不管b为何值,结果为0
课堂练习:有下面定义的语句和逻辑表达式: int a=0,b=10,c=0,d=0 a && b && (c=a+10,d=100) 逻辑表达式执行后,a,b,c,d的值各为多少?
任务实现效果演示 例题源代码:switchcalculator.c
相关知识 1. switch语句 2. break语句
1 switch多分支选择结构
❖ 尽管用if…else if结构可以实现多分支,注但意当:分常支量较表多达时式,必程须序是结整构型较、复字杂符。型或枚举类型,不能是 实型表达式,每个case关键字后的常量表达式应互不相同
值为0 等价于i==(k>j),值为1
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算符与逻辑表达式
&&(逻辑与)、||(逻辑或)、!(逻辑非)(单目)
逻辑表达式的一般形式:
优先级: 1.由低到高: ||→ && → !; 2.多种运算符一起: = →|| →&& →关系运算符 →算术运算符→ !。
【】 简单计算器小程序:由用户输入运算数和四则运算符(+、-、*、/),输出计算结果。
【】

4-3-2ifelifelse语句的应用课件 粤教版(2019)高中信息技术必修1

4-3-2ifelifelse语句的应用课件 粤教版(2019)高中信息技术必修1
num=int(input( ))
C if _______________:
print("YES") else:
print("NO")
A.num%2 = 0 or num%3 =0
B.num%2 == 0 or num%3 ==0
C.num%2 == 0 and num%3 ==0
D.num%2 = 0 and num%3 =0
一、 if…elif…else语句的应用
例题
先用变量a保存数字7, 然后从键盘输入一个整数b,
编程思路 (2)绘制流程图
接下来判断a与b之间的关系:
如果b与a相等,则提示:猜对了;
如果b大于a,则提示:猜大了;
如果b小于a,则提示:猜小了;
最后显示游戏结束。
一、 if…elif…else语句的应用
粤教版信息技术必修一《数据与计算》第四章《程序设计基础》
0.复习:单分支if语句
例题
先用变量a保存数字7,再输入一个整数b,
如果a与b相等,则提示:猜对了;
如果a与b不相等,则提示:猜错了
最后显示游戏结束。
a=7
b = int(input("请输入你猜的数b="))
if a==b:
#如果a与b相等
Байду номын сангаас
关系(关系如下展示),已知爸爸32岁,妈妈31岁,小智9岁,弟弟3岁,请问小智他们
B 买门票花了(
)钱。(price表示门票价格, age表示年龄):
if age>=18:
一、 if…elif…else语句的应用
例题
先用变量a保存数字7, 然后从键盘输入一个整数b, 接下来判断a与b之间的关系: 如果b与a相等,则提示:猜对了; 如果b大于a,则提示:猜大了; 如果b小于a,则提示:猜小了; 最后显示游戏结束。

ifelse语句

ifelse语句

ifelse语句条件语句,是程序中根据条件是否成⽴进⾏选择执⾏的⼀类语句,这类语句在实际使⽤中,难点在于如何准确的抽象条件。

例如实现程序登录功能时,如果⽤户名和密码正确,则进⼊系统,否则弹出“密码错误”这样的提⽰框等。

本部分对于条件语句的介绍,重点在于语法讲解和基本的使⽤,更详细的使⽤参看后续的综合⽰例部分。

if else语句该类语句的语法格式为:if(条件表达式)功能代码;语法说明:if是该语句中的关键字,后续紧跟⼀对⼩括号,该对⼩括号任何时候不能省略,⼩括号的内部是具体的条件,语法上要求该表达式结果为boolean类型。

后续为功能的代码,也就是当条件成⽴时执⾏的代码,在程序书写时,⼀般为了直观的表达包含关系,功能代码⼀般需要缩进。

需要特别注意的是:1、这⾥的功能代码只能是⼀⾏,关于多⾏结构的功能代码,后续将说明。

2、 if(条件表达式)后续⼀般不书写分号if语句的执⾏流程为:如果条件表达式成⽴,则执⾏功能代码,如果条件表达式不成⽴,则不执⾏后续的功能代码。

⽰例代码:int a = 10;if(a >= 0)System.out.println(“a是正数”);if( a % 2 == 0)System.out.println(“a是偶数”);在该⽰例代码中,第⼀个条件是判断变量a的值是否⼤于等于零,如果该条件成⽴则执⾏输出,第⼆个条件是判断变量a是否为偶数,如果成⽴也输出。

注意以下代码的执⾏流程:int m = 20;if( m > 20)m += 20;System.out.println(m);按照前⾯的语法格式说明,只有m+=20;这⾏代码属于功能代码,⽽后续的输出语句和前⾯的条件形成顺序结构,所以该程序执⾏以后输出的结果为20.如果当条件成⽴时,需要执⾏的语句有多句,则可以使⽤语句块来进⾏表述,语法格式如下:if(条件表达式){功能代码块;}使⽤这种语法格式,使⽤⼀个代码块来代替前⾯的功能代码,这样可以在代码块内部书写任意多⾏的代码,⽽且也使整个程序的逻辑⽐较清楚,所以在实际的代码编写中推荐使⽤该种逻辑。

C语言if语句的使用讲解

C语言if语句的使用讲解

C语言if语句的使用讲解C语言if语句的使用讲解if语句(if statement)是指编程语言(包括c语言,C#,VB,汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。

下面是店铺为大家整理的C语言if语句的使用讲解,欢迎参考~if语句的使用用if语句可以构成分支结构。

它根据给定的条件进行判断,以决定执行某个分支程序段。

C语言的if语句有三种基本形式。

语句的三种形式1) 第一种形式为基本形式:ifif(表达式) 语句其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。

【例1】#includeint main(void){int a,b,max;printf(" input two numbers: ");scanf("%d%d",&a,&b);max=a;if (maxprintf("max=%d",max);return 0;}本例程序中,输入两个数a、b。

把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。

因此max中总是大数,最后输出max的值。

2) 第二种形式为: if-elseif(表达式)语句1;else语句2;其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。

【例2】#includeint main(void){int a, b;printf("input two numbers: ");scanf("%d%d",&a,&b);if(a>b)printf("max=%d ",a);elseprintf("max=%d ",b);return 0;}输入两个整数,输出其中的大数。

改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。

语义分析和语法制导翻译-编译原理-06-(二)

语义分析和语法制导翻译-编译原理-06-(二)
E.p
是语法结构树指针 是名字的表项入口 是数值
id.entry num.val
树构造函数
mknode 建中间结点 mkleaf 建叶结点
生成语法树的属性文法
产生式 S→id:=E 语义规则 S.p:= mknode(':=', mkleaf(id, id.entry), E.p)
E→E1+E2 E.p:= mknode('+', E1.p, E2.p) E→E1*E2 E.p:= mknode('*', E1.p, E2.p) E→ -E1 E→ (E1) E→ id E→ num E.p:= mknode('-', 0, E1.p) E.p:= E1.p E.p:= mkleaf(id, id.entry) E.p:=mkleaf(num,num.val)
翻译模式的设计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in } L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
从其兄弟结点和父结点的属性值计算出来的 如:L.in
固有属性(单词属性)
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综
合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
E.val=15 T.val=15 T.val=3 F.val=3 digit.attr=3 *

实验4分支结构程序设计

实验4分支结构程序设计

实验4分支结构程序设计分支结构是程序设计中常用的一种控制结构,通过判断条件的真假来选择不同的执行路径。

在实验4中,我们将学习如何使用分支结构来设计程序。

一、分支结构的基本语法在分支结构中,根据条件的真假执行不同的代码,主要有以下几种语法结构:1. if语句: if语句是最基本的分支结构,用于根据条件执行不同的代码块。

语法如下:if (条件)//条件为真时执行的代码} else//条件为假时执行的代码其中,条件是一个表达式,如果表达式的值为真,则执行if语句块中的代码;否则执行else语句块中的代码。

2. if-else if-else语句:用于根据多个条件选择执行不同的代码。

语法如下:if (条件1)//条件1为真时执行的代码} else if (条件2)//条件1为假,条件2为真时执行的代码} else//条件1和条件2都为假时执行的代码在这种结构中,多个条件会按照顺序依次被检查,一旦一些条件为真,相应的代码块即被执行,后续的条件判断将被略过。

3. switch语句:用于根据不同的表达式值选择执行不同的代码块。

语法如下:switch (表达式)case 值1://表达式的值与值1相等时执行的代码break;case 值2://表达式的值与值2相等时执行的代码break;...default://表达式的值与之前的值都不相等时执行的代码break;在switch语句中,表达式的值将与每个case后的值进行比较,如果相等,相应的代码块将被执行,使用break语句可以使程序跳出switch 语句。

二、分支结构的应用在实验4中,我们可以结合具体问题来设计分支结构程序。

以下是一个示例:问题:根据学生的成绩判断其等级并输出。

解决方法:1.输入学生的成绩。

2. 使用if-else if-else语句判断成绩所属的等级,并输出。

具体实现如下:#include <iostream>int mai//输入学生的成绩int score;std::cout << "请输入学生的成绩:";std::cin >> score;//判断成绩所属等级并输出if (score >= 90)std::cout << "成绩等级为A" << std::endl;} else if (score >= 80)std::cout << "成绩等级为B" << std::endl;} else if (score >= 70)std::cout << "成绩等级为C" << std::endl;} else if (score >= 60)std::cout << "成绩等级为D" << std::endl;} elsestd::cout << "成绩等级为E" << std::endl;}return 0;在上述代码中,我们通过if-else if-else语句根据学生的成绩判断其等级,并输出相应的结果。

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

学号:0120910340205编译课程设计题目IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)学院计算机科学与技术学院专业计算机科学与技术专业班级计算机科学与技术0902班姓名指导教师郭羽成2012 年 1 月 5 日课程设计任务书学生姓名:专业班级:计算机0902班指导教师:郭羽成工作单位:计算机科学与技术学院题目: IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2011年 11月 18日系主任(或责任教师)签名: 2011年 11月 18日一.系统描述I F-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)对条件语句: IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE 〈赋值语句〉(1)写出符合语法分析方法要求的文法和属性文法描述。

(2)给出语法分析方法的思想及分析表设计。

(3)给出中间代码序列的结构设计。

(4)完成相应的词法分析、语法分析和语义分析程序设计。

(5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

二.文法及属性文法的描述if then else文法的产生式为:①S→if E then B else B②E→id1 A id2 | id1③A→< | > | ==④B→id1=num根据条件语句: IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE 〈赋值语句〉,描述相应的文法,其中共有4个非终结符(S,E,A,B),终结符10个(if,then,else,id1,id2,<,>,==,=,num)。

E为布尔表达式,B为赋值语句。

三.语法分析方法描述及语法分析表设计首先根据已知优先文法构造相应的优先关系矩阵,并将文法的产生式保存,设置符号栈S,算法步骤如下:1)将输入符号串a1a2……an#依次逐个存入符号栈S中,直到遇到栈顶符号ai的优先性>下一个待输入符号aj时为止。

2)栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号ak,即找到 ak-1<ak,为止。

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

4)重复上述的三个步骤直到归约完输入符号串,栈中只剩文法的开始符号为止。

按照优先关系矩阵对输入串if x>y then a=2 else u=9 的分析过程四.中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式描述此设计要求使用的是三地址的中间代码,三地址代码是由下面一般形式构成的语句序列: x:=y op z;其中x,y,z为名字,常数或编译时产生的临时变量;op代表运算符号如标点,浮点运算符号等等。

每个语句的右边只能有一个运算符。

表达式x + y * z翻译成的三地址语句序列是:t1 := y * zt2 := x + t1常用的三地址语句有:赋值语句x := y op z,x := op y,x := y无条件转移goto L条件转移if x relop y goto L过程调用param x 和call p , n过程返回 return y索引赋值x := y[i]和 x[i] := y地址和指针赋值x := &y,x := *y和*x := y4.2中间代码序列的结构设计在本程序的文法中,中间代码的三地址码为:L1:if id1 A id2 goto L2goto L3L2:id1=numgoto LnextL3:id1=numgoto LnextLnext:其中id1,id2在具体的程序运行中用输入的单词符号所确定,A代表<,>,==三种符号,num 代表数字。

五. 编译系统的概要设计在词法分析部分,应用函数word()来识别标识符和关键字,其中用ASCII码来识别字母,如遇到不合法的字符就会报错。

在语法分析部分,用简单优先法完成此次文法分析的关键在于构造该文法的简单优先关系矩阵,以及如何运用该矩阵完成移入和归约的过程,从而完成整个文法的分析。

求非终结符号的FIRST集和LAST集,利用FIRST集和LAST集求出优先关系,最终构造出简单优先关系矩阵。

在整个简单优先关系矩阵构造成功后,我们还应该构造一个堆栈,用来存放符号;并将符号栈中的栈顶元素与输入串队列的队头元素进行比较,然后查找简单优先关系矩阵得到相应的优先关系,从而完成分析表中所要求完成的动作,如果栈中的栈顶元素比输入串队列的队头元素优先关系为<或=则将输入串队列的队头元素移入栈中,若为>则要将栈中的符号进行归约,这时要找到栈中的句柄归约,若找不到句柄进行归约则输入的符号串不是该文法的句子。

找到句柄归约完之后再重复上面的步骤,最后符号栈中最后只剩该文法的开始符号,则整个过程分析成功,否则则分析失败或出现错误。

根据栈的归约操作通过cout语句将三地址输出。

六.源代码#define N 100#include<iostream>#include<string.h>#include<stdio.h>using namespace std;static char a[N]; /*存放输入的语句*/static char str[N]; /*存放构成单词符号的字符串*/static int b[N];static char copyy[N][N];static char ch;static int i=0;static int j=0;static int m;static int n;int p;int h[14][14];int l[14][14];struct list //定义结点{int data;list *next;};class stack//定义栈类{private:list *ptr;public:stack(){ ptr=NULL;}void push(int i);int pop();};void stack::push(int x) { list *q=new list;q->data=x;q->next=ptr;ptr=q;}int stack:: pop(){list *p;int value;value=ptr->data;p=ptr;ptr=ptr->next;return value;}//***************词法分析程序***********************int word(){if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122)){/* 识别标识符和关键字*/ch=a[i];str[j]=ch;i++;j++;while((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122 )||(a[i]>=48&&a[i]<=57)) {ch=a[i];str[j]=ch;i++;j++;}if(a[i]!=' ')i--;/*使i回调*/if(strcmp(str,"if")==0||strcmp(str,"IF")==0)return(2);else if(strcmp(str,"then")==0||strcmp(str,"THEN")==0)return(3);else if(strcmp(str,"else")==0||strcmp(str,"ELSE")==0)return(4);else if(strcmp(str,"AND")==0||strcmp(str,"and")==0)else if(strcmp(str,"or")==0||strcmp(str,"OR")==0) return(6);else if(strcmp(str,"not")==0||strcmp(str,"NOT")==0) return(7);else return(1);}else if(a[i]>=48&&a[i]<=57){/*识别常数*/ch=a[i];str[j]=ch;i++;j++;while((a[i]>=48&&a[i]<=57)&&i<N){ch=a[i];str[j]=ch;i++;j++;}if(a[i]!=' ')i--;return(8);}else if(a[i]=='<'){ch=a[i];str[j]=ch;i++;j++;{ch=a[i];str[j]=ch; return(10);}else{ i--;return(9);}}else if(a[i]=='>') {ch=a[i];str[j]=ch;i++;j++;if(a[i]=='=') {ch=a[i];str[j]=ch; return(12);}else{ i--;return(11);}}else if(a[i]=='!') {ch=a[i];str[j]=ch;i++;j++;if(a[i]=='=') {ch=a[i];str[j]=ch; return(13);}else{ i--;return(-1);}}else if(a[i]=='=') {ch=a[i];str[j]=ch;i++;j++;if(a[i]=='=') {ch=a[i];str[j]=ch; return(15);}else{ i--;return(14);}}else if(a[i]=='(') {ch=a[i];str[j]=ch;return(17);}else if(a[i]==')') {ch=a[i];str[j]=ch;return(18);}else if(a[i]==' ') {return(16);}elsereturn (-1);}int bn(){ int k=0;while(k<strlen(a)) {b[n]=word();if(b[n]==16){ i++;k=i;n--;}else if(b[n]!=-1) {i++;k=i;strcpy(copyy[n],str);cout<<str<<"<"<<b[n]<<">"<<" ";}else{cout<<endl;cout<<"error!词法分析器分析到第"<<n+1<<"个单词符号这里发现错误!"<<endl; return (-1);break;}n++;for(m=0;m<N;m++)str[m]='\0';j=0;}}stack A,B;void inserth(int i,int j){if(!h[i][j]){h[i][j]=1;A.push(h[i][j]);}}void insertl(int i,int j){if(!l[i][j]){l[i][j]=1;B.push(l[i][j]);}}int sentence_judge() {if(b[0]==2){if(b[1]==1){if(b[2]==3){if(b[3]==1){if(b[4]==14){if(b[5]==8){if(b[6]==4){if(b[7]==1){if(b[8]==14){if(b[9]==8)return (1);elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}else if((b[2]==9)||(b[2]==11)||(b[2]==15)) {if(b[3]==1){if(b[4]==3){if(b[5]==1){if(b[6]==14){if(b[7]==8){if(b[8]==4){if(b[9]==1) {if(b[10]==14) {if(b[11]==8) return (2); elsereturn (-1); }elsereturn (-1); }elsereturn (-1); }elsereturn (-1); }elsereturn (-1); }elsereturn (-1); }elsereturn (-1); }elsereturn (-1);}elsereturn (-1);}elsereturn (-1);}elsereturn(-1);}elsereturn(-1);}void sentence(){char c[][N]={"S→if E then B else B","E→id1 A id2|id1","A→<|>|==","B→id1=num"}; char d[][N]={"S","E","A","B","if","then","else","id1","id2","<",">","==","=","num"};//非终结符4个,终结符10个char e[][N][N]={{"S","→","if","E","then","B","else","id1","=","num","#"},{"E","→","id1","A", "id2","|","id1","#"},{"A","→","<","|",">","|","==","#"},{"B","→","id1","=","num","#"}};int f[N][N];int g[N][N];//存放关系,1代表=关系,2代表<关系,3代表>关系int k,n;i=0;g[1][5]=1;g[2][8]=1;g[3][6]=1;g[4][2]=1;g[4][7]=2;g[5][3]=1;g[5][7]=2;g[6][3]=1;g[6][7]=2;g[7][2]=1;g[7][5]=3;g[7][9]=2;g[7][10]=2;g[7][11]=2;g[7][12]=1;g[8][5]=3;g[9][8]=3;g[10][8]=3;g[11][8]=3;g[11][13]=1;g[13][6]=3;cout<<"条件语句的文法如下:"<<endl; for(i=0;i<4;i++)cout<<c[i]<<endl;for(j=0;j<4;j++){for(i=0;i<4;i++){ if(strcmp(e[j][0],d[i])==0)for(k=0;k<14;k++)if(strcmp(e[j][2],d[k])==0)inserth(i,k);}}for(j=0;j<4;j++){for(k=0;k<8;k++){if(strcmp(e[j][k],"|")==0){for(i=0;i<4;i++){if(strcmp(e[j][0],d[i])==0)for(m=0;m<14;m++)if(strcmp(e[j][k+1],d[m])==0)inserth(i,k+1);}}}}for(j=0;j<4;j++){n=0;while(strcmp(e[j][n],"#")!=0) n++;for(i=0;i<4;i++){ if(strcmp(e[j][0],d[i])==0) for(k=0;k<14;k++){if(strcmp(e[j][n-1],d[k])==0) insertl(i,k);}}}for(j=0;j<4;j++){for(k=0;k<8;k++){if(strcmp(e[j][k],"|")==0) {for(i=0;i<4;i++){if(strcmp(e[j][0],d[i])==0) for(m=0;m<14;m++)if(strcmp(e[j][k-1],d[m])==0)insertl(i,k-1);}}}}for(j=0;j<4;j++){for(i=2;i<10;i++){if(strcmp(e[j][i],"|")!=0&&strcmp(e[j][i+1],"|")!=0&&strcmp(e[j][i+1],"#")) {for(k=0;k<14;k++)if(strcmp(e[j][i],d[k])==0)f[j][k]=1;}}}if(sentence_judge()!=-1) //sentence_judge()进行规约cout<<"输入的句子符合语法要求!";elsecout<<"输入的句子不符合语法要求!";}void code(){if(sentence_judge()==1){cout<<"L1: "<<"if "<<copyy[1]<<" goto L2\n";cout<<" goto L3\n";cout<<"L2: "<<copyy[3]<<copyy[4]<<copyy[5]<<"\n";cout<<" goto Lnext\n"<<endl;cout<<"L3: "<<copyy[7]<<copyy[8]<<copyy[9]<<"\n";cout<<" goto Lnext\n"<<endl;cout<<"Lnext:exit\n"<<endl;}elseif(sentence_judge()==2){cout<<"L1: if "<<copyy[1]<<copyy[2]<<copyy[3]<<" goto L2\n"; cout<<" goto L3\n"<<endl;cout<<"L2: "<<copyy[5]<<copyy[6]<<copyy[7]<<"\n";cout<<" goto Lnext\n"<<endl;cout<<"L3: "<<copyy[9]<<copyy[10]<<copyy[11]<<"\n";cout<<" goto Lnext\n"<<endl;cout<<"Lnext: \n "<<endl;}}int main(){int value;cout<<"请输入条件语句:"<<endl;gets(a); /*输入一个句子*/cout<<endl;cout<<"词法分析分析出的单词及其对应的编码如下:"<<endl; value=bn();cout<<endl<<endl;if(value!=-1){sentence();}cout<<endl;if(sentence_judge()!=-1){cout<<"进行语义分析输出的三地址码如下:"<<endl; code();}int c;cin>>c;return 0;}七.软件的测试方法和测试结果运行结果:八.研制报告本设计收获与体会:在本次课程设计中,通过查阅一些资料和在同学的帮助下完成。

相关文档
最新文档