こんにちは皆さん、私はプログラミングスキームが非常に新しいので、たとえば基本的にリストを読み取るスキームで字句アナライザーを構築しようとしています< 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))))))))
私は最善を尽くしていますが、私がコンパイルしようとしているものは何もありません。私は多くのことをグーグルで調べましたが、私を助けることができるものを見つけることができませんでした..私に役立つチュートリアルやガイドがあったとしても、共有してください