标签: tiger

在我的编译器中编写单元测试(生成IL)

我正在编写一个Tiger编译器C#,我将把Tiger代码翻译成IL.

在实现AST中每个节点的语义检查时,我为此创建了许多单元测试.这很简单,因为我的CheckSemantic方法看起来像这样:

public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我想为某个节点的语义检查编写一些单元测试,我所要做的就是构建一个AST,然后调用该方法.然后我可以这样做:

Assert.That(errors.Count == 0);
Run Code Online (Sandbox Code Playgroud)

要么

Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
Run Code Online (Sandbox Code Playgroud)

但是我现在正在开始代码生成,而且我不知道在为该阶段编写单元测试时可能是一个好的做法.

我正在ILGenerator上课.我考虑过以下几点:

  • 生成我想测试的示例程序的代码
  • 保存该可执行文件
  • 执行该文件,并将输出存储在文件中
  • 断言该文件

但我想知道是否有更好的方法呢?

c# compiler-construction unit-testing compilation tiger

9
推荐指数
1
解决办法
495
查看次数

使用Ocamllex作为lexing字符串(The Tiger Compiler)

我正在尝试遵循Appel的"ML中的现代编译器实现",并且正在使用Ocamllex编写词法分析器.

规范要求词法分析器转换转义序列返回字符串.以下代码摘自ocamllex输入文件:

 rule tiger = parse
 ...
 | '"'
     { let buffer = Buffer.create 1 in
       STRING (stringl buffer lexbuf)
     }
 and  stringl buffer = parse
 | '"' { Buffer.contents buffer }
 | "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf }
 | '\\' '\\' …
Run Code Online (Sandbox Code Playgroud)

ocaml lex tiger ocamllex

7
推荐指数
1
解决办法
1636
查看次数