计划新手,目前正在研究词法分析器。下面是我的代码,我收到错误 地图:合同违规 预期:列表? 给出:# 论点位置:第二 其他论点......: #
#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))))
我的输入是(狗追猫)
答案 0 :(得分: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
在哪里被召唤?单击“检查语法”图标(带放大镜的复选标记),然后将鼠标悬停在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
中发现错误。