0%

这是一个简单编译器的实现设计记录,如果感兴趣,完整项目代码已开源。下面是项目的具体介绍。

项目介绍

1
2
3
4
5
6
7
          _     _                             _ _           
__ _| |__ (_) ___ ___ _ __ ___ _ __ (_) | ___ _ __
\ \ /\ / / '_ \| | / __/ _ \| '_ ` _ \| '_ \| | |/ _ \ '__|
\ V V /| | | | | | (_| (_) | | | | | | |_) | | | __/ |
\_/\_/ |_| |_|_| \___\___/|_| |_| |_| .__/|_|_|\___|_|
|_|

本项目打算用C语言设计一个极简的WHI语言编译器。github上也有不少极其优秀的且完整的项目,那么我的目的就是只关注编译器最核心的原理部分,而不是力求一定要尽善尽美。

设计原则将采用kiss原则,即使其尽可能的简单。

token识别上,打算采用正则表达式匹配的做法来达到更好的识别token的目的。

在目标语言上,将源程序翻译为简单栈式抽象机代码。同时与预设结果进行比较以验证编译器的正确性。

项目任务及完成情况见task.todo文件

阅读全文 »

正则表达式介绍

正则表达式(英语:Regular Expression,常简写为regexregexpRE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

阅读全文 »

递归下降分析设计概要

关于错误处理部分的设计

对于错误处理,我们主要将所有的错误类型定义在一个结构体中

1
2
3
4
5
struct grammer_error{
int errorkind;
const char* str;
// void (*handler) (int errorkind,int row, int col);
} errors[];
之所以将其分离开来,而不是直接在有错误的地方用printf打印的主要原因在于,尽量减少模块之间的耦合性。而且这样设计的好处还在于,我们可以在结构体中加入更多的特性,比如后期可能为每一个错误处理增加一个出错处理函数(如注释部分所示),当我们识别到具体的错误时就对其进行一定的处理达到识别多个错误的目的,而不是简单的识别一个错误然后直接退出,这样可以减少用户因多个错误导致的多次编译。

阅读全文 »

代码生成

回填链表的设计

由于我们需要在一遍扫描中生成指令代码,但是遇到分支循环语句时,由于执行时间的限制,我们暂时看不到后续跳转的位置,因此我们就需要一种数据结构将需要跳转的位置保存下来,当我们执行到合适的位置的时候对其进行回填。而具体的数据结构设计如下:

1
2
3
4
5
6
7
struct backpatchlist
{
int inst_remain;
struct backpatchlist *tail;
struct backpatchlist *next;
};

阅读全文 »

2022-7-14

单词 释义
degradation 退化
controversialist 善辩者
spell 招致
sought 寻求
elevated 高尚的
capture 表达
propose 提出,建议

2022-7-15

单词 释义
buy 相信,接受
prudent 谨慎的
incentive 激励,刺激
promising 大有希望的
aggravate 加剧

2022-7-17

单词 释义
byproduct 副产品
harness 利用
limbic 边缘
prefrontal 前额的
cortex 皮层
reasoning 推理
course 进程
literally 确实上,字面上

2022-7-19

单词 释义
hostile 敌对的
live off 依赖……生活
revenue 收入
bring in 引入
subsidy 补助
wing 侧厅
rocket 猛增
flagstone 石板
bed down 在……过夜

2022-7-20

单词 释义
easy game 易捕获的猎物
fishery 渔场
biomass 生物量
vessel 船,容器
proport ion 比例
longlines 多钩长线
saturate 使充满
bait 诱饵
stock 储备量
notion 观点,信念
yield 产量,出产

2022-7-21

单词 释义
phony 虚假的,冒牌的
perpetual 连续不断的
massacre 屠杀
innocent 无辜者,清白
after all 别忘了,到底
be dedicated to 致力于
depict 描绘
ideology 意识形态
bummer 令人烦恼的事
anchor 主播,锚
beaming 笑容满面的
agenda 目的,议程表
arthritis 关节炎
clove 丁香
distasteful 使厌恶的
refreshing 使精神焕发
be inclined to 倾向于

2022-7-24

单词 释义
examine 检验,查看
noteworthy 值得注意的
quirk 奇事,怪事
pronounced 明显的,显著的
astrological sign 星座
stamina 耐力,体力,精力
couple with 加上,外加
cognitive 认知的
swamp 淹没
exhibit 表现,展览
take to 开始从事
pursuit 事业,爱好
achievers 成功者
startling 惊人的
assertion 断言,主张
trait 特性,特点
overrate 高估
nurture 培养

2022-7-25

单词 释义
field 回答,处理,场地
column 专栏
supplement 增刊,增补
analogy 类比
elude 躲避,使不理解
deduce 推论,推断
neurology 神经学
populate 占据,居住于
chronological 按时间顺序的
capture 充分体现,捕获
critical 关键的,批评的
correlate 与...相关
testify 证实
toil 苦干,辛勤劳作

2022-7-26

单词 释义
count on 依赖,依靠
pink slip 解雇通知单
reduce 使沦为,减少
trade..for.. 用...换...
bear 承担,带有
spouse 配偶
of all stripes 各领域的,形形色色的
parachute 降落伞
get laid off 被解雇
weather 度过困难
make up 弥补,编造
absorb 承担,吸收
interest 利益,利息
share 份额,分享
borne 承担,承受
deductible 免赔额,自付款
demographics 人口统计数据
odds 概率,机会
attendant 随之而來的,服务员
eightfold 八倍的
wholesale 大規模的
shift 转嫁
fallout 负面影响

2022-7-27

单词 释义
sort out 解决
compliance 服从
head rolling 常指受到惩罚,倒霉
put right 用...换...
be hign on one's agenda 摆在某人的议事日程首要位置
boards 董事会
feeble 脆弱的,虚弱的
suite (一批)随员,套间
executive 管理的,行政的
contractor 承包商
asset 资产
redundancy 冗余
dim 迟钝的,暗淡的
due 预期的,应给的
get into wrong hands 落到危险分子或敌人手里
penaty 惩罚
theft 偷窃
disclose 揭露
overshadow 使黯然失色
go astray 被盗,丢失
regulators 监管机构

2022-7-29

单词 释义
catch up to 追赶
sphere 领域,球体
undesirable 不良的,有害的
susceptible 易受影响的
disorder 疾病,失调
hormones 激素,荷尔蒙
trigger 诱因,扳机
ovary 卵巢
observe 说,评论
worn out 疲惫不堪
chronic 长期的
domestic 家庭的
interpersonal 人际关系
one-shot-deals 一次性完成的任务
wear-and-tear 折磨
frustration 挫折
obligations 责任,义务
strain 压力
diffuse 舒缓,渗透
demonstrate 表明
inclination 倾向

2022-7-30

单词 释义
straightforward 直接的
journal 期刊,杂志,日记
affiliation 隶属机构,附属
decline 拒绝
peer 同龄人,同等地位的人
rest with 归属于,取决于
issue 发布,宣布
handsome 数量(收入)客观的
signal 标志,表达
endeavour 努力,尝试
distribution 分布
ready 迅速的
institutional 机构的
archive 档案室,知识库

2022-8-5

单词 释义
frame 身躯 ,体格,框架
dramatically 显著的
more than willing 非常乐意
obscure 掩盖,使费解
notably 特别,极大程度上
tissue 组织,纸巾
get in the way 阻碍
secular trend 长期趋势
substantial 很大程度上,重大的
upright 直立的
canal 道,管,运河
bipedal 双足行走的
constraint 约束,限制
organism 有机体
by and large 大体上,一般而言

2022-8-6

单词 释义
father 创立
extract 拔出,取出
transplant 移植
spur 鼓励,激励,促进
examine 考察,审查
from the bottom up 彻底的,从头开始
compromise 妥协,折中,和解
infancy 初期,婴儿期
more than anything 更重要的是,主要地
hamper 阻碍,限制
bedrock 基石
part with 放弃,交出
count 算作,计算
narrow 勉强的
clause 条款,从句
formula 方案
grant 准许,授权,同意
inflate 使大幅增加

2022-8-8

单词 释义
all...but... 除...之外全部,几乎
mindlessly 不动脑子的,盲目的
unreflecting 缺乏考虑的
herd 人群
implication 含义,可能的影响
innovation 创新
parallel 相应的,平行的
context 背景,上下文
trains of thought 思路,一连串的思想
dismiss 不予考虑,摒弃
direct 引导,监督
bother 费力,操心
press into 把...圧入
wonder 疑惑,惊讶
decider 决赛,决策者
work through 解决
be born with 生而具有的
approach 处理
or so 大约
perpetuate 使持续
commonness 平庸
come in 起作用,参与
decisiveness 果断

2022-8-9

单词 释义
boost 提高
shell out 支付
prescription 处方
over-the-counter 不需处方方可合法出售的
trace down 追踪,找到
put up 提名...为候选,张贴,提高
swab 擦拭,棉签
precision 精确,准确
genealogist 家谱学者
hawk 兜售
chromosome 染色体
mitochondrial 线粒体的
sample 样本
lump together 把...混到一块,把...归类在一起
subject 取决于,服从于...的
evaluation 评估,评价

2022-8-10

单词 释义
alike 两者都,同样的
put sb through sth 安排某人上(学),使经历磨练
radical 根本的,激进的
productivity 生产力
standards 水平,规范
deride 嘲笑,愚弄
counterpart 对应的事物
push 促使
constrain 限制,强迫
overrestimate 高估

2022-8-11

单词 释义
attach importance to 重视
in keeping with 与...一致,协调
pursuit 追求
preoccupation 关注,专注
unfold 逐渐展开,打开
puritan 清教徒,苦行者
theological 神学的
distinctive 独特的,有特定的
episode 事件
civility 礼仪,礼貌
virtuosity 精湛技艺
extensively 大量的,广泛的
earnestness 认真
let alone 更不用说
dependent 侍从
supersitious 迷信的
quality 特征,质量
account 记录
decisive 关键的,果断的
settle 决定,解决,定居
commitment 信奉,承诺,奉献
confront 面对
folk 普通百姓
mock 嘲弄,蔑视,虚假的
end 目的,结尾

在我们对三角函数进行定积分计算的时候,可能会遇到高次幂的情况,诸如

\[ \int {sin}^8x dx \]

\[ \int {sin}^{10}x dx \]

等等积分。当然如果对应积分的上下限位于 \([0,\frac{\pi}{2}]\),那么我们自然可以想到利用华里氏公式进行计算。当然可能也有些比较特殊的题可以用区间在现公式进行解决。除此之外的如果积分区间不规则也没有合适的解决办法的时候,我们可能只有将其原函数求解出来,在带入上下限进行计算。

阅读全文 »

编译器正确性的验证

直观的正确性判定

在经过一系列的数据变化,最终正确的结果会被放到桟式抽象机的顶部,如果与预期结果一致,那么我们可以认为编译器在结果上正确。

如何描述这一个过程?

  1. 代码执行一步,多步到最终的执行结束?
  2. 符号表与代码对应地址的表述
  3. 加减法的形式化表述等
阅读全文 »