编译原理课程设计--C语言编译器

这篇具有很好参考价值的文章主要介绍了编译原理课程设计--C语言编译器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编译原理课程设计–C语言编译器

源程序1:
编译原理课程设计--C语言编译器
源程序1词法分析结果:
编译原理课程设计--C语言编译器
与程序1语法分析结果(部分)
编译原理课程设计--C语言编译器
源程序1四元式:
编译原理课程设计--C语言编译器
源程序1优化后的四元式:
编译原理课程设计--C语言编译器
action-goto表(部分)
编译原理课程设计--C语言编译器
文件目录:
编译原理课程设计--C语言编译器

课设目的

(1)掌握语义分析过程,即语法制导翻译过程。
(2)在语法分析的LR分析程序中的基础上添加程序,进行语义分析,生成源程序的四元式代码。
(3)理解语法分析和语义分析的接口方式。
(4)掌握中间代码的局部优化、循环优化和全局优化的基本原理和方法。
(5)对语义分析生成的四元式代码进行基本块的划分和局部优化,减少代码的存储空间,提高代码的运行效率。

课设内容

在语法分析程序中添加语义分析功能,审查TPL语言源程序是否有语义错误,若程序语义正确,则语义分析结果生成四元式代码,否则给出错误位置和原因。编写语义分析程序的流程如图2-1所示。
编译原理课程设计--C语言编译器
对语义分析的结果四元式划分基本块,采用DAG图完成块内优化,给出优化后的四元式结果。编写代码优化程序的流程如图2-2所示。
编译原理课程设计--C语言编译器

课设要求

采用自底向上的方法来设计TPL编译器,实现编译器的以下功能:
(1)能对任何TPL语言源程序的语法分析结果进行语义分析。
(2)输出语义分析过程。
(3)若程序语义正确,则语义分析结果生成四元式代码,否则给出错误位置和原因。
(4)采用基本块的划分方法对语义分析的结果四元式划分基本块。
(5)使用DAG图完成基本块的优化,给出优化后的四元式结果。

课设原理

语义分析原理

//语义分析是基于语法制导下的语义分析,对每个产生式编制一个语义子程序,在进行语法分析的过程中,当使用一个产生式进行归约时,就调用该产生式相应的语义子程序实现语义检查与翻译。语法制导定义的实现途径首先将LR分析器能力扩大,增加在归约后调用语义规则的功能,再增加语义栈,语义值放到与符号栈同步操作的语义栈中,多项语义值可放在同一个语义栈。以下给出每个产生式的语义子程序以及对应的修改后的产生式。
(0) S->vm(){S}
{S.chain:=S1.chain;}
(1) S->C{S}
{S.chain:=merge(C.chain,S.chain);}
(2) S->T{S}
{emit(jump,-,-T.codebegin);
S.chain:=T.chain;
backpatch(S1.chain,T.codebegin);}
(3) S->A;S
{S.chain := S1.chain;
backpatch(A.chain,nextstat);}
(4) S->AS
{S.chain := S1.chain;}
(5) A->nz
{S.TYPE := int;
A.chain = 0;}
(6) S->^
{S.chain := 0;}
(7) C->i(A)
{backpatch(A.true,nextstat);
C.chain := A.false;}
(8) T->W(A)
{T.codebegin:=W.codebegin;
backpatch(A.true,nexstat);
T.chain:=A.false;}
(9) T->F(A;A;A)
{T.codebegin:=F.codebegin;
backpatch(A2.true,nextstat);
T.chain: = A2.false;}
(10) A->nz=k
{A.chain = 0;
A.type := int;
emit(:=,k,-,z);}
(11) A->lz=k
{A.type := float;
emit(:=,k,-,z);
A.chain = 0;}
(12) A->z=A
{p:=z.place;
A.chain = 0;
if p ≠ nil then emit(:=,A1.place,-,p)
else error;
A.chain = 0;}
(13) A->z+A
{A.palce:=newtemp;
emit(+,z.place,A1.place,A.place);}
(14) A->z*A
{A.palce:=newtemp;
emit(*,z.place,A1.place,A.place);}
(15) A->z-A
{A.palce:=newtemp;
emit(-,z.place,A1.place,A.place);}
(16)A->z>k
{A.codebegin:=nextstat;
A.true:=nextstat;
A.false:=nextstat+1;
emit(>,z.palce,k.val,0);
emit(jump,-,-0);}
(17) A->z<k
{A.codebegin:=nextstat;
A.true:=nextstat;
A.false:=nextstat+1;
emit(<,z.palce,k.val,0);
emit(jump,-,-0);}
(18) A->(A)||(A)
{A.codebegi
n:=A1.codebegin;
backpatch(A1.false,A2.codebegin);
A.true:=merge(A1.true,A2.true);
A.false:=A2.false;}
(19) A->(A)&&(A)
{A.codebegin:=A1.codebegin;
backpatch(A1.true,A2.codebegin);
A.true:=A2.true;
A.false:=merge(A1.false,A2.false);}
(20) A->(A)!=(A)
{A.codebegin:=nextstat;
A.true:=nextstat;
A.false:=nextstat+1;
emit(!=j,A1.palce,A2.place,0);
emit(jump
,-,-0);}
(21) A->(A)==(A)
{A.codebegin:=nextstat;
A.true:=nextstat;
A.false:=nextstat+1;
emit(==j,A1.palce,A2.place,0);
emit(jump,-,-0);}
(22) A->z++
{A.palce:=newtemp;
emit(+,z.
place,1,A.place);
A.chain = 0;}
(23) A->z
{A.place := z;
emit(:=,z,-,A.place);
A.chain = 0;}
(24) A->k
{A.place := newtemp;
emit(:=,k,-,A.place);
A.chain = 0;}
(25) S->b;
{S.chain := nextstat;}
(26) W->w
{W.codebegin = nextstat;}
(27) F->f
{F.codebegin = nextstat;}
(28) A->z==k
{A.codebegin:=nextstat;
A.true:=nextstat;
A.false:=nextstat+1;
emit(==j,z.name,k,0);
emit(jump,-,-0);}
(29) A->A->nz=z
{A.chain = 0;
A.type := int;
emit(:=,z,-,z);}
(30) A->A->nz=-k
{A.chain = 0;
A.type := int;
emit(-,k,-,z);}

局部优化原理

代码优化部分主要实现对基本块内的局部优化,实验原理如下。
(1)找入口语句
程序的第一个语句;
条件转移语句或无条件转移语句的转移目标;
紧跟在条件转移语句后面的语句。
(2)划分基本块
对每一入口语句,构造其所属的基本块。它是由该入口语句到下一入口语句(不包括下一入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。
(3)删除不可达语句
(4)对每个块按照四元式类型构造DAG图。DAG子图如图4-1所示。
编译原理课程设计--C语言编译器

数据结构、函数说明和主要算法

主要的数据结构

typedef struct//语法树的结点属性
{
    string val;//常量的值
    string name;//变量的名字
    string type;//符号的属性和标识符的属性
    string place;
    int tru_e;
    int fals_e;
    int codebegin;
    int chain;
}quaternion;
vector<int> G[1000];//语法树结点标号
vector<string> symbol;//语法树结点内容
vector <quaternion> attr;//储存语法树结点
extern int Q_count = 0;//语法树结点个数
typedef struct//四元式结构体
{
    string a;
    string b;
    string c;
    string d;
}four;
four F[MAX];//储存四元式
int F_count = 100;//四元式地址
string table_z[MAX];//符号表 变量名
int table_z_count = 0;//变量个数
string table_h[MAX];//符号表 函数名
int table_h_count = 0;//函数名个数
int new_w = 0;//新的临时变量的个数
typedef struct//优化结点属性
{
    vector <string> left;//结点左方信息
    string down;//结点下方信息
    vector <int> parent;//父结点号容器
    vector <int> son;//子结点号容器
    int future;//生成的结点是几型
    int num;//根据第几条四元式产生的结点
}optimize;
vector<int> parted;//入口标号
int parted_count = 0;//块数
four FF[MAX];//储存被优化后的四元式
int FF_count = 100;//被优化后的四元式地址
int down[MAX];//每一块减少的条数
int down_count = 0;

所有函数的说明

string newtemp();//新建变量
void quater(int u);//遍历语法树
u:开始遍历的结点标号
void emit();//输出四元式
void apart();//分块函数
vector <optimize> DAG(int z,int a,int b,vector <optimize> opp,int opp_count,vector <int> H[1000]);//DAG构图函数
z:第几块
a:入口标号
b:出口标号
opp:储存DAG各结点信息的容器
opp_count:DAG结点个数
H:DAG图结点标号链接情况
void work_optimize();//优化函数
void emit2()//输出优化后的四元式

主要算法

void quater(int u)//从第u个结点开始向下遍历语法树,分析每个结点,执行相应语义动作
1.if (为空结点) then return
2.end if
3.for(i ← 0 to G[u].size())
4.    quater(G[u][i])//迭代遍历所有的儿子结点
5.end for
//根据不同的产生式执行语义动作
6.if(结点信息为0表示用第0条产生式进行规约)then
7.    执行第零条产生式的语义动作
8.else if(结点信息为1表示用第1条产生式进行规约)then
9.    执行第1条产生式的语义动作
10.……(若执行语义动作过程中产生新的变量名称,使用容器储存变量名称。)
11.else if(结点信息为30表示用第30条产生式进行规约)then
12.    执行第30条产生式的语义动作
13.end if
vector <optimize> DAG(int z,int a,int b,vector <optimize> opp,int opp_count,vector <int> H[1000])//a、b为两个入口语句,生成块的DAG图
1.queue <int> son;//暂存儿子结点标号
2.for(i ← a to b);//遍历一块
3.    if该结点信息为0型then
4.        遍历已经生成的结点查找有无相等变量已经生成;
5.        if没有then新建结点
6.        else if有then更新该结点左部信息;
7.        end if;
8.    else if该结点信息为1型then
9.        遍历已经生成的结点查找有无相等变量已经生成;
10.        遍历已经生成的结点查找有无相等数值已经生成;
11.        if变量未曾生成,数值未曾出现then
12.            新建一个儿子结点;
13.            新建一个父结点;
14.            儿子结点标号入son栈;
15.            while(!son.empty());//构建语法树
16.                    H[opp_count].push_back(son.front());//DAG连接
17.                    son.pop();//son栈弹出元素
18.                end while;
19.        else if数值出现过,变量名未曾出现then
20.            新建一个父亲结点;
21.            儿子结点标号入son栈;
22.            while(!son.empty())//构建语法树
23.                H[opp_count].push_back(son.front());//DAG连接
24.                son.pop();//son栈弹出元素
25.            end while;
26.        end if;
27.    else if该结点信息为2型then
28.        遍历已经生成的结点查找有无相等变量已经生成;
29.    	 遍历已经生成的结点查找有无相等变量已经生成;
30.        if两个变量都存在then
31.            if有共同的父结点并且能合并then更新该父结点左部信息;
32.            else不能合并then
33.                新建一个儿子结点;
34.                儿子结点标号入son栈
35.                while(!son.empty())//构建语法树
36.                    H[opp_count].push_back(son.front());//DAG连接
37.                    son.pop();//son栈弹出元素
38.                end while;
39.            end if;
40.        else if只有一个变量存在
41.            新建一个儿子结点;
42.            新建一个父亲结点存新的运算结果;
43.            儿子结点标号入栈;
44.            son.push(opp_count-1);
45.            while(!son.empty())//构建语法树
46.                H[opp_count].push_back(son.front());//DAG连接
47.                son.pop();//son栈弹出元素
48.            end while49.        else if一个变量都不存在then
50.            新建两个儿子结点;
51.            新建一个父亲结点;
52.            儿子结点标号入栈;
53.            while(!son.empty())//构建语法树
54.                H[opp_count].push_back(son.front());//DAG连接
55.                son.pop();//son栈弹出元素
56.            end while57.    else if该结点信息为6型then
58.        新建一个结点;
59.    end if60.end for
61.return opp;
void work_optimize()//对四元式进行优化
1.for(i ← 1 to parted_count)
2.    vector <optimize> opp;//优化结点信息
3.    vector <int> H[1000];//储存四元式DAG 画邻接表
4.    int H_count = 1;//DAG结点标号
5.    int opp_count = 0;//生成的DAG的结点数
6.    opp = DAG(i,parted[i],parted[i+1]-1,opp,opp_count,H);//生成DAG
7.    simple(opp);//根据结点是几型的确定该四元式是否需要删除,并整理保留下来的四元式信息
8.end for;
9.for(i ← 0 to FF_count)//遍历优化后的四元式
10.    if是跳转语句 then
11.        根据第四区段求得跳转到第m块;
12.        根据down数组求得第m块前共减少a条四元式;
13.        m = m - a;//优化后的跳转序列
14.        FF[i].d = m;
15.    end if;
16.end for;
17.emit2();//输出优化后的四元式

运行结果

编译原理课程设计--C语言编译器
编译原理课程设计--C语言编译器Q::幺幺幺伞琪琪灵伞耳琪(项目私发)文章来源地址https://www.toymoban.com/news/detail-477536.html

到了这里,关于编译原理课程设计--C语言编译器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机组成原理课题讨论——编译器对程序的影响

    一、引言   本次课题研究题目由我的老师提出,研究成果以及结论均由我以及我的同学经过不懈的努力得出,仅供大家参考! 二、编译器的概念及工作流程   编译器是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的

    2024年02月04日
    浏览(29)
  • C语言【编译器、变量、输入输出有关的】

    一些想到的【从编译器到变量到输入输出有关的】的问题,有些是按自己理解写的答,有些待解决。 C语言可以跨平台,汇编不可以,编译时C语言会根据不同系统翻译成不同形式的汇编语言。 C语言中算数运算会在寄存器中运行,变量保存在堆或栈中。 遗留问题 : C语言 变量

    2024年02月05日
    浏览(35)
  • Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序

    目录 一. 在Ubuntu系统下用c语言编写一个简单的输出hello world 的程序,并编译、运行。 1.1 gcc/g++简介 1.2 c++程序输出 Hello World: 1.3 c语言程序输出 Hello World: 二. 编写一个主程序文件main1.c和一个子程序文件sub1.c,实现函数间的调用 2.1  编写sub1.c 和main1.c 函数 2.1.1 编写sub1.c函数

    2024年02月04日
    浏览(41)
  • 【送书福利-第三十一期】《TVM编译器原理与实践》

    适读人群 :从事AI算法,软件,AI芯片,编译器开发工程技术人员 人工智能(Artificial Intelligence,AI)已经在全世界信息产业中获得广泛应用。深度学习模型推动了AI技术革命,如 TensorFlow、PyTorch、MXNet、Caffe等。大多数现有的系统框架只针对小范围的服务器级 GPU进行过优化,

    2024年01月21日
    浏览(43)
  • python语言在线编译器,python 在线编程工具

    大家好,小编来为大家解答以下问题,python语言在线编译器,python 在线编程工具,今天让我们一起来看看吧! 1.python在线编译器的解决方案 方案一:vscode web版(vscode online) 大名鼎鼎的vscode 推出了web版,也就是说可以在网页上进行编程了。 github地址:https://github.com/microsoft/v

    2024年04月26日
    浏览(35)
  • 【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )

    计算机 的 程序 是在 CPU 上执行的 , CPU 上执行的只有匹配该 CPU 的机器码指令 , 不同类型的 CPU 执行的 机器码指令 格式不同 , X86 和 ARM 执行的 机器码 指令格式是不同的 ; 机器码指令 是 二进制的 , 所有在 计算机 上执行的程序 , 都是 若干 二进制机器码 的集合 ; 计算机 只能执

    2024年03月22日
    浏览(37)
  • 开源Bluespec bsc编译器和可重用示例设计

    这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。 达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec ,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。 摘要: bsc编译器是一

    2024年01月24日
    浏览(25)
  • 嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

    目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”:语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明:section  七、属性声明:aligned  C语言标准的发展过程: ● KR C. ● ANSI C. ● C99. ● C11. 指定初始化结构体成员:         和数组类似,

    2024年02月08日
    浏览(41)
  • 【C语言&C++编译器】VS2019离线安装版,附详细安装步骤和安装包

    网盘链接下载地址:链接:https://pan.baidu.com/s/1mj6ssEcyc1DBKTmRr_uoxw?pwd=2023 提取码:2023 --来自百度网盘超级会员V1的分享 —BD网盘链接点击跳转 1.右键 VS2019.rar ,选择解压到 VS2019 2.打开 vs2019vs2019_offlin 找到 vs_setup.exe 并双击启动 3.弹出界面选择 继续 4.在界面勾选以下如图选项,注

    2024年02月11日
    浏览(57)
  • C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学

    少年们好,我是博主 那一脸阳光 ,我们接下来介绍C语言的调试和bug的分享。 引言: “如果你曾经在深夜与一串神秘莫测的C代码狭路相逢,彼此瞪大眼睛,犹如牛仔对决般紧张刺激;或者你曾试图驯服一段狂野不羁的循环,却发现自己陷入了一个深不见底的逻辑黑洞,那么

    2024年01月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包