语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx

上传人:b****7 文档编号:22816032 上传时间:2023-02-05 格式:DOCX 页数:24 大小:332.25KB
下载 相关 举报
语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx_第1页
第1页 / 共24页
语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx_第2页
第2页 / 共24页
语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx_第3页
第3页 / 共24页
语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx_第4页
第4页 / 共24页
语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx

《语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx》由会员分享,可在线阅读,更多相关《语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx(24页珍藏版)》请在冰豆网上搜索。

语义分析报告及中间代码生成程序设计原理与实现技术实验报告材料及源代码北京交通大学文档格式.docx

//求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'

;

temp.right.push_back("

E+T"

);

E-T"

T"

i"

temp1.left='

T'

temp1.right.push_back("

T*F"

T/F"

F"

temp2.left='

F'

temp2.right.push_back("

(E)"

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

void

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1