Kalkulator - obsługa nawiasów przy pomocy wyrażeń regularnych

0

Witam. Mam problem, mam zrobić kalkulator który będzie uwzględniał kolejność wykonywania działań i obsługiwał nawiasy.
Kolejność działań zrobiłem. Ale nie mam pojęcia jak zabrać się za nawiasy. Nauczyciel powiedział że mam zrobić to za pomocą wyrażen regularnych, ale nie umiem się w tym połapać.
Oto kod kalkulatora http://pastie.org/1844043

0

Nie patrze na kod, ale jeżeli chodzi o wyrażenia regularne to dobrze Tobie nauczyciel doradził, z nich skorzystać jest najprościej. Z http://regexpstudio.com pobierasz moduł do wyrażeń regularnych wraz z dokumentacją i przykładami. Później wrzucasz do katalogu z projektem, dodajesz to sekcji uses.

uses
  regexpr;

procedure CzaryMaryDawajToCoJestWNawiasachStary(Tekst : string; Wyjscie : TStrings);
var
  R : TRegExpr;
begin
  Wyjscie.Clear;
  R := TRegExpr.Create;
  try
    R.Expression := '\((.+?)\)';
    if R.Exec(Tekst) = True then
    begin
      repeat
        Wyjscie.Add(R.Match[1]);
      until not R.ExecNext;
    end;
  finally
    R.Free;
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  CzaryMaryDawajToCoJestWNawiasachStary(Edit1.Text, Memo1.Lines);
end;

Powyższy kod dla tekstu w Editcie:
8 * (3 + 5) - 5 * (3 - 2)
Zwróci w Memo w kolejnych linijkach tekst:

3 + 5
3 - 2

Dalej już kombinuj sobie sam. Przy odrobinie kombinacji można przy użyciu TRegExpr napisać taką funkcję ktora od razu policzy podane wyrażenie. Dalej kominuj już sam. A temat przenoszę do Newbie.

EDIT: a teraz widze, bo to jest tak jak się nie taguje wątków i nie pisze precyzyjnie. Jeżeli kompilujesz pod FPC to tam również jest moduł do obsługi regexpr'a, ale nigdy z niego nie korzystałem, ale podejrzewam z tego co sprawdziłem to ze wspomnianym modulem z dyrektywą kompilatora $MODE DELPHI - kompiluje się bez problemów i działa tylko, że tutaj na TStringList.

program banalne_podstawy;

{$MODE DELPHI}

uses
  classes, regexpr;

procedure CzaryMaryDawajToCoJestWNawiasachStary(Tekst : string; Wyjscie : TStrings);
var
  R : TRegExpr;
begin
  Wyjscie.Clear;
  try
    R := TRegExpr.Create;
    R.Expression := '\((.+?)\)';
    if R.Exec(Tekst) = True then
    begin
      repeat
        Wyjscie.Add(R.Match[1]);
      until not R.ExecNext;
    end;
  finally
    R.Free;
  end;
end;

const
  Dzialanie = '8 * (3 + 5) - 5 * (3 - 2)';

var
  I : integer;
  SL : TStringList;
begin
  SL := TStringList.Create;
  CzaryMaryDawajToCoJestWNawiasachStary(Dzialanie, SL);
  for I := 0 to SL.Count - 1 do
    Writeln(SL[I]);
  SL.Free;
  Readln;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1