-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConstrFunctions.~pas
More file actions
89 lines (76 loc) · 2.77 KB
/
ConstrFunctions.~pas
File metadata and controls
89 lines (76 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit ConstrFunctions;
interface
uses UsesUnit;
procedure cfIf_Operate(var memoPos: integer; const ptNode: pTRec);
procedure cfSwitch_Operate(var memoPos: integer; const ptNode: pTRec);
procedure cfCycle_Operate(var memoPos: integer; const ptNode: pTRec);
//Óâåëè÷èâàòü âåçäå â çàâèñèìîñòè îò óñëîâèÿ, åãî íàëè÷èÿ (ñì. ìåòîäó)
implementation
uses Tree;
function cfDefineEndSymbol(const memoPos: integer; findSymb, thenSymb, elseSymb: string): string;
begin
if pos(findSymb, GetStringFromMemo(memoPos))<>0
then result:=thenSymb
else result:=elseSymb;
end;
procedure cfCycleFindOperationsUntilFoundEndSymbol(const endIfSign: string; var memoPos: integer; var operatorsAmount: integer);
var tempStr: string;
constrType: TConstructionType;
begin
repeat
inc(memoPos);
tempStr:=GetStringFromMemo(memoPos);
constrType:=RecogniseOperation(tempStr);
if constrType=c_Operation
then operatorsAmount:=operatorsAmount+AmountOfOperations(tempStr)
else DefineAndRunConstructionParseFunc(constrType);
until pos(endIfSign, tempstr)<>0;
end;
procedure cfIf_Operate(var memoPos: integer; const ptNode: pTRec);
var endIfSign: string;
begin
endIfSign:=cfDefineEndSymbol(memoPos+1, '{', '}', ';');
cfCycleFindOperationsUntilFoundEndSymbol(endIfSign, memoPos, ptNode^.fAmount);
if pos('else', GetStringFromMemo(memoPos+1))<>0
then begin
endIfSign:=cfDefineEndSymbol(memoPos+1, '{', '}', ';');
cfCycleFindOperationsUntilFoundEndSymbol(endIfSign, memoPos, ptNode^.fAmount);
end;
inc(memoPos);
end;
procedure cfSwitch_Operate(var memoPos: integer; const ptNode: pTRec);
var ptCurNode: ptRec;
subTreeCount, figureLevel, curMemoPos: integer;
begin
curMemoPos:=memoPos;
repeat
inc(curMemoPos);
if (pos('case', GetStringFromMemo(curMemoPos))<>0) or (pos('default', GetStringFromMemo(curMemoPos))<>0)
then inc(subTreeCount);
if pos('{', GetStringFromMemo(curMemoPos))<>0
then inc(figureLevel);
if pos('}', GetStringFromMemo(curMemoPos))<>0
then dec(figureLevel);
until (pos('}', GetStringFromMemo(memoPos))<>0) and (figureLevel=-1);
inc(memoPos);
ptCurNode:=ptNode;
repeat
if pos('case', GetStringFromMemo(memoPos))<>0
then begin
cfCycleFindOperationsUntilFoundEndSymbol('break', memoPos, ptCurNode^.fAmount);
if subTreeCount>1
then begin
dec(subTreeCount);
ptCurNode:=trAddElement(ptCurNode, ptCurNode^.fLevel+1, ptCurNode^.fConstr);
end;
end;
inc(memoPos);
until pos('}', GetStringFromMemo(memoPos))<>0;
inc(memoPos);
end;
procedure cfCycle_Operate(var memoPos: integer; const ptNode: pTRec);
begin
cfCycleFindOperationsUntilFoundEndSymbol('}', memoPos, ptNode^.fAmount);
inc(memoPos);
end;
end.