Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

Tanchonok



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет, всем.Хотелось бы помощи от умных и знающих людей, знала бы и умела бы честное слово не просила бы. Надо решить задачку по программированию
Разработать программу по выполнению лексического анализа для
языка программирования, удовлетворяющего ниже перечисленным
требованиям
Оператор присваивания "=" и + ( сложение
условный оператор, построенный в
соответствии с предложенным синтаксисом конструкции:
IF <условие> THEN BEGIN <операторы> END;
здесь <условие> задается одной из форм: a<b, либо a=b, либо a>b;
Оператор вывода переменных
WRITE ( <список переменных через запятую> );
 Программа языка имеет структуру
VAR <список переменных через запятую >: INTEGER
BEGIN <операторы программы> END
 
Добавлено:
примерный образец программы есть а как его править руки не оттуда растут да и мозгов мало.
{ ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР
таблица кодов лексем
_____________________
Лексема Код
_____________________
var 1
begin 2
end 3
read 4
write 5
integer 6
+ 100
- 101
* 102
/ 103
= 104
( 105
) 106
, 107
: 108
; 109
0 - тип служебных слов и перечисленных выше операций
ident 200 – тип идентификаторов
const 300 – тип констант
}
Const
kT=6;
{ 6 - количество служебных слов: var, begin, end, read, write, integer}
n_str=500;
{ предельный размер исходного текста в символах, включая пробелы }
n_ident=20;
{ ограничение на количество служебных слов + переменных }
n_lex=100;
{ ограничение на общее число лексем }
Type
TS=string[10];
{ длина имени лексемы не превышает 10 символов}
Var
a_text : array[1..n_str] of char;
{ входная программа - посимвольное представление исходного текста }
LL : array[1..n_lex] of integer;
{ массив внутренних кодов лексем - результат лексического анализа }
TT : array[1..n_lex] of integer;
{ массив типов для каждой лексемы исходного текста }
VV : array[1..n_ident] of TS; { таблица идентификаторов }
in_text : text; { текстовой файл программы }
out_int : file of integer;
{ выходной файл кодов лексем с указанием типа }
out_ident : file of TS;
{ выходной файл идентификаторов: служебные слова и
переменные }
prt : text; { файл для размещения протокола выполнения программы }
n_text : integer; { счетчик длины массива a_text }
nL : integer; { счетчик длины массива LL }
nT : integer; { счетчик длины массива TT }
i : integer; { вспомогательная переменная }
{ Начальная установка, заполнение таблицы идентификаторов всеми
служебными словами, предварительно зарезервированными в таблице
кодов лексем }
procedure ust;
begin VV[1]:='var';
VV[2]:='begin';
VV[3]:='end';
VV[4]:='read';
VV[5]:='write';
VV[6]:='integer';
nT:=kT; nL:=0;
end;
{ ввод исходного текста }
procedure input;
var a : char; { один символ }
begin
assign(in_text,'prim.lex'); { связь файловой переменной с файлом }
{prim.lex – произвольно выбранное имя файла, имя расширения
указывает, что текст файла предназначен для лексического анализа }
reset(in_text); { открытие файла для чтения }
n_text:=0;
while not eof(in_text) do
begin read(in_text,a); n_text:=n_text+1;
a_text[n_text]:=a;
end;
end;
{ формирование результатов в виде файлов: cod.lex,ident.lex }
procedure out;
var i : integer;
begin
assign(out_int,'cod.lex');
rewrite(out_int);
assign(out_ident,'ident.lex');
rewrite(out_ident);
write(out_int,nL,nT);
for i:=1 to nL do write(out_int,LL[i],TT[i]);
for i:=1 to nT do write(out_ident,VV[i]);
end;
{ Распознавание буквы - true(1), иначе false(0) }
function bukva(a : char): integer;
var
k,kz : integer;
begin k:=ord(a); { ord - фунция дает код символа в ASCII }
if ( k>=64 ) and ( k<=90 ) or
( k>=96 ) and ( k<=122 )
then kz:=1
else kz:=0;
bukva:=kz;
end;
{ Распознавание цифры - true(1), иначе false(0) }
function cifra( a : char) : integer ;
var k,kz : integer;
begin k:=ord(a);
if ( k>=48 ) and ( k<=57 )
then kz:=1
else kz:=0;
cifra:=kz;
end;
{ Размер идентификатора (количество символов, входящих в образование
имени лексемы), где начало i, конец k }
function l_ident( i : integer):integer;
var k:integer;
begin
k:=i;
while ( bukva(a_text[k])=1 ) or ( cifra(a_text[k])=1 )
do k:=k+1;
k:=k-1;
l_ident:=k;
end;
{ Размер цифровой константы ( начало i, конец k ) }
function l_const ( i : integer ) : integer;
var k:integer;
begin
k:=i;
while cifra(a_text[k])=1 do k:=k+1;
k:=k-1;
l_const:=k;
end;
{ Определение типа и кода лексемы ( строки str ), если данной лексемы
нет в таблице служебных слов (массив - VV), тогда она добавляется в
массив VV }
procedure ttin( kk :integer; str : string;
var kod,typ : integer );
var k,i : integer;
begin
{ поиск в таблице VV }
k:=0;
for i:=1 to nT do
if str=VV[i] then k:=i;
{ идентификатор имеется в таблице VV }
if k<=kT then
begin kod:=k; typ:=0; end; { служебные слова }
if k>kT then
begin kod:=k; typ:=kk; end; { имя переменной }
{ идентификатора нет в таблице, тогда он добавляется }
if k=0 then
begin nT:=nT+1; VV[nT]:=str; kod:=nT; typ:=kk; end;
end;
{ лексический анализ }
procedure lexan;
var
i,j,k,kod,typ : integer;
a: char; str : string;
begin
i:=0;
while i<=n_str do
begin
i:=i+1;
a:=a_text[i];
if ord(a) > 32 then
begin
if bukva(a)=1 then
{ если a - буква, то может быть только идентификатор }
begin k:=l_ident(i);
str:='';
for j:=i to k do str:=str+a_text[j];
ttin(200,str,kod,typ);
nL:=nL+1; LL[nL]:=kod; TT[nL]:=typ;
i:=k;
end;
{ если a - цифра, то далее может быть
только цифровая константа }
if cifra(a)=1 then
begin k:=l_const(i); { цифровая константа }
str:='';
for j:=i to k do str:=str+a_text[j];
ttin(300,str,kod,typ);
nL:=nL+1; LL[nL]:=kod; TT[nL]:=typ;
i:=k;
end;
{ если a - не буква и не цифра, то далее
может быть только операция }
if ( bukva(a)<>1 ) and ( cifra(a)<>1 ) then
begin
{ проверка на код операции }
case a of
'+': kod:=100;
'-': kod:=101;
'*': kod:=102;
'/': kod:=103;
'=': kod:=104;
'(': kod:=105;
')': kod:=106;
',': kod:=107;
':': kod:=108;
';': kod:=109;
end;
typ:=0;
nL:=nL+1; LL[nL]:=kod; TT[nL]:=typ;
end;
end;
end; { end of while }
end;
{ основная программа }
begin
ust; { начальная установка }
input; { ввод программы }
lexan; { лексический анализ }
assign(prt,'prot.txt');
{ con - вывод на экран,
prot.txt – произвольное имя файла для записи протокола
выполнения программы }
rewrite(prt);
writeln(prt,' Количество лексем=',nL,
' Количество идентификаторов и констант=',nT);
writeln(prt);
writeln(prt,' Результат работы лексического анализатора');
writeln(prt);
writeln(prt,' Исходная программа');
for i:=1 to n_text do
write(prt,a_text[i]);
writeln(prt); writeln(prt);
writeln(prt,' тип лексемы : код лексемы');
for i:=1 to nL do
begin write(prt,TT[i]:3,':',LL[i]:3,' ');
if i mod 4 = 0 then writeln(prt);
end;
writeln(prt); writeln(prt);
writeln(prt,' Таблица идентификаторов и констант');
for i:=1 to nT do
write(prt,VV[i],' '); writeln(prt);
writeln(prt,' Конец протокола');
close(prt);
out;
end.
 
Добавлено:
Буду рада помощи.

Всего записей: 6 | Зарегистр. 04-02-2008 | Отправлено: 14:16 12-03-2008 | Исправлено: Tanchonok, 17:43 12-03-2008
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru