Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

синтаксический контроль заданного оператора


lusuj ©   (2008-12-05 21:04:00) 

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

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


Григорьев Антон   (2008-12-13 08:51:00) [1]

Если всё-таки есть желание разобраться с тем, как на самом деле пишутся синтаксические анализаторы, можно начать с http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10
Правда, там разбирается только одна частная задача, но зато разбирается подробно, для самых начинающих. Рассмотрено там и то, как правильно разбирать выражение независимо от того, отделены символы операций от своих операндов пробелами или нет. Если разберётесь со статьёй, то книги типа [8] будет читать намного легче.


Сергей М.   (2008-12-12 21:01:00) [2]


> lusuj   (12.12.08 17:27) [16]


Ну что ж .. Смотри, кума, - тебежить)


> хочется еще както проверить очередность


ЮЗ тебя пытался вразумить, наставить на путь истинный построения синтаксических парсеров, но ты не внемлешь - тебе, вишь ли, только бы дикого препода сатисфицировать, а дальше трава не расти)


lusuj   (2008-12-12 17:27:00) [3]


> Тогда это не Паскаль

если препод сказал что паскаль значит паскаль )))
хочется еще както проверить очередность операторов, тогда может '4' заработаю )
спасибо


Сергей М.   (2008-12-12 16:58:00) [4]


> отдельные части оператора разделяются группой пробелов


Тогда это не Паскаль, а нечто с закосом под него).. Ибо Паскаль не требует обязательного присутсвия пробельных символов, обрамляющих операторы сравнения и присваивания


lusuj   (2008-12-12 16:46:00) [5]

DVM работает прога на все 100, проверил, в условии отдельные части оператора разделяются группой пробелов, вот я и сделал не  '=', а '  = ' ...
тока еще немного бы доделать, чтоб проверять больше вариантов ввода.


DVM   (2008-12-12 11:51:00) [6]


>        x:=pos(' = ',str);
>        y:=pos(' := ',str);

че-то мне подсказывает, что это не будет работать.


lusuj   (2008-12-12 10:42:00) [7]

всем спасибо за помощь
ребята есть еще какие-то идеи, завтра сдавать, теорию читал толку маловато. Подход вроде верен, исключаю все возможные интерпретации заданного оператора и делов. Спасибо.


Ega23   (2008-12-10 11:43:00) [8]


> Для начала - разберитесь, что и почему здесь написано:


Красота!


Alkid   (2008-12-10 11:42:00) [9]


> lusuj   (10.12.08 11:39) [9]

You're doing it wrong!


lusuj   (2008-12-10 11:39:00) [10]

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

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.

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


Rouse_   (2008-12-06 19:50:00) [11]

http://rouse.drkb.ru/books.php#compilers


Юрий Зотов   (2008-12-06 15:02:00) [12]

Для начала - разберитесь, что и почему здесь написано:

<буква> ::= a.. z| A.. Z
<цифра> ::= 0.. 9
<символ_имени> ::= <буква> | <цифра>
<символы_имени> ::= <символ_имени> | <символ_имени> <символы_имени>
<имя> ::= <буква> | <буква> <символы_имени>
<число> ::= <цифра> | <цифра> <число>
<логическое выражение> ::= <имя> =<имя>
<оператор_перехода> ::= GOTO<имя>
<оператор_присваивания> ::= <имя> :=<число>
<условный_оператор> ::= IF<логическое выражение> THEN<оператор_перехода> ELSE<оператор_присваивания>


Юрий Зотов   (2008-12-06 14:35:00) [13]

> lusuj   (05.12.08 21:04)

>  каки элементы использовать, кроме эдит и лейбл

Теорию синтаксического анализа. Формы Бэкуса-Наура. Синтаксические диаграммы. И т.п. Материалов на эту тему в Сети полно.

Иначе не напишете НИКОГДА. И не помогут ни эдит, ни лейбл.


Германн   (2008-12-06 00:36:00) [14]


> подскажи пожалуйста каки элементы использовать, кроме эдит
> и лейбл ),

Все, которые могут содержать текст. Но дело не в том какие компоненты использовать. Присоединяюсь к [2]. Теория и основы Паскаля.


DVM   (2008-12-05 22:56:00) [15]


> подскажи пожалуйста каки элементы использовать, кроме эдит
> и лейбл )

Мой тебе совет - начни с изучения теории.


lusuj   (2008-12-05 22:22:00) [16]


> В IDE это все уже заложено!

я прошу прощения, я в целом немного с делфи работаю, подскажи пожалуйста каки элементы использовать, кроме эдит и лейбл ), а там буду разбираться.
Спасибо


DVM   (2008-12-05 22:19:00) [17]


> lusuj   (05.12.08 21:04)  

Поищи книгу Д.Креншоу "Пишем компилятор" тебе как раз подойдет. Там все на паскале.


Loginov Dmitry   (2008-12-05 21:43:00) [18]

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


Ничего делать не надо. В IDE это все уже заложено!


Наверх

Титульная страница Поиск, карта сайта Написать письмо