| 注册
home doc ppt pdf
请输入搜索内容

热门搜索

年终总结个人简历事迹材料租赁合同演讲稿项目管理职场社交

语法制导四元式(算术表达式)生成器

文***享

贡献于2023-08-28

字数:5978



辽宁师范学计算机信息技术学院

综合性实验报告









课程名称: 编译技术
实验题目:语法制导四元式(算术表达式)生成器
学生姓名:
专业: 计算机科学技术
学号:
实验日期: 2015






实验目
1 理解语法分析器原理语法制导翻译程实质
2 学会语法分析识语法成分变换中间代码形式中逆波兰记号形式语义分析方法编程实现算术表达式进行语法分析程基础进行语义分析

实验容
1 输入算术表达式源语言形式输出语法分析程(输入流变化程)四元式序列
2 定算术表达式首先通词法分析程识出类语法成分输出文件中然采预测分析方法进行分析语法检查出具体分析程包括分析步骤分析栈剩余符号产生式基础文法中插入语义动作语法分析程中遇语义动作做相应翻译工作终结果(算术表达式逆波兰式)输出源文件中

实验程

判断文法否LL(1)文法
(1)E>E+E
(2)E>E*E
(3)E>i|E

文法含左递消左递确定算法优先次序文法变:
(1)E>TG
(2)G>+TG|^
(3)T>FS
(4)S>*FS|^
(5)F>i|E

1推出^非终结符表:
E
G
T
S
F






2非终结符FIRST集合:
FIRST(E){(i}
FIRST(G){+ ∅}
FIRST(T){(i}
FIRST(S){* ∅}
FIRST(F){(i}

3非终结符FOLLOW集合:
FOLLOW(E){)#}
FOLLOW(G){)#}
FOLLOW(T){+)#}
FOLLOW(S){+)#}
FOLLOW(F){*+)#}


4产生式SELECT集合:
SELECT(E>TG){(i}
SELECT(G>+TG){+}
SELECT(G>^){)#}
SELECT(T>FS){(i}
SELECT(S>*FS){*}
SELECT(S>^){+)#}
SELECT(F>E){(}
SELECT(F>i){i}

5:
SELECT(G>+TG)∩SELECT(G>∅) {+}∩{)#} ∅
SELECT(S>*FS)∩SELECT(S>∅) {*}∩{+)#} ∅
SELECT(F>E)∩SELECT(F>i) {i}∩{(} ∅
文法LL(1)文法

二构造预测分析表

i
+
*
(
)

#
E
TG


TG

E

G

+TG


^

^
T
FS


FS



S


*FS

^

^
F
i


(E)





三程序开始
1预测试算术表达式:
4+(467e10)*(789)+5#
分析:i+(i)*(i)+i# 写入文件中
边分析边编织逆波兰式数组stack1存放
1 存入9文法产生式:
E>TG
E2>E
G>+TG
G2>^
T>FS
S>*FS
S2>^
F>i
F2>(E)
2 存入预测分析表格(二)
3 利 终结符数组:vt非终结符数组:vn预测分析表table分析栈stack等等分析串str2进行分析分许程存入optxt中


具体代码:
#include
#include
#include
#include
char str2[20]{0} 存放识字符串i+(i)*(i)+i#
FILE *op 存储算术表达式文件a+(467e10)*(789)+b#
FILE *fp 存储分析程文件
char vt[7]{'i''+''*''('')''''#'} 终结符
char vn[5]{'E''G''T''S''F'} 非终结符

typedef struct type{ 产生式类型定义
char left 非终结符
char right[5] 产生式右边字符
}type
type EE1GG1TSS1FF1 8产生式
type table[7][7] 预分析表

char stack[30]{0} 分析栈
char stack1[30]{0} 存储逆波兰式
int s1st0 s>栈顶st>前需分析字符

void analy1(char str1[]){ 分析>i+(i)*(i)+i#
int i0j0p0q0
char s[30]{0} 辅助堆栈
while(str1[i]'#'){
switch(str1[i]){
case 'a'str2[j++]'i'stack1[q++]'a' break
case 'b'str2[j++]'i'
stack1[q++]s[p2]
stack1[q++]s[p]s[p]'\0's[p]'\0'
stack1[q++]'b'
break
case '+'s[p++]'+' str2[j++]'+'break
case '*'stack1[q++]s[p]
s[p]'\0'
str2[j++]'*'
s[p++]'*'
break
case '('str2[j++]'('break
case ')'stack1[q++]s[p]s[p]'\0'
stack1[q++]'b'
str2[j++]')'break
case ''s[p++]'@'
if(str2[j1]'i')break
else str2[j++]''
break
case ''stack1[q++]''
if(str2[j1]'i')break
else str2[j++]'i'
break
case '0'stack1[q++]'0'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '1'stack1[q++]'1'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '2'stack1[q++]'2'
if(str2[j1]'i')break
else str2[j++]'i'

break
case '3' stack1[q++]'3'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '4' stack1[q++]'4'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '5' stack1[q++]'5'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '6' stack1[q++]'6'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '7'stack1[q++]'7'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '8' stack1[q++]'8'
if(str2[j1]'i')break
else str2[j++]'i'
break
case '9' stack1[q++]'9'
if(str2[j1]'i')break
else str2[j++]'i'
break
case 'e'stack1[q++]s[p]s[p]'\0'
if(str2[j1]'i'){
s[p++]'e'
break
}
else str2[j++]'i'
break
}
i++
}
stack1[q++]s[p]s[p]'\0'
str2[j]'#'
}
void store(){ 8产生式存入
printf(产生式:\n)
Eleft'E'
strcpy(ErightTG)
printf(c>s\nEleftEright)

E1left'E'
strcpy(E1rightE)
printf(c>s\nE1leftE1right)

Gleft'G'
strcpy(Gright+TG)
printf(c>s\nGleftGright)

G1left'G'
strcpy(G1right^)
printf(c>s\nG1leftG1right)

Tleft'T'
strcpy(TrightFS)
printf(c>s\nTleftTright)

Sleft'S'
strcpy(Sright*FS)
printf(c>s\nSleftSright)

S1left'S'
strcpy(S1right^)
printf(c>s\nS1leftS1right)

Fleft'F'
strcpy(Frighti)
printf(c>s\nFleftFright)

F1left'F'
strcpy(F1right(E))
printf(c>s\n\nF1leftF1right)
}

int length(char a[]){ 求数组长度
int il0
for(i0i<5i++)
if(a[i]'\0') l++
return l
}
void tables(){ 建立分析表
int ij
for(i0i<4i++) 初始化分析表
for(j0j<6j++)
table[i][j]left'N' 表left置N’

table[0][5]E1 table[0][0]table[0][3]E 存入文法
table[1][1]G table[1][4]table[1][6]G1
table[2][0]T table[2][3]T
table[3][2]S table[3][1]table[3][4]table[3][6]S1
table[4][0]F table[4][3]F1

printf(表达式文法预测分析表:\n)
printf( \t)
for(i0i<7i++) printf(c\tvt[i])
printf(\n)

for(i0i<5i++){
printf(c\tvn[i])
for(j0j<7j++)
printf(s\ttable[i][j]right)
printf(\n)
}
printf(\n)
}
void write(char str[]){ 字符串写入文件fp
fputs(strfp)
}
void fun(int hint l){ 推导产生式倒序存入分析栈中
int ilength(table[h][l]right)1
s
for(i i>1 i )
stack[++s]table[h][l]right[i] 产生式逆序入栈
if(stack[s]'^')
stack[s]'\0'

fputc(table[h][l]leftfp)
write(>)
write(table[h][l]right)
write(\n)
}


void print(int n){ 写入文件
fprintf(fpd\t\tn++) 步骤
fprintf(fps\t\tstack) 分析栈
fprintf(fps\t\tstr2) 剩余输入串
}

void analy2(){
int ijn0finish0hl
char Xa
store() 产生式
tables() 预测分析表格
write(********************分析********************\n)
write(步骤\t\t分析栈\t\t剩余字符\t\t产生式\n)
stack[++s]'#' #入栈
stack[++s]'E' E入栈
astr2[st] 前剩余串左字符

while(s>1){
Xstack[s] 栈顶字符
print(++n)
for(i0i<5i++){
if(Xvn[i]){ 栈顶非终结符时E G T S F
hi 行号
for(j0j<7j++){
if(avt[j]){
lj 列号
break
}
}
if(table[h][j]left'N'){ 空时
fun(hl)
}
}
}
for(i0i<7i++){ 栈顶终结符时i + * ( ) #
if(Xvt[i]){
stack[s]'\0'
str2[st++]' '
astr2[st] 前剩余串左字符
fputc(Xfp)
if(X'#') write(接受\n)
else write(匹配\n)
}
}
}
}

void main(){
char str1[300]{0} 预分析算术表达式a+(467e10)*(789)+b#
char h[]\n
fpfopen(Hfptxtr)
fgets(str1300fp) fgets读取行 fgetc读取字符 fread想长度
fclose(fp)

analy1(str1)
fpfopen(Hfptxta) 会覆盖原数
fwrite(hsizeof(h)1fp) 换行
fwrite(stack1sizeof(stack1)1fp) 写入逆波兰式
fclose(fp)

printf(分析符号串:s\n\nstr2)
opfopen(Hoptxtw)
fputs(str2fp) 写入i+(i)*(i)+i#
write(\n)
analy2()

fclose(op)
}
四运行结果截屏:
源文件:


屏幕输出:

分析程:


运行源文件:

实验结果分析

文档香网(httpswwwxiangdangnet)户传

《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 2 香币 [ 分享文档获得香币 ]

该文档为用户出售和定价!

购买文档

相关文档

《带括号算术表达式的计算》实验报告

四川大学数据结构与算法分析实验报告实验名称 :带括号的算术表达式求值指导老师 :_______________________学 院 :_______软件学院_______专 业 :_______软件工程_______姓 名 :________ _____学 号 :_____ ____班

文***品 3年前 上传390   0

初一数学 从算术到代数

专题03 从算术到代数阅读与思考算术与代数是数学中两门不同的分科,它们之间联系紧密,代数是在算术中“数”和“运算”的基础上发展起来的.用字母表示数是代数的一个重要特征,也是代数与算术的最显著的区别.在数学发展史上,从确定的数过渡到用字母表示数经历了一个漫长的过程,是数学发展史上的一个飞跃.用字母表示数有如下特点:1.任意性即字母可以表示任意的数.2.限制性即虽然字母表示任意的

小***库 4年前 上传602   0

如何编制导学案

捷克著名的教育家夸美纽斯说过这样一句话:“找出一种教育方法,使教师因此可以少教,但是学生多学。”课堂教学中采取什么样的教学策略,才能够实现教师少教,学生多学的教育目的?就是编写高质、实用的导学案。导学案的作用能使教师由学生学习的指导者变为学生学习的促进者、引导者,从而在根本上改变了学生的学习方式。

兰***2 4年前 上传772   0

设计专篇编制导则

危险化学品建设项目安全设施设计专篇编制导则 ( 2013-3-8) 1适用范围 本导则适用于中华人民共和国境内新建、改建、扩建危险化学品生产、储存的建设项目以及伴有危险化学品产生的化工建设项目(包括危险化学品长输管道建设项目,以下统称建设项目)安全设施设计专篇的编制。 本导则不适用于下列建设项目: 1)危险化学品的勘探、开采及其辅助的储存; 2)原油和天然气勘探、开采的配套输送及储存

1***1 5年前 上传921   0

连锁便利物流的应变配送管理模式与管控机制导师指导

随着经济的不断开展,连锁便利店作为一种新的零售渠道逐步在零售业中成为一个重要的角色,据安信证券研究中心的报告显示:从2003 年到2021 年,中国便利店店铺数和收入复合年均增长率分别达20%和24%。

鬼***笑 2年前 上传607   0

初一数学 从算术到代数_答案

专题03 从算术到代数例1 例2 A例3 原式= = 故其整数部分为2008例4 设图③中含有个正方形. (1) 由,得 (2) 由得,因均是正整数, 所以当时, 此时例5解法1: 时,; 时, , 猜想: 个, 计算过程类似于 解法2: 时,时, 猜想: 原式 验证如下: 反思结论必为一个数的平方形式, 不妨设,

小***库 4年前 上传743   0

浙教版(2020)信息技术八上 1.3 算术运算符和表达式 一课一练(含答案)

1.3算术运算符和表达式一课一练一、单选题1.在Small Basic的图形窗口中画椭圆是使用DrawEllipse操作,关于DrawEllipse操作的使用格式,它的使用格式如下:GraphicsWindow. DrawEllipse(a,b,width,height)。下列说法错误的是(  )。 A. 参数a, b分别指椭圆的x, y坐标            

福***园 8个月前 上传237   0

小学算术运算测试程序JAVA课程设计报告

面向对象程序设计(JAVA)课程设计说明书学院名称: 计算机与信息工程学院 班级名称: 20XX级计算机科学与技术 题 目: 小学算术运算测试程序 面向对象程序设计(JAVA)课程设计任务书学 院计算机与信息工程学院专 业20XX级计算机科学与技术

文***品 3年前 上传705   0

英语语法

一、指出下面句子分别属于哪个句型。① The police arrived quickly.② In the modern city, there are some problems, such as air pollution, crowdedness and noise.③ In the countryside I can enjoy a comfortable and quiet life.

心***1 2年前 上传749   0

英语语法入门

第一讲 语序和五种基本句式He learns English every day.他每天学习英语。(中英语序不同)

L***4 4年前 上传1371   0

定语从句语法讲解

在复合句中,修饰某一名词或代词的从句叫定语从句。被修饰的名词或代词叫先行词,定语从句一般放在先行词的后面。

归***2 3年前 上传612   0

日语语法总结

日语语法小结一. 句型 句型 时态 敬    体 简    体 判断句现在时 肯定 です だ 否定 ではありません ではない、じゃない 过去时肯定 でした だった 否定 ではありませんでした ではなかった、じゃなかった 存在句物体 肯定 あります ある 否定 ありません ない 物体肯定 います いる

小***库 2年前 上传662   0

英语语法复习

名词(n.)是人和事物的名称,如pen(钢笔),English(英语),life(生活)。

k***s 5年前 上传1201   0

英语语法2

句子的成份是指组成句子的各个部分,即:__________,___________,_____________,__________,________________,_____________和____________。____________和_____________是句子的主体部分。1. ____________用来说明句子所说的是“什么人”或是“什么事物”。请划出下列句子的该成份。1.A mooncake is a delicious, round cake.

心***1 2年前 上传495   0

青年教师导师制导师工作总结

为了贯彻我校青年教师导师制的落实,促进我系青年教师尽快成长,使其在短时间内,牢固树立专业思想,提高教学水平和科研能力,在2017-2018学年,本人在完成教学工作的同时,对我院青年教师XX同志进行指导培养。

b***a 4年前 上传1585   0

激光制导武器发展现状

激光制导武器以激光脉冲为制导信源来探测和追踪目标,分为寻的制导和驾束制导,目前应用最为广泛的是激光寻的制导。激光寻的制导根据指示光源来源不同,分为激光半主动寻的制导和主动寻的制导[8]。激光半主动寻的制导的指示光源由弹外的目标指示器发出,弹上的激光导引头根据弹外的指示激光进行制导;而激光主动寻的制导能够实现指示激光的自主发射和接收,该过程通过弹上的激光发射器和导引头实现。目前,由于技术水平和硬件条件的制约,激光主动寻的制导应用难度较大,激光半主动寻的制导研究最为成熟、应用最为广泛。

P***r 5年前 上传1834   0

现代汉语“左右不过”表达式探析

尽管“左右不过X”结构在现代汉语中非常常见,但我们在査闻相关研究资料时发现,学界对它的专口研究还相对较少。

爱***享 3年前 上传715   0

表92 销售日报表达式

表92 销售日报表达式 年 月 日 项次 来访 客户 访 问 时 间 备注 到 达 离 开 交款 签约 询问 看房 砍价 其他 决定 为决定 失败 时 分 时 分

小***周 10年前 上传9372   0

新编日语2语法汇总

新编日语·(2)语法知识汇总第1~2课1、用言中顿:动词连用形+、;形容词词尾变为く+、形容动词的中顿法与连接形式相同。动词谓语句在连续使用几个中顿法后,最后一个中顿法往往改成て的连接式,起承上启下的作用。2、动词准备体:(1)表示为了某种特定目的事先做好准备(て型中顿,假定型中顿)。(2)表示让某种状态继续保持下来ておい(き)。3、动词存续体:(1)表示某人动作的结果所造成的状态依然存

文***品 4年前 上传1184   0

PHP语法练习题

1、PHP语言标记是(B )。 A、<……> B、<?php……?> C、?............? D、/*………*/2、PHP代码要想以“<?”为开头,以“?>”为结束,需要启用配置文件中的(A )选项。 A、short_open_tag B、asp_tags C、allow_call_time_pass_reference D、safe_

文***享 1年前 上传534   0

被动语态语法讲解

语态用来表示主语和谓语之间的关系,分为主动语态和被动语态。二、被动语态结构被动语态结构简单而言就是“be+动词过去分词”,即be+done不同时态下的被动语态,只需要用“be done”结构代替原本时态中的实义动词即可,例如:

归***2 3年前 上传917   1

小学英语语法汇总

小学英语语法汇总

四***1 5年前 上传1356   0

2015高考英语试题分类解析(语法填空答案解析)——专题23 图画式

1.【2015·上海】Guided WritingDirections: Write an English composition in 120–150 words according to the instructions given below in Chinese.学校即将举办“读书节”,目前正广泛征集“读书节”宣传册图片。假设你是该校学生潘阳,你已找到以下三幅图片,决定

飘***2 9年前 上传518   0

高考语法复语法系列-句子成分讲义

句子成分由词按照一定的语法规则结合起来表示一个完整概念的语言单位叫做句子。组成句子的各个部分(单词或词组等)叫做句子的成分。句子的成分有主语、谓语、宾语、表语、定语、状语、宾语补足语和同位语(了解)等。主语和谓语为句子的主要成分,其他为次要成分。注意,词类与句子成分不同。词类单纯指单词的分类(如名词、动词等),而句子成分则指单词、词组、短语等在句子中的语法作用(如作主语、谓语)。1 主

福***园 1年前 上传298   0

英语语法课评课稿

               英语语法课评课稿                                   周二第二节听了刘老师的一节英语语法专题课,这节课刘老师从非谓语动词角度做切入点,把单纯的非谓语动词专题和高考的新题型语法填空有机的结合起来,这三周外语组老师出的三节课都是和高考新题型有关,如果说第一节王老师的语法课是面,那么孟凡奇老师的语法课是线的话,对于刘艳平老师的课我觉得应

f***z 10年前 上传17597   0