34 lines
1.2 KiB
Racket
34 lines
1.2 KiB
Racket
#lang racket
|
||
;Лексический анализ Вячин 0307
|
||
|
||
(require parser-tools/lex)
|
||
(require (prefix-in : parser-tools/lex-sre))
|
||
;библиотеки для работы с функциями
|
||
|
||
(define calc-lexer
|
||
(lexer
|
||
[(:+ (:or (char-range #\a #\z) (char-range #\A #\Z)))
|
||
(cons `(NAME ,(string->symbol lexeme)) (calc-lexer input-port))]
|
||
;символы от a-z и от A-Z
|
||
[#\( (cons '(LPAR) (calc-lexer input-port))]
|
||
;левая скобка
|
||
[#\) (cons '(RPAR) (calc-lexer input-port))]
|
||
;правая скобка
|
||
[(:+ (char-range #\0 #\9))
|
||
(cons `(CONST ,(string->number lexeme)) (calc-lexer input-port))]
|
||
;цифры от 0-9
|
||
[(:or #\+ #\- #\/ #\* #\^) (cons `(OP ,(string->symbol lexeme)) (calc-lexer input-port))]
|
||
;операции "+", "-", "/", "*", "^"
|
||
[whitespace (calc-lexer input-port)]
|
||
;пробелы не заносятся в список лексем
|
||
[(eof) '()]))
|
||
;конец входной последовательности
|
||
|
||
(define (lex n)(calc-lexer(open-input-string n)))
|
||
;для удобного пользования: (lex "*входная последовательность*")
|
||
|
||
|
||
|
||
|
||
|