【问题标题】:DrRacket BNF grammarDrRacket BNF 语法
【发布时间】:2016-04-10 14:34:34
【问题描述】:

我这样写一个 BNF 语法:

#lang pl

#| BNF for the LE language:
   <LE> ::= <num>
          | <null>
|#

(define-type LE
  [Num Number]
)

但我不确定如何检查此代码是否良好... 如何检查球拍唯一我们可以使用它的空值和数字的东西?

我认为是这样的:

(test 5)

但是

(test '())

也在工作,我没有在我的 BNF 中设置列​​表

(如果这段代码不好 - 我会很高兴看到一些 BNF 示例并检查......)

【问题讨论】:

标签: numbers racket bnf


【解决方案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 -&gt; LE) 声明了test 函数的类型。由于(test '()) 中的空列表与LE 类型不匹配,你应该会得到一个错误。

编辑:示例已更新为使用(Num 5) 而不仅仅是5

编辑 2:添加 Kons

【讨论】:

  • 第一次测试给我错误:类型检查器:预期类型不匹配:给定数量:正字节输入:5
  • 我已经更新了代码。 PS:pl 语言可从 pl.barzilay.org 获得
  • tnx 很多,最后一个。如何检查测试中的“null”?
  • 添加了 Kons。见上文。
  • 查阅你的文字,看看他们是如何做的。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多