2016-04-10 48 views
1
Merhaba ben böyle bir BNF grameri yazmak

:DrRacket BNF gramer

#lang pl 

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

(define-type LE 
    [Num Number] 
) 

ama bu kod iyi olup olmadığını kontrol etmek nasıl emin değilim ... raket tek şey kontrol etmek nasıl biz boş ve sayılarını kullanabilir mi?

i onun gibi bir şey düşünüyorum:

(test 5) 

ama

(test '()) 

çok çalışmak ve benim BNF'te Listesini ayarı değilim

(bu kod iyi değilse - ı bazı BNF örnekleri için mutlu olacak ve kontrol ediyor ...)

tnx çok

+1

'pl' ana dağıtım parçası değil, biraz daha fazla bilgi vermek gerekecektir. Bremner'ın kursundaki dil mi? (http://www.cs.unb.ca/~bremner/teaching/cs3613/racket-setup/). Eğer öyleyse Racket hangi versiyonu için? – soegaard

cevap

1

test olmadan ben şu programı denemenizi öneririz: (: test : LE -> LE)test fonksiyonun türlerini beyan

#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) 

Not söyledi. (test '())'da boş liste LE türüyle eşleşmediğinden, bir hata bulmanız gerekir.

DÜZENLEME: Örnekler, (Num 5)'u ve yalnızca 5'u değil güncelleştirmeyi güncellemiştir.

DÜZENLEME 2: Katma Kons dili yana

+0

ilk test bana hata ver: Tip Checker: tür uyumsuzluk beklenen: Num verilen: Olumlu-Byte in: 5 – user165210

+1

Kodu güncelledik. Not: pl dilini pl.barzilay.org – soegaard

+0

çok tnx ve sonuncusu mevcuttur. testte "null" nasıl kontrol edilir? – user165210