Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Проверка синтаксиса.


Автор: Simplor 28.2.2007, 22:24
Задача:  Проверить введеную строку  - является она выражением или нет. Выражение задано на БНФ , как :
<выражение>::=<логическая переменная>|(<выражение><знак><логическая переменная>)
<переменная>::= true | false
<знак>::= or | and

Вообщем блок-схемку начертил , перевел в код , но программка работать всеравно отказывается smile 
Вот что пока-что у меня получается :
Код

type
TL=(znak,logvir,skotkr,skzakr);
var
a,b:TL;
i:integer;
s:string;

  function chit_leks(s:string):TL;
  begin
  case s[i] of
    't':
      begin
      if (s[i+1]='r')and(s[i+2]='u')and(s[i+3]='e')
        then
          begin
            result:=logvir;
            i:=i+4;
          end
        else
          halt;
      end;
    'f':
      begin
      if (s[i+1]='a')and(s[i+2]='l')and(s[i+3]='s')and(s[i+4]='e')
        then
          begin
            result:=logvir;
            i:=i+4;
          end
        else
          halt;
      end;
    '(':
      begin
      result:=skotkr;
      i:=i+1;
      end;
    ')':
      begin
      result:=skzakr;
      i:=i+1;
      end;
    'a':
      begin
      if (s[i+1]='n')and(s[i+2]='d')
        then
          begin
            result:=znak;
            i:=i+3;
          end
        else
          halt;
      end;
    'o':
      begin
      if (s[i+1]='r')
        then
          begin
            result:=znak;
            i:=i+2;
          end
        else
          halt;
      end;
  end;
  end;
  procedure prov_vir(s:string);
  begin
  a:=chit_leks(s);
  case a of
    logvir:
      begin
      Label1.Caption:='Это выражение';
      end;
    skotkr:
      begin
      prov_vir(s);
      b:=chit_leks(s);
        if b=znak then
          begin
          a:=prov_vir(s);
          b:=chit_leks(s);
            if a=skzakr then
              begin
              Label1.Caption:='Это выражение';
              end
            else
            halt
          end
        else
        halt;
      end;
begin
s:=Edit1.Text;
prov_vir(s);
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)