Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2010, 16:48   #1
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию Разборка кода программы, как работает программа

Здравствуйте.
Мне нужно разобраться с кодом моей программы. Цель программы - производить лексический анализ текста, соответствующего заданному алфавиту и грамматике алгоритмического языка.
Этап лексического анализа текста исходной программы выделяется в самостоятельный этап работы транслятора, как с методической целью, так и с целью сокращения времени компиляции программы. Последнее достигается за счёт того, что исходная программа в виде последовательности символов, преобразуется на этапе лексической обработки к некоторому стандартному виду, что облегчает дальнейший анализ. Под лексическим анализом понимают процесс предварительной обработки исходной программы, на котором основные лексические единицы программы - лексемы: ключевые слова, идентификаторы, метки, константы приводятся к единому формату и заменяются условными кодами или ссылками на соответствующие таблицы, а комментарии исключаются из текста программы. Результатом лексического анализа является список лексем-дескрипторов и таблицы. В таблицах хранятся значения выделенных в программе лексем.
Программа написана на Delphi. То есть простым языком программа сортирует введенный текст в 4 группы(k1,k2,k3,k4), а также в подгруппы. Если с к1 и к2 все понятно, то не понятно как распознает к3 и к4. Пример результата выполнения программыk1,1, program) (k3,1, ñ) (k2,4, :=) (k3,2, ) (k2,5, (k3,3, ) (k2,1, .)
в ней k1-ключевые слова, K2-разделители, k3-идентификаторы, k4-константы(целые числа). Даже на такой простой вопрос,"почему программа не работает, если не поставить точку в конце ввода текста в окне выполнения программы?" я ответить не могу....
Заранее всем спасибо.
Вложения
Тип файла: rar теор выч проц и структур.rar (162.8 Кб, 12 просмотров)
Тип файла: rar Новая папка.rar (515.5 Кб, 10 просмотров)

Последний раз редактировалось marsel989; 26.05.2010 в 01:12.
marsel989 вне форума Ответить с цитированием
Старый 25.05.2010, 16:57   #2
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

пришлю код, чтоб вам легче было
Код:
program abv; var x, y, z:integer; begin a:=2; b:=3; c:=a+b; end.
var abc;


procedure TForm1.Button1Click(Sender: TObject);
var str, a, simbol, rez : string;
    razd : array[1..N] of string[2];
    kl: array[1..K] of string;
    L, i, j, x, y, p: integer;
    b: real;
    flag: boolean;
begin
  Edit2.Text := '';
  str := Edit1.Text; //Program as; var x,y; real; end;
  razd[1] := '.' ;
  razd[2] := ',' ;
  razd[3] := ';' ;
  razd[4] := ':=' ;
  razd[5] := ':' ;
  razd[6] := '"' ;
  razd[7] := '/' ;
  razd[8] := '*' ;
  razd[9] := '+' ;
  razd[10] := '-' ;
  razd[11] := '(' ;
  razd[12] := ')' ;
  razd[13] := '>' ;
  razd[14] := '<' ;
  razd[15] := '<>' ;
  razd[16] := '=' ;
  razd[17] := '[' ;
  razd[18] := ']' ;
  kl[1] := 'program' ;
  kl[2] := 'var' ;
  kl[3] := 'begin' ;
  kl[4] := 'end' ;
  kl[5] := 'writeln' ;
  kl[6] := 'readln' ;
  kl[7] := 'if' ;
  kl[8] := 'then' ;
  kl[9] := 'else' ;
  kl[10] := 'for' ;
  kl[11] := 'to' ;
  kl[12] := 'do' ;
  kl[13] := 'and' ;
  kl[14] := 'or' ;
  kl[15] := 'integer' ;
  kl[16] := 'real' ;
  kl[17] := 'char' ;
  kl[18] := 'string' ;
  kl[19] := 'array' ;
  kl[20] := 'procedure' ;
  kl[21] := 'function' ;
  L := Length(str);
  x:=1; //счетчик 2ого массива
  y:=1; //счетчик 3его массива
  i:=1;
  flag:=false;
 while i<=L do
  begin
    for j:= 1 to N do
    begin
    flag:=false;
    simbol:=str[i];
      if ((simbol<>razd[j]) and (simbol<>' ')) then
        begin
        end
      else
      begin
        for p:=1 to K do
        begin
          if a=kl[p] then
          begin
            rez:=rez+'(k1,'+IntToStr(p)+', '+kl[p]+ ') '; //преобразует целое число в строку
            flag:=true;
            if simbol<>' ' then
            rez:=rez+'(k2,'+IntToStr(j)+', '+simbol+ ') ';
            break;
          end
        end;
        if flag=false then
        begin
          if simbol<>' ' then
          begin
            try
              b := strToInt(a);
              rez:=rez+'(k4,'+IntToStr(y)+', '+a+ ') ';
              y:=y+1;
            except
              rez:=rez+'(k3,'+IntToStr(x)+', '+a+ ') ';
              x:=x+1;
            end;
            if ((simbol=':') and (str[i+1]='=')) then
            begin
              rez:=rez+'(k2,4'+', '+simbol+str[i+1]+ ') ';
              i:=i+1;
            end
            else
              rez:=rez+'(k2,'+IntToStr(j)+', '+simbol+ ') ';
              end;
        end;
        simbol:='';
        a:='';
        break;
      end;
   end;
  a:=a+simbol;
  i:=i+1;
  end;
    Edit2.Text := rez;
  end;
end.



{k:=1;
  for i := 1 to L do
  begin
    flag:=false;
    simbol := str[i];
    for j := 1 to N do
        begin
      if simbol = razd[j] then
      begin
        for h:=1 to (length(result)-1) do
        begin
          if result[h]=simbol then
          flag:=true;
        end;
        if flag=false then
        begin
          result[k]:=simbol;
          k:=k+1;
        end;
      end;
    end;
  end;
  for i:=1 to (k-1) do
  begin
  a:=a+'('+result[i]+')';
 end;
 Edit2.Text := a// должны сравнить }

 //for i:=1 to L do
 {i:=1;
 while i<=L do
 begin
   simbol:=str[i];
   h:=i;
   for j:=1 to N do
   begin
     a:=kl[j];
     flag:=false;
     for k:=1 to length(a) do
     begin
       if simbol=a[k] then
       begin
         h:=h+1;
         simbol:=str[h];
         if k=length(a) then
         begin
           flag:=true ;
           i:=h;
         end;
       end
       else break;
     end;
     if flag=true then
     if Edit2.Text = '' then
     Edit2.Text := a
     else
     Edit2.Text := Edit2.text+' '+a;
  end;
  for j:=1 to N do
   begin
     a:=razd[j];
     flag:=false;
     for k:=1 to length(a) do
     begin
       if simbol=a[k] then
       begin
         h:=h+1;
         simbol:=str[h];
         if k=length(a) then
         begin
           flag:=true ;
           i:=h;
         end;
       end
       else break;
     end;
     if flag=true then
     if Edit2.Text = '' then
     Edit2.Text := a
     else
     Edit2.Text := Edit2.text+' '+a;
  end;
//if flag = false then
  Inc(i);
end;
end;}

Последний раз редактировалось Stilet; 26.05.2010 в 11:52.
marsel989 вне форума Ответить с цитированием
Старый 25.05.2010, 17:19   #3
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

так же замечено, что программа иногда работает некорректно.. от чего зависит не понятно..

помогите. доработайте код, ведь прога не сложная... или киньте готовую, у кого есть, и подскажите где найти можно....

нам преподаватель не объясняет ничего, лекции даже не читал, хотя обязан был. я программирование вообще не люблю, поставте себя на мое место, только треть из группы сдало...

ребята, хоть что нибудь напишите

буду держать тему в топе

Последний раз редактировалось Stilet; 26.05.2010 в 10:26.
marsel989 вне форума Ответить с цитированием
Старый 26.05.2010, 00:08   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Слушай, попытался разобратся - не понял. Можеш какнить по-проще объяснить: Что надо. И во вложении нет формы (файлы dfm и pas).
Sibedir вне форума Ответить с цитированием
Старый 26.05.2010, 01:21   #5
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

добавил требуемые файлы. программа должна распозновать введенный текст на латинском языке. Например, такой текст "program abv,c:=a+ b;end." и рузультате пишет (k1,1, program) (k3,1, abv) (k2,2, ,) (k3,2, c) (k2,4, :=) (k3,3, a) (k2,9, +) (k3,4, b) (k2,3, (k1,4, end) (k2,1, .) , где k1-ключевые слова, K2-разделители, k3-идентификаторы, k4-константы(целые числа), далее число-это порядковый номер в массиве (кроме к3 и к4 - массивов не нашел), далее сам элемент текста...
marsel989 вне форума Ответить с цитированием
Старый 26.05.2010, 12:53   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Блин. Не понятно.
Цитата:
k4-константы(целые числа)
А если ввидут вещественное
Цитата:
далее число-это порядковый номер в массиве
В КАКОМ МАССИВЕ?
Цитата:
кроме к3 и к4 - массивов не нашел
А где их искать? И что это за массивы то?

Если хотите, чтобы вам помогли, потрудитесь изложить задачу четко и подробно с САМОГО НАЧАЛА. Что-то мне подсказывает, что вашу задачу нужно решать иначе (хотя не могу сказать наверника, я же не понял первоначальную задачу).
Если это какая-нибудь лабораторная, приведите текст задачи как есть.
Sibedir вне форума Ответить с цитированием
Старый 26.05.2010, 18:34   #7
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

1.если ввести вещественное, то она его не распознает, т е не работает, да это и не нужно, хотя я даже не знаю где задается что именно integer
2. в коде программы, видите в первом массиве 21 элемент, во втором-18
3. для к3 и к4 массивов не задано, но понятно что к4-это массив чисел integer
Завтра сдавать, а я ни фиг* не знаю
Посылаю методичку по лабе, p s не очень понятная но какая есть
Вложения
Тип файла: doc ЛабораторнаяРабота№1.doc (50.0 Кб, 9 просмотров)

Последний раз редактировалось marsel989; 26.05.2010 в 19:20.
marsel989 вне форума Ответить с цитированием
Старый 26.05.2010, 18:39   #8
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

http://rapid.ufanet.ru/2241297 - вот методичка по лабе, только написана настолько корявым языком, ничего не понятно
marsel989 вне форума Ответить с цитированием
Старый 26.05.2010, 18:53   #9
marsel989
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 17
По умолчанию

а почему как комментарий у меня пол программы?? она не нужна что ле вообще?
я примерно понял как работает программа, сначала проверяет относится ли элемент к к1, если нет, значит далее к к2, если тоже нет, то к к4 - константам, если опять нет, то к к3(идентификаторы) - Но тут возникает вопрос, что будет вместо этих вопросов (к3, ??), если массива нет, как она определить на каком месте этот идентификатор находится....
marsel989 вне форума Ответить с цитированием
Старый 26.05.2010, 19:19   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А вы уже работаете с классами?
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает программа и что делает dragun4ik Помощь студентам 0 23.05.2010 15:51
Не могу разобраться как работает программа(сложение дробей) Superlotles Общие вопросы C/C++ 1 15.05.2010 16:05
при работе с Excel не работает кусок кода Tirendus Общие вопросы Delphi 4 23.07.2009 13:13
Разборка кода Safary Помощь студентам 8 28.11.2008 09:18
Оптимизация кода программы insi Фриланс 2 17.05.2008 18:30