131. ЗАДАНИЕ ЛАБОРАТОРНОй РАБОТЫ № 2
Приложение 2. «"Программирование синтаксического анализатора»
"
3.1. Для заданного фрагмента программы на Паскале разработать грамматику для построения грамматического разбора с помощью рекурсивного спуска.
4.2. В качестве процедуры SCAN использовать лексический анали¬затор, сконструированный в лабораторной работе №1.
5.3. Написать и отладить процедуры рекурсивного спуска.
6.4. Спроектировать тест для проверки работо¬споcобности синтаксического анализатора.
13.11.1. Содержание отчета
Представленная к защите лабораторная работа должна быть оформлена в виде отчета, содержащего:
1. Титульный лист.
2. Краткое теоретическое обоснование.
3. Грамматические правила для нетерминальных символов грамматики.
4. Блок -схему алгоритма с описанием примененных функций и процедур.
5. Текст программы парсера.
6. Отпечатанный диагностический файл для исходного программ¬ного фрагмента (без ошибок и с сознательно допущен¬ными ошибками).
7. Выводы и заключения по проделанной работе.
13.21.2. Варианты заданий для лабораторной работы
Варианты заданий представляют собой модифициро¬ванные фрагменты текстов заданий для ЛР 1, и включают в себя все ранее распознанные лексемы, поэтому нет необходимости строить новый лексический анализатор.
1) for i:=i to ListBox1.Items.Count-1 do
S:=S+Listbox1.Items[i];
2) if Length(S) > 15 + 1 + 10 then Error
3) if (Status = csError) and (Key <> C)then Key:=;
4) if Event.Command = cmCalcButton then
ClearEvent(Event);
5) for I := 0 to 19 do P := New(PButton, cmCalcButton);
6) if Tmp^.Num = StrToInt(S) then i := i+1;
7) if (CEdit1.Text=) and (Kedit2.Text=) then
begin ShowMessage(Please enter data);exit end;
8) if TPoint(Info).Y <= T.Y then
R.Move(0, Desktop^.Size.Y - R.B.Y - 2);
9) P: string[Length(CIndicator)] = CIndicator;
R.A.X := (I mod 4) * 5 + 2;
10) if (Longint(Location) <> Longint(ALocation)) or
(Modified<>AModified) then Location:=ALocation;
11) if State and sfDragging = 0 then Color := GetColor(1);
12) if S[i] in [A..Z]then
Begin
code:=ord(S[i]);
Inc(code,2);
S[i]:=Chr(code)
End
13) if Buffer <> nil then IsValid := True else
EditorDialog(edOutOfMemory, nil);
14) while Count > 0 do
begin
WriteBuf(0, Y, Size.X, 1, B[Delta.X]);
Dec(Count);
end;
15) if EditorDialog(edFind, @FindRec) <> cmCancel then FindStr := Find;
16) while Count <> 0 do
begin
P := NextLine(P); Dec(Count);
end;
17) while (I < CurPtr) and (Buffer^[I] = ) do Inc(I);
18) if HScrollBar <> nil then HScrollBar^.SetState(sfVisible, Enable);
19) if Form1.Button2.Caption=Cancel Then Form1.Button2.Caption:=Previous;
20) if EditorFlags and efPromptOnReplace <> 0 then
TrackCursor(False);
21) if HasSelection and DelSelect then DeleteSelect else
SetSelect(CurPtr, EndPtr, True)
22) if Event.What = evKeyDown then
begin
KeyState := Lo(Key); ClearEvent(Event);
end
23) while (P < BufLen) and (BufChar(P) <> #13) do
Inc(Pos); Inc(P);
end;
24) if UpdateFlags <> 0 then
SetCursor(CurPos.X - Delta.X, CurPos.Y - Delta.Y);
25) if Length(Number) = 1 then Number := 0 else Dec(Number[0]);
Программирование синтаксического анализатора
Лабораторная работа по предмету «Программирование»