作者wei115 (NEET)
看板C_and_CPP
标题[问题] 如何让C尽量有组合语言的形式
时间Mon May 6 23:49:47 2019
问题(Question):
我想试试看实作一个C编译器
之前没有学过编译器,看了几个星期的资料後,还是不太懂编译器
不过土法炼钢,还是炼出了一些东西
因为不知道写一个编译器的难度,所以简化一下目标,只做编译器的前端
使用C作为中间语言,希望可以去除语法糖,和格式尽量和组合语言相近,以便後端实做
使用递回下降方法,没有多少检查(int str = "aabbcc"; 是可以的)
语法3成参考K&R,7成用猜的,程式码写的不够合理,常常加一个功能就要动到整个专案
之後收集更多资料後会全部打掉重练
目前有做出int、char的宣告if、while
之後想做阵列&指标的功能,但不知道指标的宣告和使用该如何简化
想请各位大大提供一些方向
谢谢
p.s
以一个1+...+100的回圈程式为例
输入:
int main()
{
int a = 101;
int out = 0;
while(a = a - 1)
out = out + a;
}
输出:
int r0;int r1;int r2;int r3;int r4;int r5;int r6;int r7;int r8;int r9;int
r10;int r11;int r12;int r13;int r14;int r15;int r16;int r17;int r18;int r19;
int main()
{
r0 = 101;
int a = r0;
r0 = 0;
int out = r0;
L0:
r0 = a;
r1 = a;
r2 = 1;
r3 = r1 - r2;
r0 = r3;
a = r3;
if(!r0) goto L1;
r4 = out;
r5 = out;
r6 = a;
r7 = r5 + r6;
r4 = r7;
out = r7;
goto L0;
L1:
}
希望输入的程式码可以转成这种最简形式
--
「我不创造美少女,我只是从纸中看见了天使,并用手使她们自由。」
——矢吹
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.126.109.77
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1557157798.A.E9F.html
1F:→ Lipraxde: 你知道 SSA form 是什麽东西吗?你好像是想在产生中间05/07 07:41
2F:→ Lipraxde: 表示法的时後做暂存器分配?暂存器分配是後端该做的事05/07 07:41
会有这样的现象是因为我在乱写....,原本是计算机的形式(输入一个算式,输出是三位址
码),处理的时候是以一行作为单位,处理完之後,暂存器编号归零,後来扩充功能後这样
的形式也保留了下来
※ 编辑: wei115 (27.246.39.28), 05/07/2019 09:41:02
3F:→ Lipraxde: 那你有 AST 吗?05/07 11:10
4F:→ wei115: 没有,词汇分析後用递回下降,直接输出中间码05/07 11:53
5F:→ wei115: 中间基本上全部写成一陀.....05/07 11:54
6F:→ Lipraxde: 先建立 AST,之後再从 AST 产生中间码会比较容易写05/07 12:10
7F:→ wei115: 目前对ast不够了解,之後收集足够的资料後打算全部重写,05/07 12:26
8F:→ wei115: 但是现在对要产生怎样形式的中间码还没有什麽头绪05/07 12:26
9F:→ Lipraxde: 用你原本的方法就好了啊,不然 java bytecode、llvm IR05/07 13:22
10F:→ Lipraxde: 之类的,还是你是打算後端也自己写?05/07 13:22
普通的运算式我可以这样写,但像是指标和阵列我就不知道怎麽分解了......
11F:→ Killercat: 可惜不是C++ 不然板上一堆CPPGM的心得 XD05/07 13:47
C++感觉更难......
※ 编辑: wei115 (27.246.39.28), 05/07/2019 14:03:13
13F:→ RishYang: 小弟我最近写了简单的Lexer与Parser 05/09 03:16