2016-04-10 10 views
1

Здравствуйте я написать BNF грамматику так:DrRacket BNF грамматику

#lang pl 

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

(define-type LE 
    [Num Number] 
) 

, но я не знаю, как проверить, если этот код хорошо ... как проверить рэкетом на единственное, что мы может использовать его нуль и цифры?

я думаю, что-то вроде этого:

(test 5) 

но

(test '()) 

работает слишком, и я не устанавливать список в моем BNF

(если этот код не хорошо - я будет рад за некоторые примеры BNF и проверку ...)

tnx много

+1

Поскольку язык 'pl' не является частью основного дистрибутива, вам нужно будет дать более подробную информацию. Является ли язык «pl» на курсе Бремнера? (http://www.cs.unb.ca/~bremner/teaching/cs3613/racket-setup/). Если да, для какой версии Racket это? – soegaard

ответ

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, вы должны получить сообщение об ошибке.

EDIT: примеры были обновлены, чтобы использовать (Num 5), а не только 5.

EDIT 2: Добавлено Kons

+0

первый тест, дайте мне ошибку: Тип проверки: несоответствие типа Ожидаемое: Номер : Положительный байт в: 5 – user165210

+1

У меня есть код обновления. PS: Язык pl доступен на pl.barzilay.org – soegaard

+0

tnx много, и последний. как проверить «нуль» в тесте? – user165210