2012-05-21 66 views
0

好傢伙即時編程方案非常新,所以我嘗試建立在方案中的詞法分析器,基本上讀取列表例如< SUM + 34 >和出放會是這樣的詞法分析器在方案

{ is the left bracket 
SUM is an identifier 
+ is the plus operator 
34 is a Digit 
} is the right bracket 

我'm正在使用dr.scheme ,該程序並不完全告訴我我錯過了什麼或者錯誤的提示。 一切對我來說是

很新的這是我到目前爲止已經試過:

(define alist'(< SUM + 34 >)) 

(define (token? object) 
    (and (list? object) 
     (not (null? object)) 
     (eq? (car object) 'token))) 

(define (ident-token? token) 
    (type-token? token 'IDENTIFIER)) 
(define (digit-token? token) 
    (type-token? token 'DIGIT)) 
(define (op-token? token) 
    type-token? token 'OPERATOR) 

(define (type-token? token type) 
    (and(type-token? token) 
     (eq? (name-token token) type))) 

(define (name-token token) 
    (cadr token)) 

(define (value-token token) 
    (caddr token)) 

(define (spot-token) 
    (cadddr token)) 

(define (assign-token name value spot) 
    (list 'token name value spot)) 

(define *peek* '()) 

(define (check-token alist) 
    (let ((token (if (null? *peek*) 
        (<token> in) 
        *peek))) 
    (set! *peek* '()) 
    token)) 

(define (peek-token alist) 
    (let ((token (if (null? *peek*) 
        (read-token in) 
        *peek*))) 
    (set! *peek* (if token token '())) 
    token)) 

(define (<token> alist) 
    (let* (next-loc (next-spot in)) (next-char (peek-char in)) 
    (cond ((eof-object? next-char) #f) 
      ((char-whitespace? next-char) 
      (begin (check-char in) 
        (<token> in))) 
      ((char-ident-initial? next-char) 
      (<identifier> (list (check-char in)) next-loc in)) 
      (else 
      (let ((next-char (check-char in))) 
      (cond ((char=? #\(next-char) 
        (assign-token 'LEFT-PAREN "(" next-loc)) 
        ((char=? #\) next-char) 
        (assign-token 'RIGHT-PAREN ")" next-loc)) 
        ((char=? #\` next-char) 
        (assign-token 'ADD-OP "+" next-loc)) 
        ((char=? #\] next-char) 
        (assign-token 'SUB-OP "-" next-loc)) 
        ((char=? #\{ next-char) 
        (assign-token 'MULT-OP "*" next-loc)) 
        ((char=? #\} next-char) 
        (assign-token 'DIV-OP "/" next-loc)) 
        (else 
        (syntax-error next-loc next-char)))))))) 

請傢伙我想我最好的,沒有什麼我嘗試編譯。我搜索了很多東西,但我找不到可以幫助我的東西。 即使您有教程或指南,可以幫助我分享

+0

請在提交前縮進代碼。在DrRacket中按ctrl + I。 – soegaard

+1

在op-token上缺少一套parens,並且alist上的間距已關閉 –

+0

您可以查看我的只爲了好玩的項目https://github.com/rmrfchik/jc它包含解決方案,這些解析器在方案之間是兼容的。我很容易使用(至少試圖這樣做;) – paul

回答

1

我認爲在閱讀錯誤消息時您需要一點指導。

當我運行上面DrRacket你的程序中,我得到的錯誤:

expand: unbound identifier in module in: token 

同時token這個功能是紅色:

(define (spot-token) 
    (cadddr token))  ; <--- 

這意味着,編譯器不是招之前沒有看到名字token

現在,因爲你沒有包括目的的描述你的功能, 我的猜測是,你忘了在參數列表中使用令牌:

(define (spot-token token) 
    (cadddr token))  

早發現錯誤是很重要的儘可能。 我的建議是每次你寫一個新功能時,在 上寫下 ,然後在下一個功能開始 之前至少進行一次到兩次功能測試。