2017-05-06 3 views
1

Nouveau sur schéma et travaille actuellement sur un analyseur lexical. Ci-dessous est mon code et je reçois l'erreur carte: violation du contrat prévu: liste? donnée: # position d'argument: 2e autres arguments ...: #Schéma Lexical Parser

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

Mon entrée est (le chien chasse le chat)

+1

Quelle est la sortie attendue? –

Répondre

2

L'exécution du programme, je vois que les couleurs DrRacket cette expression rouge:

(map getToken l) 

qui fait partie de la fonction

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

et puisque l'erreur est

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

nous savons maintenant que ttw est appelée avec void en entrée et non une liste comme prévu.

Où est ttw appelé? En cliquant sur l'icône "Vérifier la syntaxe" (la coche avec la loupe), puis en passant la souris sur ttw montre toutes les utilisations.

La seule utilisation est:

(ttw (parse-sentence input)) 

Cela signifie que parse-sentence retourné void. Voyons voir la définition de parse-sentence:

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

D'accord, donc l'erreur doit être 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))) 
     )) 

Et ici, nous voyons ceci:

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

La construction begin renvoie la valeur de la dernière expression. Ici (display ...) renvoie void.

Vérification de la sortie, nous voyons juste avant le message d'erreur:

Not an Article!!!the 

Le problème est que article rendement autre chose qu'une liste.

Cependant, comme vous avez trouvé une erreur, je vous suggère de regarder dans la fonction error. Quelque chose comme: (error 'article (~a "Not an article, got: " (car list)). Si vous utilisez error DrRacket vous montrera directement qu'une erreur a été trouvée dans article.