【问题标题】:Scheme Lexical Parser方案词法分析器
【发布时间】:2017-05-06 23:17:54
【问题描述】:

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

我的输入是(狗追猫)

【问题讨论】:

  • 预期输出是什么?

标签: functional-programming scheme racket


【解决方案1】:

运行程序,我看到 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 中发现了错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2014-04-21
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多