1 module epsilon.shift;
2 
3 import EAG = epsilon.eag;
4 import io : UndefPos;
5 import runtime;
6 import std.bitmanip : BitArray;
7 import std.conv : to;
8 
9 private const nil = EAG.nil;
10 
11 public void Shift()
12 {
13     int HT;
14     EAG.Alt HA;
15     EAG.Factor HF;
16     int Rhs;
17     int Num;
18     int Var;
19     BitArray GenNonts = EAG.All - EAG.Pred;
20     BitArray Del;
21 
22     Del.length = EAG.NextHNont + 1;
23     EAG.NextMAlt = EAG.firstMAlt;
24     EAG.NextMemb = EAG.firstMemb;
25     EAG.NextVar = EAG.firstVar;
26     EAG.NextNode = EAG.firstNode;
27     EAG.NextParam = EAG.firstParam;
28     EAG.NextMTerm = EAG.NextHTerm - EAG.firstHTerm + EAG.firstMTerm;
29     while (EAG.NextMTerm >= EAG.MTerm.length)
30         EAG.Expand;
31     for (HT = EAG.firstHTerm; HT < EAG.NextHTerm; ++HT)
32         EAG.MTerm[HT - EAG.firstHTerm + EAG.firstMTerm].Id = EAG.HTerm[HT].Id;
33     EAG.NextMNont = EAG.NextHNont - EAG.firstHNont + EAG.firstMNont;
34     while (EAG.NextMNont >= EAG.MNont.length)
35         EAG.Expand;
36     for (int HN = EAG.firstHNont; HN < EAG.NextHNont; ++HN)
37     {
38         if (GenNonts[HN])
39         {
40             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].Id = EAG.HNont[HN].NamedId;
41             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].MRule = nil;
42             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].IsToken = EAG.HNont[HN].IsToken;
43             HA = EAG.HNont[HN].Def.Sub;
44             do
45             {
46                 EAG.Scope = EAG.NextVar;
47                 HA.Scope.Beg = EAG.NextVar;
48                 HA.Formal.Pos = UndefPos;
49                 HA.Formal.Params = EAG.NextParam;
50                 EAG.AppParam(EAG.NextNode, UndefPos);
51                 EAG.ParamBuf[EAG.NextParam - 1].isDef = false;
52                 EAG.AppParam(nil, UndefPos);
53                 EAG.NodeBuf[EAG.NextNode] = EAG.NextMAlt;
54                 ++EAG.NextNode;
55                 if (EAG.NextNode >= EAG.NodeBuf.length)
56                     EAG.Expand;
57                 Rhs = EAG.NextMemb;
58                 HF = HA.Sub;
59                 Num = 2;
60                 while (HF !is null)
61                 {
62                     if (auto term = cast(EAG.Term) HF)
63                     {
64                         EAG.AppMemb(-(term.Sym - EAG.firstHTerm + EAG.firstMTerm));
65                     }
66                     else if (GenNonts[(cast(EAG.Nont) HF).Sym])
67                     {
68                         EAG.AppMemb((cast(EAG.Nont) HF).Sym - EAG.firstHNont + EAG.firstMNont);
69                         Var = EAG.FindVar((cast(EAG.Nont) HF)
70                                 .Sym - EAG.firstHNont + EAG.firstMNont, Num, UndefPos, true);
71                         EAG.NodeBuf[EAG.NextNode] = -Var;
72                         ++EAG.NextNode;
73                         if (EAG.NextNode >= EAG.NodeBuf.length)
74                             EAG.Expand;
75                         (cast(EAG.Nont) HF).Actual.Pos = UndefPos;
76                         (cast(EAG.Nont) HF).Actual.Params = EAG.NextParam;
77                         EAG.AppParam(-Var, UndefPos);
78                         EAG.ParamBuf[EAG.NextParam - 1].isDef = true;
79                         EAG.AppParam(nil, UndefPos);
80                         ++Num;
81                     }
82                     else
83                     {
84                         if (HF.Next !is null)
85                             HF.Next.Prev = HF.Prev;
86                         if (HF.Prev !is null)
87                             HF.Prev.Next = HF.Next;
88                         if (HF == HA.Sub)
89                             HA.Sub = HF.Next;
90                         if (HF == HA.Last)
91                             HA.Last = HF.Prev;
92                     }
93                     HF = HF.Next;
94                 }
95                 if (cast(EAG.Rep) EAG.HNont[HN].Def)
96                 {
97                     EAG.AppMemb(HN - EAG.firstHNont + EAG.firstMNont);
98                     Var = EAG.FindVar(HN - EAG.firstHNont + EAG.firstMNont, Num, UndefPos, true);
99                     EAG.NodeBuf[EAG.NextNode] = -Var;
100                     ++EAG.NextNode;
101                     if (EAG.NextNode >= EAG.NodeBuf.length)
102                         EAG.Expand;
103                     HA.Actual.Pos = UndefPos;
104                     HA.Actual.Params = EAG.NextParam;
105                     EAG.AppParam(-Var, UndefPos);
106                     EAG.ParamBuf[EAG.NextParam - 1].isDef = true;
107                     EAG.AppParam(nil, UndefPos);
108                 }
109                 EAG.AppMemb(nil);
110                 EAG.AppMemb(EAG.NewMAlt(HN - EAG.firstHNont + EAG.firstMNont, Rhs));
111                 HA.Scope.End = EAG.NextVar;
112                 HA = HA.Next;
113             }
114             while (HA !is null);
115             if (cast(EAG.Opt) EAG.HNont[HN].Def || cast(EAG.Rep) EAG.HNont[HN].Def)
116             {
117                 if (auto opt = cast(EAG.Opt) EAG.HNont[HN].Def)
118                 {
119                     opt.Formal.Pos = UndefPos;
120                     opt.Formal.Params = EAG.NextParam;
121                     opt.Scope.Beg = EAG.NextVar;
122                     opt.Scope.End = EAG.NextVar;
123                 }
124                 else if (auto rep = cast(EAG.Rep) EAG.HNont[HN].Def)
125                 {
126                     rep.Formal.Pos = UndefPos;
127                     rep.Formal.Params = EAG.NextParam;
128                     rep.Scope.Beg = EAG.NextVar;
129                     rep.Scope.End = EAG.NextVar;
130                 }
131                 EAG.AppParam(EAG.NextNode, UndefPos);
132                 EAG.ParamBuf[EAG.NextParam - 1].isDef = false;
133                 EAG.AppParam(nil, UndefPos);
134                 EAG.NodeBuf[EAG.NextNode] = EAG.NextMAlt;
135                 ++EAG.NextNode;
136                 if (EAG.NextNode >= EAG.NodeBuf.length)
137                     EAG.Expand;
138                 Rhs = EAG.NextMemb;
139                 EAG.AppMemb(nil);
140                 EAG.AppMemb(EAG.NewMAlt(HN - EAG.firstHNont + EAG.firstMNont, Rhs));
141             }
142         }
143         else
144         {
145             EAG.HNont[HN].Def = null;
146             Del[HN] = true;
147             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].Id = nil;
148             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].MRule = nil;
149             EAG.MNont[HN - EAG.firstHNont + EAG.firstMNont].IsToken = false;
150         }
151     }
152     EAG.NextDom = EAG.firstDom;
153     foreach (HN; GenNonts.bitsSet)
154     {
155         EAG.HNont[HN].Sig = EAG.NextDom;
156         EAG.AppDom('+', HN.to!int - EAG.firstHNont + EAG.firstMNont);
157         EAG.AppDom('+', nil);
158     }
159     EAG.All -= Del;
160     EAG.Pred -= Del;
161     EAG.Prod -= Del;
162     EAG.Reach -= Del;
163     EAG.Null -= Del;
164 }