# microc **Repository Path**: longyongjiang/microc ## Basic Information - **Project Name**: microc - **Description**: 编译原理课程作业,microc编译器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-06-29 - **Last Updated**: 2022-05-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # [2020-2021学年第2学期](http://sigcc.gitee.io/plc2021/#/./lab/proj.final?id=_2020-2021学年第2学期) # [**实 验 报 告**](http://sigcc.gitee.io/plc2021/#/./lab/proj.final?id=实-验-报-告) ![zucc](http://sigcc.gitee.io/plc2021/lab/zucc.png) - 课程名称:编程语言原理与编译 - 实验项目:期末大作业 - 专业班级:软件工程1801 计算1803 - 学生学号:31803112 31801147 - 学生姓名:梁泽生 龙泳江 - 实验指导教师:郭鸣 # 运行脚本 ```F# #r "nuget: fslexyacc" #load "Absyn.fs";; #load "Debug.fs";; #load "CPar.fs";; #load "CLex.fs";; open FSharp.Text.Lexing let show e = printfn "%A" e let test s = let lexbuf = LexBuffer.FromString (s+"\n") in CPar.Main CLex.Token lexbuf; ``` ```F# dotnet build ./interpc.fsproj dotnet fsi #r "nuget: FsLexYacc";; //添加包引用 #load "Absyn.fs" "Debug.fs" "CPar.fs" "CLex.fs" "Parse.fs" "Interp.fs" "ParseAndRun.fs" ;; open ParseAndRun;; //导入模块 ParseAndRun fromFile "myexample\unary.c";; //显示 ex1.c的语法树 run (fromFile "example\ex1.c") [17];; //解释执行 ex1.c run (fromFile "myexample\unary.c") [8];; //解释执行 ex11.c Debug.debug <- true //打开调试 ``` # gitee链接 [microc: 编译原理课程作业,microc编译器 (gitee.com)](https://gitee.com/longyongjiang/microc) # 实现的功能点 - (**)注释 - 前缀自增自减 - For循环 - __开头内部保留变量报错 - 变量声明时赋值 - switch语法 - break ## (**)注释 ### 测试代码 ```c //test1 (* *)注释测试 void main(int n){ //annotation 1 /*annotation 2*/ } (* here is annotation 0*) void main(int n){ //annotation 1 /*annotation 2*/ (* here is annotation 0*) } void main(int n){ //annotation 1 /*annotation 2*/ (* here (*is annot*)ation 0*) } ``` ### 解释执行 ![image-20210629210735576](image-20210629210735576.png) ## 自增自减 ### 测试代码 ```c // 测试自增自减 void main (int n){ int i; i=5; print i; print ++i; print i; print --i; print i; } /* void main (int n){ int i; //i++; } */ /* void main (int n){ int i; i++; i--; } */ ``` ### 语法树 ![image-20210630000715891](image-20210630000715891.png) ### 解释运行 ![image-20210630013501380](image-20210630013501380.png) ## FOR循环实现 ### 测试代码 ```c /* void main(int n){ print n; } */ void main(int n){ int i; i=0; for(i=1;i 0) print n; */ int a ; a = 1; while(a < n){ a = a+1; if(a==4) break; print a; } } # 执行命令 # .\bin\Debug\net5.0\microc.exe -g .\myexample\break.c 5; # .\bin\Debug\net5.0\machine.exe .\break.out 7 ``` ### 编译执行 ![image-20210705105505114](image-20210705105505114.png) ### 指令 ![image-20210705105544046](image-20210705105544046.png) # 总结 ## 绩效评价 | 姓名 | 学号 | 班级 | 任务 | 权重 | | ------ | -------- | ------------ | ---------- | ------ | | Name | No. | Class | Task | Factor | | 龙泳江 | 31801147 | 计算机1803 | 设计、编码 | 1.0 | | 梁泽生 | 31803112 | 软件工程1801 | 报告,测试 | 0.9 | ## 成员代码提交日志 ![image-20210630063619276](image-20210630063619276.png) ## 完成情况 | 实现 | 完成评价 | 备注 | | ---------------------- | -------- | ---- | | (**)注释 | ⭐⭐⭐ | | | 前缀自增自减 | ⭐ | | | for循环 | ⭐ | | | __开头内部保留变量报错 | ⭐⭐ | | | 变量声明时赋值 | ⭐ | | | switch语法 | ⭐ | | | break编译执行 | ⭐⭐⭐ | | ## 个人经验教训总结 #### 龙泳江 经过此次编译原理课程实践,我对程序的本质有了更深刻的了解;看到这些神奇的实现方式,不禁为前人的智慧感到深深的敬佩。虽然我只做了编译前端的一部分,但是这东西确实挺难的。我了解了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解。 ps.break的实现真是有趣 #### 梁泽生 此次编译原理课程实验大作业让我体会到,计算机其他专业课一样,要学好编译原理,实验是必不可少的环节。我们深有体会:书上的知识都能看懂,基本原理也都明白,但是在自己亲手编写程序时,却无从下手,甚至连第一句该怎么写都不知道。通过实验,可以在很大程度上加深印象。在书上看的知识点,一切都是理所当然,十分顺利,而自己动手,才会真正发现自己的不足之处。