2017-05-06 112 views
1

新计划和目前正在使用词法分析器。以下是我的代码,我收到错误 map:合同违规 预计:列表? 给出:# 说法位置:第二 其他参数...: #计划词汇分析器

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

而且由于错误是

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

我们现在知道,ttw调用与void作为输入,而不是一个列表预期。

ttw哪里叫?点击“Check Syntax”图标(带放大镜的复选标记),然后将鼠标悬停在ttw上可显示所有用途。

的唯一用途是:

(ttw (parse-sentence input)) 

这意味着parse-sentence返回void。让我们来看看的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))) 
     )) 

在这里,我们看到:

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

将构建begin返回值最后一个表达式。这里(display ...)返回void

检查输出,我们在错误消息之前看到右边:

Not an Article!!!the 

所以问题是不是列表中的其他article回报的东西。

但是,既然您发现了一个错误,我建议您看看功能error。例如:(error 'article (~a "Not an article, got: " (car list))。如果您使用error DrRacket会直接告诉您在article中发现了错误。