Форум: "Начинающим";
Текущий архив: 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