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

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

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

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

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

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

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


чуть ниже приведён фрагмент кода.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  // разделители
  D = [' ','(', ')'];
 
  ident =['a'..'z','_']+['0'..'9'];
   ident_ =['a'..'z','_'];
  prisvo = '++';
   oper =['+','-'];
 
   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 s[i]=prisvo then
      for i1:=0 to  Memo1.Lines.Count-1 do
    begin
     memo2.lines.add(sw+ '  присвоение');
     found:=true;
       break;
     end;
 
    end;
    end;
end;
уж пробовал из списка в файле загружать и просто s[i] присваивать "присвоение", и что угодно - и ничего. не желает он воспринимать символ, состоящий из 2-х и более спецсимволом(
будьте добры, помогите неумехе
rachina вне форума Ответить с цитированием
Старый 09.10.2015, 09:09   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
не желает он воспринимать символ, состоящий из 2-х и более спецсимволом(
Феерично! Это всё равно что требовать налить в чашку две полных чашки воды. конечно не получится.

Сравнивайте текущий символ с первым и следующий со вторым.

Код выложен, как есть. Он не претендует на идеальность.
Вложения
Тип файла: zip LexAnaliser.zip (2.3 Кб, 8 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 09.10.2015, 09:20   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ну дык, если k-й символ = ":" и а следующий = "=", то лексема - знак присваивания.
Вообще, разбей анализ на несколько проверок.

Код:
// говнокод
function IsAssignment(var ptr: PChar): Boolean;
begin
  Result:= p^ = ':'; 
  Inc(p);
  Result:= Result and (p^ = '=');
  Inc(p);
end;
А ещё лучше - изучи вот это (очень сложная и скучная хрень).
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 09.10.2015, 11:09   #4
rachina
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 27
По умолчанию

спасибо большое) а на счёт автоматов - верно сказано!

с помощью лекса это всё проще выглядит и делается

Последний раз редактировалось Аватар; 09.10.2015 в 11:55.
rachina вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт введённых символов в поле ввода Androsik JavaScript, Ajax 2 02.10.2011 13:26
Количество символов в memo romanzi Компоненты Delphi 4 19.01.2011 10:41
Анализ текста в компонентах Memo sokla Помощь студентам 4 14.03.2010 00:32
Массив символов и Memo (*_*) Общие вопросы Delphi 4 09.05.2009 10:39
произвести статистический анализ встречающихся символов на Делфи ILeto Помощь студентам 2 25.12.2008 19:00