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

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


aq:netherscript

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

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

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

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

Синтаксис

Весь исходный текст подразделяется на сущности двух видов - слова и строки. Строки разделяются между собой символом возврата каретки, а слова при разделении подчиняются следующим правилам:

  • пробел и табуляция - отделяют одно слово от другого
  • спецсимволы \ ( ) [ ] { } ; : , . являются сами по себе словами, их не нужно отделять пробелом или табуляцией
  • «текст заключенный в двойные кавычки» - всегда считается одним словом
  • 'текст заключенный в одинарные кавычки' - тоже считается одним словом
  • комментарий до конца строки
  • /* комментарий в середине строки */

Внимание! Многострочный комментарий вида /* */ не поддерживается! Используйте вместо него условие #if 0 … #endif (см п.6)

Подключение файлов

#include имя_файла 

Подключает содержание файла к процессу парсинга. В имени файла можно указывать добавочные пути (например monsters/soldier.ns2), но нельзя указывать относительные пути. (например ../monsters.ns2).

Другие правила:

префикс './' к имени файла заставит парсер искать файл в той же папке, что и текущий файл параметр вида <имя файла> - означает что инклюдится системный файл, и искать его парсер будет в каталоге script/system/ в любом другом случае проверять файл парсер будет в папке scripts/

Пример использования #include:

#include "./my_defs.ns2"
#include "my_defs.ns2"
#include "monsters/mynewmonster.ns2"
#include "<my_defs.ns2>"

Ограничения:

Макс. 64 подключения файлов (включая начальный)

Константы #define

Константы используются для вставки в код готовых шаблонов. Чтобы вставить константу в произвольное место кода, нужно использовать синтаксис [имя_константы]. Самый простой пример использования констант:

#define true 1
#define false 2
// Вместо [true] и [false] обработчик кода увидит 1 и 0
MonsterClass MySoldier
{
  health 40
  cantaketamage [true]
  deathobituary [false]
}

Константы типа #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.txt · Последнее изменение: 06.07.2020 03:50 (внешнее изменение)

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