Лексический анализ
This commit is contained in:
26
Вячин Александр/README.md
Normal file
26
Вячин Александр/README.md
Normal file
@@ -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;;
|
||||||
|
|
||||||
33
Вячин Александр/lekz_analyz.rkt
Normal file
33
Вячин Александр/lekz_analyz.rkt
Normal 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 "*входная последовательность*")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user