From f27315172d7167d8937628578c5d6f22b3ceab16 Mon Sep 17 00:00:00 2001 From: Dmitriy Gorshenin Date: Thu, 12 May 2022 19:02:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B5=D0=BA=D1=81=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Вячин Александр/README.md | 26 +++++++++++++++ Вячин Александр/lekz_analyz.rkt | 33 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 Вячин Александр/README.md create mode 100644 Вячин Александр/lekz_analyz.rkt diff --git a/Вячин Александр/README.md b/Вячин Александр/README.md new file mode 100644 index 0000000..474bba7 --- /dev/null +++ b/Вячин Александр/README.md @@ -0,0 +1,26 @@ +# Лексический анализ +## Ссылка на видеоразбор +https://youtu.be/NKhwfK0PurY +## Код из книги + type token = Name of string| Num of string | Other of string;; + let lex = + let several p = many ( some p ) in + let lowercase_letter s = " a" <= s & s <= " z " in + let uppercase_letter s = "A" <= s & s <= "Z" in + let letter s = lowercase_letter s or uppercase_letter s in + let alpha s = letter s or s = "_" or s = " ’ " in + let digits = " 0" <= s & s <= "9 " in + let alphanum s = alpha s or digit s in + let spaces = s = "␣ " or s = " \n" or s = "\ t " in + let collect (h , t) = h^( it list ( prefix ^) t " " ) in + let rawname = + some alpha ++ several alphanum >> (Name o collect ) in + let rawnumeral = + some digit ++ several digit >> (Num o collect) in + let raw other = some (K true) >> Other in + let token = + (rawname | | rawnumeral | | rawother) ++ several space >> fst in + let tokens = (several space ++ many token ) >> snd in + let all tokens = (tokens ++ finished) >> fst in + fst o all token s o explode;; + \ No newline at end of file diff --git a/Вячин Александр/lekz_analyz.rkt b/Вячин Александр/lekz_analyz.rkt new file mode 100644 index 0000000..88db3dc --- /dev/null +++ b/Вячин Александр/lekz_analyz.rkt @@ -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 "*входная последовательность*") + + + + +