2017-05-06 15 views
1

現在のレキシカルアナライザで作業しています。以下は私のコードであり、エラーが発生しています map:契約違反 期待:リスト? は、与えられた:# 引数の位置:第2 その他の引数...: #Schemeのレキシカルパーサー

#lang racket 

(define tokens '((dog noun) 
       (cat noun) 
       (chases verb) 
       (the article))) 

(define (getToken word) 
    (cadr (assq word tokens))) 

(define ttw (lambda (l) 
    (map getToken l))) 

(define (parse-sentence list) 
    (article list)) 


(define (article list) 
    (if (eq? (car list) 'article) 
     (begin 
      (display "Article: ") 
      (display (car list)) 
      (noun (cdr list)) 
     ) 
     (begin 
      (display "Not an Article!!!") 
      (display (car list))) 
     )) 

(define (noun list) 
    (if (eq? (car list) 'noun) 
     (begin 
      (display "Noun:") 
      (display (car list)) 
      (noun (cdr list)) 
     ) 
     "Not a noun!!!") 
     ) 

(begin 
    (display "Enter a Sentance in(): ") 
    (let ((input (read))) 
     (ttw (parse-sentence input)))) 

私の入力は(犬が猫を追いかける)

+1

期待される出力は何ですか? –

答えて

2

は、プログラムを実行している、私はこの表現そのDrRacketの色を見ると赤:機能の一部

(map getToken l) 

ある

(define ttw (lambda (l) 
    (map getToken l))) 

とエラーは、我々は今、期待通りttwを入力としてvoidなくリストで呼び出されていることを知っている

map: contract violation 
    expected: list? 
    given: #<void> 
    argument position: 2nd 
    other arguments...: 

であるからです。

ttwはどこですか? "Check Syntax"アイコン(虫めがねのチェックマーク)をクリックし、ttwの上にマウスを移動すると、すべての用途が表示されます。

のみ使用がである:

(ttw (parse-sentence input)) 

これはparse-sentencevoidを返したことを意味します。のは、parse-sentenceの定義を見てみましょう:

(define (parse-sentence list) 
    (article list)) 

さて、エラーがarticleでなければなりませんので:

(define (article list) 
    (if (eq? (car list) 'article) 
     (begin 
      (display "Article: ") 
      (display (car list)) 
      (noun (cdr list))    
     ) 
     (begin 
      (display "Not an Article!!!") 
      (display (car list))) 
     )) 

そして、ここで私たちは、この参照:値を返すbegin

(if ... 
    ... 
    (begin 
      (display "Not an Article!!!") 
      (display (car list)))) 

コンストラクト最後の式のここで(display ...)voidを返します。出力の確認

は、我々は正しいエラーメッセージの前に参照してください。

Not an Article!!!the 

だから、問題はarticleがリスト以外の何かを返すことです。

しかし、エラーが見つかったので、私はあなたが機能errorを調べることをお勧めします。次のようなもの:(error 'article (~a "Not an article, got: " (car list))errorを使用すると、DrRacketはarticleにエラーが見つかったことを直接表示します。