方案词法分析器

时间:2017-05-05 00:13:41

标签: scheme

目前在Scheme中使用词法分析器。我是计划的新手,但对如何做有一般性的了解。我正在关注一个在线教程,但是我一直收到这个错误,因为我没有使用UMASS方案。我该怎么做才能替换这个类(错误:记录解析未绑定标识符)。以下是我的代码

  #lang racket


(define record_parse
  (lambda(noun adjective adverb conjunction prep terminator)
    ((noun) '(dog cat rat house tree))
    ((adjective) '(furry fast lazy sneaky))
    ((adverb) '(quickly silently))
    ((conjunction) '(and or))
    ((prep) '(with around up))
    ((terminator) '(!))))

(define noun '(dog cat rat house tree))

(define adjective '(furry fast lazy sneaky))
(define adverb '(quickly silently))
(define conjunction '(and or))
(define prep '(with around up))
(define terminator '(!))

(define class_parse (record-parse 'parse '(full full)))

(define cons_parse   (car class_parse))
(define sel_parse    (caddr class_parse))
(define tree_parse   (car sel_parse))
(define rest_parse   (cadr sel_parse))

(define parse_article
  (lambda (list_of_tokens)
    (cond
      ((null? list_of_tokens) #f)
      ((member? (car list_of_tokens) '(a the)) 
       (cons_parse                           
        (car list_of_tokens)             
        (cdr list_of_tokens)))             
      (else   #f )                            
      )  
    )       
  )           

(define (member? x list)
  (if (null? list) #f
      (if (equal? x (car list)) #t
          (member? x (cdr list)))))

(define parse_noun
  (lambda (list_of_tokens)
    (cond
      ((null? list_of_tokens) #f)
      ((member? (car list_of_tokens) noun)    
       (cons_parse                           
        (car list_of_tokens)             
        (cdr list_of_tokens)))            
      (else   #f )                           
      ) 
    )      
  )          

(define parse_noun_phrase
  (lambda (list_of_tokens)
    (let ((p_det (parse_article list_of_tokens)))     
      (if p_det                                        
          (let ( (p_n (parse_noun (rest_parse p_det))))
            (if p_n                                  
                (cons_parse                         
                 (list 'noun_phrase              
                       (tree_parse p_det)           
                       (tree_parse p_n))          
                 (rest_parse p_n)                
                 )                                
                #f)                                
            )                                
          #f)                                         
      )                                        
    ))

(define verb '(loves hates eats chases stalks))
(define parse_verb
  (lambda (list_of_tokens)
    (cond
      ((null? list_of_tokens) #f)
      ((member? (car list_of_tokens) verb)     
       (cons_parse                             
        (car list_of_tokens)                
        (cdr list_of_tokens)))             
      (else   #f )                            
      )   
    )      
  )           

(define parse_verb_phrase
  (lambda (list_of_tokens)
    (let ((p1 (parse_verb list_of_tokens)))
      (if p1
          (let ((p2 (parse_noun_phrase (rest_parse p1))))
            (if p2
                (cons_parse
                 (list 'verb_phrase
                       (tree_parse p1)
                       (tree_parse p2))
                 (rest_parse p2)
                 )
                #f)
            ) 
          #f)
      )
    ))

(define parse_sentence
  (lambda (list_of_tokens)
    (let ((p1 (parse_noun_phrase list_of_tokens)))
      (if p1
          (let ((p2 (parse_verb_phrase (rest_parse p1))))
            (if p2
                (cons_parse
                 (list 'sentence
                       (tree_parse p1)
                       (tree_parse p2))
                 (rest_parse p2)
                 )
                #f)
            )
          #f)
      )
    ))

;example of parsing a sentence
;(example
;    '(parse_sentence '(the dog chases the cat))
;    (cons_parse
;        '(sentence (noun_phrase the dog)    
;            (verb_phrase chases
;                (noun_phrase the cat)
;               (terminator)))    
;        '()                                   
;        )                                
;    )

(begin
  (display "Enter a Sentance in (): ")
  (let ((input (read)))
    (parse_article (parse_sentence input))))

我收到错误(定义class_parse(记录解析'解析'(完整)))

1 个答案:

答案 0 :(得分:2)

您定义的过程称为record_parse,但您尝试将其作为record-parse调用。修正拼写错误后,您会收到其他错误:record_parse定义为接收6个参数,但您只传递两个参数:'parse'(full full)。并且record_parse的主体没有意义,似乎你试图实现case表达式,但这不是它在Scheme中的写法 - 在所有

仅限初学者,看起来有更多错误。您应该单独测试每个过程,直到您掌握语法并在编写涉及使用所有过程的更复杂行为之前。

相关问题