Возможно вы искали: 'ACM 1918: Aerial Comba...'

May 15 2025 18:59:23
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Интерпретация строковых выражений как функций (perl)

Интерпретация строковых выражений как функций (perl)

Ключевые слова: perl, (найти похожие документы)

From: Александров Константин <alexandrov_ks@mail.ru.> http://www.zahodi-ka.ru
Newsgroups: email
Date: Sun, 19 Nov 2006 17:02:14 +0000 (UTC)
Subject: Интерпретация строковых выражений как функций


Иногда возникает потребность интерпретировать в программе строковое
выражение как функцию. Например, при написании графопостроителя
требуется переработать полученную строку так, чтобы в результате
получилась функция, причем работающая со скоростью, необходимой для
многократного пересчета координат точек. На самом деле круг подобных
задач намного шире, он включает в себя программы, использующие любые
варианты условий отбора (например, интерпретация условий SQL запросов).
Эта статья посвящена решению задач такого рода, правда я не буду
приводить готовых исходников, которые можно скачать и скомпилировать,
моя задача - показать одну из возможностей реализации. Кому это нужно и
интересно, сами напишут все, что надо и разовьют идею.

Примеры в статье будут написаны на PERL только потому, что этот язык
является достаточно гибким и не придется отвлекать внимание от задачи на
особенности реализации под конкретный язык.

Итак сначала о постановке задачи: программа получает строковое
выражение, содержащее определение математической или логической функции
любой сложности. Например, выражение

1/(5*6 + x^0.5 + y*0.8)


или

(A == B AND C != 5) OR (D != 'abc')


Эти выражения являются сложными, но их можно свести к простому виду

[ПЕР1] [Функция1] [ПЕР2]


Операторы сравнения также являются функциями, например оператор !=
получает значения 2-х переменных и возвращает "0" или "1". Пусть
[Функция1] возвращает значение [Значение1], тогда процесс упрощения
строки может вестись следующим образом:

$A == 34 AND $C != 5
[ПЕР1] = $A, [ПЕР2] = 34, [Функция1] = "=="


После выделения функции заменяем ее в исходной строке возвращаемым значением:

[Значение1] AND $C != 5,
[Значение1] AMD [Значение2],
[Значение3]


Последнее значение и будет являться значением выражения, которое
требуется найти (Далее будет рассматриваться работа только с простыми
выражениями). Однако, если использовать переработку исходной строки с
заменой функции на её значение при конкретных значениях переменных, то
будут серьёзные потери производительности. Поэтому логичным является
использовать не сами значения, а указатели на них. Для этого потребуется
хранить значения самих переменных, констант и значений функций.

# Массив аргументов - констант
my @F_args_const;
my $Ch_args_const;

# Ассоциативный массив аргументов - переменных
my %zn_p;

# Массив аргументов - результатов функций
my $F_rez;

# Массив указателей на аргументы функции
my @F_args_p;

# Указатель на функцию
my $F_Name_p;

# Два указателя на аргументы функции
my $F_arg_p1;
my $F_arg_p2;


Для тех, кто не знаком с синтаксисом PERL поясню, что если перед именем
переменной стоит знак "$", то переменная является скаляром и может
содержать любое единичное значение: строку, число, указатель на объект.
Если "@", то это массив скаляров, обращаться к каждому элементу массива
можно используя имя массива с указанием перед ним знака "$" (то есть
элемент массива - скаляр) и индекса в квадратных скобках после имени.
Если "%", то это ассоциативный массив, обращаются к нему так же, как и к
обычному, только вместо индекса в квадратных скобках указывается
строковое выражение в фигурных.

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

# Определение функции "=="
sub ravno_ch
{
my $str1 = $_[0];
my $str2 = $_[1];
if ($str1 == $str2) {return 1;};
return 0;
};

# Значения, полученные из начальной строки
my $ARG1 = '$A';
my $ARG2 = '34';
my $FUNC = '==';

# Заполнение данных о функции
if ($FUNC eq '==')
{
$F_Name_p = &ravno_ch;
};

# Запоминаем ЗНАЧЕНИЕ $ARG2 в мессиве констант
$F_args_const[0] = $ARG2;
# Запоминием УКАЗАТЕЛЬ на первый аргумент функции
$F_arg_p1 = $zn_p{$ARG1};
# Запоминием УКАЗАТЕЛЬ на второй аргумент функции
$F_arg_p2 = $F_args_const[0];


Теперь несколько слов о вызове функции и о задании её аргументов. С
константным аргументом всё просто, его значение сохранено в массиве
констант и при каждом расчете значения функции оно будет использоваться.
Значение же переменной $A будет храниться в элементе ассоциативного
массива $zn_p{'$A'}. Его можно будет легко задавать перед каждым
расчетом.

# Запоминаем текущее значение переменной
$zn_p{'$A'} = 12;
# Вызываем функцию
$F_rez = &$F_Name_p($$F_arg_p1, $$F_arg_p2);


Знак "$$" перед именем переменных F_arg_p1 и F_arg_p2 означает, что при
расчете нужно брать не значения этих переменных (в них лежат указатели),
а данные, на которые они указывают. Знак "&$" перед именем F_Name_p
означает, что нужно вызвать функцию, указатель на которую записан в
переменной $F_Name_p.

Все, что было описано в статье, можно использовать и для интерпретации
сложных выражений, просто в таком случае они будут представляться не
одной функцией, а набором функций (указатели на них логично записать в
массив и вызывать их последовательно). Наверняка найдутся читатели,
которые скажут, что реализация такой задачи на PERL не нужна, или её
можно реализовать с использованием стандартных средств языка. Они
конечно будут правы, однако подход, примененный для решения задачи
позволяет сделать аналог например на СИ (язык поддерживает все методы,
которые использовались в данном примере)
970 Прочтений •  [Интерпретация строковых выражений как функций (perl)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Интерпретация строковых выражений к... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка