我写了这样的BNF语法:
#lang pl
#| BNF for the LE language:
<LE> ::= <num>
| <null>
|#
(define-type LE
[Num Number]
)
但我不确定如何检查此代码是否良好... 如何检查球拍我们唯一可以使用它的空值和数字?
我认为是这样的:
(test 5)
但是
(test '())
也在工作,我没有在我的BNF中设置List
(如果这段代码不好 - 我会很高兴看到一些BNF示例并检查......)
答案 0 :(得分:1)
如果没有测试,我建议您尝试以下程序:
#lang pl
#| BNF for the LE language:
<LE> ::= <num>
| <null>
|#
(define-type LE
[Num Number]
[Nul Null]
[Kons LE LE])
(: test : LE -> LE)
(define (test x)
x)
(test (Num 5)) ; this is accepted since 5 is a Number
(test (Nul '())
(test (Kons (Num 1) (Num 2)))
; (test (Num "foo")) ; this provokes an error (as it should)
请注意(: test : LE -> LE)
声明test
函数的类型。由于在(test '())
中空列表与LE
类型不匹配,因此您应该收到错误。
编辑:示例已更新为使用(Num 5)
而不只是5
。
编辑2:添加了Kons