1 #include "fconstruct.h"
2 
3 std::map<FConstruct::FCLid, wxRegEx*> FConstruct::FCLReMap;
4 std::map<FConstruct::FCLid, std::vector<wxString> > FConstruct::FCLWordMap;
5 std::map<wxString, std::vector<FConstruct::FCLid> > FConstruct::WordFCLidMap;
6 
FConstruct()7 FConstruct::FConstruct()
8 {
9     //ctor
10 }
11 
~FConstruct()12 FConstruct::~FConstruct()
13 {
14     //dtor
15 }
16 
Clear()17 void FConstruct::Clear()
18 {
19     m_Parts.clear();
20     m_Fct = ctUnknown;
21 }
22 
AddPart(const wxString & word1,const wxString & word2,const wxString & word3)23 void FConstruct::AddPart(const wxString& word1, const wxString& word2, const wxString& word3)
24 {
25     if (word1.IsEmpty())
26         return;
27     std::vector<wxString> part;
28     part.push_back(word1);
29 
30     if (word2.IsEmpty())
31     {
32         m_Parts.push_back(part);
33         return;
34     }
35     else
36         part.push_back(word2);
37 
38     if (word3.IsEmpty())
39     {
40         m_Parts.push_back(part);
41         return;
42     }
43     else
44         part.push_back(word3);
45     m_Parts.push_back(part);
46 }
47 
GetWords(int i,wxString & word1,wxString & word2,wxString & word3,FCLid & flid) const48 void FConstruct::GetWords(int i, wxString& word1, wxString& word2, wxString& word3, FCLid& flid) const
49 {
50     flid = fclUnknown;
51     if (int(m_Parts.size()) <= i)
52         return;
53     size_t nw = m_Parts[i].size();
54 
55     if (nw > 2)
56     {
57         word1 = m_Parts[i][0];
58         word2 = m_Parts[i][1];
59         word3 = m_Parts[i][2];
60     }
61     else if (nw > 1)
62     {
63         word1 = m_Parts[i][0];
64         word2 = m_Parts[i][1];
65         word3 = wxEmptyString;
66     }
67     else
68     {
69         word1 = m_Parts[i][0];
70         word2 = wxEmptyString;
71         word3 = wxEmptyString;
72     }
73 
74     if (word1.IsSameAs(_T("if")) && word2.IsSameAs(_T("then")) && word3.IsSameAs(wxEmptyString))
75         flid = fclIf_if_then;
76     else if (word1.IsSameAs(_T("else")) && word2.IsSameAs(_T("if")) && word3.IsSameAs(_T("then")))
77         flid = fclIf_else_if_then;
78     else if (word1.IsSameAs(_T("else")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
79         flid = fclIf_else;
80     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("if")) && word3.IsSameAs(wxEmptyString))
81         flid = fclIf_end_if;
82 
83     else if (word1.IsSameAs(_T("do")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
84         flid = fclDo_do;
85     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("do")) && word3.IsSameAs(wxEmptyString))
86         flid = fclDo_end_do;
87 
88     else if (word1.IsSameAs(_T("interface")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
89         flid = fclInterf_interf;
90     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("interface")) && word3.IsSameAs(wxEmptyString))
91         flid = fclInterf_end_interf;
92 
93     else if (word1.IsSameAs(_T("function")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
94         flid = fclFun_fun;
95     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("function")) && word3.IsSameAs(wxEmptyString))
96         flid = fclFun_end_fun;
97 
98     else if (word1.IsSameAs(_T("subroutine")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
99         flid = fclSub_sub;
100     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("subroutine")) && word3.IsSameAs(wxEmptyString))
101         flid = fclSub_end_sub;
102 
103     else if (word1.IsSameAs(_T("program")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
104         flid = fclProg_prog;
105     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("program")) && word3.IsSameAs(wxEmptyString))
106         flid = fclProg_end_prog;
107 
108     else if (word1.IsSameAs(_T("module")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
109         flid = fclMod_module;
110     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("module")) && word3.IsSameAs(wxEmptyString))
111         flid = fclMod_end_module;
112 
113     else if (word1.IsSameAs(_T("submodule")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
114         flid = fclSubmod_submod;
115     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("submodule")) && word3.IsSameAs(wxEmptyString))
116         flid = fclSubmod_end_submod;
117 
118     else if (word1.IsSameAs(_T("select")) && word2.IsSameAs(_T("case")) && word3.IsSameAs(wxEmptyString))
119         flid = fclSelectCase_start;
120     else if (word1.IsSameAs(_T("case")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
121         flid = fclSelectCase_case;
122     else if (word1.IsSameAs(_T("case")) && word2.IsSameAs(_T("default")) && word3.IsSameAs(wxEmptyString))
123         flid = fclSelectCase_case;
124     else if (word1.IsSameAs(_T("select")) && word2.IsSameAs(_T("type")) && word3.IsSameAs(wxEmptyString))
125         flid = fclSelectType_start;
126     else if (word1.IsSameAs(_T("type")) && word2.IsSameAs(_T("is")) && word3.IsSameAs(wxEmptyString))
127         flid = fclSelectType_type_is;
128     else if (word1.IsSameAs(_T("class")) && word2.IsSameAs(_T("is")) && word3.IsSameAs(wxEmptyString))
129         flid = fclSelectType_class_is;
130     else if (word1.IsSameAs(_T("class")) && word2.IsSameAs(_T("default")) && word3.IsSameAs(wxEmptyString))
131         flid = fclSelectType_class_default;
132     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("select")) && word3.IsSameAs(wxEmptyString))
133         flid = fclSelect_end;
134 
135     else if (word1.IsSameAs(_T("type")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
136         flid = fclType_type;
137     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("type")) && word3.IsSameAs(wxEmptyString))
138         flid = fclType_end_type;
139 
140     else if (word1.IsSameAs(_T("enum")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
141         flid = fclEnum_enum;
142     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("enum")) && word3.IsSameAs(wxEmptyString))
143         flid = fclEnum_end_enum;
144 
145     else if (word1.IsSameAs(_T("critical")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
146         flid = fclCritical_critical;
147     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("critical")) && word3.IsSameAs(wxEmptyString))
148         flid = fclCritical_end_critical;
149 
150     else if (word1.IsSameAs(_T("forall")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
151         flid = fclForall_forall;
152     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("forall")) && word3.IsSameAs(wxEmptyString))
153         flid = fclForall_end_forall;
154 
155     else if (word1.IsSameAs(_T("associate")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
156         flid = fclAssoc_associate;
157     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("associate")) && word3.IsSameAs(wxEmptyString))
158         flid = fclAssoc_end_associate;
159 
160     else if (word1.IsSameAs(_T("block")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
161         flid = fclBlock_block;
162     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("block")) && word3.IsSameAs(wxEmptyString))
163         flid = fclBlock_end_block;
164 
165     else if (word1.IsSameAs(_T("block")) && word2.IsSameAs(_T("data")) && word3.IsSameAs(wxEmptyString))
166         flid = fclBlockdata_blockdata;
167     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("block")) && word3.IsSameAs(_T("data")))
168         flid = fclBlockdata_end_blockdata;
169 
170     else if (word1.IsSameAs(_T("change")) && word2.IsSameAs(_T("team")) && word3.IsSameAs(wxEmptyString))
171         flid = fclTeam_change_team;
172     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("team")) && word3.IsSameAs(wxEmptyString))
173         flid = fclTeam_end_team;
174 
175     else if (word1.IsSameAs(_T("where")) && word2.IsSameAs(wxEmptyString) && word3.IsSameAs(wxEmptyString))
176         flid = fclWhere_where;
177     else if (word1.IsSameAs(_T("else")) && word2.IsSameAs(_T("where")) && word3.IsSameAs(wxEmptyString))
178         flid = fclWhere_else_where;
179     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("where")) && word3.IsSameAs(wxEmptyString))
180         flid = fclWhere_end_where;
181 
182     else if (word1.IsSameAs(_T("module")) && word2.IsSameAs(_T("procedure")) && word3.IsSameAs(wxEmptyString))
183         flid = fclProc_mod_proc;
184     else if (word1.IsSameAs(_T("end")) && word2.IsSameAs(_T("procedure")) && word3.IsSameAs(wxEmptyString))
185         flid = fclProc_end_proc;
186 }
187 
MakeFCLReMap()188 void FConstruct::MakeFCLReMap()
189 {
190     int options = wxRE_ADVANCED | wxRE_ICASE;
191 
192     FCLReMap[fclIf_if_then] = new wxRegEx( wxT("^(\\s*)(([a-zA-Z0-9_]+)(\\s*)(:)(\\s*))?((if)(\\s*)(\\()(.+)(\\))(\\s*)(then))((\\s*)!(.*))?(\\s*)$"), options);
193     FCLReMap[fclIf_else_if_then] = new wxRegEx( wxT("^(\\s*)(else)(\\s*)((if)(\\s*)(\\()(.+)(\\))(\\s*)(then)((\\s+)([a-zA-Z0-9_]+))?)((\\s*)!(.*))?(\\s*)$"), options);
194     FCLReMap[fclIf_else] = new wxRegEx( wxT("^(\\s*)(else)(\\s*)((\\s+)([a-zA-Z0-9_]+))?((\\s*)!(.*))?(\\s*)$"), options );
195 	FCLReMap[fclIf_end_if] = new wxRegEx( wxT("^(\\s*)(end)(\\s*)(if)((\\s+)([a-zA-Z0-9_]+))?(\\s*)"), options );
196 
197 	FCLReMap[fclDo_do] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(do)(([\\s\\t]*$)|([\\s\\t]+[a-z_]+.*))"), options);
198 	FCLReMap[fclDo_end_do] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(do)\\y"), options);
199 
200     FCLReMap[fclInterf_interf] = new wxRegEx(_T("^[\\s\\t]*(abstract[\\s\\t]+)?interface\\y"), options);
201     FCLReMap[fclInterf_end_interf] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(interface)\\y"), options);
202 
203     FCLReMap[fclFun_fun] = new wxRegEx(_T("^((.*[\\s\\t]+)|([\\s\\t]*))function(\\s+)([a-z0-9_]+)(\\s*)(\\(.*[\\)&]+)"), options);
204     FCLReMap[fclFun_end_fun] = new wxRegEx(_T("^[\\s\\t]*(end|((endfunction|(end(\\s+)function))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
205 
206     FCLReMap[fclSub_sub] = new wxRegEx(_T("^[\\s\\t]*((elemental|impure|module|non_recursive|pure|recursive)\\s+)*subroutine(\\s+)([a-z0-9_]+)(\\s*)(\\(.*[\\)&]+)?\\s*$"), options );
207     FCLReMap[fclSub_end_sub] = new wxRegEx(_T("^[\\s\\t]*(end|((endsubroutine|(end(\\s+)subroutine))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
208 
209     FCLReMap[fclProg_prog] = new wxRegEx(_T("^[\\s\\t]*program(\\s+)([a-z0-9_]+)([\\s\\t]*)$"), options );
210     FCLReMap[fclProg_end_prog] = new wxRegEx(_T("^[\\s\\t]*(end|((endprogram|(end(\\s+)program))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
211 
212     FCLReMap[fclMod_module] = new wxRegEx(_T("^[\\s\\t]*(module)(\\s+)((?!procedure[\\s:]+)[a-z0-9_]+)([\\s\\t]*)$"), options );
213     FCLReMap[fclMod_end_module] = new wxRegEx(_T("^[\\s\\t]*(end|((endmodule|(end(\\s+)module))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
214 
215     FCLReMap[fclSubmod_submod] = new wxRegEx(_T("^[\\s\\t]*(submodule)(\\s*)(\\(\\s*[a-z0-9_:]+\\s*\\))(\\s*)([a-z0-9_]+)([\\s\\t]*)$"), options);
216     FCLReMap[fclSubmod_end_submod] = new wxRegEx(_T("^[\\s\\t]*(end|((endsubmodule|(end(\\s+)submodule))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
217 
218     FCLReMap[fclSelectCase_start] = new wxRegEx(_T("^[\\s\\t]*(([a-zA-Z0-9_]+)(\\s*)(:)(\\s*))?select(\\s*)case(\\s*)(\\(.*[\\)&]+)"), options);
219     FCLReMap[fclSelectCase_case] = new wxRegEx(_T("^[\\s\\t]*((case(\\s+)default)|(case(\\s*)\\(.*\\)))([\\s\\t]*[a-z0-9_]+)?([\\s\\t]*)$"), options);
220     FCLReMap[fclSelect_end] = new wxRegEx(_T("^[\\s\\t]*(end(\\s*)select)((\\s)+[a-z0-9_]+)?(\\s*)$"), options);
221 
222     FCLReMap[fclSelectType_start] = new wxRegEx(_T("^[\\s\\t]*(([a-zA-Z0-9_]+)(\\s*)(:)(\\s*))?select(\\s*)type(\\s*)(\\(.*[\\)&]+)"), options);
223     FCLReMap[fclSelectType_type_is] = new wxRegEx(_T("^[\\s\\t]*type(\\s+)is(\\s*)(\\(.*[\\)&]+)"), options );
224     FCLReMap[fclSelectType_class_is] = new wxRegEx(_T("^[\\s\\t]*class(\\s+)is(\\s*)(\\(.*[\\)&]+)"), options );
225     FCLReMap[fclSelectType_class_default] = new wxRegEx(_T("^[\\s\\t]*class(\\s+)default((\\s)+[a-z0-9_]+)?(\\s*)$"), options);
226 
227     FCLReMap[fclType_type] = new wxRegEx(_T("^([\\s\\t]*)(type)(\\s*)((\\s*,\\s*(([a-z0-9_]+)|(extends\\([a-z0-9_]+\\))))*\\s*::)?(\\s*)([a-z0-9_]+)\\y"), options);
228     FCLReMap[fclType_end_type] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(type)\\y"), options);
229 
230     FCLReMap[fclEnum_enum] = new wxRegEx(_T("^[\\s\\t]*enum\\y"), options);
231     FCLReMap[fclEnum_end_enum] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(enum)\\y"), options);
232 
233     FCLReMap[fclCritical_critical] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(critical)\\y"), options);
234     FCLReMap[fclCritical_end_critical] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(critical)\\y"), options);
235 
236     FCLReMap[fclForall_forall] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(forall)(\\s*)(\\([^\\)]+\\))(\\s*)$"), options);
237     FCLReMap[fclForall_end_forall] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(forall)\\y"), options);
238 
239     FCLReMap[fclAssoc_associate] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(associate)(\\s*)(\\(.*\\))(\\s*)$"), options);
240     FCLReMap[fclAssoc_end_associate] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(associate)\\y"), options);
241 
242     FCLReMap[fclBlock_block] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)\\s*:\\s*)?(block)(\\s*)$"), options);
243     FCLReMap[fclBlock_end_block] = new wxRegEx(_T("^[\\s\\t]*([0-9]*)([\\s\\t]*)(end)(\\s*)(block)([\\s\\t]*)(([\\s\\t]+)([a-z0-9_]+)\\s*)?$"), options);
244 
245     FCLReMap[fclTeam_change_team] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(change\\s+team)\\s*\\(.*\\)(\\s*)$"), options);
246     FCLReMap[fclTeam_end_team] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(end\\s*team)\\y"), options);
247 
248     FCLReMap[fclBlockdata_blockdata] = new wxRegEx(_T("^([\\s\\t]*)(block\\s*data)(([\\s\\t]+)([a-z0-9_]+))?\\s*$"), options);
249     FCLReMap[fclBlockdata_end_blockdata] = new wxRegEx(_T("^([\\s\\t]*)(end|((end\\s*block\\s*data)(([\\s\\t]+)([a-z0-9_]+))?))\\s*$"), options);
250 
251     FCLReMap[fclWhere_where] = new wxRegEx(_T("^([\\s\\t]*)([0-9]*)([\\s\\t]*)(([a-z0-9_]+)(\\s*)(:)(\\s*))?(where)(\\s*)(\\([^\\)]+\\))(\\s*)$"), options);
252     FCLReMap[fclWhere_else_where] = new wxRegEx(_T("^([\\s\\t]*)(else\\s*where)\\y"), options);
253     FCLReMap[fclWhere_end_where] = new wxRegEx(_T("^[\\s\\t]*(end)(\\s*)(where)\\y"), options);
254 
255     FCLReMap[fclProc_mod_proc] = new wxRegEx(_T("^[\\s\\t]*module(\\s+)procedure(\\s+)([a-z0-9_]+)(\\s*)$"), options );
256     FCLReMap[fclProc_end_proc] = new wxRegEx(_T("^[\\s\\t]*(end|((endprocedure|(end(\\s+)procedure))((\\s)+[a-z0-9_]+)?))(\\s*)$"), options);
257 }
258 
DelFCLReMap()259 void FConstruct::DelFCLReMap()
260 {
261     for (std::map<FCLid, wxRegEx*>::iterator it=FCLReMap.begin(); it!=FCLReMap.end(); ++it)
262         delete it->second;
263     FCLReMap.clear();
264 }
265 
MakeFCLWordMap()266 void FConstruct::MakeFCLWordMap()
267 {
268     std::vector<wxString> words;
269     words.resize(3);
270     words[0] = _T("if");
271     words[1] = _T("then");
272     words[2] = wxEmptyString;
273     FCLWordMap[fclIf_if_then] = words;
274 
275     words[0] = _T("else");
276     words[1] = _T("if");
277     words[2] = _T("then");
278     FCLWordMap[fclIf_else_if_then] = words;
279 
280     words[0] = _T("else");
281     words[1] = wxEmptyString;
282     words[2] = wxEmptyString;
283     FCLWordMap[fclIf_else] = words;
284 
285     words[0] = _T("end");
286     words[1] = _T("if");
287     words[2] = wxEmptyString;
288     FCLWordMap[fclIf_end_if] = words;
289 
290     words[0] = _T("do");
291     words[1] = wxEmptyString;
292     words[2] = wxEmptyString;
293     FCLWordMap[fclDo_do] = words;
294 
295     words[0] = _T("end");
296     words[1] = _T("do");
297     words[2] = wxEmptyString;
298     FCLWordMap[fclDo_end_do] = words;
299 
300     words[0] = _T("interface");
301     words[1] = wxEmptyString;
302     words[2] = wxEmptyString;
303     FCLWordMap[fclInterf_interf] = words;
304 
305     words[0] = _T("end");
306     words[1] = _T("interface");
307     words[2] = wxEmptyString;
308     FCLWordMap[fclInterf_end_interf] = words;
309 
310     words[0] = _T("function");
311     words[1] = wxEmptyString;
312     words[2] = wxEmptyString;
313     FCLWordMap[fclFun_fun] = words;
314 
315     words[0] = _T("end");
316     words[1] = _T("function");
317     words[2] = wxEmptyString;
318     FCLWordMap[fclFun_end_fun] = words;
319 
320     words[0] = _T("subroutine");
321     words[1] = wxEmptyString;
322     words[2] = wxEmptyString;
323     FCLWordMap[fclSub_sub] = words;
324 
325     words[0] = _T("end");
326     words[1] = _T("subroutine");
327     words[2] = wxEmptyString;
328     FCLWordMap[fclSub_end_sub] = words;
329 
330     words[0] = _T("program");
331     words[1] = wxEmptyString;
332     words[2] = wxEmptyString;
333     FCLWordMap[fclProg_prog] = words;
334 
335     words[0] = _T("end");
336     words[1] = _T("program");
337     words[2] = wxEmptyString;
338     FCLWordMap[fclProg_end_prog] = words;
339 
340     words[0] = _T("module");
341     words[1] = wxEmptyString;
342     words[2] = wxEmptyString;
343     FCLWordMap[fclMod_module] = words;
344 
345     words[0] = _T("end");
346     words[1] = _T("module");
347     words[2] = wxEmptyString;
348     FCLWordMap[fclMod_end_module] = words;
349 
350     words[0] = _T("submodule");
351     words[1] = wxEmptyString;
352     words[2] = wxEmptyString;
353     FCLWordMap[fclSubmod_submod] = words;
354 
355     words[0] = _T("end");
356     words[1] = _T("submodule");
357     words[2] = wxEmptyString;
358     FCLWordMap[fclSubmod_end_submod] = words;
359 
360     words[0] = _T("select");
361     words[1] = _T("type");
362     words[2] = wxEmptyString;
363     FCLWordMap[fclSelectType_start] = words;
364 
365     words[0] = _T("type");
366     words[1] = _T("is");
367     words[2] = wxEmptyString;
368     FCLWordMap[fclSelectType_type_is] = words;
369 
370     words[0] = _T("class");
371     words[1] = _T("is");
372     words[2] = wxEmptyString;
373     FCLWordMap[fclSelectType_class_is] = words;
374 
375     words[0] = _T("class");
376     words[1] = _T("default");
377     words[2] = wxEmptyString;
378     FCLWordMap[fclSelectType_class_default] = words;
379 
380     words[0] = _T("select");
381     words[1] = _T("case");
382     words[2] = wxEmptyString;
383     FCLWordMap[fclSelectCase_start] = words;
384 
385     words[0] = _T("case");
386     words[1] = _T("default");
387     words[2] = wxEmptyString;
388     FCLWordMap[fclSelectCase_case] = words;
389 
390     words[0] = _T("end");
391     words[1] = _T("select");
392     words[2] = wxEmptyString;
393     FCLWordMap[fclSelect_end] = words;
394 
395     words[0] = _T("type");
396     words[1] = wxEmptyString;
397     words[2] = wxEmptyString;
398     FCLWordMap[fclType_type] = words;
399 
400     words[0] = _T("end");
401     words[1] = _T("type");
402     words[2] = wxEmptyString;
403     FCLWordMap[fclType_end_type] = words;
404 
405     words[0] = _T("enum");
406     words[1] = wxEmptyString;
407     words[2] = wxEmptyString;
408     FCLWordMap[fclEnum_enum] = words;
409 
410     words[0] = _T("end");
411     words[1] = _T("enum");
412     words[2] = wxEmptyString;
413     FCLWordMap[fclEnum_end_enum] = words;
414 
415     words[0] = _T("critical");
416     words[1] = wxEmptyString;
417     words[2] = wxEmptyString;
418     FCLWordMap[fclCritical_critical] = words;
419 
420     words[0] = _T("end");
421     words[1] = _T("critical");
422     words[2] = wxEmptyString;
423     FCLWordMap[fclCritical_end_critical] = words;
424 
425     words[0] = _T("forall");
426     words[1] = wxEmptyString;
427     words[2] = wxEmptyString;
428     FCLWordMap[fclForall_forall] = words;
429 
430     words[0] = _T("end");
431     words[1] = _T("forall");
432     words[2] = wxEmptyString;
433     FCLWordMap[fclForall_end_forall] = words;
434 
435     words[0] = _T("associate");
436     words[1] = wxEmptyString;
437     words[2] = wxEmptyString;
438     FCLWordMap[fclAssoc_associate] = words;
439 
440     words[0] = _T("end");
441     words[1] = _T("associate");
442     words[2] = wxEmptyString;
443     FCLWordMap[fclAssoc_end_associate] = words;
444 
445     words[0] = _T("block");
446     words[1] = wxEmptyString;
447     words[2] = wxEmptyString;
448     FCLWordMap[fclBlock_block] = words;
449 
450     words[0] = _T("end");
451     words[1] = _T("block");
452     words[2] = wxEmptyString;
453     FCLWordMap[fclBlock_end_block] = words;
454 
455     words[0] = _T("block");
456     words[1] = _T("data");
457     words[2] = wxEmptyString;
458     FCLWordMap[fclBlockdata_blockdata] = words;
459 
460     words[0] = _T("end");
461     words[1] = _T("block");
462     words[2] = _T("data");
463     FCLWordMap[fclBlockdata_end_blockdata] = words;
464 
465     words[0] = _T("change");
466     words[1] = _T("team");
467     words[2] = wxEmptyString;
468     FCLWordMap[fclTeam_change_team] = words;
469 
470     words[0] = _T("end");
471     words[1] = _T("team");
472     words[2] = wxEmptyString;
473     FCLWordMap[fclTeam_end_team] = words;
474 
475     words[0] = _T("where");
476     words[1] = wxEmptyString;
477     words[2] = wxEmptyString;
478     FCLWordMap[fclWhere_where] = words;
479 
480     words[0] = _T("else");
481     words[1] = _T("where");
482     words[2] = wxEmptyString;
483     FCLWordMap[fclWhere_else_where] = words;
484 
485     words[0] = _T("end");
486     words[1] = _T("where");
487     words[2] = wxEmptyString;
488     FCLWordMap[fclWhere_end_where] = words;
489 
490     words[0] = _T("module");
491     words[1] = _T("procedure");
492     words[2] = wxEmptyString;
493     FCLWordMap[fclProc_mod_proc] = words;
494 
495     words[0] = _T("end");
496     words[1] = _T("procedure");
497     words[2] = wxEmptyString;
498     FCLWordMap[fclProc_end_proc] = words;
499 }
500 
GetWordsFromFCLid(FCLid flid,wxString & word1,wxString & word2,wxString & word3)501 void FConstruct::GetWordsFromFCLid(FCLid flid, wxString& word1, wxString& word2, wxString& word3)
502 {
503     if (FCLWordMap.count(flid) > 0)
504     {
505         std::vector<wxString> words;
506         words = FCLWordMap[flid];
507         word1 = words[0];
508         word2 = words[1];
509         word3 = words[2];
510     }
511     else
512     {
513         word1 = wxEmptyString;
514         word2 = wxEmptyString;
515         word3 = wxEmptyString;
516     }
517 }
518 
MakeWordFCLidMap()519 void FConstruct::MakeWordFCLidMap()
520 {
521     std::vector<FCLid> idv;
522     wxString kw = _T("if");
523     idv.push_back(fclIf_if_then);
524     idv.push_back(fclIf_else_if_then);
525     idv.push_back(fclIf_end_if);
526     WordFCLidMap[kw] = idv;
527 
528     idv.clear();
529     kw = _T("then");
530     idv.push_back(fclIf_if_then);
531     idv.push_back(fclIf_else_if_then);
532     WordFCLidMap[kw] = idv;
533 
534     idv.clear();
535     kw = _T("else");
536     idv.push_back(fclIf_else_if_then);
537     idv.push_back(fclIf_else);
538     idv.push_back(fclWhere_else_where);
539     WordFCLidMap[kw] = idv;
540 
541     idv.clear();
542     kw = _T("elseif");
543     idv.push_back(fclIf_else_if_then);
544     WordFCLidMap[kw] = idv;
545 
546     idv.clear();
547     kw = _T("end");
548     idv.push_back(fclIf_end_if);
549     idv.push_back(fclDo_end_do);
550     idv.push_back(fclInterf_end_interf);
551     idv.push_back(fclSub_end_sub);
552     idv.push_back(fclFun_end_fun);
553     idv.push_back(fclProg_end_prog);
554     idv.push_back(fclMod_end_module);
555     idv.push_back(fclSubmod_end_submod);
556     idv.push_back(fclSelect_end);
557     idv.push_back(fclType_end_type);
558     idv.push_back(fclEnum_end_enum);
559     idv.push_back(fclCritical_end_critical);
560     idv.push_back(fclForall_end_forall);
561     idv.push_back(fclWhere_end_where);
562     idv.push_back(fclAssoc_end_associate);
563     idv.push_back(fclBlock_end_block);
564     idv.push_back(fclTeam_end_team);
565     idv.push_back(fclBlockdata_end_blockdata);
566     idv.push_back(fclProc_end_proc);
567     WordFCLidMap[kw] = idv;
568 
569     idv.clear();
570     kw = _T("endif");
571     idv.push_back(fclIf_end_if);
572     WordFCLidMap[kw] = idv;
573 
574     idv.clear();
575     kw = _T("do");
576     idv.push_back(fclDo_do);
577     idv.push_back(fclDo_end_do);
578     WordFCLidMap[kw] = idv;
579 
580     idv.clear();
581     kw = _T("enddo");
582     idv.push_back(fclDo_end_do);
583     WordFCLidMap[kw] = idv;
584 
585     idv.clear();
586     kw = _T("while");
587     idv.push_back(fclDo_do);
588     WordFCLidMap[kw] = idv;
589 
590     idv.clear();
591     kw = _T("concurrent");
592     idv.push_back(fclDo_do);
593     WordFCLidMap[kw] = idv;
594 
595     idv.clear();
596     kw = _T("abstract");
597     idv.push_back(fclInterf_interf);
598     WordFCLidMap[kw] = idv;
599 
600     idv.clear();
601     kw = _T("interface");
602     idv.push_back(fclInterf_interf);
603     idv.push_back(fclInterf_end_interf);
604     WordFCLidMap[kw] = idv;
605 
606     idv.clear();
607     kw = _T("endinterface");
608     idv.push_back(fclInterf_end_interf);
609     WordFCLidMap[kw] = idv;
610 
611     idv.clear();
612     kw = _T("function");
613     idv.push_back(fclFun_fun);
614     idv.push_back(fclFun_end_fun);
615     WordFCLidMap[kw] = idv;
616 
617     idv.clear();
618     kw = _T("endfunction");
619     idv.push_back(fclFun_end_fun);
620     WordFCLidMap[kw] = idv;
621 
622     idv.clear();
623     kw = _T("subroutine");
624     idv.push_back(fclSub_sub);
625     idv.push_back(fclSub_end_sub);
626     WordFCLidMap[kw] = idv;
627 
628     idv.clear();
629     kw = _T("endsubroutine");
630     idv.push_back(fclSub_end_sub);
631     WordFCLidMap[kw] = idv;
632 
633     idv.clear();
634     kw = _T("program");
635     idv.push_back(fclProg_prog);
636     idv.push_back(fclProg_end_prog);
637     WordFCLidMap[kw] = idv;
638 
639     idv.clear();
640     kw = _T("endprogram");
641     idv.push_back(fclProg_end_prog);
642     WordFCLidMap[kw] = idv;
643 
644     idv.clear();
645     kw = _T("module");
646     idv.push_back(fclMod_module);
647     idv.push_back(fclMod_end_module);
648     idv.push_back(fclProc_mod_proc);
649     idv.push_back(fclProc_end_proc);
650     WordFCLidMap[kw] = idv;
651 
652     idv.clear();
653     kw = _T("endmodule");
654     idv.push_back(fclMod_end_module);
655     WordFCLidMap[kw] = idv;
656 
657     idv.clear();
658     kw = _T("submodule");
659     idv.push_back(fclSubmod_submod);
660     idv.push_back(fclSubmod_end_submod);
661     WordFCLidMap[kw] = idv;
662 
663     idv.clear();
664     kw = _T("endsubmodule");
665     idv.push_back(fclSubmod_end_submod);
666     WordFCLidMap[kw] = idv;
667 
668     idv.clear();
669     kw = _T("select");
670     idv.push_back(fclSelectCase_start);
671     idv.push_back(fclSelect_end);
672     idv.push_back(fclSelectType_start);
673     WordFCLidMap[kw] = idv;
674 
675     idv.clear();
676     kw = _T("case");
677     idv.push_back(fclSelectCase_start);
678     idv.push_back(fclSelectCase_case);
679     WordFCLidMap[kw] = idv;
680 
681     idv.clear();
682     kw = _T("selectcase");
683     idv.push_back(fclSelectCase_start);
684     WordFCLidMap[kw] = idv;
685 
686     idv.clear();
687     kw = _T("selecttype");
688     idv.push_back(fclSelectType_start);
689     WordFCLidMap[kw] = idv;
690 
691     idv.clear();
692     kw = _T("endselect");
693     idv.push_back(fclSelect_end);
694     WordFCLidMap[kw] = idv;
695 
696     idv.clear();
697     kw = _T("default");
698     idv.push_back(fclSelectCase_case);
699     idv.push_back(fclSelectType_class_default);
700     WordFCLidMap[kw] = idv;
701 
702     idv.clear();
703     kw = _T("type");
704     idv.push_back(fclSelectType_start);
705     idv.push_back(fclSelectType_type_is);
706     idv.push_back(fclType_type);
707     idv.push_back(fclType_end_type);
708     WordFCLidMap[kw] = idv;
709 
710     idv.clear();
711     kw = _T("class");
712     idv.push_back(fclSelectType_class_is);
713     idv.push_back(fclSelectType_class_default);
714     WordFCLidMap[kw] = idv;
715 
716     idv.clear();
717     kw = _T("is");
718     idv.push_back(fclSelectType_type_is);
719     idv.push_back(fclSelectType_class_is);
720     WordFCLidMap[kw] = idv;
721 
722     idv.clear();
723     kw = _T("endtype");
724     idv.push_back(fclType_end_type);
725     WordFCLidMap[kw] = idv;
726 
727     idv.clear();
728     kw = _T("enum");
729     idv.push_back(fclEnum_enum);
730     idv.push_back(fclEnum_end_enum);
731     WordFCLidMap[kw] = idv;
732 
733     idv.clear();
734     kw = _T("endenum");
735     idv.push_back(fclEnum_end_enum);
736     WordFCLidMap[kw] = idv;
737 
738     idv.clear();
739     kw = _T("critical");
740     idv.push_back(fclCritical_critical);
741     idv.push_back(fclCritical_end_critical);
742     WordFCLidMap[kw] = idv;
743 
744     idv.clear();
745     kw = _T("endcritical");
746     idv.push_back(fclCritical_end_critical);
747     WordFCLidMap[kw] = idv;
748 
749     idv.clear();
750     kw = _T("forall");
751     idv.push_back(fclForall_forall);
752     idv.push_back(fclForall_end_forall);
753     WordFCLidMap[kw] = idv;
754 
755     idv.clear();
756     kw = _T("endforall");
757     idv.push_back(fclForall_end_forall);
758     WordFCLidMap[kw] = idv;
759 
760     idv.clear();
761     kw = _T("associate");
762     idv.push_back(fclAssoc_associate);
763     idv.push_back(fclAssoc_end_associate);
764     WordFCLidMap[kw] = idv;
765 
766     idv.clear();
767     kw = _T("endassociate");
768     idv.push_back(fclAssoc_end_associate);
769     WordFCLidMap[kw] = idv;
770 
771     idv.clear();
772     kw = _T("block");
773     idv.push_back(fclBlock_block);
774     idv.push_back(fclBlock_end_block);
775     idv.push_back(fclBlockdata_blockdata);
776     idv.push_back(fclBlockdata_end_blockdata);
777     WordFCLidMap[kw] = idv;
778 
779     idv.clear();
780     kw = _T("endblock");
781     idv.push_back(fclBlock_end_block);
782     idv.push_back(fclBlockdata_end_blockdata);
783     WordFCLidMap[kw] = idv;
784 
785     idv.clear();
786     kw = _T("data");
787     idv.push_back(fclBlockdata_blockdata);
788     idv.push_back(fclBlockdata_end_blockdata);
789     WordFCLidMap[kw] = idv;
790 
791     idv.clear();
792     kw = _T("blockdata");
793     idv.push_back(fclBlockdata_blockdata);
794     idv.push_back(fclBlockdata_end_blockdata);
795     WordFCLidMap[kw] = idv;
796 
797     idv.clear();
798     kw = _T("endblockdata");
799     idv.push_back(fclBlockdata_end_blockdata);
800     WordFCLidMap[kw] = idv;
801 
802     idv.clear();
803     kw = _T("change");
804     idv.push_back(fclTeam_change_team);
805     WordFCLidMap[kw] = idv;
806 
807     idv.clear();
808     kw = _T("team");
809     idv.push_back(fclTeam_change_team);
810     idv.push_back(fclTeam_end_team);
811     WordFCLidMap[kw] = idv;
812 
813     idv.clear();
814     kw = _T("endteam");
815     idv.push_back(fclTeam_end_team);
816     WordFCLidMap[kw] = idv;
817 
818     idv.clear();
819     kw = _T("where");
820     idv.push_back(fclWhere_where);
821     idv.push_back(fclWhere_else_where);
822     idv.push_back(fclWhere_end_where);
823     WordFCLidMap[kw] = idv;
824 
825     idv.clear();
826     kw = _T("elsewhere");
827     idv.push_back(fclWhere_else_where);
828     WordFCLidMap[kw] = idv;
829 
830     idv.clear();
831     kw = _T("endwhere");
832     idv.push_back(fclWhere_end_where);
833     WordFCLidMap[kw] = idv;
834 
835     idv.clear();
836     kw = _T("procedure");
837     idv.push_back(fclProc_mod_proc);
838     idv.push_back(fclProc_end_proc);
839     WordFCLidMap[kw] = idv;
840 }
841 
842