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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2012, 22:22   #31
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Подскажите алгоритм как занести слова из строки в массив. Т.е. каждое слово в отдельный элемент массива. Слова у меня отделены пробелами. Я иду по строке пока не встречу пробел, каждый символ строки записывая в новую строку, как тока пробел появился, новая строка готова - она содержит первое слово и мы заносим эту строку в первый элемент массива и очищаем эту строку. Но вот дальше этот алгоритм не работает, потому что если его повторить, он начинает с начала строки и опять сохраняет первое слово, а мне после первого прохода надо начинать с символа, который после первого пробела. Как сделать?
Arturko вне форума Ответить с цитированием
Старый 06.06.2012, 23:53   #32
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Готово:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s2,s3:string;
    i,j,k,count:integer;
    mas, mas2: array[1..32] of string;
begin
  mas[1]:='if';
  mas[2]:='(';
  mas[3]:='CEdit1';
  mas[4]:='.';
  mas[5]:='Text';
  mas[6]:='=';
  mas[7]:='''';
  mas[8]:='''';
  mas[9]:=')';
  mas[10]:='and';
  mas[11]:='(';
  mas[12]:='KEdit2';
  mas[13]:='.';
  mas[14]:='Text';
  mas[15]:='=';
  mas[16]:='''';
  mas[17]:='''';
  mas[18]:=')';
  mas[19]:='then';
  mas[20]:='begin';
  mas[21]:='ShowMessage';
  mas[22]:='(';
  mas[23]:='''';
  mas[24]:='Please';
  mas[25]:='enter';
  mas[26]:='data';
  mas[27]:='''';
  mas[28]:=')';
  mas[29]:=';';
  mas[30]:='exit';
  mas[31]:='end';
  mas[32]:=';';
  s2:=Memo1.Text;
  i:=1;
   while i<Length(s2) do
    begin
        if (s2[i]=' ') and (s2[i+1]=' ') then Delete(s2,i,1) else inc(i);
    end;
  i:=1;
  while i<= Length(s2) do
    begin
      if ((s2[i]='(') or (s2[i]=')') or (s2[i]='=') or (s2[i]='''') or (s2[i]=';') or (s2[i]='.')) and (s2[i+1]<>' ')
        then Insert(' ',s2,i+1);
      if ((s2[i]='(') or (s2[i]=')') or (s2[i]='=') or (s2[i]='''') or (s2[i]=';') or (s2[i]='.')) and (s2[i-1]<>' ')
        then Insert(' ',s2,i);
      inc(i);
    end;
    s3:='';
    count:=0;
    for k:=1 to Length(s2) do
      begin
        if s2[k]=' ' then inc(count);
      end;
    if s2[Length(s2)]<>' ' then inc(count);
    j:=1;
    for i:=1 to count do
      begin
        while s2[j]<>' ' do
          begin
            s3:=s3+s2[j];
            inc(j);
          end;
        j:=j+1;
        mas2[i]:=s3;
        s3:='';
      end;
    if count>32 then ShowMessage('Please remove unnecessary text') else
    if mas[1]<>mas2[1] then ShowMessage('if expected') else
    if mas[2]<>mas2[2] then ShowMessage('( expected') else
    if mas[3]<>mas2[3] then ShowMessage('CEdit1 expected') else
    if mas[4]<>mas2[4] then ShowMessage('. expected') else
    if mas[5]<>mas2[5] then ShowMessage('Text expected') else
    if mas[6]<>mas2[6] then ShowMessage('= expected') else
    if mas[7]<>mas2[7] then ShowMessage('Incorrect text') else
    if mas[8]<>mas2[8] then ShowMessage('Incorrect text') else
    if mas[9]<>mas2[9] then ShowMessage(') expected') else
    if mas[10]<>mas2[10] then ShowMessage('and expected') else
    if mas[11]<>mas2[11] then ShowMessage('( expected') else
    if mas[12]<>mas2[12] then ShowMessage('KEdit2 expected') else
    if mas[13]<>mas2[13] then ShowMessage('. expected') else
    if mas[14]<>mas2[14] then ShowMessage('Text expected') else
    if mas[15]<>mas2[15] then ShowMessage('= expected') else
    if mas[16]<>mas2[16] then ShowMessage('Incorrect text') else
    if mas[17]<>mas2[17] then ShowMessage('Incorrect text') else
    if mas[18]<>mas2[18] then ShowMessage(') expected') else
    if mas[19]<>mas2[19] then ShowMessage('then expected') else
    if mas[20]<>mas2[20] then ShowMessage('begin expected') else
    if mas[21]<>mas2[21] then ShowMessage('ShowMessage expected') else
    if mas[22]<>mas2[22] then ShowMessage('( expected') else
    if mas[23]<>mas2[23] then ShowMessage('Incorrect text') else
    if mas[24]<>mas2[24] then ShowMessage('Incorrect text') else
    if mas[25]<>mas2[25] then ShowMessage('Incorrect text') else
    if mas[26]<>mas2[26] then ShowMessage('Incorrect text') else
    if mas[27]<>mas2[27] then ShowMessage('Incorrect text') else
    if mas[28]<>mas2[28] then ShowMessage(') expected') else
    if mas[29]<>mas2[29] then ShowMessage('; expected') else
    if mas[30]<>mas2[30] then ShowMessage('exit expected') else
    if mas[31]<>mas2[31] then ShowMessage('end expected') else
    if mas[32]<>mas2[32] then ShowMessage('; expected') else
    ShowMessage('No errors.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text:='if (CEdit1.Text='''') and (KEdit2.Text='''') then begin ShowMessage(''Please enter data''); exit end;';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Text:='if (CEdit1.Text='''') and (KEdit2.Text='''') then begin ShowMessage(''Please enter data''); exit end;';
end;
Arturko вне форума Ответить с цитированием
Старый 07.06.2012, 07:43   #33
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Arturko Посмотреть сообщение
Готово:
Код:
  mas[1]:='if';
  mas[2]:='(';
  mas[3]:='CEdit1';
  mas[4]:='.';
  mas[5]:='Text';
  mas[6]:='=';
  mas[7]:='''';
  mas[8]:='''';
  mas[9]:=')';
  mas[10]:='and';
  mas[11]:='(';
  mas[12]:='KEdit2';
  mas[13]:='.';
  mas[14]:='Text';
  mas[15]:='=';
  mas[16]:='''';
  mas[17]:='''';
  mas[18]:=')';
  mas[19]:='then';
  mas[20]:='begin';
  mas[21]:='ShowMessage';
  mas[22]:='(';
  mas[23]:='''';
  mas[24]:='Please';
  mas[25]:='enter';
  mas[26]:='data';
  mas[27]:='''';
  mas[28]:=')';
  mas[29]:=';';
  mas[30]:='exit';
  mas[31]:='end';
  mas[32]:=';';
Не нужно было этого делать.
Нужно было ввести строку и обработать ее тем же алгоритмом, которым Вы будете обрабатывать строку, введенную пользователем.

И еще раз напомню о своей точке зрения: в Вашей задаче реальный парсинг не нужен - достаточно лишь немного преобразовать строку, после чего сравнивать ее побайтно.
s-andriano вне форума Ответить с цитированием
Старый 07.06.2012, 08:16   #34
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я не понял - Вы хотите рассматривать только одну строку? А если в if будет другое корректное выражение? Анализ не нужен будет? Если для одной строки, то все гораздо проще - нужно ее подготовить как писал ранее, но нет смысла загонять в массив. Просто сравните с образцом и все дела.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.06.2012, 18:53   #35
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Я не понял - Вы хотите рассматривать только одну строку? А если в if будет другое корректное выражение?
Это не я хочу, это ТС хочет.
Перечитайте 1-й пост темы, а также уточнение в постах 3-4.
s-andriano вне форума Ответить с цитированием
Старый 07.06.2012, 21:46   #36
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Это не я хочу, это ТС хочет.
Да ему и писал
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.06.2012, 08:25   #37
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Работу не зачли, всё совсем не так....
Нужно проверить не только эту строку, а синтаксис, т.е.
if (CEdit1.Text='лолрлро') - это не должно быть ошибкой,
CEdit2.Text - тоже
и т.д.

Тут надо как-то составить правила, что после if должно иди условие, неважно какое, главное что бы оно было написано синтаксически правильно, и так для всего кода. Как это сделать? Приведите хоть часть, как начать.
Arturko вне форума Ответить с цитированием
Старый 13.06.2012, 13:34   #38
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Приведите хоть часть, как начать.
Сформулируйте, пожалуйста, условие задачи.
s-andriano вне форума Ответить с цитированием
Старый 13.06.2012, 13:44   #39
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Основная задача синтаксического анализатора – проверка правиль*ности грамматического
построения предложений исходного текста программы. Все конструкции современных языков
программирования имеют четкие и однозначные грамматические правила (синтаксис), которые
должны соблюдаться при написании программы. Для выяв*ления возможных ошибок и
контроля правильности построения пред*ложений языка в исходном тексте необходимо иметь:
1) предложение языка, представленное в виде таблицы стандартных символов;
2)грамматику языка, расположенную в памяти (в некоторых методах грамматического
разбора это требование может отсутствовать);
3) алгоритм грамматического разбора, реализованный в виде син*таксического анализатора
(английский термин – PARSER, которым мы будем пользоваться для краткости).

Т.е. главной задачей я так понимаю составить грамматические правила и потом использовать для проверки. Тогда всё будет верно. Но как записать правила? Я так понимаю правило, это что то типа, если увидели if, после него должно следовать условие, условие должно быть заключено в скобки, в условии должно быть 2 идентификатора и между ними знак сравнения, после скобки должно следовать and/or и так далее. Т.е содержимое нам неважно, главное верный синтаксис, где надо там зарезервированное слово где надо идентификатор и т.д. Как такие правила составить?
Arturko вне форума Ответить с цитированием
Старый 13.06.2012, 15:20   #40
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

предположительно, нужно копать в сторону:
результаты поиска в Гугл: построение синтаксического анализатора грамматики языка

возможно, что в вашем случае, не требуется полномасштабное решение.

Хотя, я бы акцентировал внимание на то, чтобы найти методическое пособие именно к данной работе, желательно вашего учебного заведения/авторства ваших преподавателей, на крайний случай, чужую ПРАВИЛЬНУЮ работу (можно прошлых лет) и разобрался в том, что именно от вас требуется.

пока, с ваших слов (я про те посты, где вы писали про if (CEdit1.Text='лолрлро') ) - ничего непонятно - что считать правильной конструкцией, что - нет...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синтаксический анализатор(LL) Legato Общие вопросы Delphi 2 25.12.2011 18:29
Синтаксический анализатор Lisёноk Помощь студентам 2 12.12.2011 09:51
Синтаксический анализатор Jeka57 Помощь студентам 1 05.06.2011 22:47
Синтаксический анализатор Ita Фриланс 0 29.03.2011 01:37
Синтаксический анализатор Douglas Помощь студентам 0 28.12.2010 18:01