;==================================================
;
; свертка/развертка системы текстов
; текст представлен списком
;((Имя Вариант ...)...)
; первое имя в свертке - обозначение системы текстов
; (Элемент ...)
; (Имя Лексема (Варианты))
; ((пример (ма (ш н)
; (ш а) )
; ( ш н ) )
; ((н ина)) )
;==================================================
; реализация свертки: unic, ass-all, swin, gram, bnf
(defun unic (vac) (remove-duplicates (mapcar ’car vac) ))
;; список уникальных начал
(defun ass-all (Key Vac)
;; список всех вариантов продолжения (что может идти за ключом)
(cond
((Null Vac) Nil)
((eq (caar Vac) Key) (cons (cdar Vac)
(ass-all Key (cdr Vac)) ))
(T (ass-all Key (cdr Vac)) )
) )
(defun swin (key varl) (cond
;; очередной шаг свертки или снять скобки при отсутствии вариантов
((null (cdr varl))(cons key (car varl)))
(T (list key (gram varl)) )
))
(defun gram (ltext)
;; левая свертка, если нашлись общие начала
( (lambda (lt) (cond
((eq (length lt)(length ltext)) ltext)
(T (mapcar
#’(lambda (k) (swin k (ass-all k ltext ) ))
lt )
) ) ) (unic ltext)
) )
(defun bnf (main ltext binds) (cons (cons main (gram ltext)) binds))
;; приведение к виду БНФ
;===================================================
; реализация развертки: names, words, lexs, d-lex, d-names,
; h-all, all-t, pred, sb-nm, chain, level1, lang
(defun names (vac) (mapcar ’car vac))
;; определяемые символы
(defun words (vac) (cond
;; используемые символы
((null vac) NIL)
((atom vac) (cons vac NIL ))
(T (union (words(car vac)) (words (cdr vac)))) ))
(defun lexs (vac) (set-difference (words vac) (names vac)))
;; неопределяемые лексемы
(defun d-lex ( llex)
;; самоопределение терминалов
(mapcar #’(lambda (x) (set x x) ) llex) )
(defun ( llex)
;; определение нетерминалов
(mapcar #’(lambda (x) (set (car x )(cdr x )) ) llex) )
(defun h-all (h lt)
;; подстановка голов
(mapcar #’(lambda (a)
(cond
((atom h) (cons h a))
(T (append h a)) )
) lt) )
(defun all-t (lt tl)
;; подстановка хвостов
(mapcar #’(lambda (d)
(cond
((atom d) (cons d tl))
(T(append d tl))
) ) lt) )
(defun pred (bnf tl)
;; присоединение предшественников
(level1 (mapcar #’(lambda (z) (chain z tl )) bnf) ))
(defun sb-nm (elm tl)
;; постановка определений имен
(cond
((atom (eval elm)) (h-all (eval elm) tl))
(T (chain (eval elm) tl))
) )
(defun chain (chl tl)
;; сборка цепочек
(cond
((null chl) tl)
((atom chl) (sb-nm chl tl))
((atom (car chl))
(sb-nm (car chl) (chain (cdr chl) tl) ))
(T (pred (all-t (car chl) (cdr chl)) tl)) ))
(defun level1 (ll)
;; выравнивание
(cond
((null ll)NIL)
(T (append (car ll) (level1 (cdr ll)) )) ))
(defun lang ( frm )
;; вывод заданной системы текстов
(d-lex (lexs frm))
(d-names frm)
(pred (eval (caar frm)) ’(())
) )
|
Листинг 8.4.1. Автомат для нахождения всех вхождений некоторой системы слов во входной поток |
| Закрыть окно |