Инструменты пользователя

Инструменты сайта


aq:netherscript

Это старая версия документа.


Это незаконченный документ!

NetherScript 2.0 - это настраиваемый парсер, написанный на QuakeC. Файлы, написанные на скрипте NetherScript 2.0 обычно имеют расширение NS2. Язык NetherScript состоит из общих инструкций (инструкции прекомпилятора) и предметных инструкций.

Общие инструкции являются частью ядра NetherScript и работают одинаково для всех, они управляют ходом обработки документа. С помощью общих инструкций можно выносить в шаблоны часто используемый код, разбить файл скрипта на несколько файлов, изменить ход выполнения обработки и произвести другие трюки. Вcе общие инструкции начинаются с символа «#»

Предметные инструкции определяются в коде QuakeC в зависимости от области, для которой настраивается парсер. Таким образом одно ядро NetherScript может обслуживать неограниченное число предметных областей самых разный типов. Например в Arcade Quake на нем описывается интерфейс меню, хад, монстры, предметы, оружие. В данной статье такие инструкции описаны не будут.

Синтаксис

Весь исходный текст подразделяется на сущности двух видов - слова и строки. Строки разделяются между собой символом возврата каретки, а слова при разделении подчиняются следующим правилам: * пробел и табуляция - отделяют одно слово от другого * спецсимволы \ ( ) [ ] { } ; : , . являются сами по себе словами, их не нужно отделять пробелом или табуляцией * «текст заключенный в двойные кавычки» - всегда считается одним словом * 'текст заключенный в одинарные кавычки' - тоже считается одним словом * комментарий до конца строки * /* комментарий в середине строки */ Внимание! Многострочный комментарий /**/ не поддерживается! Используйте вместо него условие #if 0 … #endif (см п.6) ====== Подключение файлов ====== <code java> #include имя_файла </code> Подключает содержание файла к процессу парсинга. В имени файла можно указывать добавочные пути (например monsters/soldier.ns2), но нельзя указывать относительные пути. (например ../monsters.ns2). Другие правила: префикс './' к имени файла заставит парсер искать файл в той же папке, что и текущий файл параметр вида <имя файла> - означает что инклюдится системный файл, и искать его парсер будет в каталоге script/system/ в любом другом случае проверять файл парсер будет в папке scripts/ Пример использования #include: <code java> #include «./my_defs.ns2» #include «my_defs.ns2» #include «monsters/mynewmonster.ns2» #include «<my_defs.ns2>» </code> Ограничения: Макс. 64 подключения файлов (включая начальный) ====== Константы #define ====== Константы используются для вставки в код готовых шаблонов. Чтобы вставить константу в произвольное место кода, нужно использовать синтаксис [имя_константы]. Самый простой пример использования констант: <code java> #define true 1 #define false 2 Вместо [true] и [false] обработчик кода увидит 1 и 0 MonsterClass MySoldier {

health 40
cantaketamage [true]
deathobituary [false]

} </code>

Константы типа #define при вставке сохраняют свою структуру слов:

// Вместо [true] и [false] обработчик кода увидит 1 и 0
#define defMySoldier MonsterClass MySoldier
[defMySoldier]
{
  health 40
  cantaketamage 1
  deathobituary 0
  deathstring "You have killed my soldier!"
}

Но если определить константу с помощью инструкции #defword, то она при вставке будет представлять из себя одно слово

// Вместо [true] и [false] обработчик кода увидит 1 и 0
#defword mySoldierDeathMessage You have killed my soldier!
// еще можно описать константу так:
// #define mySoldierDeathMessage "You have killed my soldier!"
MonsterClass MySoldier
{
  health 40
  cantaketamage 0
  deathobituary 1
  deathstring [mySoldierDeathMessage]
}

+

  #define имя_константы (параметр1, параметр2...параметр16) текст_константы
  #define имя_константы текст_константы
  #const имя_константы(параметр1,параметр2...) текст_константы
  #const имя_константы текст_константы
  #undef имя_константы_или_макрокоманды
  #redef
  #redefword
  #undefall

Ограничения: * макс. параметров: 16 * макс. длина имени параметра: 32 символа

Макрофункция #macro

То же самое, что и #define, но для использования в коде нужно использовать синтаксис @имя_макро_команды(параметры). Сделана для удобочитаемости кода. Имя макрофункции может совпадать с именем константы, объявленной через #define/#defword

#macro имя_константы(параметр1,параметр2...) содержание
#macro имя_константы содержание
#macroword имя_константы(параметр1,параметр2...) содержание
#macroword имя_константы содержание

Енумерация #enum

#enum int { ... }
#enum flags { ... }

Условия и переходы

#if значение ... #elseif значение ... #else ... #endif
#ifdef значение ...
#goto метка
#label имя_метки
#skip количество words
#skip колколичество lines
#eof

Управление парсером

#pragma параметр значение
#pragma precompiler on/off
#pragma warnings 0/1/2/3
#pragma debug 0/1
#pragma debugmessages 0/1
#pragma labels_on_failed_ifs 0/1

Служебные инструкции

#message сообщение
#error сообщение
#warning сообщение
#debug сообщение
#printdef имя_константы
#printmacro имя_макрокоманды

Системные константы и макрофункции

@true
@on
@false
@off
@random
@random(x,y)
@crandom 
@chance(x)
@defined(n)
@equal(x,y)
@bitand(x,y)
@bitor(x,y)
@label_list
@define_list
aq/netherscript.1251978053.txt.gz · Последнее изменение: 06.07.2020 03:50 (внешнее изменение)

Инструменты страницы