0

こんにちは皆さん、私はプログラミングスキームが非常に新しいので、たとえば基本的にリストを読み取るスキームで字句アナライザーを構築しようとしています< SUM + 34 >。出力は次のようになります

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

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

私は最善を尽くしていますが、私がコンパイルしようとしているものは何もありません。私は多くのことをグーグルで調べましたが、私を助けることができるものを見つけることができませんでした..私に役立つチュートリアルやガイドがあったとしても、共有してください

4

1 に答える 1

1

エラーメッセージを読むには少しガイダンスが必要だと思います。

上記のプログラムを DrRacket で実行すると、次のエラーが表示されます。

expand: unbound identifier in module in: token

同時に、tokenこの関数は赤く着色されています:

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

これは、コンパイラがtoken以前に名前を見たことがないことを意味します。

関数の目的の説明が含まれていないため、引数のリストでトークンを使用するのを忘れていたと思います。

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

ミスを早期に発見することが重要です。私のアドバイスは、新しい関数を書くたびに、次の関数を始める前に、関数の少なくとも 1 ~ 2 つのテストを書くことです。

于 2012-05-22T13:36:23.567 に答える