Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > синтаксический контроль заданного оператора


Автор: lusuy 5.12.2008, 21:29
Помогите пожалуйста кто чем может. Нужно разработать программу, проводящую синтаксический контроль введенного оператора паскаля (If <имя1> =  <имя2> Then Goto <метка> else <имя3>:=<число>). Проверяются: числа, имена, баланс скобок, знаки операций. Должны быть подпрограммы  проверки имени и  проверки числа. При обнаружении ошибок  выводить сведения: тип ошибки и  место ошибки в операторе.

Очен признателен за любую помощь.

Автор: cemick 6.12.2008, 00:09
Врядли кто поможет, тут либо гуглить, либо читать книгу дракона.. Поуму если делать, то разработка граматики, лексический анализатор, потом синтаксический.. Либо регулярными выражениями дешево и средито)))

Автор: lusuy 10.12.2008, 11:36
что-то написал, было условие что Отдельные части оператора разделяются группой пробелов:
Код

procedure TForm1.Button1Click(Sender: TObject);
procedure name(str:string; var q,w,r,t:integer);
   begin
    q:=pos(' If ',str);
    if  q=0 then label7.Caption:='ошибка, в имени: "if"; If <имя1> =  <имя2> '  ;
    w:=pos(' Then ',str);
    if  w=0 then label8.Caption:='ошибка, в имени: "Then"; if .. Then Goto <метка> else .. ';
     r:=pos(' Goto ',str);
    if  r=0 then label9.Caption:='ошибка, в имени: "Goto"; Then Goto <метка> else <имя3>:=<число> ';
t:=pos(' else ',str);
    if  t=0 then label10.Caption:='ошибка, в имени: "else"; Then Goto <метка> else <имя3>:=<число> '
     end;
 var
str,s1,s2,s3,s4,s5:string;
F : TextFile;
x,y,a,i,s,d,k,j,h,g:integer;
begin
    Label2.Caption:='';
    Label3.Caption:='';
    Label4.Caption:='';
    Label5.Caption:='';
    Label6.Caption:='';
    Label7.Caption:='';
    Label8.Caption:='';
    Label9.Caption:='';
    Label10.Caption:='';
    Label11.Caption:='';
    AssignFile(F, 'text.txt');
    Rewrite(F);
      s1:='ошибка"="; If <имя1> =  <имя2> ';
      s2:='ошибка ":="; Then Goto <метка> else <имя3>:=<число> ';
      s3:='превышено количество оператора "=" ';
      s4:='превышено количество оператора ":=" ';
      s5:='баланс скобок нарушен';
        str:= edit1.Text;
        x:=pos(' = ',str);
        y:=pos(' := ',str);
        if  x=0 then label2.Caption:=s1;
        if  x=0 then writeln(F, s1);
        if  y=0 then label3.Caption:=s2;
        if  y=0 then writeln(F, s1);
        s:=0;
        d:=0;
        for i:=1 to length(str) do
        begin
        if str[i]='=' then inc(s);
        if str[i]=':=' then inc(d);
        end;
        if s>2 then label5.Caption:=s3;
        if s>2 then writeln(F, s3);
        if d>1 then label6.Caption:=s4;
        if d>1 then writeln(F, s4);
        a:=0;
        for i:=1 to length(str) do
          begin
          if str[i]='(' then inc(a);
          if str[i]=')' then dec(a);
          end;
        if a<>0 then label4.Caption:=s5;
        if a<>0 then writeln(F, s5);
        name(str,k,j,h,g);
        if k=0 then writeln(f,'ошибка, в имени: "if"; If <имя1> =  <имя2> ') ;
        if j=0 then writeln(f,'ошибка, в имени: "Then"; if .. Then Goto <метка> else .. ');
        if h=0 then writeln(f,'ошибка, в имени: "Goto"; Then Goto <метка> else <имя3>:=<число> ');
        if g=0 then writeln(f,'ошибка, в имени: "else"; Then Goto <метка> else <имя3>:=<число> ');
    CloseFile(F)
end;
end.

подскажите пожалуйста как проверить порядок выполнения операторов, и число
      

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