Лексический анализ

This commit is contained in:
2022-05-12 19:02:24 +03:00
parent aeb8ad77fa
commit f27315172d
2 changed files with 59 additions and 0 deletions

View File

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