2012-05-21 4 views
0

Привет ребята им очень новой в схеме программирования, так им пытаются построить лексический анализатор в схеме, которая в основном читает список, например < SUM + 34 > и из пут будет что-то вроде этоголексический анализатор в схеме

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

I Я использую 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 и интервал выключен на alist –

+0

Вы можете проверить мой проект для забавы https://github.com/rmrfchik/jc. Он содержит парсеры, которые совместимы между схемами. Я пробовал использовать (по крайней мере, пытался это сделать;) – paul

ответ

1

Мне кажется, вам нужно небольшое руководство по чтению сообщений об ошибках.

Когда я запускаю программу выше DrRacket, я получаю ошибку:

expand: unbound identifier in module in: token 

В то же время token в этой функции окрашен в красный цвет:

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

Это означает, что компилятор hasn Раньше не было имени token.

Теперь, так как вы не включаете в себя описание цели для функций, моего предположения, что вы забыли использовать маркер в списке аргументов:

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

Важно, чтобы поймать ошибки в начале насколько это возможно. Мой совет - каждый раз, когда вы пишете новую функцию, напишите на минимум один-два теста функции до начала со следующей функцией.

Смежные вопросы