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))))))))
請傢伙我想我最好的,沒有什麼我嘗試編譯。我搜索了很多東西,但我找不到可以幫助我的東西。 即使您有教程或指南,可以幫助我分享
請在提交前縮進代碼。在DrRacket中按ctrl + I。 – soegaard
在op-token上缺少一套parens,並且alist上的間距已關閉 –
您可以查看我的只爲了好玩的項目https://github.com/rmrfchik/jc它包含解決方案,這些解析器在方案之間是兼容的。我很容易使用(至少試圖這樣做;) – paul