Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1228255615
demon
2008-12-03 01:06
2009.01.25
как защитить файл


6-1196354544
Crystalis
2007-11-29 19:42
2009.01.25
как перехватить пакетик ? ;)


2-1228771391
cruiser
2008-12-09 00:23
2009.01.25
Как создать компонент в D2009?


2-1228899008
Нов_и_чок
2008-12-10 11:50
2009.01.25
Некорректное отображение формы на экране!!!


1-1206685673
icon 16x16
2008-03-28 09:27
2009.01.25
маленькие иконки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский