语义分析及中间代码生成程序设计原理与实现技术实验报告及源代码北京交通大学Word文档下载推荐.docx
- 文档编号:16601868
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:17
- 大小:24.79KB
语义分析及中间代码生成程序设计原理与实现技术实验报告及源代码北京交通大学Word文档下载推荐.docx
《语义分析及中间代码生成程序设计原理与实现技术实验报告及源代码北京交通大学Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《语义分析及中间代码生成程序设计原理与实现技术实验报告及源代码北京交通大学Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
//求FirstVT和LastVT
voidmatrix();
//求算符优先矩阵
voidtest();
//测试文法
intcmp(chara,charb);
比较两个运算符的优先级10-1
voidout(charnow,intavg1,intavg2);
//打印四元式
intope(charop,inta,intb);
//定义四元式计算方法
5.实验代码
详见附件
6.程序测试
6.1功能测试
程序运行显示如下功能菜单:
选择打印文法:
选择构造FirstVt集和LastVT集:
选择构造算符优先矩阵:
6.2文法测试
测试1:
1+2*3
测试2:
2+3+4*5+(6/2)
7.学习总结
本次实验完成了语义及中间代码生成的设计原理与实现,所采用的方法为算符优先分析方法,首先根据文法求出此文法的FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。
由于此文法和第四次文法基本相同,只是多了一条赋值语句,所以采用的规则和第四次基本相同。
在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。
由于本次实验部分代码和第四次实验的代码比较相似,只需增加一点四元式的分析计算打印过程,就能够顺利完成本次实验。
通过这次实验,我对语义分析以及中间代码部分有了一定的提高,对以后的学习有了一定程度上的帮助。
//lb6.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
#include<
iostream>
string>
VECTOR>
stack>
usingnamespacestd;
structinfo{
charleft;
vector<
right;
char>
first;
last;
};
vector<
info>
lang;
stack<
sta;
//比较两个运算符的优先级10-1
intmain(){
intchoose;
while
(1){
cout<
<
"
****************************************"
<
endl;
获取文法请按1"
打印文法请按2"
构造FirstVT集和LastVT集请按3"
构造优先关系矩阵请按4"
文法测试请按5"
结束请按0"
cin>
>
choose;
if(choose==0)
break;
switch(choose){
case1:
get();
break;
case2:
print();
case3:
fun();
case4:
matrix();
case5:
test();
default:
break;
}
}
return0;
}
voidget(){
infotemp,temp1,temp2;
temp.left='
E'
;
temp1.left='
T'
/F"
);
temp2.left='
F'
lang.push_back(temp);
lang.push_back(temp1);
lang.push_back(temp2);
cout<
文法获取完成"
voidprint(){
for(inti=0;
i<
lang.size();
i++){
for(intj=0;
j<
lang[i].right.size();
j++){
cout<
lang[i].left<
-->
lang[i].right[j]<
voidfun(){
inti,j,sign=0,sign1=0;
for(i=0;
for(j=0;
stringtemp=lang[i].right[j];
//获取右部
if(temp[0]>
'
Z'
||temp[0]<
A'
){//终结符
lang[i].first.push_back(temp[0]);
}
elseif(temp.length()>
=2){//终结符
if(temp[1]>
||temp[1]<
){
lang[i].first.push_back(temp[1]);
}
if((temp[0]>
)&
&
temp.length()==1){//终结符
lang[i].last.push_back(temp[0]);
=3){//终结符
)
lang[i].last.push_back(temp[1]);
elseif(temp[2]>
||temp[2]<
)//终结符
lang[i].last.push_back(temp[2]);
while(sign==0){//迭代FirstVT
sign=1;
for(i=0;
for(j=0;
stringtemp=lang[i].right[j];
if(temp.length()==1&
(temp[0]<
='
&
temp[0]>
)){//可以迭代
for(intk=0;
k<
k++){
if(lang[k].left==temp[0]){//找到了,添加元素
for(intp=0;
p<
lang[k].first.size();
p++){
sign1=0;
charch=lang[k].first[p];
for(intq=0;
q<
lang[i].first.size();
q++){
if(lang[i].first[q]==ch){//包含了
sign1=1;
}
}
if(sign1==0){
lang[i].first.push_back(ch);
sign=0;
}
}
}
}
sign=0;
while(sign==0){//迭代LastVT
lang[k].last.size();
charch=lang[k].last[p];
lang[i].last.size();
if(lang[i].last[q]==ch){//包含了
lang[i].last.push_back(ch);
FirstVT:
"
:
lang[i].first[j]<
LasttVT:
lang[i].last[j]<
voidmatrix(){
inti,j;
9;
i++){//初始化
mtr[i][j]='
n'
stringtemp="
+-*/()i#"
for(i=1;
mtr[i][0]=temp[i-1];
mtr[0][i]=temp[i-1];
str;
i++){//aUa<
FirstVT(U)
stringss=lang[i].right[j];
stringok="
if(ss.length()>
2){
if((ss[0]>
||ss[0]<
(ss[1]<
ss[1]>
)){//aU
ok="
ok+=ss[0];
ok+=ss[1];
str.push_back(ok);
if((ss[1]>
||ss[1]<
(ss[2]<
ss[2]>
ok+=ss[2];
str.size();
for(j=1;
if(mtr[j][0]==str[i][0]){//FindaThenFindFirstVt(U)
for(intk=0;
if(lang[k].left==str[i][1]){//FindU
for(intp=0;
for(intq=1;
if(mtr[q][0]==lang[k].first[p]){
mtr[j][q]='
'
str.clear();
i++){//UaLastVT(U)>
a
(ss[0]<
ss[0]>
)){//Ua
if((ss[2]>
||ss[2]<
if(mtr[0][j]==str[i][1]){//FindaThenFindLastVt(U)
if(lang[k].left==str[i][0]){//FindU
if(mtr[0][q]==lang[k].last[p]){
mtr[q][j]='
i++){//abaUba=b
(ss[0]>
)){//aa
(ss[1]>
)){//aUa
if(str[i][0]==mtr[j][0]){
for(intk=1;
if(mtr[0][k]==str[i][1]){
mtr[j][k]='
='
lang[0].first.size();
i++){//#
if(lang[0].first[i]==mtr[0][j]){
mtr[8][j]='
if(lang[0].first[i]==mtr[j][0]){
mtr[j][8]='
mtr[8][8]='
if(mtr[i][j]!
cout<
mtr[i][j]<
else
voidtest(){
请输入算术表达式:
stringstr;
cin>
str+='
#'
inti,j,k;
stack<
int>
data;
op;
op.push('
charnow='
//记录当前栈顶操作符
intsign=0;
str.length();
i++
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语义 分析 中间 代码 生成 程序设计 原理 实现 技术 实验 报告 源代码 北京 交通大学
链接地址:https://www.bdocx.com/doc/16601868.html