#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 "*входная последовательность*")