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 |
|