MicroC实现Expr部分和for循环,无续算版本Comp.fs展示
MicroC
功能介绍
在MicroC的基础上进行部分扩展。由于续算只实现了Expr部分和for循环,所以只展示无续算版本Comp.fs
功能 | 示例 | 对应文件 |
---|---|---|
变量赋值声明 | int i = 0; | test_init.c |
前置与后置自增、自减 | ++i; --i; i++; i–; | test_selfplus.c |
for循环 | for(i=0; i<3; i++){ } | test_for.c |
三目运算符 | a?b:c | test_ternary.c |
do-while | do{ }while(i<3); | test_dowhile.c |
while | while(i<3){ } | test_while.c |
for i in range(0,3) | for i in range(0,3)}{ } | test_range.c |
Switch-case(-default) | switch(){case 1:…; case 2:…; default:…; } | test_switch.c |
+= -= *= /= %= | i += 2; … | test_primAssign.c |
与 或 非 异或 & | ~ ^ | a ^ b; a | b; a & b; ~a; | test_bitop.c |
移位运算 >> << | a << 2; a >> 2; | test_shift.c |
Max Min | max(e1, e2); min(e1, e2); | test_minmax.c |
执行命令
dotnet fslex --lexlib Microsoft.FSharp.Text.Lexing --unicode CLex.fsl
生成CLex.fs
词法分析器dotnet fsyacc --lexlib Microsoft.FSharp.Text.Lexing --parslib Microsoft.FSharp.Text.Parsing --module CPar CPar.fsy
生成CPar.fs
语法分析器与CPar.fsi
javac Machine.java
生成虚拟机dotnet fsi -r FsLexYacc.Runtime.dll Absyn.fs CPar.fs CLex.fs Parse.fs Interp.fs ParseAndRun.fs
可以启用fsi
的运行该编译器。在
fsi
中输入:
open ParseAndComp;;
之后则可以在
fsi
中使用使用:fromString
:从字符串中进行编译fromFile
:从文件中进行编译compileToFile
:生成中间表示
示例:
compileToFile (fromFile "test/test_init.c") "test/test_init.out";;
#q;;fromString "void main(){int i = 1;}";;
生成中间表示之后,便可以使用虚拟机对中间代码进行运行得出结果:
虚拟机功能:
java Machine
运行中间表示java Machinetrace
追踪堆栈变化
示例:
java Machine test_init.out
java Machinetrace test_init.out
功能实现
- 变量定义
简介:原本的microC只能声明变量,不能顺带赋值。改进后可以同时进行。
对比
// old void main(){int i;i = 1; }
// new (test_init.c) int main(){int i = 1;print i; }
堆栈图
- 自增、自减操作
简介:包含i++ ++i --i i–操作
例子:
void main(){int i = 1;print i++;print ++i;print i--;print --i; } ```http://www.biyezuopin.vip
运行结果:
- FOR循环
简介:增加了for循环
例子:
void main(){int i;for(i = 0; i < 5; ++i){print i;} }
运行结果:
运行栈:
- 三目运算符
- 简介:三目运算符 a>b?a:b
- 用例:
void main(){int a = 2;print a?2:3;print a-2?2:3; }
- 运行结果:
for in range
简介:for i in range(0,5) 范围循环
例子:
void main(){int i;for i in range(0, 5){print i;} }
运行结果:
- Switch-case-default
例子:
void main(){int i = 0;switch(i){case 1: print 1;case 2: print 2;case 0: {int j = 1; print j;}}i = 5;switch(i){case 1: print 1;case 2: print 2;case 0: {int j = 1; print j;}default: print i;} }http://www.biyezuopin.vip
运行结果:
+= -= /= *= %=
int main(){int i=0;int n=1;switch(n){case 1:{i=n+n;break;}case 5:i=i+n*n;} }
- 运行结果
- 运行结果
与 或 非 异或 & | ~ ^
void main(){print 1&0;print 1|0;print 2^1;print ~1; }
- 运行结果:
- 运行结果:
- 移位 << >>功能:
例子:
void main(){int i = 1;print i << 2;print i >> 1; }
- 运行结果
Max Min 功能:
例子:
void main(){print max(10*10,1);print min(10*10,1); }
- 运行结果
JVM
BITAND = 26,BITOR = 27,BITXOR = 28,BITLEFT = 29,BITRIGHT = 30, BITNOT = 31
http://www.biyezuopin.vip- 指令集添加:
- BITAND:
- 简介:& 与
- 功能:将两个表达式进行与运算
- BITOR:
- 简介:| 或
- 功能:将两个表达式进行或运算
- BITXOR:
- 简介:^ 异或
- 功能:将两个表达式进行异或运算
- BITLEFT:
- 简介:<<
- 功能:将值左移
- BITRIGHT:
- 简介:>>
- 功能:将值右移
- BITNOT:
- 简介:~
- 功能:二进制取反
- BITAND:
- 指令集添加:
心得体会
这学期大作业比较多,导致最后赶完其他5门大作业和两场考试后,只剩4~5天写编译。因为将近1个月没碰编译,所有结构都要重新看过。又由于F#比较灵巧,刚写的功能几分钟后就忘了是怎么实现的。中间想加一些功能,比如 break、try-catch等,我会发现需要对存储环境进行添加,但由于时间有限遂放弃。其次,在写完无续算版本的编译器后,打算尝试续算版本,感受到了自己有多菜,被头部声明的几个跳转函数玩的死去活来,真的记不住啊,写一句就要往上翻。最后也只实现了Expr部分和一个For循环的续算,卡在Switch 好几个小时又放弃了。。。
1、能感受到写一个功能,可能代码量不是很多,但是要想较长时间。
2、没有把概念、精髓融会贯通,对于环境定义总是写写忘忘,脑中无法生成连贯的思路。
3、虽然很多功能没能实现出来,但经过思考,我大概能知道缺少什么结构,对语言设计、存储有了进一步的理解
4、感受到了仅仅30条指令能完成这么多功能的强大,很有趣
5、没有试过llvm,有点遗憾。有时间会再去折腾一下没实现的功能,也会去试试llvm
从《七周七语言》了解并学习了不同类型的语言、到正则表达、词法分析、语法分析等等,最后自己上手解释器、编译器、生成中间代码、用栈式虚拟机运行,都对计算机学习有着极大的帮助。加深了我对计算本质的理解与运用。
MicroC实现Expr部分和for循环,无续算版本Comp.fs展示相关推荐
- EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算
摘要: E-HPC 低成本计算方案 E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追 ...
- foreach循环怎么获取全部返回值_JavaScript中For循环的3种版本和使用场景
作者 | Fernando Doglio 译者 | 王强 我们大家都至少会了解一个版本的 For 循环,它如此经典,可能每一种语言都有它的一个版本.但 JavaScript 足足有 3 种 For 循 ...
- 宏基d260linux系统,Devuan GNU+Linux 2.0.0 稳定版发布,无systemd自由版本
评价该项目"Veteran UNIX Admins"已经宣布发布Devuan GNU+Linux 2.0.0,这是该项目的一个新稳定版本,该版本在2014年底派生出Debian,以 ...
- CSS+JS自动循环滚动的多图片幻灯切换展示效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 戴尔G3 3579笔记本无法使用耳机上的麦克风/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法
戴尔G3 3579笔记本麦克风用不了/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法 遇到的问题(症状) 戴尔G3 3579笔记本重装系统后插入耳机不再弹出询问框询问插入的是何种设备 识别不到普 ...
- 苹果App store app上架转让注意事项,无续费按钮,无转让按钮,给人工打电话
下面几个注意事项挨个看一下 原账号下App处于活跃状态,即不能欠费 如果欠费,需要原账号 先下载developer App(手机下载就可以) 进行实名认证后,需要先到网页版接受一个协议,网页才会显示续 ...
- 掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进
注:以下内容来自于网络,若有侵权请联系QQ3609400292进行删除. 煤矿安全生产标准化管理体系基本要求及评分方法(试行) 8.4 掘 进 一.工作要求(风险管控) 1.生产组织 (1)煤 ...
- 佛祖保佑永无BUG python版本
佛祖保佑 永无BUG # # _ooOoo_ # o8888888o # 88" . "88 # (| -_- |) # O\ = /O # ____/`---'\____ # . ...
- 免费去水印软和视频编辑软件—无水印剪辑,版本V1.0.5
行业解决方案.产品招募中!想赚钱就来传!>>> 免费全免费,无广告 无水印剪辑支持短视频去水印.图片去水印.视频裁剪.视频剪辑.视频图片加水印文字加图涂鸦工具! 1.支持一键解析提取 ...
最新文章
- MySQL中查询的看到的日期和Java程序查询出来的日期差了几个小时
- 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击...
- HTML+CSS实例——漂亮的查询部件(一)
- Android构建流程——篇六
- 用udp协议通讯时怎样得知目标机是否获得了数据包?_和相亲对象聊天,你属于UDP还是CDP?...
- Redis的碎片整理功能只有在使用jemalloc的时候才支持
- 老杨和驳客都在胡言乱语——千条道理不如一个事实
- 系统学习NLP(五)--句法分析
- PHP的压力测试工具ab.exe 和mpm介绍提高并发数
- python微信爬虫
- 增强安全性、支持跨页逻辑关系设定的电信运营级EnableQ在线问卷调查引擎V1.60来了......
- cm11 android l,【鹰眼出品】安卓4.4.4 CM11已刷,流畅度爆表!《转》
- tcl中数字加减的怪异现象
- 7-1 愿天下有情人都是失散多年的兄妹 (25 分)
- 1.CPU体系架构-RISC指令集和CISC指令集
- testmeshpro合批_Unity合批原理及失败的原因
- 饿饿,饭饭「每日一题」
- cgb2107-day08
- 隐藏CAD图层内容,2种方法搞定
- 第 5 章 函数和代码复用