- Построить синтаксическое дерево из строки шаблона
- Скомпилировать программу с учетом переданных разделителей S
- (A) Пусть
N- дерево, результат п.1 - (F) Скопмилировать
N-
Если
NэтоnodePattern-
Обойти дочерние элементы. Пусть
Mэто список программ- Взять следующий дочерний узел
N; - Пусть
Pэто результат применения (A) кN; - Пусть
P'это результат применения оптмизаций кP - Положить
P'вM
- Взять следующий дочерний узел
-
(B) Пусть
M'это минимизированное количество программ вM:-
Пусть
X = 0;Y = length(M);COUNT = 0;RESULT = NIL;LEFT, RIGHT = 0;-
(C) Пусть
LIST = M[X:Y];-
(D) Пусть
Pэто результат склеивания программ:-
Пусть
P1это результат преобразование вEveryOf:-
Итерация по
LIST:- Пусть
Eэто следующий элементLIST, MIN = 0,SEP = ""; - Если
Eэто неSuper,Any,Single,List, вернутьNIL; - Если
Eэто первый элемент,SEP = E.SEP - Есди
E.SEP != SEPвернутьNIL; - Если
EэтоSingleилиList, тоM = M+1;
- Пусть
-
Вывод
- Если все программы в
LISTэтоSuperвернуть новую программуSuper; - Если все программы в
LISTэтоAnyвернуть новую программуAny; - Если
LISTсодержитAnyилиSuper, аSEP- пустая строка вернуть новую программуMin{MIN}; - Иначе:
- пусть
Pэто программаEveryOf; - если
M > 0, добавитьMin{MIN}вP; - если
LISTне содержитAnyиSuper, положитьMax{M}вP; - если
SEP != "", положитьNotContains{SEP}вP; - вернуть
P;
- Если все программы в
-
-
Пусть
P2это результат преобразование вRow:- Итерация по
LIST, пустьPэто программаRow:- Пусть
Eэто следующий элементLIST; - Если
Eне имеет фиксированной длины, вернутьNIL; - Положить
EвP;
- Пусть
- Вернуть
P;
- Итерация по
-
-
Если
P1 == P2 == NIL, тоP = NIL -
Если
P1 == NILтоP = P2 -
Если
P2 == NILтоP = P1 -
Если
P1.LEN() > P2.LEN()тоP = P1, иначеP = P2 -
Если
P == NIL, то переход на п.10; -
Если
RESULT == NIL, то переход на п.9; -
Если
PиRESULTимеют фиксированную длину, иP.LEN() > RESULT.LEN(), то переход на п.9; -
Если
Y -X > COUNT, то переход на п.9 -
RESULT = P,COUNT = Y - X,LEFT = X,RIGHT = Y; -
Если
Y > X, тоY = Y-1; Продолжить (C) -
Если
X < length(M), тоX = X + 1;Y = length(M); Продолжить (C)
-
-
-
Если
RESULT == NILвернутьM; -
Пусть
NEXT = [ M[:LEFT]..., RESULT, M[RIGHT:]... ]; -
Если
length(NEXT) == length(M)вернутьNEXT; -
Вернуть (B) от
NEXT;
-
-
(E) Скомпилировать
M':- Если
length(M') == 1, вернутьM'[0]; - Пусть P это (D) от
M';- Если
P != NIL, вернутьP;
- Если
- Пусть
MAXэто программа изM'с наибольшей фиксированной длиной, аIэто ее индекс вM';- Пусть
LEFT = M'[:I],RIGHT = NIL; - Если
I+1 < length(M'), тоRIGHT = M'[I+1:] - Пусть
Tэто программаBTree;T.Value = MAX;- Если
length(LEFT) > 0, то установить вT.Leftрезультат (E) отLEFT; - Если length(RIGHT) > 0, то установить в
T.Rightрезультат (E) отRIGHT;
- Вернуть
T;
- Пусть
- Если
-
-
Если
NэтоnodeAnyOf,- Обойти дочерние элементы. Пусть
Mэто список программ- Взять следующий дочерний узел
N - Пусть
Pэто результат (F) отN - Пусть
P'это результат применения оптмизаций кP - Положить
P'вM
- Взять следующий дочерний узел
- Вернуть программу
AnyOf{M}
- Обойти дочерние элементы. Пусть
-
Если
NэтоnodeList- Вернуть программу
List{N.Chars, N.Not}
- Вернуть программу
-
Если
NэтоnodeRange- Вернуть программу
Range{N.Low, N.High, N.Not}
- Вернуть программу
-
Если
NэтоnodeAny- Вернуть программу
Any{S}
- Вернуть программу
-
Если
NэтоnodeSuper- Вернуть программу
Super
- Вернуть программу
-
Если
NэтоnodeSingle2. Вернуть программуSingle{S} -
Если
NэтоnodeText- Вернуть программу
Raw{N.Text}
- Вернуть программу
-
- (A) Пусть
Last active
January 14, 2016 12:42
-
-
Save gobwas/55d02928d4cdeb68b112 to your computer and use it in GitHub Desktop.
Glob
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment