Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ((1 && 1) || (1 || 0)) -- expression
- // 12333333322222333333321 -- levels
- // = Get threesomes: 2 operands and operation =
- // 1) (1 && 1) -> 1 -- by maximum levels
- // 2) (1 || 0) -> 1 -- by maximum levels
- // 3) (1 || 1) -> 1 -- replace threesomes to "1" or "0"
- // 4) 1 -> 1 -- result
- function ParseLogic(code :string) :boolean;
- var x,b :integer;
- level :string;
- maxlev :integer;
- threesome :string; // Threesome for calculate: 2 operands and operation
- cond :string; // Condition from threesome
- begin
- // Calculate levels
- b := 1;
- for x := 1 to length(code) do
- begin
- if code[x] = '(' then
- begin
- inc(b);
- level := level + IntToStr(b);
- end else if code[x] = ')' then
- begin
- dec(b);
- level := level + IntToStr(b);
- end else level := level + IntToStr(b);
- end;
- maxlev := 1;
- // Get maximum level
- for x := 1 to Length(level) do
- begin
- if StrToInt(level[x]) > maxlev then maxlev := StrToInt(level[x]);
- end;
- // Get FIRST maximum (by level) threesome
- for x := 1 to length(code) do
- begin
- if (code[x] = ')') and (level[x] = IntToStr(maxlev-1)) then
- begin
- threesome := threesome + code[x];
- break;
- end;
- if level[x] = IntToStr(maxlev) then threesome := threesome + code[x];
- end;
- // Calculate threesome and replace in expression
- cond := Copy(threesome, 2, Length(threesome)-2); // copy w/o "(" and ")"
- // Parse binary expressions like "1 && !0"
- if ParseIf(cond, '', '') then
- begin
- Result := true;
- end else
- begin
- Result := false;
- end;
- // If all calculations are done
- if length(code) = 1 then
- begin
- Result := (code = '1');
- exit;
- end else
- begin
- // Replace threesome by result
- code := StringReplace(code, threesome, IntToStr(abs(StrToInt(BoolToStr(Result, false)))), []);
- // Calculate remaining threesomes recursively
- Result := ParseLogic(code);
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement