2016-04-10 16 views
1

Hallo Ich schreibe eine BNF grammer wie folgt aus:DrRacket BNF grammer

#lang pl 

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

(define-type LE 
    [Num Number] 
) 

, aber ich bin nicht sicher, wie zu überprüfen, ob dieser Code gut sind ... , wie das das einzige, was in Schlägers überprüfen, ob wir kann seine Null und Zahlen verwenden?

ich denke, so etwas wie die:

(test 5) 

aber

(test '()) 

zu arbeiten, und ich bin nicht in meinem BNF Einstellung Liste

(wenn dieser Code nicht gut ist - i wird für einige BNF Beispiel glücklich sein und überprüfen ...)

tnx viel

+1

Da die Sprache 'pl' nicht Teil der Hauptverteilung ist, müssen Sie einige weitere Informationen geben. Ist die 'pl'-Sprache aus Bremners Kurs? (http://www.cs.unb.ca/~bremner/teaching/cs3613/racket-setup/). Wenn ja, für welche Racket-Version? – soegaard

Antwort

1

Ohne Prüfung Ich schlage vor, versucht das folgende Programm:

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

Beachten Sie, dass (: test : LE -> LE) die Typen der test Funktion erklärt. Da in (test '()) die leere Liste nicht mit dem LE Typ übereinstimmt, sollten Sie einen Fehler erhalten.

EDIT: Die Beispiele wurden aktualisiert, (Num 5) und nicht nur 5 zu verwenden.

EDIT 2: Added Kons

+0

der erste Test gib mir Fehler: Typ Checker: Typ Mismatch erwartet: Num gegeben: Positiv-Byte in: 5 – user165210

+1

Ich habe den Code zu aktualisieren. PS: Die PL Sprache ist verfügbar von pl.barzilay.org – soegaard

+0

Tnx viel, und die letzte. Wie überprüft man die "Null" im Test? – user165210