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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2015, 00:38   #1
rachina
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 27
Печаль Анализ текста, введённого в memo

Доброго времени суток!
Пишу лексический анализатор. С горем пополам смог определить идентификаторы, числа, служебные слова и арифметические знаки. осталось определить числа, введённые через запятую, а не через точку (220,33 например)
всё (почти) делаю через константы)


чуть ниже приведён фрагмент кода.

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  // разделители
  D = [' ','(', ')'];
 
  ident =['a'..'z','_']+['0'..'9'];
   ident_ =['a'..'z','_'];
  prisvo = '++';
   oper =['+','-'];
    cifra = ['0'..'9']+[',']+['0'..'9'];  // как раз для определения цифр с запятой ввёл
 
   var
swp, result, S, sW, sWL : String;
  i, i1,i3, Pos1, Len, LenW, errorPos,errorPos1, n,q : Integer;
  float :real;
  ReservedWords :TStringList;
  bred: Tstringlist;
  Found :Boolean;
 
begin
   memo2.clear;
 
  S := Memo1.Text; // чтоб определить длину введенного текста
  len:=0;
   Len := Length(S);
  Pos1 := 0;
  for i := 1 to Len do
  begin
    Found:=False;
    if S[i] in D then Continue; // чтобы со спокойной душой пропускать разделители
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    if (i = Len) or (S[i + 1] in D) then
    begin
 
      LenW := i - Pos1+1; // здесь определяем длину слова
      sW := Copy(S, Pos1, LenW); //конкретное слово
 
 
/// для примера: здесь я определяю, что введены числа (слава функции val)
 Val(sW, float, errorPos);
 
      if errorPos = 0 Then
      begin
 
      for i1:=0 to  Memo1.Lines.Count-1 do
    begin
     memo2.lines.add(sw+ ' число');
     found:=true;
    break;
 
end; end else  ....
// тут арифметические знаки
 end else
          if s[i] in oper then
      for i1:=0 to  Memo1.Lines.Count-1 do
    begin
     memo2.lines.add(sw+ ' арифметический знак');
     found:=true;
       break;
     end;
      end;
    end else begin
 
//определение присвоения 
     if copy(s,i,2)=prisvo then begin
      for i1:=0 to  Memo1.Lines.Count-1 do
    begin
     memo2.lines.add(prisvo+ '  присвоение');
     found:=true;
       break;
     end;  
 
end  else
 
// вот отсюда начинается веселье
       if sw[i] in cifra then begin
       for i1:=0 to  Memo1.Lines.Count-1 do
    begin
     memo2.lines.add(sw+ '  тоже число');
     found:=true;
       break;
     end;      
 
    end;
    end;
end;

пытался работать также, как и с определением идентификатора, но что-то как-то не задалось.
для чисел, записанных через точку или для целых чисел пригодилась функция val, а что тут делать? подскажите, пожалуйста
rachina вне форума Ответить с цитированием
Старый 23.10.2015, 01:18   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от rachina Посмотреть сообщение
для чисел, записанных через точку или для целых чисел пригодилась функция val, а что тут делать? подскажите, пожалуйста
Перед вызовом процедуhы Val вызывать процедуру
StringReplace
Дабы заменить запятую или точку но тот символ, который установлен в системе как разделитель целой и дробной части вещественного числа.
RTFM DecimalSeparator
northener вне форума Ответить с цитированием
Старый 23.10.2015, 02:20   #3
rachina
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 27
По умолчанию

спасибо))
DecimalSeparator - вообще открыл для себя что-то новое!!!
rachina вне форума Ответить с цитированием
Старый 23.10.2015, 02:44   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от rachina Посмотреть сообщение
спасибо))
DecimalSeparator - вообще открыл для себя что-то новое!!!
Да не за что.
Будет время, прошерсти RTFM. Там есть ещё несколько сепараторов, знание которых может потребоваться в дальнейшем.
northener вне форума Ответить с цитированием
Старый 23.10.2015, 03:23   #5
rachina
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 27
По умолчанию

хорошо! очень дельный совет))
rachina вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ символов введённых в memo rachina Общие вопросы Delphi 3 09.10.2015 11:09
Delphi передача текста из memo в memo hauk70 Помощь студентам 27 22.05.2012 18:33
Анализ текста DAV88 Помощь студентам 1 17.05.2010 12:35
Анализ текста в компонентах Memo sokla Помощь студентам 4 14.03.2010 00:32
Анализ текста GonZaleZ Общие вопросы C/C++ 11 16.09.2009 23:31