1

Тема: Реалізація "умовного тексту"

Реалізовую сайт-програвач інтерактивної літератури (текстових квестів) власного формату.
Зіштовхнувся з необхідністю реалізації "умовного тексту".

Наприклад, десь в БД зберігається якийсь текст, скажімо, опис якогось предмета.
Користувач при час ігрової сесії має певні параметри (власні характеристики, індикатои прийнятих рішень, тощо).
Отриманий користувачем текст опису предмета має адаптовуватись до поточних параметрів.
Під адаптацією розуміється багато речей, але найважчою зараз виглядає реалізація "умовного тексту".
Тобто текст в базі має містити певні умовні конструкції, які "підключають" певні абзаци, речення чи окремі слова до відображення.

Наприклад:
"
Ви стоїте біля старого $if botanic>1 $endcond дуба $else дерева $endif заввишки 20 метрів.
$if perseption>5 $endcond На одній з гілок ви помічаєте пташите гніздо. $endif
"

Спеціальна функція має доступ до параметрів користувача та відсікає зайвий текст перед відправкою.
Підстановку значень та аналіз простих умов (без and та or) реалізувати нескладно, а от далі стає важче.

Задача виглядає не те, щоб зовсім типовою, але точно не унікальною.
Підозрюю, що є якісь системи, стандарти чи шаблони для таких речей, може навіть якісь реалізовані бібліотеки є (php?).

Може хтось підкаже відповідні назви чи корисні поклилання/ідеї, щоб не винаходити інтерпретатор з нуля.

Подякували: 0xDADA11C7, P.Y.2

2

Re: Реалізація "умовного тексту"

Питання в тому, де ви плануєте зупинитися. Зараз ви додаєте and та or, потім буде розгорнуте обчислення математичних виразів на кшталт

дракон $if dragon_lives/(power-dragon_armor)>lives/(dragon_power-armor) $endcond сильніший $else слабший #endif за вас

далі додасте цикли та функції, а зрештою просто перейдете на PHP замість власної мови, бо саме так PHP і виник, зрештою.

3

Re: Реалізація "умовного тексту"

А в цілому ви шукаєте шаблонизатор (template engine).

4

Re: Реалізація "умовного тексту"

Слушне зауваження) Опишу межі.

Програма мінімум: підстановка і одиничні умови.
Було б добре: вкладені умовні оператори.
Програма максимум: булеві функції and та or всередині умов у ДНФ

5

Re: Реалізація "умовного тексту"

Тоді далі розбору одного виразу вам іти не треба, а це добре можна зробити рекурсією. Псевдокодом:

function calculate(шаблон)
{
  if шаблон є значенням {
    return значення
  }
  if шаблон є змінною {
    return значення змінної
  }
  if шаблон є бінарною операцією {
    return calculate(перший аршумент) операція calculate(другий аргумент)
  }
  if шаблон є умовним виразом {
    return calculate(умова) ? calculate(гілка then) : calculate(гілка else)
  }
}

бінарна операція - це і булеві операції, і арифметика, і порівняння.

Подякували: Shau1