Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Свой парсер формул, помогите с реализацией 
V
    Опции темы
wofs
Дата 5.10.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



Вводные данные:

A,B числа

есть переменная, где хранится формула в текстовом виде:
RoundEx(A+B,10)

RoundEx - некая функция, делающая округление

как распарсить строку так, что бы приложение выполнило эту функцию (она может быть и другойи несколько разных функций могут чередоваться.)
--
надеюсь понятно изложил... smile 
PM MAIL   Вверх
Bitter
Дата 5.10.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: нет
Всего: 27



Допустим ты хранишь строку в переменной Code:string.  Code := 'RoundEx(A+B,10)' ;
Начинаешь перебирать Code по символам до первого разделителя или конца строки, записывая эти символы в новую переменную S.
Разделителями считаются все знаки кроме букв и цифр. После того, как ты достиг разделителя, из Code удаляешь первые символы до текущего. В итоге ты получишь S = 'RoundEx', Code = '(A+B,10)'.
Дальше. Анализируеш S. Проверяешь является ли эта строка функцией которую тебе надо обрабатывать или нет. Делается так:

Код

 if UpperCase(S)='SIN' then ....  else 
 if UpperCase(S)='COS' then ....  else 
 if UpperCase(S)='ROUNDEX' then ....  else 
 if UpperCase(S)='FLOWER' then ....  ;


так вот, если является, то вызываешь соответствующий обработчик, написанный тобой, в который передаешь Code.

 
Код

if UpperCase(S)='ROUNDEX' then ExecuteRoundEx(Code)  else ...


а в нем уже ты должен разобрать Code на аргументы и вызвать реальную RoundEx.

Добавлено @ 14:19
Кстати, забыл. В обработчике, ты должен не просто выделить аргументы, а Выделить строку, которая в скобках. После чего передать эту строку обратно в парсер (на случай если в скобках вложенная функция). А в парсер дописать, что если выделаня строка S не является функцией, значит это переменная, ну и вернуть её значение и остаток строки Code. Ну тут уже зависит от задачи, если ты пишешь интерпритатор, то нужно заводить таблицы переменных, обрабатывать присвоение значений и т.д.

Это сообщение отредактировал(а) bems - 5.10.2009, 19:26
PM MAIL ICQ Skype   Вверх
wofs
Дата 5.10.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



идея ясна, спасибо! попробуем smile
PM MAIL   Вверх
Bitter
Дата 5.10.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: нет
Всего: 27



гы гы. А вы знали что F L O W E R (без пробелов) заменяется на FLOWER ?  smile  smile  smile

Добавлено @ 15:06
Ах нет, это некто bems втихаря меняет. ишь какой...


 ! 
bems
Мат на форуме запрещен. Как и флуд в тематических разделах. Bitter, wofs, предупреждение, пока что усное. И раз уж вопрос решен - закрываю тему.


Это сообщение отредактировал(а) bems - 5.10.2009, 16:45
PM MAIL ICQ Skype   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0396 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.