我正在开发 Racket 中一种简单语言的解释器,我需要实现类似于 JavaScript 的三元条件 (Expr ? Expr : Expr)。我的语言支持加法、减法和相等等基本运算,现在我要添加布尔值和这个三元运算。
这是我当前的解析代码;;解析:Expr -> AST;;将“自定义语言”Expr 解析为 AST
(define (parse expr)
(match expr
[(? number?) (num expr)]
[(? string?) (str expr)]
['TRUE (bool #t)]
['FALSE (bool #f)]
[`(+ ,x ,y) (add (parse x) (parse y))]
[`(- ,x ,y) (sub (parse x) (parse y))]
[`(=== ,x ,y) (equals (parse x) (parse y))]
[`(,test '? ,true ': ,false)
(condt (parse test) (parse true) (parse false))]
[_ (error "Invalid custom Lang expression")]))
我现在正在学习 racket,而且我以前只有 java 经验。我假设这就像 java 中的类,并且我定义可以解析什么?然后我会有一个运行 fn,它接受解析的输入和输出结果。
这是我的跑步
;; run: AST -> Result
;; Computes the result of running a customLang AST
(define (run ast)
(match ast
[(num n) n]
[(str s) s]
[(bool b) b]
[(add x y) (cus+ (run x) (run y))]
[(sub x y) (cus- (run x) (run y))]
[(equals x y) (equal? (run x) (run y))]
[(condt test true-branch false-branch)
(if (truthy? (run test)) (run true-branch) (run false-branch))]
[_ NaN]))
所以我理解这是如果 true 则先运行,如果 false 则再运行。而且我的解析似乎设置正确。但是当我尝试运行测试时
;; JS "truthy" true
(check-equal? (evalcustom '(10 ? 100 : 200)) 100)
;; JS "truthy" false
(check-equal? (evalcustom '((- 100 100) ? "a" : "b")) "b")))
它无法识别,只能输出我创建的错误消息。我不知道如何让这个结构和 AST 树一起工作,以及它们为什么应该工作。因此,我不知道如何调试我的问题。
谢谢您的帮助,我非常感激。