用F#写一个简单的编译器

2021-6-29 22:02:2

#编译原理#Fshape

61

前言

随着期末的到来,编译原理这门课也到了要提交大作业的时候了,因此在这里作一笔记。

开始写编译器

概览

  • 首先本编译器是基于Micro C编译器写的,基于Micro C编译器改进并引入新特性
  • Micro C源码

Micro C分析

  • Micro C主要是由以下几部分组成
    • 解释器
      • Absyn.fs #抽象语法 (需要修改)
      • grammar.txt #文法定义
      • CLex.fsl #fslex词法定义 (需要修改)
      • CPar.fsy #fsyacc语法定义 (需要修改)
      • Parse.fs #语法解析器
      • Interp.fs #解释器
    • 编译器
      • Machine.fs #VM 指令定义 (需要修改)
      • Machine.java #使用Java作为编译器后端 (需要修改)
      • Comp.fs #编译器 输出 stack vm 指令序列
      • Backend.fs #编译器后端 翻译 stack vm 指令序列到 x86_64 (需要修改)
    • 其他
      • Debug.fs #debug模式相关文件
      • microc.fs #定义了读入的文件格式
      • microc.fsproj #项目构建相关
      • ParseAndComp.fs #定义了一些接口
  • 构建与运行指令
    • dotnet build #构建项目
    • dotnet fsi #打开f#控制台
    • #r \"nuget: FsLexYacc\";; #导入库文件
    • #load \"Absyn.fs\" \"CPar.fs\" \"CLex.fs\" \"Debug.fs\" \"Parse.fs\" \"Machine.fs\" \"Backend.fs\" \"Comp.fs\" \"ParseAndComp.fs\";;
    • open ParseAndComp;;
    • compileToFile (fromFile \"test\\\\test.c\") \"output\\\\ex\";; #编译测试文件
    • javac Machine.java #编译器后端
    • java Machine ./output/test.out 2 #运行测试文件
    • dotnet run -p microc.fsproj ./test/test.c #这种也可以一步编译到位,但是microc.fsproj要配置好
    • 解释器执行
      • 'dotnet restore interpc.fsproj'
      • 'dotnet clean interpc.fsproj'
      • 'dotnet build -v n interpc.fsproj'
      • 'dotnet run -p interpc.fsproj ex1.c 8'
  • 了解了以上的文件结构后便可以开始着手修改Micro C编译器了