Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.12 KB | None | 0 0
  1. // ((1 && 1) || (1 || 0))   -- expression
  2. // 12333333322222333333321  -- levels
  3. //  = Get threesomes: 2 operands and operation =
  4. // 1) (1 && 1) -> 1         -- by maximum levels
  5. // 2) (1 || 0) -> 1         -- by maximum levels
  6. // 3) (1 || 1) -> 1         -- replace threesomes to "1" or "0"
  7. // 4) 1 -> 1                -- result
  8. function ParseLogic(code :string) :boolean;
  9. var x,b       :integer;
  10.     level     :string;
  11.     maxlev    :integer;
  12.     threesome :string; // Threesome for calculate: 2 operands and operation
  13.     cond      :string; // Condition from threesome
  14. begin
  15.     // Calculate levels
  16.     b := 1;
  17.     for x := 1 to length(code) do
  18.     begin
  19.         if code[x] = '(' then
  20.         begin
  21.            inc(b);
  22.            level := level + IntToStr(b);
  23.         end else if code[x] = ')' then
  24.         begin
  25.            dec(b);
  26.            level := level + IntToStr(b);
  27.         end else level := level + IntToStr(b);
  28.     end;
  29.  
  30.     maxlev := 1;
  31.     // Get maximum level
  32.     for x := 1 to Length(level) do
  33.     begin
  34.       if StrToInt(level[x]) > maxlev then maxlev := StrToInt(level[x]);
  35.     end;
  36.  
  37.     // Get FIRST maximum (by level) threesome
  38.     for x := 1 to length(code) do
  39.     begin
  40.       if (code[x] = ')') and (level[x] = IntToStr(maxlev-1)) then
  41.       begin
  42.         threesome := threesome + code[x];
  43.         break;
  44.       end;
  45.  
  46.       if level[x] = IntToStr(maxlev) then threesome := threesome + code[x];
  47.     end;
  48.  
  49.     // Calculate threesome and replace in expression
  50.     cond := Copy(threesome, 2, Length(threesome)-2); // copy w/o "(" and ")"
  51.  
  52.     // Parse binary expressions like "1 && !0"
  53.     if ParseIf(cond, '', '') then
  54.     begin
  55.       Result := true;
  56.     end else
  57.     begin
  58.       Result := false;
  59.     end;
  60.  
  61.     // If all calculations are done
  62.     if length(code) = 1 then
  63.     begin
  64.       Result := (code = '1');
  65.       exit;
  66.     end else
  67.     begin
  68.       // Replace threesome by result
  69.       code := StringReplace(code, threesome, IntToStr(abs(StrToInt(BoolToStr(Result, false)))), []);
  70.       // Calculate remaining threesomes recursively
  71.       Result := ParseLogic(code);
  72.     end;
  73. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement