Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

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

 
lusuj   (2008-12-05 21:04) [0]

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

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


 
Loginov Dmitry ©   (2008-12-05 21:43) [1]

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


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


 
DVM ©   (2008-12-05 22:19) [2]


> lusuj   (05.12.08 21:04)  

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


 
lusuj   (2008-12-05 22:22) [3]


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

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


 
DVM ©   (2008-12-05 22:56) [4]


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

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


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


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

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


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

> lusuj   (05.12.08 21:04)

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

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

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


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

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

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


 
Rouse_ ©   (2008-12-06 19:50) [8]

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


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

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

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.

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


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


> lusuj   (10.12.08 11:39) [9]

You"re doing it wrong!


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


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


Красота!


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

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


 
DVM ©   (2008-12-12 11:51) [13]


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

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


 
lusuj   (2008-12-12 16:46) [14]

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


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


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


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


 
lusuj   (2008-12-12 17:27) [16]


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

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


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


> lusuj   (12.12.08 17:27) [16]


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
15-1227633295
Поросенок Винни-Пух
2008-11-25 20:14
2009.01.25
pda версия форума


1-1206717670
Still Swamp
2008-03-28 18:21
2009.01.25
GradientFill


2-1228978681
zorik
2008-12-11 09:58
2009.01.25
TObjectList. Правильно ли я делаю?


15-1227671554
Slider007
2008-11-26 06:52
2009.01.25
С днем рождения ! 26 ноября 2008 среда


15-1227684509
natashap
2008-11-26 10:28
2009.01.25
помогите начинающему разобраться с delphi