- Построить синтаксическое дерево из строки шаблона
- Скомпилировать программу с учетом переданных разделителей 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
этоnodeSingle
2. Вернуть программу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