Scheme Lexical Parser

时间:2017-05-06 23:17:54

标签: functional-programming scheme racket

计划新手,目前正在研究词法分析器。下面是我的代码,我收到错误 地图:合同违规   预期:列表?   给出:#   论点位置:第二   其他论点......:    #

#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 个答案:

答案 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中发现错误。