【发布时间】:2014-10-05 17:46:21
【问题描述】:
我正在尝试为球拍中的编译器测试标记器/解析器组合,并且我有一个函数parse-string,合同类型类似于(-> string? ast:IntExp)(我知道,我可能应该重命名我的结构,但我在那里尝试了一段时间的打字球拍。
无论如何,我有一个测试库,上面写着类似的东西
(check-equal? (parse-string "4") (ast:IntExp 4)),所有的测试都失败了,即使经过人工检查,它们看起来应该通过。我所有的结构都是用define-struct/contract 定义的,它们都被标记为#:transparent。
这里出了什么问题?
好的,抱歉没有提供足够的资源来提供帮助:
这是IntExp 的结构定义:
(define-struct/contract (IntExp Exp) ([val integer?]) #:transparent)
这是测试:(check-equal? (parse-string "4") (ast:IntExp 4))
以下是 rackunit 反馈的投诉:
--------------------
FAILURE
actual: #(struct:IntExp ... 4)
expected: #(struct:IntExp ... 4)
name: check-equal?
location: (#<path:/Users/clem/dev/tiger/parser-lexer-tests.rkt> 8 0 139 48)
expression: (check-equal? (parse-string "4") (ast:IntExp 4))
而且,以防万一,这是我 requireing 的依赖项:
(require "lexer.rkt"
"parser.rkt"
parser-tools/lex
(prefix-in ast: "ast.rkt")
rackunit)
实际的解析器代码有点大,我有一种预感,它不是问题的根源,因为我的所有测试都以这种方式失败(经过检查,结果似乎是正确的)。我敢打赌,我在 rackunit 中做了一些非常愚蠢的事情。
【问题讨论】:
-
所以你有一个过程
parse-string,它评估为一个结构,并且使用相同的值parse-string初始化的另一个版本的结构,你会在它们之间得到#fforcheck-equal??如果您需要更多帮助,我认为您需要提供更多代码。