![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
синтаксический контроль заданного оператора
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 это все уже заложено!