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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2012, 23:32   #21
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Arturko Посмотреть сообщение
Насчёт пробелов вы тоже правы, если в мемо1 сделаю между словами 2 пробела, выдаст ошибку, хотя это не является ошибкой.
Как решить проблему?
Зачем Вы задаете вопросы, если не хотите читать на них ответы?
Я об этом уже писал в посте №10.
s-andriano вне форума Ответить с цитированием
Старый 05.06.2012, 23:46   #22
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Я плохо знаю программирование, а вы говорите загадками, не хотите на пальцах объяснить, простите...
Пока сделал вот так, не всё конечно учтено, но хоть что-то...
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s1,s2:string;
    i,x:integer;
begin
  x:=0;
  s1:='if (CEdit1.Text='''') and (Kedit2.Text='''') then begin ShowMessage(''Please enter data''); exit end;';
  s2:=Memo1.Text;
  i:=1;
  while i<Length(s1) do
    begin
        if (s2[i]=' ') and (s2[i+1]=' ') then Delete(s2,i,1) else inc(i);
    end;
  for i:=1 to Length(s1)+1 do
    begin
      if s1[i]<>s2[i] then
        begin
          x:=1;
          if (i>=1) and (i<=3) then ShowMessage('Incorrect ''if''');
          if (i=4) or (i=25) or (i=64) then ShowMessage('( expected');
          if (i=19) or (i=40) or (i=84) then ShowMessage(') expected');
          if (i=85) or (i=95) then ShowMessage('; expected');
          if (i>=5) and (i<=16) then ShowMessage('Incorrect CEdit1.Text=''''');
          if (i>=20) and (i<=24) then ShowMessage('Incorrect ''and''');
          if (i>=26) and (i<=37) then ShowMessage('Incorrect Kedit2.Text=''''');
          if (i>=41) and (i<=45) then ShowMessage('Incorrect ''then''');
          if (i>=46) and (i<=51) then ShowMessage('Incorrect ''begin''');
          if (i>=52) and (i<=63) then ShowMessage('Incorrect ''ShowMessage''');
          if (i>=87) and (i<=90) then ShowMessage('Incorrect ''exit''');
          if (i>=91) and (i<=94) then ShowMessage('Incorrect ''end''');
          if (i>96) then ShowMessage('Incorrect end of code');
          if (i>=66) and (i<=82) then ShowMessage('No errors.');
          if (i=86) then ShowMessage('No errors.');
          if (i>=65) and (i<=83) then ShowMessage(''' expected');
          break;
        end;
    end;
    if x=0 then ShowMessage('No errors.');

end;

Последний раз редактировалось Arturko; 06.06.2012 в 01:12.
Arturko вне форума Ответить с цитированием
Старый 06.06.2012, 07:55   #23
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Arturko Посмотреть сообщение
Я плохо знаю программирование, а вы говорите загадками, не хотите на пальцах объяснить, простите...
Уточните, Вы плохо знаете программирование или плохо знаете русский язык?
Вроде, специально стараюсь писать по-русски, не используя вставок на ЯП. Чего ж Вам еще надо?
В моем посте №10 я писал:
Цитата:
удалить лишние пробелы
после чего в Вашем посте №17 читаю:
Цитата:
сделаю между словами 2 пробела, выдаст ошибку, хотя это не является ошибкой
Откуда я делаю вполне естественный вывод, что мой пост №10 Вы не читали.
И покажите, пожалуйста, где именно я говорю загадками.

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

Последний раз редактировалось s-andriano; 06.06.2012 в 08:03.
s-andriano вне форума Ответить с цитированием
Старый 06.06.2012, 12:29   #24
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Нормализуйте строку - замените все "нехорошие" символы (например символ табуляции) на пробел. Затем сделайте так, чтобы в строке не встречалось более двух пробелов подряд (естественно нужно учитывать выражения в кавычках - строковые константы).
Далее все последовательности символов разделенных между собой заталкайте в динамический массив. Так Вы получите лексемы. Затем в большинстве случаев (но не всегда) анализ первой лексемы дает уже понять что же перед нами за оператор (в нашем случае это будет if). Ставите какой-нибудь селектор (например, используете case) и вперед - рассматриваете работу каждого оператора в отдельности. Ну вкратце как-то так.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 06.06.2012 в 12:31.
Utkin вне форума Ответить с цитированием
Старый 06.06.2012, 12:51   #25
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

могу поделиться своим в качестве примера, но вечером, сейчас на работе
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.06.2012, 18:33   #26
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Спасибо за ответы. Сейчас тоже убегаю, но мысль понял, вечером скину что получится.
Utkin ваш вариант выглядит наиболее правильным.
Sparky любые исходники могут помочь, спасибо.
Arturko вне форума Ответить с цитированием
Старый 06.06.2012, 20:43   #27
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Я прав, что в моём случае лексемы будут такие?:
Код:
if 
(
CEdit1.Text
=
'
)
and
Kedit2.Text
then
begin
ShowMessage
; 
exit 
end
А как мне каждое слово из строки представить элементом массива?
Arturko вне форума Ответить с цитированием
Старый 06.06.2012, 21:18   #28
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Я введённую строку пытаюсь разбить на лексемы, т.е хочу что бы перед и после скобки, точки, точки с запятой,знака равно, апострофа, поставились пробелы. Если я преобразую так строку потом все слова я смогу занести в массив. Я делаю так:
Цитата:
s2:=Memo1.Text;
i:=1;
while i<= Length(s2) do
begin
if (s2[i]='(') or (s2[i]='=') or (s2[i]='''') or (s2[i]=';') or (s2[i]='.')then
begin
s2[i-1]:=' ';
s2[i+1]:=' ';
end;
inc(i);
end;
ShowMessage(s2);
Но после нажатия GO, получаю такой ответ преобразованной строки:

Потерялись некоторые символы, не понимаю почему. Объясните пожалуйста.
Arturko вне форума Ответить с цитированием
Старый 06.06.2012, 21:21   #29
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,301
По умолчанию

Потому что таким образом вы не вставляете символы, а "затираете" существующие.
Имхо, нужно "идти" по строке и командой copy "выдирать" куски.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2012, 21:31   #30
Arturko
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 35
По умолчанию

Вспомнил про процедуру insert, всё ок, сейчас дальше буду думать
Arturko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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